Il est bien connu qu'une personne sur une grille sous l'influence de l'alcool a une chance égale d'aller dans toutes les directions disponibles. Cependant, cette affirmation de bon sens ne s’applique pas au domaine des très petits ivrognes, dont le comportement ressemble beaucoup à ceux qui empruntent tous les chemins disponibles en même temps, et les chemins possibles qu’ils empruntent peuvent se gêner. Votre tâche consiste à afficher les positions possibles d'un tel ivrogne après chaque n
étape.
spécification
L’ivrogne en question occupe une grille carrée et peut être considéré comme un automate cellulaire à trois états utilisant un voisinage de Von Neumann (en forme de plus) qui suit ces règles simples:
Empty
va àAwake
si elle est adjacente à exactement unAwake
, et sinon va àEmpty
Awake
va àSleeping
Sleeping
va àSleeping
L’état initial du plateau est un simple Awake
entouré d’un champ infini de Empty
s.
Défi
Étant donné un entier non négatif n
, créez une représentation ASCII de l'ivrogne après les n
étapes. Chaque état doit être représenté par un caractère différent et les solutions doivent indiquer quel caractère signifie quel état. Si vous utilisez des espaces pour Empty
, vous n'avez pas besoin d'en inclure une série à la fin d'une ligne.
C'est du code-golf , donc la réponse la plus courte gagne. Des failles standard s'appliquent, les espaces de début et de fin sont autorisés, la sortie de tableau de chaînes / 2d est autorisée, etc.
Exemples
Ces exemples utilisent pour
Empty
, @
pour Awake
et #
pour Sleeping
.
n=0
@
n = 1
@
@#@
@
n = 2
@
#
@###@
#
@
n = 3
@
@#@
@ # @
@#####@
@ # @
@#@
@
n=6
@
#
@###@
@#@
@ ### @
#@# # #@#
@###########@
#@# # #@#
@ ### @
@#@
@###@
#
@
n=10
@
#
@###@
@#@
###
# # #
#######
# ### #
@ ## ### ## @
#@# ### # ### #@#
@###################@
#@# ### # ### #@#
@ ## ### ## @
# ### #
#######
# # #
###
@#@
@###@
#
@
Note intéressante
En regardant la séquence du nombre de cellules occupées dans l'OEIS, j'ai découvert que l'ivrogne quantique était isomorphe à la séquence de cure - dents beaucoup mieux étudiée . Si vous pouvez intégrer cette connaissance à un meilleur golf, je serai bien impressionné.
la source
n=10
est correct? J'ai essayé quelques approches et elles ont toutes la même (mauvaise) réponse, alors je veux juste m'assurer. Ça a l'air un peu éteint mais je ne sais pas.Réponses:
Wolfram Language (Mathematica) ,
9291 octetsUn défi parfait pour utiliser les fonctionnalités de Mathematica
CellularAutomaton
!Essayez-le en ligne!
Vide = 0, éveillé = 1, en sommeil = 2
Animation des 256 premières itérations (blanc = vide, gris = réveillé, noir = en sommeil):
Explication
Run
CellularAutomaton
avec des spécifications ...Appliquez la règle totaliste 3 couleurs 7049487784884, avec le voisinage de Von Neumann ...
Sur un tableau avec un seul 1 au milieu, avec un fond de 0 ...
Répétez
<input>
fois ({j#}
évalue à{{{#}}}
). Le tableau se développe automatiquement si une cellule à l'extérieur de la bordure n'est pas identique à l'arrière-planCette règle vient du numéro de base 3
220221220221220221220221220
, ce qui signifie « changer tout1
ou2
à2
et changer0
de1
si et seulement s'il y a un nombre impair de1
s autour d' elle. »Imprimer le tableau.
La demi-preuve de "'impair
1
' 'équivaut à' exactement un1
'":Considérez cette grille de pixels 5x5. Le blanc est un
0
ou une2
cellule (pixels non éveillés) et le gris est une1
cellule.Si une
1
cellule a été générée autour de trois0
cellules, la grille doit alors ressembler à ceci: elle comporte trois1
colonnes disposées en forme de U (ou une version tournée) comme suit:En raison de l'auto-similarité de cet automate cellulaire, tout motif apparaissant dans l'automate cellulaire doit apparaître sur la diagonale (par induction). Cependant, ce motif n'est pas symétrique en diagonale. c'est-à-dire qu'il ne peut pas apparaître sur la diagonale ni apparaître nulle part sur l'automate cellulaire.
Awake / Sleeping sont équivalents
Notez qu'une
0
cellule ne peut pas être entourée par exactement une ou trois2
cellules et des cellules restantes0
, car cela impliquerait que certaines étapes précédentes, la cellule avait un voisin d'une ou trois1
cellules - et devait être1
déjà devenue une (contradiction). Par conséquent, il est normal d'ignorer la distinction entre1
et2
et l'état "change tout1
en un1
, et un0
en un1
si et seulement s'il a un nombre impair de voisins non nuls".L’automate cellulaire qui en résulte est en effet identique à l’original, la seule différence étant qu’il n’ya pas de distinction entre les ivrognes "éveillés" et "endormis". Ce modèle est décrit dans le document OEIS A169707 .
Essayez-le en ligne!
Comparaison côte à côte des 16 premières itérations:
L'ajout de deux itérations consécutives donne un résultat conforme aux spécifications de défi (94 octets):
Essayez-le en ligne!
la source
Python 2 , 192 octets
Essayez-le en ligne!
-17 octets grâce à Mr. Xcoder
-9 octets utilisant le format de sortie de Jonathan
-11 octets grâce à Lynn
-3 octets grâce aux ovs
la source
exec
enregistre 9 octets de moins et…for k in 0,1,2,3for…
un de plus: Linkn=[C+k for k in-1j,1j,-1,1for C in c]
sauve un octet de plus!X+Y*1jin
c'est quelque chose que je ne pensais pas vraiment possible: PC,
360354343319Les nouvelles
#define
lignes après les non- lignes sont juste pour la présentation ici, elles ne sont donc pas comptées. J'ai inclus une fonction wrapper, donc −6 (313) si la fonction n'est pas comptée et que vous supposez qu'ellen
vient d'ailleurs.q(10)
les sorties:Utilisation
pour vide,
"
pour dormir et!
pour dormir .Cela fonctionne comme suit:
A(i,b,e)
est “i∈ [b, e).”,B(b,e)
est “r∈ [b, e) .∀c∈ [b, e).”Remarquez qu'après n générations, le tableau est égal à 2 n + 1 carré.
En raison de la symétrie du tableau, il suffit de simuler le quadrant inférieur droit. Nous allouons donc une matrice carrée n + 1 avec une ligne et une colonne de remplissage pour la recherche de voisin ultérieure (donc n + 2).
Allouer avec
calloc
nous permet de multiplier simultanément la largeur par la hauteur et de vider le tableau0
(vide).Lors de la recherche d'une cellule par ses coordonnées (
C
etD
), il utilise la valeur absolue de la ligne et de la colonne (W
) pour refléter automatiquement les coordonnées.Le tableau est stocké sous la forme d'un tableau de paires d'entiers représentant les générations actuelle et précédente. Les entiers en question sont
char
donc évitablessizeof
.La génération la plus recherchée (par le test du voisin) est la génération précédente, elle est donc placée à l'index 0 de la paire pour pouvoir y accéder avec
*
.A chaque génération (
g
), la génération actuelle est copiée sur la génération précédente à l'aide d'uneB
boucle, puis la nouvelle génération est générée à partir de l'ancienne.Chaque cellule est représentée en utilisant
0
pour vide,1
pour éveillé et2
pour dormir. Compter les voisins était à l’origine un calcul du nombre de bits définis dans les 4 bits les plus bas de la cellule lorsque les 4 voisins sont décalés et ordonnés ensemble en tant qu’indicateurs (N
), à utiliser16
pour dormir. Mais avec l'observation qu'un nombre impair de voisins équivaut à exactement 1 voisin, nous pouvons enregistrer plusieurs caractères en utilisant simplement un masque avec 1.À la fin, le tableau est entièrement imprimé en effectuant une itération sur le quadrant inférieur droit en utilisant la même astuce de coordonnées de valeur absolue, moins le remplissage, de sorte que nous n'imprimons pas le remplissage extérieur sur le tableau. C'est aussi pourquoi la
B
boucle inclut une accolade d'ouverture, car nous avons l'instruction extra newline dans la boucle externe.Les codes ASCII mappent commodément 0 + 32 (vide) sur un espace, 2
"
+ 32 (en veille) sur et 1 + 32 (éveillé) sur!
.Globalement, je pense qu’il s’agit d’un golf étonnamment lisible en raison de la belle structure du problème.
la source
putchar(10)
parputs("")
&~
n'est pas une NAND, je voulais dire que je pense parfois!(a &~ b)
en termes dea NAND (NOT b)
, bien que dans ce cas, la logique!
ne soit pas la même que celle du bit~
parce que nous comptons sur le0
ou le1
résultat de!
.MATL , 39 octets
Cela affiche
Empty
comme(espace)
Awake
comme#
Sleeping
comme!
.Essayez-le en ligne! Vous pouvez également regarder le motif se développer dans l’art ASCII ou graphiquement (code modifié).
Explication
Le code utilise des nombres complexes
0
,1
,j
pour représenter les trois états: vide, réveil, sommeil respectivement.la source
Befunge,
384304 octetsEssayez-le en ligne!
Le problème pour essayer d'implémenter ce genre de chose dans Befunge est la taille de la mémoire limitée (2000 octets pour les données et le code). J'ai donc dû utiliser un algorithme qui calcule le caractère correct pour une coordonnée donnée sans faire référence aux calculs précédents. Il y parvient en regardant de manière récursive dans tous les chemins possibles que l'ivrogne aurait pu suivre pour atteindre ce point.
Malheureusement, ce n'est pas une solution particulièrement efficace. Cela fonctionne, mais il est incroyablement lent et devient d'autant plus lent que la valeur de n est grande . Ainsi, bien que cela puisse potentiellement fonctionner pour n n’importe quel nombre d’environ 127 (limite de cellules mémoire de Befunge de 7 bits), dans la pratique, vous perdrez inévitablement tout intérêt à attendre le résultat. Sur TIO, le délai d'attente de 60 secondes sera dépassé (au mieux, environ 6). Un compilateur fera beaucoup mieux, mais même dans ce cas, vous ne voudriez probablement pas aller beaucoup plus haut que 10.
Néanmoins, je pensais que cela valait la peine d'être soumis car c'est en fait une assez belle démonstration d'une "fonction" récursive dans Befunge.
la source
Python 2 , 214 octets
Essayez-le en ligne!
Explication
Utilisations
0
pourempty
,1
poursleeping
et2
pourawake
. Imprime une liste de caractères à deux dimensions (chaînes d'une longueur).Définit une fonction qui prend un entier non négatif
n
. Avance successive de l'automate cellulaire jusqu'à atteindre l'état souhaité. Enfin, une conversion entre les valeurs entières internes et les caractères réels est appliquée.la source
Lua ,
251242239238 octets-8 octets en simplifiant l'initialiseur de la matrice au prix de quelques espaces supplémentaires supplémentaires.
-1 octet en se transformant
c=i==2+...and print(s)
enc=i~=2+...or print(s)
.-3 octets en construisant d'abord une chaîne complète et en imprimant une fois à la fin.
-1 octet grâce à Jonathan Frech en réécrivant en
or(g(...)==1 and
tant queor(1==g(...)and
.Essayez-le en ligne!
Vide = Espace
éveillé =
1
Dormir =
0
Prend une entrée à partir de la ligne de commande et imprime sur stdout.
En représentant les états comme
false
/nil
,1
et en0
interne, la détection « vide » n'a pas besoin de code et le contrôle « exactement éveillé » peut être fait avec un simple ajout.la source
or(g(...)==1 and
peut êtreor(1==g(...)and
.APL (Dyalog) , 38 octets
Essayez-le en ligne!
-4 grâce à Adám .
-8 grâce à ngn .
la source
Gelée ,
3929 octetsEssayez-le en ligne!
Utilisations
0
,1
et2
pour vider éveillé et dormir. Le pied de page dans le lien convertit cela en,
@
et#
.ṬŒḄ
au lieu deḤḶ=¹
.-
au lieu de1N
. Rend également¤
inutile.S
au lieu de+/
.Ḃ+Ḃ+
au lieu de%3=1+=1Ḥ$+
. Maintenant utilise2
pour dormir au lieu de3
.Explication à venir ...
la source
APL (Dyalog Classic) , 38 octets
Essayez-le en ligne!
basé sur la solution d'Erik the Outgolfer
⍪1
est une matrice 1x1 contenant 1⎕
entrée évaluée( )⍣⎕
appliquer autant de fois(⌽0,⍉)⍣4
entourez avec des 0, c’est-à-dire 4 fois: transposez (⍉
), ajoutez des 0 à gauche (0,
), inversez horizontalement (⌽
)g←3+/0,,∘0
une fonction qui additionne les triples horizontaux, appelez-lag
⍉∘g∘⍉
une fonction qui additionne les triples verticaux - eng
cours de transposition2 | ⍉∘g∘⍉ + g←3+/0,,∘0
somme des deux sommes modulo 2⌈
le plus grand entre ça et ...2∘∧
le LCM de 2 et la matrice d'origine - cela transforme les 1 en 2, tout en préservant les 0 et les 2la source
Perl 5 , 192 + 1 (
-n
) = 193 octetsEssayez-le en ligne!
Utilise 0 pour vide, 1 pour éveillé et 2 pour endormi.
la source
Ruby ,
164153 octetsEssayez-le en ligne!
Utilise "" pour vide, "@" pour éveillé et "#" pour dormir (comme dans l'exemple). Je pourrais économiser 6 octets en utilisant des chiffres à la place, je suppose, mais ça a l'air mieux comme ça.
la source
Pip ,
6961 octets60 octets de code, +1 pour le
-l
drapeau.Prend
n
comme argument de ligne de commande. Utilisations0
pour vide,1
pour éveillé et2
pour dormir. (Pour obtenir un meilleur art ASCII comme dans les exemples du défi, remplacez la finaley
par" @#"@y
.)Essayez-le en ligne!
Explication
Installer:
Boucle principale:
où le corps de la fonction est:
Après la boucle, nous imprimons simplement
y
. L'-l
indicateur signifie que la liste imbriquée est imprimée en concaténant le contenu de chaque ligne et en séparant les lignes avec des nouvelles lignes.la source
Java (OpenJDK 8) , 220 octets
Essayez-le en ligne!
Remarque: le tableau renvoyé contient une bordure ou des
'\0'
caractères. Puisque l'avion est supposé être infini, seul le non-frontière est utilisé.Mappage de caractères:
(espace)
=
0
Enregistre
la source
@
contrôle, et vous avez trouvé la clé! Agréable. Lachar
diffusion était un oubli total de ma part.Python,
199192 octetsCe code fonctionne à la fois sur Python 2 et Python 3, mais il utilise la bibliothèque Numpy tierce partie pour effectuer la gestion des tableaux.
print(f(6))
les sortiesSi vous voulez une impression plus jolie, vous pouvez l'appeler comme suit:
qui imprime en utilisant les mêmes caractères que ceux donnés dans la question.
la source
[e]ach state should be represented by a different character
(j'interprètecharacter
comme un caractère ASCII réel plutôt que comme un entier).