Ecrivez deux blocs de code rectangulaires, chacun avec w caractères larges et h caractères hauts, qui mettent en œuvre le jeu de la vie de Conway lorsqu'ils sont disposés dans une grille. ( w et h peuvent être des entiers positifs)
Par exemple, les deux blocs de code peuvent être: ( w = 3, h = 2, pas le code réel)
XX|
--+
et
|
--+
Traitez le premier bloc comme s'il s'agissait de la cellule "vivante" du jeu de la vie et le second comme s'il s'agissait de la cellule "morte".
Maintenant , organiser plusieurs copies de ces deux blocs dans un programme plus vaste qui représente un jeu de la grille de vie, comme ce planeur :
| | | | |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX|XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Maintenant, voici le point clé: lorsque ce code est exécuté, la sortie doit être la grille Game of Life qui est la génération suivante, en utilisant les mêmes blocs de code actifs et inactifs pour les cellules.
Ainsi, le programme ci-dessus devrait générer la nouvelle génération du planeur, qui sert également de programme exécutable:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| |XX| | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Lancer ceci produirait la prochaine génération:
| | | | |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
| | |XX| |
--+--+--+--+--+
|XX| |XX| |
--+--+--+--+--+
| |XX|XX| |
--+--+--+--+--+
| | | | |
--+--+--+--+--+
Etc.
Le processus doit pouvoir être répété indéfiniment et fonctionner pour tout arrangement de vos blocs de code vivants et morts dans une grille Game of Life.
La grille de sortie doit avoir les mêmes dimensions que le programme dont elle est issue (5 par 6 ci-dessus). Des tailles de grille aussi petites que 1 sur 1 devraient fonctionner et elles peuvent être arbitrairement grandes. Naturellement, une grille vide sortira d'elle-même.
Mise à jour: Pouvoir simuler des grilles de toutes dimensions sans avoir à changer les "mosaïques" serait idéal, mais comme cela semble très difficile, j'accepterai les réponses qui supposent que la grille a une certaine taille (environ 16 * 16).
Les règles du jeu de la vie sont les suivantes:
- Toute cellule vivante avec moins de 2 ou plus de 3 voisins vivants ( Moore ) meurt.
- Toute cellule morte avec exactement 3 voisins vivants s'anime.
- Les autres cellules ne changent pas.
Notation
Le défi consiste à faire cela dans la plus petite zone de bloc de code possible. Votre score est w * h . Le score le plus bas gagne. En cas d'égalité, la réponse la plus votée l'emporte.
Détails
- Outre les nouvelles lignes nécessaires pour rendre les choses rectangulaires, vos deux blocs de code (et donc vos programmes de grille Game of Life) ne doivent contenir que des caractères ASCII imprimables (codes hexadécimaux 20 à 7E, sans onglets, sans nouvelles lignes ).
- Les deux blocs de code doivent avoir exactement w * h caractères (en plus des nouvelles lignes nécessaires) avec au moins une différence de caractère. Les rembourrer avec des espaces ou des commentaires est acceptable. Ils ne devraient pas changer d'une génération à l'autre.
- La sortie doit aller dans un fichier ou sur stdout. Il n'y a pas d'entrée.
- Les conditions aux limites peuvent être périodiques (où le bord supérieur borde le bord inférieur et les bords gauche bordent le droit) ou infinies (où toutes les cellules en dehors des limites sont toujours mortes). Choisissez ce qui vous convient le mieux.
- La lecture de votre propre code source n'est pas autorisée.
- Toute langue ou outil qui fait déjà cela n'est pas autorisé. (Juste au cas où un existe.)
Remarque: les -|+
caractères ci-dessus ont uniquement été utilisés pour souligner les bordures des cellules. Vos blocs n'ont pas besoin de frontière distincte. Cependant , lors de l'affichage de votre sortie, il serait utile de séparer les blocs de manière distincte, peut-être avec un caractère jamais utilisé dans le programme, il est donc facile de le supprimer. par exemple
DD+DD+DD+DD
+++++++++++
AA+DD+AA+DD
au lieu de
DDDDDDDD
AADDAADD
la source
__SOURCE_CODE__
.Réponses:
Perl, w * h = 233 * 1 = 233 (par cellule)
Les cellules fonctionnent dans toutes les tailles de grille (même avec une longueur de ligne irrégulière). Les cellules hors limites sont considérées comme mortes.
Cellule morte
Cellule vivante
Planeur
génère:
Explication (non actuelle)
Perl, w * h = 140 * 2 = 280 (par cellule)
La cellule multiligne n'est pas efficace mais peut être éliminée
__LINE__
.Cellule morte
Cellule vivante
la source
JavaScript ES6 (239 x 1 caractères par cellule)
Cellule morte:
Cellule vivante:
Seule différence
S[j]=0
entre lesS[j]=1
cellules mortes et vivantes.La taille de la grille est contrôlée avec les variables W (largeur) et H (hauteur). Les cellules hors de la grille sont mortes.
Version commentée
Planeur (grille 5 x 6)
Sorties nouvelle génération:
la source
|
opérateur est au niveau du bit et ne fonctionne qu'avec des nombres.||
est un opérateur logique qui retourne le côté gauche s'il est "trueish", le côté droit sinon.Python, 67x33 = 2 211
Notez que c'est ma jolie version, où j'ai ajouté une ligne de "#" à toutes les autres lignes d'une cellule de vie et "" à toutes les autres lignes d'une cellule morte. De plus, les cellules sont séparées par des lignes "#". De cette façon, vous pouvez placer une configuration initiale dans un fichier texte, par exemple
GOL.py
, et la regarder avec une police minuscule pour voir ce qui se passe à chaque étape. Pour passer à l’étape suivante, exécutez-lepython GOL.py > GOL1.py;mv GOL1.py GOL.py
et consultez-le à nouveau.Ma solution fonctionne sur une grille de taille arbitraire et suppose des conditions aux limites périodiques. Je n'ai pas testé différentes largeurs de trait, mais il existe certainement des possibilités pour cela.
Je devrais également mentionner que le succès de cette solution dépend du fait qu’il
__del__
est appelé quand ila
est détruit à la fin du programme. La documentation Python indiqueJ'espère donc que cela ne fonctionne pas uniquement avec mon interprète.
Cellule vivante:
Cellule morte:
Python, 67x17 = 1 139 Pour obtenir une version golfée, avec toujours un moyen de reconnaître les cellules vitales de loin, la deuxième instruction d'impression des lignes 19 et 31 ainsi que toutes les autres lignes sont supprimées.
Cellule vivante:
Cellule morte:
S'il y a une demande, j'expliquerai volontiers le fonctionnement interne de ma solution lorsque je trouverai le temps.
la source
<sup><sub>...</sub></sup>
dans un<pre><code>
bloc. Cela ne diminue pas la hauteur d'une ligne, mais la police du texte est diminuée pour chaque occurrence. Si vous utilisez uniquement un indice ou un exposant, le code flottera vers le haut ou vers le bas en dehors du balisage, mais en alternant, il restera centré verticalement.