L'algorithme de sculpture de couture, ou une version plus complexe de celui-ci, est utilisé pour le redimensionnement d'image sensible au contenu dans divers programmes graphiques et bibliothèques. Jouons au golf!
Votre entrée sera un tableau d'entiers rectangulaire à deux dimensions.
Votre sortie sera le même tableau, une colonne plus étroite, avec une entrée supprimée de chaque ligne, ces entrées représentant un chemin de haut en bas avec la somme la plus faible de tous ces chemins.
https://en.wikipedia.org/wiki/Seam_carving
Dans l'illustration ci-dessus, la valeur de chaque cellule est indiquée en rouge. Les nombres noirs sont la somme de la valeur d'une cellule et le plus petit nombre noir dans l'une des trois cellules au-dessus (indiqué par les flèches vertes). Les chemins surlignés en blanc sont les deux chemins de somme les plus faibles, tous deux avec une somme de 5 (1 + 2 + 2 et 2 + 2 + 1).
Dans le cas où il y a deux chemins liés pour la somme la plus basse, peu importe celui que vous supprimez.
L'entrée doit provenir de stdin ou d'un paramètre de fonction. Il peut être formaté d'une manière appropriée à la langue de votre choix, y compris les crochets et / ou les délimiteurs. Veuillez préciser dans votre réponse comment la saisie est attendue.
La sortie doit être stdout dans un format délimité sans ambiguïté, ou comme une valeur de retour de fonction dans l'équivalent de votre langue à un tableau 2D (qui peut inclure des listes imbriquées, etc.).
Exemples:
Input:
1 4 3 5 2
3 2 5 2 3
5 2 4 2 1
Output:
4 3 5 2 1 4 3 5
3 5 2 3 or 3 2 5 3
5 4 2 1 5 2 4 2
Input:
1 2 3 4 5
Output:
2 3 4 5
Input:
1
2
3
Output:
(empty, null, a sentinel non-array value, a 0x3 array, or similar)
EDIT: Les nombres seront tous non négatifs, et chaque couture possible aura une somme qui tient dans un entier 32 bits signé.
Réponses:
CJam,
5144 octetsIl s'agit d'une fonction anonyme qui extrait un tableau 2D de la pile et en envoie un en retour.
Essayez les cas de test en ligne dans l' interpréteur CJam . 1
Idée
Cette approche parcourt toutes les combinaisons possibles d'éléments de ligne, filtre celles qui ne correspondent pas aux coutures, trie par la somme correspondante, sélectionne le minimum et supprime les éléments correspondants du tableau. 2
Code
1 Notez que CJam ne peut pas distinguer les tableaux vides des chaînes vides, car les chaînes ne sont que des tableaux dont les éléments sont des caractères. Ainsi, la représentation sous forme de chaîne des tableaux vides et des chaînes vides est
""
.2 Alors que la complexité temporelle de l'algorithme présenté sur la page Wikipedia doit être de O (nm) pour une matrice n × m , celle-ci est au moins de O (m n ) .
la source
{2ew::m2f/0-!},
Haskell, 187 octets
Exemple d'utilisation:
Fonctionnement, version courte: construire une liste de tous les chemins (1), par chemin: supprimer les éléments correspondants (2) et additionner tous les éléments restants (3). Prenez le rectangle avec la plus grande somme (4).
Version plus longue:
la source
IDL 8.3, 307 octets
Meh, je suis sûr que cela ne gagnera pas car c'est long, mais voici une solution simple:
Non golfé:
Nous créons de manière itérative le réseau d'énergie et suivons dans quelle direction va la couture, puis construisons une liste de suppression une fois que nous connaissons la position finale. Retirez la couture via l'indexation 1D, puis remettez-la dans le tableau avec les nouvelles dimensions.
la source
[0:n]
; si c'est vrai, il est facile de le remplacerr+=[0:z[1]-1]*z[0]
parr+=indgen(z[1]-1)*z[0]
.JavaScript ( ES6 ) 197209
215Implémentation étape par étape de l'algorithme wikipedia.
Peut probablement être raccourci davantage.
Testez l'exécution de l'extrait dans Firefox.
la source
Pip, 91 octets
Cela ne gagnera aucun prix, mais je me suis amusé à y travailler. L'espace est réservé à des fins esthétiques et n'est pas inclus dans le nombre d'octets.
Ce code définit une fonction anonyme dont l'argument et la valeur de retour sont des listes imbriquées. Il implémente l'algorithme de la page Wikipedia:
a
(l'argument) est les nombres rouges etz
les nombres noirs.Voici une version avec harnais de test:
Résultats:
Et voici l'équivalent approximatif de Python 3. Si quelqu'un veut une meilleure explication du code Pip, il suffit de demander dans les commentaires.
la source