Le jeu de la vie de Conway est l'exemple classique de l'automatisation cellulaire. Les cellules forment une grille carrée et chacune a deux états: vivant ou mort. A chaque tour, chaque cellule se met à jour simultanément en fonction de son état et de celui de ses huit voisins:
- Une cellule vivante reste en vie si elle a exactement deux ou trois voisins vivants
- Une cellule morte devient vivante si elle a exactement trois voisins vivants
Votre mission, si vous acceptez de l'accepter, consiste à coder la mise en œuvre la plus courte de Game of Life dans votre langue préférée.
Les règles:
- La grille doit être au moins 20x20
- La grille doit envelopper (donc la grille est comme la surface d'un tore)
- Votre implémentation doit permettre à l'utilisateur de saisir ses propres modèles de départ.
- GoL est un peu inutile si vous ne pouvez pas voir ce qui se passe, il doit donc y avoir une sortie visuelle de l'automate en marche, le résultat de chaque tour étant affiché suffisamment longtemps pour être vu!
;
précèdent}
. Aussi,var
s peut être éliminé à certains moments (si cela ne casse pas votre code). Et pour une lignefor
s,if
vous pouvez éliminer s etc, le{ }
tout à :for(...) for(...) dosomething()
.Réponses:
Toile HTML5 avec JavaScript,
940639586519 caractèresJ'ai toujours voulu faire quelque chose avec canvas, donc voici ma tentative (version originale en ligne ). Vous pouvez changer de cellule en cliquant sur (également possible en mode de fonctionnement).
Vous pouvez maintenant aussi essayer la nouvelle version ici .
Malheureusement, il y a un problème que je ne pouvais pas encore résoudre. La version en ligne comporte 11 caractères de plus, car jsFiddle place un nœud de texte juste avant le canevas (pourquoi?) Et le canevas n’est donc plus le premier enfant.
Edit 1: Beaucoup d’optimisations et de restructurations.
Edit 2: Plusieurs modifications mineures.
Edit 3: En ligne le bloc de script complet plus les modifications mineures.
la source
1
rendre aussi rapide que le mien plutôt que de marcher lentement. De plus, si vous souhaitez implémenter le dessin (plutôt que de cliquer sur chaque carré), vous pouvez arrondir la position de la souris à la taille de bloc la plus proche et remplir le rectangle à cet endroit. Plus de personnages mais plus de points.new Array('#FFF','#800')
par['#FFF','#800']
.s
tableau surtan
etred
puisque ce sont les deux couleurs avec les représentations les plus courtes - vous enregistre deux caractères. Aussi, si possible, mettez la version littérale dej
dans l'intervalle. Je suis sûr qu'il y a encore beaucoup à faire.Python, 219 caractères
Je suis allé pour golfage maximum, avec juste assez d’interface pour répondre à la question.
Vous l'exécutez comme ceci:
Les nombres dans la liste représentent les coordonnées des cellules de départ. La première ligne est 0-19, la deuxième ligne est 20-39, etc.
Exécutez-le dans un terminal avec 21 lignes et il a l'air plutôt élégant.
la source
2-(p in P)
==2-({p}<P)
. Mais vous devrez alors modifier votre saisie en{8,29,47,48,49}
:)TI-BASIC, 96 octets (87 pour entrée non concurrente)
Pour votre calculatrice graphique de la série TI-84 (!). Ce fut tout un défi, car il n'y a pas moyen facile d'écrire une routine graphique en mémoire tampon (certainement rien construit), et l'écran graphique ne comporte que quatre commandes graphiques pertinentes:
Pxl-On()
,Pxl-Off()
,Pxl-Change()
, etpxl-Test()
.Utilise tous les pixels accessibles à l’écran et s’enveloppe correctement. Chaque cellule correspond à un pixel et le programme met à jour ligne par ligne horizontalement vers la droite de l'écran. Étant donné que les calculatrices ne disposent que d’un processeur z80 à 15 MHz et que BASIC est un langage interprété lentement, le code ne reçoit qu’une image toutes les cinq minutes environ.
La saisie utilisateur est simple: avant d’exécuter le programme, utilisez l’outil Plume pour dessiner votre forme sur l’écran du graphique.
Adapté de mon inscription à un concours de golf sur le forum de la calculatrice Omnimaga .
Version Omnimaga (87 octets)
Ce code a une fonctionnalité supplémentaire: il détecte s'il est exécuté pour la première fois et aléatoirement l'état de l'écran. Lors des exécutions suivantes, la simulation se poursuit automatiquement si elle est arrêtée à la fin d'une image. Toutefois, il ne s’agit pas d’une entrée concurrente car elle n’enroule pas l’écran; les cellules sur la bordure extérieure seront toujours considérées comme mortes si l'écran du graphique est préalablement effacé.
Cette version est probablement le code le plus golfé que j'ai jamais écrit, et contient quelques optimisations vraiment méchantes:
J'utilise l'état d'horloge comme un drapeau. Au début du programme, la date / heure est activée et j'utilise la valeur de l'indicateur global isClockOn pour déterminer s'il s'agit de la première itération. Une fois la première image dessinée, je ferme l'horloge. Enregistre un octet sur la méthode la plus courte et environ quatre sur la méthode évidente.
Je stocke les états des trois colonnes à côté de celle qui est mise à jour dans un tableau de 63 éléments en nombre en base 7. La place du 49 tient la colonne à droite, celle du 7 la colonne du milieu et la place des unités la colonne de gauche - 1 pour une cellule vivante et 0 pour une cellule morte. Ensuite, je prends le reste mod 6 de la somme des trois nombres autour de la cellule en cours de modification pour trouver le nombre total de cellules voisines vivantes (c'est comme la divisibilité par 9 astuce - en base 7, le reste mod 6 est égal à la somme de les chiffres). Enregistre environ 10 octets par lui-même et donne la possibilité d'utiliser les deux optimisations suivantes. Exemple de diagramme (supposons qu’il existe un planeur centré sur une certaine colonne à Y = 45:
La cellule centrale restera morte car elle est entourée d’exactement cinq cellules vivantes.
Une fois chaque ligne complétée, les nombres du tableau sont mis à jour en divisant les nombres existants par 7, en supprimant la partie décimale et en ajoutant 49 fois les valeurs des cellules de la nouvelle colonne. Le stockage des trois colonnes à chaque fois serait beaucoup plus lent et moins élégant, prenez au moins 20 octets supplémentaires et utilisez trois listes au lieu d'une, car les valeurs des cellules de chaque ligne doivent être stockées avant la mise à jour des cellules. C’est de loin le moyen le plus simple de stocker les positions des cellules.
L'extrait
int(3fPart(3cosh(
donne1
lorsque l'entrée est égale à 3/6,2
lorsqu'elle est égale à 4/6 et0
lorsqu'elle est égale à 0, 1/6, 2/6 ou 5/6. Économise environ 6 octets.la source
Mathematica - 333
Fonctionnalités:
Interface interactive: cliquez sur les cellules pour créer vos motifs
Belle grille
Boutons: RUN, PAUSE, CLEAR
Le code est ci-dessous.
Si vous voulez avoir une idée de la façon dont cela fonctionne, le deuxième exemple de ce blog est simplement une version plus élaborée (analyse en direct de Fourier, meilleure interface) du code ci-dessus. L'exemple devrait fonctionner directement dans votre navigateur après le téléchargement du plugin gratuit.
la source
C 1063 caractères
En tant que défi, j’ai fait cela en C en utilisant l’API Windows non favorable au golf pour des E / S en temps réel. Si le verrouillage est activé, la simulation sera exécutée. Il restera immobile si Capslock est désactivé. Dessiner des motifs avec la souris; clic gauche ravive les cellules et clic droit tue les cellules.
Le fichier EXE compilé peut être trouvé ici
Edit: j'ai commenté la source. C'est disponible ici
la source
J (39 caractères)
Basé sur cette version APL (même algorithme, convolution toroïdale).
Exemple d'utilisation:
la source
Mathematica, 123 caractères
Une implémentation très rudimentaire qui n'utilise pas la fonction intégrée CellularAutomaton de Mathematica.
la source
Ruby 1.9 + SDL (
380325314)EDIT : 314 caractères, et correction d'un bug avec des cellules supplémentaires apparaissant en vie à la première itération. Augmentation de la taille de la grille à 56 car la routine de couleur ne considère que les 8 bits les plus bas.
EDIT : Golf jusqu'à 325 caractères. La largeur / hauteur de la grille est maintenant de 28 puisque 28 * 9 est la plus grande que vous puissiez avoir tout en utilisant la valeur comme couleur d’arrière-plan. De plus, il ne traite plus qu’un seul événement SDL par itération, ce qui évite complètement la boucle interne. Assez serré je pense!
La simulation commence en pause et toutes les cellules sont mortes. Vous pouvez appuyer sur n’importe quelle touche pour basculer en pause ou en pause, puis cliquer sur n’importe quelle cellule pour la faire basculer entre vivante et morte. Effectue une itération tous les dixièmes de seconde.
L'emballage est un peu insipide.
Ressemble à ça:
Défi amusant! Je me félicite des améliorations que tout le monde peut voir.
la source
Scala,
118111581128106310181003999992987 caractèresUngolfed:
La plus grande partie du code ici est du matériel d'interface graphique Swing. Le jeu lui-même est dans la
actionPerformed
méthode qui est déclenchée par leTimer
, et la fonction d'assistancen
qui compte les voisins.Usage:
Compilez-le avec
scalac filename
puis lancez-lescala L
.En cliquant sur un carré, il passe de la vie à la mort, et l'option de menu démarre et arrête la partie. Si vous souhaitez modifier la taille de la grille, modifiez les trois premières valeurs de la ligne:
var(w,h,c,d,r)=(20,20,20,0,false)
il s'agit respectivement de la largeur, de la hauteur et de la taille de la cellule (en pixels).la source
import java.awt.event._
etcontents+=m("Go",true)+=m("Stop",false)}}
menant à 1093 caractères.Pure Bash, 244 octets
Fonctionne sur un univers 36x24 à enveloppe toroïdale:
Puisqu'il s'agit d'un script shell, la méthode d'entrée est conforme aux autres commandes shell - c'est-à-dire depuis stdin:
... etc
Nous pouvons rediriger les entrées de n’importe quelle source de texte, via un
tr
filtre pour obtenir des générations initiales intéressantes, par exemple:la source
JavaScript, 130
Pas tout à fait à la hauteur du défi, mais pour l’instant, voici un moteur Game of Life de 130 octets fabriqué par Subzey et moi en 2013.
http://xem.github.io/miniGameOfLife/
la source
@@\n@@
(carré 2 sur 2 dans le coin supérieur gauche) ou.@\n.@\n.@
. (Colonne 1 par 3)C # - 675 caractères
J'ai toujours voulu écrire une version de ce programme. Je ne savais jamais que cela ne prendrait qu'une demi-heure de paresse pour une version rapide et sale. (Le golf prend beaucoup plus de temps, bien sûr.)
Usage
Compromis de golf
la source
GW-BASIC,
10861035 octets (en jetons)Sous forme symbolisée, il s'agit de 1035 octets. (Le formulaire ASCII est bien sûr un peu plus long.) Vous obtenez le formulaire à jeton en utilisant la
SAVE"life
commande sans ajout",a
dans l'interpréteur.C'est la version avec maximum de golf, mais elle est toujours fonctionnelle: au démarrage, vous obtenez un éditeur dans lequel vous pouvez vous déplacer avec les touches du curseur; espace active / désactive les bactéries sur le champ actuel,
c
efface l'écran, retourne en mode de jeu.Suit une version moins obscurcie, qui définit également un tableau de jeu initial avec deux structures (une chose en rotation circulaire et un planeur):
J'ai écrit ceci en 15 minutes en m'ennuyant et en attendant un ami qui jouait du code-golf avec son «apprenti» pour Game of Life de Conway en même temps.
Cela fonctionne comme ceci: Il utilise immédiatement le tampon d’écran en mode texte 80x25 (changez l’initiale
DEF SEG
pour utiliser&hB000
si vous êtes sur une carte graphique Hercules; ces paramètres fonctionnent avec Qemu et (plus lent) dosbox). Un astérisque*
est une bactérie.Cela fonctionne en deux passes: premièrement, les lieux de naissance sont marqués
+
et la mort marque ses cibles.
. Dans le second passage,+
et.
sont remplacés par*
et, respectivement.
Le
TIMER
truc est de faire attendre une demi-seconde après chaque tour, au cas où votre hôte Qemu serait très rapideJe n'espère pas le prix le plus court, mais un prix raisonnable, en particulier compte tenu de la configuration initiale du tableau. J'ai aussi une version où le moteur de jeu a été remplacé par le code d'assemblage, au cas où cela vous intéresserait…
la source
1
-d2
.3
,,, etc.) Ou les numéros de ligne ne comptent-ils pas?Mathematica, 115 octets
Voici une échappatoire facile à ceci:
la source
Java (OpenJDK 8) -
400 388367 octetsDeuxième et (probablement) Final Edit: Géré au golf 21 octets supplémentaires après la découverte de ces mines (imo) d’ or , il est vivement recommandé à de nouvelles personnes de les lire (en particulier si vous comptez essayer certains de ces défis en utilisant Java).
Le code résultant (va probablement finir par jouer au golf encore plus si je découvre comment raccourcir les boucles doubles imbriquées ...):
Essayez-le en ligne!
(Le post original commence ici.)
En fait, j'ai pensé un instant que je pourrais au moins contester la meilleure réponse Python avec ma connaissance (certes limitée) de Java lol ... C’est un défi que j’ai quand même pris plaisir à participer (bien que j’ai rejoint le parti un peu en retard ...)
Il n'y a pas grand-chose à cela vraiment - explication de base comme suit (non-golfé):
(plus d'informations sur les instructions lambda dans Java 8 ici )
Oui, il y a un problème avec mon approche.
Comme la plupart d’entre vous l’a probablement remarqué, le code que je joue au golf dans sa version actuelle fera une boucle pour toujours. Pour éviter cela, un compteur peut être introduit en haut et utilisé dans la boucle while pour n'afficher que
n
(dans ce cas, 5) les itérations comme suit (notez la nouvelleb
variable ajoutée):De plus, quelques points méritent d’être mentionnés. Ce programme ne vérifie pas si l'entrée est correcte et échouera donc avec (très probablement) un
ArrayOutOfBoundsException
; en tant que tel, assurez-vous de vérifier que l'entrée est valide en remplissant complètement une partie d'un tableau (les tableaux en brochettes renverront l'exception mentionnée ci-dessus). De plus, le tableau actuel semble «fluide», c'est-à-dire qu'il n'y a pas de séparation entre les générations. Si vous souhaitez ajouter cela pour vérifier que les générations produites sont bien valides,System.out.println();
vous devez en ajouter un avantfor(int[]t:u)Arrays.fill(t,0);
(voir la section Essayez-le en ligne! Pour plus de clarté). Et dernier point, mais non le moindre, étant donné qu'il s'agit de mon premier code golf, tout commentaire est grandement apprécié :)Ancien code de la réponse précédente de 388 octets:
Et à partir de la réponse initiale de 400 octets:
la source
Pochoir , 6 octets
Pas ma langue préférée, mais il est court ...
4 octets de code plus les
∊
indicateurs nlist etT
orus.Essayez-le en ligne!
Est ...
3
3∊
membrem
du m oore-quartier-comte avec soi oue
la lande e -neighbourhood-comte sans moi...?
la source
Scala - 799 caractères
Exécuter en tant que script. Un clic de souris sur un carré permet de l'activer ou de le désactiver et n'importe quelle touche démarre ou arrête la génération.
la source
J, 45
Je pensais que j'essaierais J Ce n'est pas encore très bien joué au golf, mais je vais essayer encore une fois.
Exemple:
la source
Traitement
536532Je crois que cela satisfait à toutes les exigences.
Ungolfed:
la source
Matlab (152)
Je n'ai pas installé Matlab pour le tester, je viens de jouer au code que j'ai écrit il y a quelques années.
Ungolfed:
la source
Perl,
218216211202 octets(Pas de nouvelle ligne à la fin de ce code.)
Lit le modèle de départ à partir de l'entrée standard, sous la forme d'un fichier texte dans lequel les cellules vivantes sont représentées
1
, les cellules mortes sont représentées sous la forme d'un espace, les lignes étant séparées par une nouvelle ligne. L'entrée ne doit pas avoir de caractères autres que ceux-là. Les lignes peuvent être de longueur variable et seront complétées ou tronquées à exactement 79 cm de large. Exemple d'entrée est un canon de planeur:Lorsque le programme exécute Game of Life, chaque état est transféré dans la sortie standard dans un format similaire à celui de l'entrée, puis retarde 0,1 seconde. Le délai peut être personnalisé en modifiant le quatrième argument de l'appel sélectionné.
Le plateau de jeu est codé en dur à la taille 79x23. Il est enveloppé dans un tore: si vous laissez la planche en bas, vous vous retrouvez en haut; si vous partez du côté droit, vous vous retrouvez du côté gauche mais décalé d’une rangée vers le bas.
Voici une autre version qui ne lit aucune entrée et qui part d'un tableau aléatoire:
Ce code est dérivé d' un programme de jeu Perl obfusqué que j'ai écrit il y a des années . Je l'ai beaucoup changé pour que la planche soit toroïdale et que le code soit reconnu.
Ce n'est probablement pas la méthode la plus courte pour implémenter Game of Life en perl, mais c'est l'une des moins compréhensibles.
la source
Python, 589 octets
Boutons de la souris: gauche - mettre une cellule, droite - supprimer une cellule, milieu - démarrer / arrêter.
Et voici une version où vous pouvez faire glisser la souris pour dessiner. Les graphismes sont un peu plus agréables.
la source
if 1<n<4:
devrait être en retrait au même niveau quefor j in z(-1,2):
Python 2, 456 octets
Bien que je sache qu'il s'agit d'un ancien post, je ne pouvais m'empêcher de tenter le coup. Le tableau initial peut être de n'importe quelle taille, à condition de tracer une bordure autour de lui et de laisser un espace supplémentaire sur la dernière ligne.
Golf.py
Input.txt (notez l'espace supplémentaire sur la dernière ligne)
Comment courir
la source
time.sleep(0.1)==None
=>not time.sleep(.1)
,(f=='@'and(x==3 or x==2
)) ou (f == '' et x == 3) =>x==3or f=='@'and x==2
1 if
=>1if
.En traitement
270 261249 octetsLa grille correspond aux 100 * 100 pixels d’écran, l’entrée se présente sous la forme d’une image png
Ungolfed
la source
Lua + LÖVE / Love2D , 653 octets
ou espacés:
Cliquez sur le champ pour ajouter des cellules vivantes. Cliquez en dehors du champ pour l'exécuter.
Essayez-le en ligne!
la source
Postscript
529515Commencé avec l'exemple de Rosetta Code . Invoquez avec un argument filename (
gs -- gol.ps pulsar
), le fichier contenant 20 * 20 nombres binaires (séparés par un espace). Boucle infinie: dessinez un tableau, attendez pour entrer, calculez la prochaine génération.Espacé, avec quelques commentaires de pile (juste ceux dont j'avais besoin).
fichier de données pulsar:
la source
JavaScript 676
Désolé Griffin, je ne pouvais tout simplement pas regarder votre code et ne pas le réécrire légèrement ... je devais me débarrasser de deux personnages, mais ça en valait la peine!
b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}
Mais comme on dit, il est plus facile de demander pardon que la permission ...;)
la source
Octave (153)
la même chose que Matlab de DenDenDo au jeu le plus court de la vie , mais a dû être immédiatement modifiée en imagesc:
la source
Python 2: 334 octets
Seulement 6 ans de retard.
Vous pouvez le lancer comme:
Là où les 0 et les 1 représentent des cellules mortes et vivantes, une nouvelle ligne à la fin commence l'exécution.
Les grilles doivent être carrées.
Il est plus facile à exécuter que le plus petit python, prend en charge les grilles de toutes tailles et est joli à l'exécution.
C'est aussi 100 octets de plus, donc ça y est.
la source
PHP, 201 octets (non testé)
Courez avec
-nr
.panne
la source