La règle 110 est un automate cellulaire avec des propriétés intéressantes. Votre objectif est de simuler une règle 110 avec le moins de caractères possible.
Pour ceux qui ne le savent pas, la règle 110 est simulée ligne par ligne dans une grille. Chaque carré d'une ligne de la grille examine les carrés au-dessus, au-dessus de la gauche et au-dessus de la droite pour déterminer quelle cellule il doit être.
current pattern 111 110 101 100 011 010 001 000
new cell 0 1 1 0 1 1 1 0
Entrée: nombres de 0 à 39 représentant la nième carré d'entrée de la ligne supérieure, dans n'importe quel format raisonnable (chaîne séparée par des virgules, liste, arguments de fonction). Pour prendre en charge les langues indexées 1, les nombres peuvent également être indexés 1 et vont donc de 1 à 40.
Exemple d'entrée:
38,39
Sortie: une grille 40 x 40 représentant les automates en cours d'exécution, y compris la première ligne. Vous devez laisser 0 vide et 1 tout caractère d'impression visible. Les espaces de fin sont autorisés, tant que la grille réelle peut être raisonnablement distinguée. Le bas de la grille peut avoir une nouvelle ligne mais il ne doit pas y avoir de lignes vides entre les lignes de la grille.
Exemple de sortie:
XX
XXX
XX X
XXXXX
XX X
XXX XX
XX X XXX
XXXXXXX X
XX XXX
XXX XX X
XX X XXXXX
XXXXX XX X
XX X XXX XX
XXX XXXX X XXX
etc.
Remarque: Une question similaire sur les automates cellulaires 1D a déjà été posée, mais j'espère qu'en utilisant une seule règle, des réponses plus courtes pourront être écrites.
Réponses:
CJam - 47
Il utilise
!
pour les cellules "1".Essayez-le sur http://cjam.aditsu.net/
Explication:
S40*
crée une chaîne (tableau) de 40 espacesl',/
lit une ligne et se divise par une virgule{…}/
exécute le bloc pour chaque élément (les nombres sous forme de chaîne)-
i'!t
convertit le nombre en entier et définit l'élément à cette position dans la chaîne précédente (initialement 40 espaces ) à '!'À ce stade, nous avons obtenu la première ligne.
{…}39*
exécute le bloc 39 fois-
N
ajoute une nouvelle ligne-
40,
crée le tableau [0 1… 39]-
S3$S++
copie la ligne précédente (position 3 sur la pile) et la remplit d'un espace de chaque côté-
f{…}
exécute le bloc pour {chaque numéro à partir de 0 à 39} et {la ligne matelassée}-
>3<
prend une tranche de 3 éléments de la ligne matelassée en commençant par le nombre actuel-
2b
convertit à partir de la base 2; les éléments que nous avons découpés ne sont pas des chiffres de base 2, mais les caractères sont convertis en leurs valeurs ASCII et '' mod 8 est 0 et '!' le mod 8 est 1-
137Yb
convertit 137 en base 2 (Y
= 2), obtenant [1 0 0 0 1 0 0 1], qui est 110 inversé et annulé (sur 8 bits)-
='!^
obtient le chiffre de base 2 correspondant (le le tableau s'enroule donc l'index est pris mod 8) et xor avec le '!' caractère, résultant en «!» pour 0 et '' pour 1la source
Ruby, 113 caractères
Prend une entrée sur stdin. Pour utiliser une règle différente, remplacez simplement le
110
dans la dernière ligne par la règle que vous souhaitez essayer.Exemple:
la source
Mathematica, 122 octets
Oui, vous pourriez considérer cela comme abusant de cette échappatoire , mais a) cette échappatoire est assez contestée, b) une question de l'automate cellulaire a besoin d' une réponse Mathematica (en particulier une sur la règle 110) et c) la réponse Ruby de Ventero est plus courte de toute façon, donc je ne pense pas qu'il y ait de mal.
La plupart des caractères sont utilisés pour l'analyse syntaxique d'entrée et le formatage de sortie. L'automate réel est simulé en utilisant
Cela utilise des conditions aux limites périodiques (de sorte que la grille s'enroule).
la source
Python - 141
Exécuter comme par exemple
python 110.py <<< 38,39
la source
['X',' ']
pourrait être modifié'X '
pour enregistrer 5 caractères.o=range()
q,
676258 octetsNe suppose aucun bouclage:
Ancienne version
la source
Python, 186
Décent mais probablement pas optimal.
Vous n'avez pas précisé comment les entrées sont obtenues, je viens de créer une fonction.
Exemple d'utilisation:
Sortie:
la source
Mathematica, 113 caractères
Une autre réponse Mathematica utilisant
CellularAutomaton
.la source
" "["X"][[#]]&
marche?" "["X"][[1]]
est"X"
." "["X"][[0]]
renvoie la tête de" "["X"]
, à savoir" "
.C - 178
Ce code dépend du fait que chaque ligne d'une matrice est stockée dans une mémoire contiguë. De plus, il n'imprime pas la première ligne, mais il imprime les 40 suivantes, car les règles ne spécifiaient qu'une grille 40x40.
Indenté pour la lisibilité uniquement, le nombre d'octets comprend uniquement le code nécessaire.
la source
Lua - 351
Pas la langue idéale pour jouer au golf.
la source
do u(n,i,'x')
c'est intentionnel, non?Haskell ,
175170169136136127124octets−9 octets grâce à @bmo
Essayez-le en ligne!
la source
Haskell ,
135 131130 octets-1 octet grâce à Ørjan Johansen (réarrangement
take 40
)Approche complètement différente de la réponse de FrownyFrog mais à peu près de la même longueur:
Explication
La fonction110 -rule est assez simple: en utilisant
r
qui applique lazipWith3
et un peu de remplissage, nous pouvons externaliser la décision réelle pour la cellule suivante pour(?)
:le
(?)
opérateur est la partie la plus intéressante de la solution: Auparavant, j'utilisais une règle booléenne générée avec une carte de Karnaugh, mais il s'avère qu'il existe un moyen encore plus concis:la source
take 40$
avantmap(" o"!!)<$>
.Husk ,
3128 octetsHah, Husk bat Jelly!
Essayez-le en ligne!
Explication et non golfé
Avant d'ajouter une explication, permettez-moi de dissiper un peu cela. Supprimons d'abord les différentes compositions, ajoutons des parenthèses explicites et décompressons la
¨↑¨
chaîne. Remplaçons également40
par4
pour une explication plus lisible:la source
Java, 321 caractères
Entrée passée comme argument à partir de la ligne de commande, par exemple
java R 38,39
Je n'ai jamais écrit de code java plus obscur :-)
la source
Mise à jour: exemple de sortie correct ici (avec 40 lignes et non 50): Nouvelle sortie ci-dessous (supprimée la précédente pour plus de brièveté):
En faisant un autre casse-tête, j'ai appris quelque chose d'intéressant sur l'imbrication des instructions pour les boucles en php, et soudain, elles sont beaucoup plus complexes que je ne le pensais à l'origine. Quand j'aurai le temps, je pense que je peux battre ce score considérablement. Pour l'instant, il reste inchangé à un 408 non compétitif.
Ma version php 408 caractères:
Ce fut un grand puzzle. J'ai aussi passé beaucoup de temps à jouer avec les entrées car ce sont des choses fascinantes, il faut le dire. Quoi qu'il en soit, voici ma version PHP (qui est loin d'être aussi bonne que certaines des réponses publiées mais est complète. En 0ème position, ne prenez que ci-dessus et au-dessus à droite, en 39ème position, prenez uniquement au-dessus et au-dessus à gauche, c'est-à-dire sans emballage. Donc ici est ma version:
Vous pouvez le voir et l'exécuter ici: http://codepad.org/3905T8i8
Input est une chaîne d'entrée au début sous la forme $ a = '38, 39 ';
La sortie est la suivante:
J'espère que vous aimez!!!
PS J'ai dû ajouter quelques sauts de ligne au code pour que vous puissiez voir tout cela et ne pas le faire s'étendre sur la page avec une barre de défilement.
la source
Stax , 24 octets CP437
Exécutez et déboguez en ligne!
Utilise le point de code 1 dans CP437 pour les cellules "1".
Excellent cas pour montrer la puissance de cette langue.
Explication
Utilise la version non compressée (29 octets) pour expliquer.
la source
K (ngn / k) ,
4435 octetsEssayez-le en ligne!
{
}
fonction avec argumentx
!40
liste d'entiers de 0 à 39x?
trouver leurs indices dansx
, utiliser0N
(le "null entier") pour non trouvé^
lesquels sont nuls? cela nous donne l'entrée, niée39{
}\
appliquer 39 fois, en recueillant les résultats intermédiaires dans une liste1,x,1
entourer la liste de 1s (0 négatif)3'
triplets d'articles consécutifs2/'
décodage binaire chacun@
utiliser comme indices dans ...2\145
encodage binaire 145 (bits niés de 110)"X "
enfin, utilisez la matrice 40x40 comme indices dans la chaîne"X "
(l'@
ici est implicite)la source
Gelée , 29 octets
Essayez-le en ligne!
la source