Befunge, 344 octets
&v>>>#p_:63p:43g`\!+v>/*53g+\01g:2%2*1-\2/!*63g+\0\:v
40$ v++!\`g14:p35:\<^2\-1*2%2p10::%4+g00:\g36\g35-1_v
#11^$_83p73v >1+:41g`!#v_$,1+:43g`!#v_@>->2>+00p+141^_
<p1^ vp< ^,g+7g36:<<<<1+55p36:<<<< ^1?0^#7g36g35*
8&p|!++!%9#2g+7g10\*!-g38g10!-g37:g00!!*<>3^
443>:!#v_>>1-::3%1-:53g+00p\3/1-:63g+01p^
^>^>>$#<"#"53g63g7+p41g53g-43g63g-+!#^_
Essayez-le en ligne!
Comme @flawr l'a mentionné dans sa réponse MATLAB, cela peut prendre un certain temps si la taille du champ est d'une taille non triviale. En fait, il est assez facile de se retrouver dans une situation où cela ne vaut vraiment pas la peine d'attendre qu'il se termine, car il est fort probable que vous attendiez la fin des temps.
Pour comprendre pourquoi cela se produit, il est utile de visualiser le programme en cours d'exécution dans l'un des nombreux "débogueurs visuels" de Befunge. Étant donné que les données et le code sont la même chose dans Befunge, vous pourrez voir le chemin au fil du temps. Par exemple, voici une courte animation montrant à quoi pourrait ressembler une partie d'une course sur un chemin lent.
Une fois que l'algorithme décide de faire ce virage fatidique vers la gauche au bas de la limite du champ, il s'est essentiellement condamné à une vie d'errance sans but. À partir de ce moment, il doit suivre tous les chemins possibles dans cette zone clôturée avant de pouvoir reculer et essayer de tourner à droite. Et le nombre de chemins potentiels dans ces cas peut facilement devenir astronomique.
Conclusion: si cela semble prendre beaucoup de temps, c'est probablement une bonne idée d'interrompre l'exécution et de recommencer.
Explication
Il s'agit essentiellement d'un algorithme récursif, essayant tous les chemins possibles à travers le champ, puis déroulant les étapes qui ont déjà été suivies chaque fois qu'il est bloqué. Puisque Befunge n'a pas le concept de fonctions, une fonction récursive est hors de question, mais nous pouvons émuler le processus en suivant l'état sur la pile.
Cela fonctionne en remplissant la pile de coordonnées potentielles que nous pourrions vouloir suivre. Ensuite, nous tirons un ensemble de la pile et vérifions s'il est approprié (c'est-à-dire à portée et ne chevauchant pas un chemin existant). Une fois que nous avons un bon emplacement, nous écrivons un #
dans le champ de jeu à cet endroit et ajoutons ces détails à la pile au cas où nous aurions besoin de revenir en arrière plus tard.
Nous poussons ensuite quatre autres ensembles de coordonnées sur la pile (dans un ordre aléatoire) indiquant les chemins potentiels que nous pouvons emprunter à partir de ce nouvel emplacement, et sautons au début de la boucle. Si aucun des chemins potentiels n'est réalisable, nous arriverons au point de la pile où nous avons enregistré l'emplacement de celui que #
nous avons écrit, donc nous annulerons cette étape et continuerons d'essayer les coordonnées potentielles d'une étape précédente.
Voici à quoi ressemble le code avec les différents composants mis en évidence:
Lisez la largeur et la hauteur du champ et appuyez sur les coordonnées de départ avec un 0
marqueur de type pour indiquer un chemin potentiel plutôt qu'un emplacement de retour en arrière.
Vérifiez les emplacements de retour en arrière (indiqués par un 1
marqueur de type) qui sont inversés avec une simple p
commande, car ils sont stockés au format exact nécessaire pour réécrire un espace dans le champ de jeu.
Vérifiez si les coordonnées sont toujours à l'intérieur du champ de jeu. S'ils sont hors de portée, supprimez-les de la pile et faites une boucle pour essayer les prochaines coordonnées potentielles.
S'ils sont dans la plage, obtenez les deux valeurs suivantes de la pile, qui est l'emplacement de l'étape précédente (requise dans le test qui suit).
Vérifiez si les coordonnées vont entrer en contact avec un segment existant du chemin. L'emplacement de l'étape précédente est évidemment ignoré de cette vérification.
Si tous les tests réussissent, écrivez un #
dans le champ de jeu et vérifiez si nous avons atteint l'emplacement de destination.
Si c'est le cas, écrivez le chemin final et quittez.
Sinon, enregistrez les coordonnées dans la pile avec un 1
marqueur de type pour un retour en arrière ultérieur.
Ceci est interrompu par un calcul de nombres aléatoires dont nous aurons bientôt besoin.
Poussez quatre destinations potentielles qui peuvent être atteintes à partir de l'emplacement actuel. Le nombre aléatoire détermine l'ordre dans lequel ils sont poussés et donc l'ordre dans lequel ils seront suivis.
Revenez au début de la boucle principale et traitez les valeurs suivantes sur la pile.