Tracez le chemin de la fourmi de Langton .
La description
Les carrés d'un avion sont colorés de différentes manières, soit en noir soit en blanc. Nous identifions arbitrairement un carré comme la "fourmi". La fourmi peut voyager dans n'importe laquelle des quatre directions cardinales à chaque étape. La fourmi se déplace selon les règles ci-dessous:
- Sur un carré blanc, tournez à 90 ° à droite, retournez la couleur du carré, avancez d'une unité
- Sur un carré noir, tournez à 90 ° à gauche, retournez la couleur du carré, avancez d'une unité
Caractéristiques
- Entrée: un entier N compris entre 0 et 725 (inclus).
- Sortie: une grille de 17 x 17 représentant le "chemin" de la fourmi à l'étape N.
Règles
- La fourmi commence à faire face à droite (3 heures).
- La fourmi commence au centre de la grille.
- À utiliser
_#@
pour les carrés blancs, les carrés noirs et la fourmi respectivement. - La grille est initialement complètement blanche.
- Vous pouvez créer soit un programme complet soit une fonction sur un langage interprété.
- Entrée par stdin ou argument.
Exemples
Mise à jour: la sortie N = 450 du boîtier était incorrecte.
N = 0
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
N = 1
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________#________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
N = 450
_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________
Réponses:
GolfScript - 67 caractères
La solution Python de hallvabo est la plus similaire à celle-ci, je ne décrirai donc que les principales différences.
La carte est stockée sous forme de chaîne au lieu d'un tableau. C'est ainsi que nous pouvons mettre à jour une valeur sur la carte avec moins de caractères (car les chaînes sont toujours plates), et donc obtenir le format de sortie souhaité est facile.
La position de la fourmi est incrémentée par la formule
((d&1)*17+1)*((d&2)-1)
(c'est-à-dire.1&17*)\2&(*
), où d est la direction. Nous utilisons la variable6
pour ignorer l'initialisation.la source
:6
- tellement hipster. Je détesterais déboguer votre code :-)Ruby 1.9, 104 caractères
Entrée via l'argument de fonction.
m
r*r>1
lieu der.abs>1
String#scan
pour générer la sortie. Changé==
en>
String#tr
par un conditionnella source
Python, 123
Juste une légère refonte de ma solution Python à partir de http://golf.shinh.org/p.rb?Langtons+Ant .
la source
GolfScript
969489Ma langue de haine préférée est de retour avec un autre tas de codes sorta semi-lisibles.
En version 89, j'ai finalement réussi à intégrer @ dans la boucle de sortie.
Version 94:
Commenté:
Edit, je pourrais aussi bien en faire une grosse version, voici 59 * 59 et 10500 itérations:
.
la source
Windows PowerShell,
119118la source
PHP,
350309307312174161166159151149147 147144143Non golfé
350 -> 309: Diverses techniques de compression avec les boucles for (), également mises à jour pour afficher une sortie correcte.
309 -> 307: Conversion de la boucle principale for () en boucle while ().
307 -> 312: J'ai oublié de le changer pour utiliser argv.
312 -> 174: recodé sur la base d'une autre réponse.
174 -> 161: la valeur par défaut du tableau entier n'est plus par défaut.
161 -> 166: Argv gagne à nouveau.
166 -> 159: Pas besoin de redéfinir argv [1].
159 -> 151: Plus rien par défaut, PHP le fait automatiquement.
151 -> 149: Suppression d'un ensemble de parenthèses, l'ordre des opérations supprime le besoin.
149 -> 147: raccourci de la dernière boucle for (), accolades non nécessaires.
147 -> 144:La dernière boucle for () est maintenant une boucle while ().
144 -> 143: utilisé une variable temporaire pour enregistrer un caractère.
la source
C,
166162Voici une traduction de mon approche Delphi du C, montrant à quel point le C peut être compact. J'ai emprunté l'astuce conditionnelle de nouvelle ligne à fR0DDY (merci mec!):
La version en retrait et commentée ressemble à ceci:
la source
"_@#"[g[i]]
eta+=(1-(d&2))*(1+(16*(d&1)))
(1+d%2*16)
enregistre quelques caractères.Delphi, 217
Le code en retrait et commenté se lit comme suit:
Contribution:
Sortie:
la source
C 195 caractères
http://www.ideone.com/Dw3xW
Je reçois ceci pour 725.
la source
p+=t+4;x+=a[p%4];
au lieu d'p=(p+t+4)%4;x+=a[p];
enregistrer trois caractères.sed, 481 caractères
Peut être réduit à 478 caractères en supprimant la première ligne et en exécutant avec
-n
Nécessite N lignes pour l'entrée, par exemple. lorsqu'il est exécuté en tant que
les sorties:
la source
Perl, 110 caractères
Le numéro est lu à partir de la première ligne de STDIN. Le reste de l'entrée est ignoré.
Un peu plus lisible:
Modifications
(112 → 111) Pas besoin de mettre à jour
$d
avec la valeur modulo-4.(111 → 110) Peut maintenant
$d
incrémenter l' incrémentAddendum (109 caractères)
Nous pouvons avoir un caractère plus court si vous êtes content d'avoir le cas spécial d'
N=0
échec (il ne produit pas le@
caractère pour la fourmi). Toutes les autres entrées fonctionnent correctement:Les différences sont que nous utilisons maintenant
%f
au lieu de@f
afin que nous puissions utiliser des indices négatifs, et nous itérons à partir de-144..144
au lieu de0..288
. Cela évite d'avoir à initialiser$p
.la source
Mathematica, 94 caractères
la source
> <>, 122 octets
Au risque d'une petite nécromancie de fil, j'ai pensé qu'écrire une réponse en> <> serait un défi intéressant ...
Ce programme s'attend à ce que le nombre d'étapes à calculer soit présent sur la pile avant l'exécution.
la source