C'est essentiellement la même chose que cette question, sauf plus difficile. Vous devez à nouveau écrire un programme qui va du coin inférieur gauche d'un rectangle au coin supérieur droit. Cependant, cette fois, les mouvements diagonaux sont autorisés.
Le programme acceptera une paire commandée (width, height)
et les utilisera comme dimensions pour un rectangle. Votre programme créera ensuite un art ASCII de la solution (utilisez.
pour un carré vide, #
pour une partie de la solution et X
pour le carré de départ) et comptera le nombre de mouvements nécessaires pour atteindre le point final.
Exemple
Contribution: (5, 6)
Production:
....#
....#
...#.
..#..
.#...
X....
Move count: 5
La réponse la plus courte en octets gagne!
Réponses:
MATL , 38 octets
Essayez-le en ligne!
Explication
Soit
m
etn
soit les entrées triées, telles qu'ellesm
soient supérieures ou égales àn
. Le code construit initialement une matricem
xn
comme suit:#
. Le nombre de ces entrées moins 1 est le nombre de mouvements.X
..
Si nécessaire, la matrice est maintenant transposée pour avoir la forme souhaitée. Notez que la première dimension d'une matrice est sa hauteur et non sa largeur, elle correspond donc à la deuxième entrée.
La matrice est ensuite retournée à l'envers pour
X
apparaître en bas de la première colonne, et ses entrées sont utilisées comme indices dans la chaîne'.#X'
pour produire le tableau de caractères 2D souhaité.la source
Pyth,
464544 octetsEssayez-le ici.
Explication:
la source
JavaScript (ES6), 132
Modifier 2 octets enregistrés thx @Neil
Tester
la source
w--,R=
... dans lemap()
.Javascript (à l'aide d'une bibliothèque externe) (235 octets)
Bon sang c'était dur! Eh bien ... ma bibliothèque n'était pas vraiment la bonne tâche pour ce haha. Mais j'ai aimé le défi
Lien vers la bibliothèque: https://github.com/mvegh1/Enumerable
Explication du code: créer une fonction de 2 variables. Stockez x-1 et y-1 dans des variables. Stockez max et min de ceux-ci dans des variables. Créez une plage de nombres descendant verticalement à partir de (y-1) pour un nombre de y. Pour chaque élément de la plage verticale, écrivez une ligne pour l'élément actuel, en fonction du prédicat complexe. Ce prédicat crée une plage ascendante d'entiers de 0, pour un nombre de x. Pour chaque élément de cette plage, concaténez en 1 chaîne selon un prédicat complexe. Ce prédicat vérifie s'il est en bas à gauche, sinon vérifie s'il est en diagonale, sinon vérifie que nous sommes à la frontière X ou Y. Enfin, tout cela a été stocké dans une variable. Ensuite, pour obtenir le nombre de mouvements, nous comptons simplement les #. Concaténer ensuite cela à la variable stockée et renvoyer le résultat
C'était une bouchée haha. La capture d'écran a le mauvais octet parce que j'ai trouvé un moyen d'économiser 4 octets en publiant ce
EDIT: Je vois que d'autres réponses ne mettent pas "Move count:" dans leur sortie, mais la mienne l'est. Si ce n'est pas une exigence, cela rase un tas d'octets ...
la source
Python 3,
161156 octetsUne fonction qui prend l'entrée via un argument et imprime l'ascii-art, suivi du nombre de mouvements, dans STDOUT.
Comment ça fonctionne
Le programme crée d'abord une liste de listes, où chaque liste représente une ligne de la grille et chaque élément des listes de composants l'est
.
. Chaque élément qui devrait être#
a la propriété que si la grille de sortie était carrée, les ordonnées représentant son emplacement seraient égales; par conséquent, une boucle sur un indexi
et une insertion#
à l'emplacement(i, i)
donneraient la sortie souhaitée. Cependant, la grille n'est pas toujours carrée, et donc les index sont fixés à la grille en prenant le minimum d'index et de largeur / hauteur (décrémenté en raison de l'indexation zéro) comme requis. Si l'indice est nul, la position actuelle doit être l'entrée en bas à gauche, et doncX
est inséré à la place. Ensuite, les éléments de chaque ligne sont concaténés et chaque ligne est imprimée sur STDOUT. Le nombre de mouvements est le maximum de la largeur / hauteur décrémentée; ceci est également imprimé.Essayez-le sur Ideone
la source