Je serais prêt à parier que les gens ont été en attente pour celui-ci pendant un LOOOOONG moment. (Que voulez-vous dire, le défi est plus et personne ne s'en soucie plus?)
Voilà... je présente ici une solution
Befunge-93!
Il pèse un énorme 973 charaters (ou 688 si vous êtes de bienfaisance assez pour ignorer les espaces blancs, qui n'est utilisé que pour la mise en forme et n'a rien dans le code).
Mise en garde: j'ai écrit ma propre Befunge-93 interprète en Perl, il y a peu, et c'est malheureusement tout ce que j'ai vraiment eu le temps nécessaire pour faire le test. Je suis raisonnablement confiant dans sa justesse en général, mais il pourrait avoir une drôle de limitation quant à l'EOF: Depuis Perl <>
opérateur retourne undef à la fin du fichier, c'est traité comme un 0 dans le contexte numérique. Pour C implémentations basées où EOF a une valeur différente (-1 dire), ce code peut ne pas fonctionner.
003pv >~v> #v_"a"43g-!#v_23g03p33v>v
>39#<*v :: >:52*-!v >"rorrE",vg2*
######1 >^vp31+1g31$_03g13gp vv,,<15,
a#3 >0v vp30+1g30<>,,#3^@
######p $ 0vg34"a"< > >vp
^<v> > ^ p3<>-#v_:05g-!|>:15g-!| $
> v^ < < < >^v-g52:< $
v _ >52*"eslaf",,vv|-g53:_ v
: ^-"#">#:< #@,,,,<<>:43p0 v0 p34<
>">"-!vgv< ^0p33g31p32-1g3<
^ <#g1|-g34_v#-g34_v#-g34"><v^"<<<<
v!<^<33>13g1v>03g1-v>03g1+03p$v $$
>^ _#-v 1>g1-1v>+13pv >03p v pp
^_:"^"^#|^g30 <3# $< $<>^33
^!-"<":<>"v"v^># p#$<> $^44
^ >#^#_ :" "-#v_ ^ > ^gg
v g34$< ^!<v"/":< >$3p$^>05g43p$ ^55
>,@ |!-"\" :_$43g:">"-!|> ^$32
*v"x":< >-^ ^4g52<>:"^" -#v_^
5>-!#v_"ror"vv$p34g51:<>#| !-"<":<#|
^2,,, ,,"er"<>v #^^#<>05g43p$$^>^
>52*"eurt",,,,,@>15g4 3p$$$$ ^#
>:"v"\:"<"\: "^" -!#^_-!#^_-! ^
> ^
Explication
Si vous n'êtes pas familier avec le Befunge la syntaxe et le fonctionnement, vérifier ici.
Befunge est une pile, de la langue, mais il y a des commandes qui permettent d'écrire des caractères dans la Befunge code. J'en profite en deux endroits. Tout d'abord, je copie l'ensemble de l'entrée sur le Befunge conseil, mais situé à quelques lignes au-dessous de la réelle le code écrit. (Bien sûr, ce n'est jamais réellement visible lorsque le code s'exécute.)
L'autre endroit est à proximité de la le coin supérieur gauche:
######
a#
######
Dans ce cas, le domaine, je l'ai souligné ci-dessus est là que j'ai stocker un couple de coordonnées. La première colonne de la rangée du milieu, il est l'endroit où je stocke les coordonnées x de la "position du curseur"; la deuxième colonne est l'endroit où je stocke la coordonnée; les deux colonnes suivantes sont pour le stockage de l'x et y les coordonnées du faisceau laser de la source quand c'est trouvé, et la dernière colonne (avec le " un " caractère) est finalement écrasé à contenir l'actuelle direction du faisceau, ce qui évidemment change à mesure que le faisceau du chemin est tracé.
Le programme commence par placer (0,27) que la position initiale du curseur. Puis à l'entrée est de lire les caractères un à un et placé dans la position du curseur, les retours à la ligne simplement la coordonnée à l'augmentation et à la coordonnée x pour revenir à 0, comme pour un vrai retour chariot. Finalement, le fnud est lu par l'interprète et 0 la valeur du caractère est utilisé pour signaler la fin de l'entrée et de passer au laser itération des étapes. Lorsque le laser caractère [<>^v] est lu, qui est également copié dans la mémoire référentiel (sur le 'a') et ses coordonnées sont copiés dans les colonnes à la gauche.
Le résultat final de tout cela est que la totalité du fichier est en fait copié dans le Befunge code, un peu en-dessous du code traversés.
Par la suite, le faisceau emplacement est recopié dans le curseur endroits, et l'itération suivante est effectuée:
- Vérifier l'actuelle direction du faisceau et de l'incrémenter ou décrémenter les coordonnées du curseur de façon appropriée. (Je le fais d'abord pour éviter d'avoir à traiter avec le coin de cas du faisceau laser à droite sur le premier coup.)
- Lire le caractère à l'emplacement.
- Si le caractère "#", mettre de saut de ligne et les "faux" sur la pile, de l'impression, et à la fin.
- Le comparer à l'ensemble de la poutre caractères [<>^v]; si il y a un match, aussi de l'impression de "faux\n" et à la fin.
- Si le caractère est un espace vide de la pile et de continuer.
- Si le personnage est un slash, obtenir de la direction du faisceau sur la pile et de le comparer à chacun de la direction personnages à tour de rôle. Lorsque l'on est trouvé, la nouvelle direction est stocké au même endroit dans le code et la boucle se répète.
- Si le caractère est une barre oblique inverse, faire essentiellement la même chose que ci-dessus (à l'exception de la configuration appropriée pour la barre oblique inverse).
- Si le caractère est "x", nous avons touché la cible. Print "vrai\n" et la sortie.
- Si le personnage est aucun de ces, print "erreur\n" et la sortie.
Si il y a assez de demande pour cela, je vais essayer de le point exactement où dans le code, tout cela est accompli.