Le jeu de la vie

Le jeu de la vie est un « automate cellulaire » inventé en 1970 par John Horton Conway.

Une « partie » se déroule sur une grille, théoriquement infinie, divisée en cellules carrées. Chaque cellule est soit « vivante », soit « morte ».

On appelle voisin d'une cellule, une cellule qui partage au moins un « coin » avec celle-ci. On a représenté ci-dessous une cellule (coloriée) et ses huit voisins (pointés).

Voisins d'une celllule

L'état actuel d'une grille représente une « génération ». Afin de calculer la génération suivante, on parcourt toutes les cellules de la grille actuelle et, pour chacune, on applique l'une des règles suivantes :

  • si elle est morte et possède exactement trois voisines vivantes alors elle sera vivante à la prochaine génération. Si elle ne possède pas trois voisines vivantes, elle reste morte ;

  • si elle est vivante et possède deux ou trois voisines vivantes alors elle restera vivante à la prochaine génération. Dans le cas contraire, elle meurt.

Malgré leur simplicité, ces règles permettent d'engendrer des comportements complexes1.

On se propose dans cet exercice de mettre en œuvre le jeu de la vie avec Python. Pour cela, plusieurs questions sont proposées. Ces questions sont indépendantes et peuvent être traitées dans l'ordre souhaité. La dernière question regroupe l'ensemble du code et permet de visualiser l'évolution d'une grille.

La grille de jeu sera représentée par une liste de listes contenant les valeurs 0 (cellule morte) ou 1 (cellule vivante). On garantit que les grilles sont toutes des carrés de largeur et hauteur égales à un entier \(n\) strictement positif.

Dans toute la suite, les variables i désigneront des indices de lignes et j des indices de colonnes.

On fournit une fonction grille_aleatoire qui prend pour paramètres la dimension taille d'une grille (taille est un entier strictement positif indiquant le nombre de lignes et de colonnes de la grille) et un nombre flottant proba_vie (compris entre 0.0 et 1.0). Cette fonction renvoie une grille de la dimension souhaitée dans laquelle chaque cellule à une probabilité proba_vie d'être vivante.

Ainsi :

  • grille_aleatoire(7, 0.3) renvoie une grille de \(7\times 7\) dans laquelle chaque cellule a une probabilité de \(p=0,3\) d'être vivante ;

  • grille_aleatoire(10, 0.0) renvoie une grille de \(10\times 10\) entièrement remplie de cellules mortes.

Cette fonction est d'ores et déjà accessible dans tous les éditeurs. Il est inutile de l'importer.

Code de grille_aleatoire

On fournit le code de la fonction grille_aleatoire pour information.

🐍 Script Python
from random import random

MORT = 0
VIVANT = 1

def grille_aleatoire(taille, proba_vie):
    return [
        [VIVANT if random() < proba_vie else MORT for _ in range(taille)]
        for _ in range(taille)
    ]
Visualisation

On propose dans un premier temps de visualiser le fonctionnement du jeu de la vie en observant l'évolution d'une grille lors de plusieurs générations.

On fournit donc une fonction visualisation qui prend en paramètres une liste de listes grille représentant l'état initial de la grille et un entier nb_generations qui indique le nombre de générations à simuler.

Cette fonction calcule l'état de la grille au fil du nombre de générations indiquées et dessine la grille correspondante sous l'éditeur. À ce titre certains réglages sont modifiables par le biais des variables TAILLE_CELLULE (taille d'une cellule en pixels), DELAI_SECONDES (délai entre les affichages de deux grilles) et COULEUR_VIVANTE (couleur d'une cellule vivante).

Cette section ne comporte pas de tests mais seulement une représentation visuelle. Vous pouvez l'utiliser afin de tester des grilles aléatoires ou des motifs particuliers.

Restons raisonnables

Ne perdez pas de vue que nous travaillons dans le navigateur et que l'exécution de code Python n'est pas immédiate.

Dessiner des grilles de grande taille ou demander un grand nombre de générations risque dans certains cas de ralentir le fonctionnement du navigateur.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

La grille sera dessinée ici

Voisins valides

Une grille étant donnée, on souhaite calculer la grille de la génération suivante. Pour cela, il faut, pour chaque cellule, compter son nombre de voisins vivants.

Les cellules du centre de la grille ont bien huit voisins. Celles des « bords » n'en possèdent toutefois pas huit. Une cellule située dans un « coin » de la grille ne possède par exemple que trois voisins.

On demande dans un premier temps d'écrire une fonction voisins qui prend en paramètres une liste de listes grille représentant une grille ainsi que deux coordonnées valides i et j et renvoie la liste des coordonnées des voisins de la cellule de coordonnées (i, j).

Égalité de listes

Les tests de cet exercice utilisent une fonction egales qui renvoie True si les deux listes passées en paramètres contiennent exactement les mêmes éléments sans tenir compte de leur ordre d'apparition dans chacune.

Exemples
>>> grille = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> voisins(grille, 0, 0)
[(0, 1), (1, 0), (1, 1)]
>>> voisins(grille, 0, 1)
[(0, 0), (0, 2), (1, 0), (1, 1), (1, 2)]
>>> voisins(grille, 1, 1)
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1), (2, 2)]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[tf4)+2IrjRT3,sa-o iug0V8m1]P6pONnMl7h.e=cy:v9A(w;S/bdk050%0P0d0r0v0L0q0u0R0L0r0q0q0Q010d0v0G010406050q0w0B0B0r0k0S040!0t0L0w0|0t0J050#13151719110G041i1p051s0#1s1u1p110%0v0U0;0?0^0`0N0v0x0N0L1I0N0d0 050,0$0L0P1D0@0_011H1J1L1J0d1R1T1P0d0$0t0%191Q0k1q0d0N0;1c0q0G0r0J0`0i011V1F010e0.0P0J0r0B0P1P1`1|211X241T27290 0a0u0E0k0t0G0t0q0v1f0J0u0*1^0k0k0P0R2u1i2c0J1q0#1?2H0d1;1:1=0%2e0`1L0J262r1P1A1C0=1W2R0v2T0J1-1B1P0G2A1q2F2H2/121{2v2Z222(0k160L0 0u0C2E2?102=2d2^1X2`2|2~0i311|332F2Q01380r2}040u0o3c2G113f360`3i3k0u0f3o3e2?3g3u2~0b3y3q3A3s3h0t2{3j2~0F3F342@1E373K393l0M3P3r3S3t3U3M3l0A3Y3H3!3J3L3v0V3*353,3C040C0y3;3R2!3-3V0C301j323G3=3}3@0C3b423d443|2_3$3k0C3n4a2G1r2-1i2X2K0%2O3g0R1-2a1q4o1t4m2;4j1q4t0*2.3+460 0K0H0m0n3y0u3Q3g0t0 0Q4N4P3I0B0v0 3`4B4c3B0 0z0j0z0W0I4M4B4O3Z3}4R044T4/4V3,4X0 412/06504`3}0(0 0*0e3y52220Y2~584;2_0e0 0U0t0v2s0J0q5d4G220~040X5o452_0 0x0k0.1T5u4d1X5r0p4U5e370 0v5C3g5F5H5p5J040l5M3I5r0g0T3F0u5!4:5Q3t0 0,5A0P5P5v1X4?4^2/5$5.3t0$0 2h5U3,5r5t4B595R5y5+5|3}5W3F065#5?5D5(041A2A2C0v1g5n4_5I0`5:5-6c015~5 2;6m014?0s65224|3^6z5E0 5G6l5%6w0 6y606v6B4~32610`5W6G5=6R6r0 6t6Q6v6x6D0`6O6%6X046U326b3g6B4!6u6I6T6p5N6Y6*6$6M6I6)6~5@6+6-3d6/4W4Y6C716q6^6H725~6*6;6*5O7d6q6}6?72707n7b0 0g742G765}6{7a6:786=6!6@6F6_774}7i7s7u3l6W7f7z7H797q6`6,7G3,7m7D7o786P3d7N7K7V667y7S7Q7#4k6v7j6V6N7B7J047t7)5q7+7Y6q7p7~7T7L7w3}807$7:7s0g5Z5#6W0J0 2A130L0,0d7{5/4S8l6S0 0c0D8b5!6W54040e3K8o3h555L7P7x7U7k4%6e5T8H3I0t5b042$8A8e6e0v6g2u6k7,8F5Y4#6a6a8v5K578L4{7@8+4=0 028i0Z5;6.8d5K8A4?0h8R8C8{8:8=8~045*0L5B8.228N0 1|0%8A7h988m048;0d8?938K7=6I8|930%9n8^6#919k9395978Y7*048!4 8$9G845w048g0w8i0r8k8E8/040O6*8S0r0G0G269d9Q7|5s6Z876I8S8D9o729q9g6d1A7^838_5S90048}9:8B8J7^0g8a8#8c6v8w2A0d0w0k1h9}8S9L9N9P4 1i4D0P2H2,ak4n1B4p2K2M2I1,1.2K0r1San0#4o11aA0+0-0/04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[tf4)+2IrjRT3,sa-o iug0V8m1]P6pONnMl7h.e=cy:v9A(w;S/bdk050%0P0d0r0v0L0q0u0R0L0r0q0q0Q010d0v0G010406050q0w0B0B0r0k0S040!0t0L0w0|0t0J050#13151719110G041i1p051s0#1s1u1p110%0v0U0;0?0^0`0N0v0x0N0L1I0N0d0 050,0$0L0P1D0@0_011H1J1L1J0d1R1T1P0d0$0t0%191Q0k1q0d0N0;1c0q0G0r0J0`0i011V1F010e0.0P0J0r0B0P1P1`1|211X241T27290 0a0u0E0k0t0G0t0q0v1f0J0u0*1^0k0k0P0R2u1i2c0J1q0#1?2H0d1;1:1=0%2e0`1L0J262r1P1A1C0=1W2R0v2T0J1-1B1P0G2A1q2F2H2/121{2v2Z222(0k160L0 0u0C2E2?102=2d2^1X2`2|2~0i311|332F2Q01380r2}040u0o3c2G113f360`3i3k0u0f3o3e2?3g3u2~0b3y3q3A3s3h0t2{3j2~0F3F342@1E373K393l0M3P3r3S3t3U3M3l0A3Y3H3!3J3L3v0V3*353,3C040C0y3;3R2!3-3V0C301j323G3=3}3@0C3b423d443|2_3$3k0C3n4a2G1r2-1i2X2K0%2O3g0R1-2a1q4o1t4m2;4j1q4t0*2.3+460 0K0H0m0n3y0u3Q3g0t0 0Q4N4P3I0B0v0 3`4B4c3B0 0z0j0z0W0I4M4B4O3Z3}4R044T4/4V3,4X0 412/06504`3}0(0 0*0e3y52220Y2~584;2_0e0 0U0t0v2s0J0q5d4G220~040X5o452_0 0x0k0.1T5u4d1X5r0p4U5e370 0v5C3g5F5H5p5J040l5M3I5r0g0T3F0u5!4:5Q3t0 0,5A0P5P5v1X4?4^2/5$5.3t0$0 2h5U3,5r5t4B595R5y5+5|3}5W3F065#5?5D5(041A2A2C0v1g5n4_5I0`5:5-6c015~5 2;6m014?0s65224|3^6z5E0 5G6l5%6w0 6y606v6B4~32610`5W6G5=6R6r0 6t6Q6v6x6D0`6O6%6X046U326b3g6B4!6u6I6T6p5N6Y6*6$6M6I6)6~5@6+6-3d6/4W4Y6C716q6^6H725~6*6;6*5O7d6q6}6?72707n7b0 0g742G765}6{7a6:786=6!6@6F6_774}7i7s7u3l6W7f7z7H797q6`6,7G3,7m7D7o786P3d7N7K7V667y7S7Q7#4k6v7j6V6N7B7J047t7)5q7+7Y6q7p7~7T7L7w3}807$7:7s0g5Z5#6W0J0 2A130L0,0d7{5/4S8l6S0 0c0D8b5!6W54040e3K8o3h555L7P7x7U7k4%6e5T8H3I0t5b042$8A8e6e0v6g2u6k7,8F5Y4#6a6a8v5K578L4{7@8+4=0 028i0Z5;6.8d5K8A4?0h8R8C8{8:8=8~045*0L5B8.228N0 1|0%8A7h988m048;0d8?938K7=6I8|930%9n8^6#919k9395978Y7*048!4 8$9G845w048g0w8i0r8k8E8/040O6*8S0r0G0G269d9Q7|5s6Z876I8S8D9o729q9g6d1A7^838_5S90048}9:8B8J7^0g8a8#8c6v8w2A0d0w0k1h9}8S9L9N9P4 1i4D0P2H2,ak4n1B4p2K2M2I1,1.2K0r1San0#4o11aA0+0-0/04.
Voisins vivants

Une version fonctionnelle de la fonction voisins de la question précédente est disponible dans cette question. Il est inutile de l'importer.

Cette fonction étant connue, il faut désormais parcourir l'ensemble des voisins valides d'une cellule afin de connaître le nombre de voisins vivants parmi ceux-ci.

On demande d'écrire une fonction voisins_vivants qui prend en paramètres une liste de listes grille représentant une grille ainsi que deux coordonnées valides i et j et renvoie le nombre de voisins vivants de la cellule de coordonnées (i, j).

Exemples
>>> grille = [[1, 1, 0], [0, 1, 1], [0, 0, 1]]
>>> voisins_vivants(grille, 0, 0)
2
>>> voisins_vivants(grille, 1, 1)
4
>>> voisins_vivants(grille, 2, 1)
3

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[tf4)+2IrjRT3,sao iug0V8m1]P6pONnMl7he=cy:v9A(wS/b_dk050#0N0d0r0u0K0q0t0P0K0r0q0q0O010d0u0F010406050q0v0A0A0r0k0Q040X0s0K0v0`0s0I050Y111315170 0F041g1n051q0Y1q1s1n0 0#0u0S0/0;0?0^0M0u0w0M0K1G0M0d0}050*0Z0K0N1B0=0@011F1H1J1H0d1P1R1N0d0Z0s0#171O0k1o0d0M0/1a0q0F0r0I0^0i011T1D010e0,0N0I0r0A0N1N1^1`1 1V221R25270}0a0t0D0k0s0F0s0q0u1d0I0t0(1?0k0k0N0P2s1g2a0I1o0Y1;2F0d1/1.1:0#2c0^1J0I242p1N1y1A0:1U2P0u2R0I1+1z1N0F2y1o2D2F2-101_2t2X202$0k140K0}0B2C2;0~2:2b2?1V2^2`0}0i2~1`302D2O01350r2{040o392E0 3c330^3f3h0f3k3b2;3d3q0}0b3t3m3v3o3e0s2_3g0}0E3A312=1C343F36040L3K3n3N3p3P3H040z3T3C3V3E3G3h0T3t1p2+1g2V2I0#2M3d0P1+281o3:1r3.2/1h2 053^0(2,3$2Y3e0}0J0G0m0n3t0t3L3d0s0}0O4e4g3D0A0u0}0x3#323%0I0}0y0j0y0U0H4d403a4f3U474i044k4D2E4F46204o2|3A063B4t470$0}0(0e3,4G200W0}4f4L454V2@0e0}0S0s0u2q0I0q0!0S1z1`0d0q4#4O1V0|040V504-340}0w0k0,1R563M47530p4l4$58040u5e3d5h5j513p0}0l5o3D530g0R3A0t5C4N575t040d0s0*0K5r5F014I4K2-5E5f4P4p044r4+065D5S3d4X040e3F5M5T5l0u4`4=4@5w3%5q4+5#3D4v040l5/4?2!5+4h4(5m1f5^4m4u4:5:2!4 4+675g0}556d5k5G5a5c0N5=6f045i666j485m6o205@5R6e2@5u6w520}5z5B5!5D6A5l5I5K613D4I0h5Q2 5_68046l0K5d6i5s01530c6D5G5.4;5 652/6t530C6(6!5N5{5}6,5;6@5,0^6;6H5C6K0^5%2y0d0v0k6.6T736u6M3g3K0Y430N2F2*7j3/1z3;2I2K2G1*1,2I0r1Q7m0Y3:0 7z0)0+0-04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[tf4)+2IrjRT3,sao iug0V8m1]P6pONnMl7he=cy:v9A(wS/b_dk050#0N0d0r0u0K0q0t0P0K0r0q0q0O010d0u0F010406050q0v0A0A0r0k0Q040X0s0K0v0`0s0I050Y111315170 0F041g1n051q0Y1q1s1n0 0#0u0S0/0;0?0^0M0u0w0M0K1G0M0d0}050*0Z0K0N1B0=0@011F1H1J1H0d1P1R1N0d0Z0s0#171O0k1o0d0M0/1a0q0F0r0I0^0i011T1D010e0,0N0I0r0A0N1N1^1`1 1V221R25270}0a0t0D0k0s0F0s0q0u1d0I0t0(1?0k0k0N0P2s1g2a0I1o0Y1;2F0d1/1.1:0#2c0^1J0I242p1N1y1A0:1U2P0u2R0I1+1z1N0F2y1o2D2F2-101_2t2X202$0k140K0}0B2C2;0~2:2b2?1V2^2`0}0i2~1`302D2O01350r2{040o392E0 3c330^3f3h0f3k3b2;3d3q0}0b3t3m3v3o3e0s2_3g0}0E3A312=1C343F36040L3K3n3N3p3P3H040z3T3C3V3E3G3h0T3t1p2+1g2V2I0#2M3d0P1+281o3:1r3.2/1h2 053^0(2,3$2Y3e0}0J0G0m0n3t0t3L3d0s0}0O4e4g3D0A0u0}0x3#323%0I0}0y0j0y0U0H4d403a4f3U474i044k4D2E4F46204o2|3A063B4t470$0}0(0e3,4G200W0}4f4L454V2@0e0}0S0s0u2q0I0q0!0S1z1`0d0q4#4O1V0|040V504-340}0w0k0,1R563M47530p4l4$58040u5e3d5h5j513p0}0l5o3D530g0R3A0t5C4N575t040d0s0*0K5r5F014I4K2-5E5f4P4p044r4+065D5S3d4X040e3F5M5T5l0u4`4=4@5w3%5q4+5#3D4v040l5/4?2!5+4h4(5m1f5^4m4u4:5:2!4 4+675g0}556d5k5G5a5c0N5=6f045i666j485m6o205@5R6e2@5u6w520}5z5B5!5D6A5l5I5K613D4I0h5Q2 5_68046l0K5d6i5s01530c6D5G5.4;5 652/6t530C6(6!5N5{5}6,5;6@5,0^6;6H5C6K0^5%2y0d0v0k6.6T736u6M3g3K0Y430N2F2*7j3/1z3;2I2K2G1*1,2I0r1Q7m0Y3:0 7z0)0+0-04.
Génération suivante

Des versions fonctionnelles des fonctions voisins et voisins_vivants des questions précédentes sont disponibles dans cette question. Il est inutile de les importer.

Ces fonctions étant connues, on peut désormais, connaissant une grille, calculer la grille à la génération suivante. Pour ce faire :

  • on crée une nouvelle grille ne contenant que des cellules mortes,

  • on parcourt toutes les cellules de la grille actuelle et, pour chacune, on met à jour l'état de la cellule correspondante de la génération suivante en appliquant les règles du jeu de la vie.

On rappelle les règles du jeu :

  • si la cellule actuelle est morte et possède exactement trois voisines vivantes alors elle sera vivante à la prochaine génération. Si elle ne possède pas trois voisines vivantes, elle reste morte ;

  • si la cellule actuelle est vivante et possède deux ou trois voisines vivantes alors elle restera vivante à la prochaine génération. Dans le cas contraire, elle meurt.

On demande d'écrire une fonction generation qui prend en paramètres une liste de listes grille représentant une grille et renvoie une nouvelle grille représentant la génération suivante.

Exemple
>>> grille = [[1, 1, 0], [0, 1, 1], [0, 0, 1]]
>>> generation(grille)
[[1, 1, 1], [1, 0, 1], [0, 1, 1]]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[4)2R,a- iVà8mG16CMl7.e:9AH;US/dktfIrjT3sogu0x]PpONnEh=céLyvDz(wq_b050H0y0J0i0l0v0Q0k0)0v0i0Q0Q0(010J0l0Y010406050Q0T0p0p0i0M0,040F0R0v0T180R0#0k020i0p0Y0D0k0g0y1i0M0=0T0y0Q050G1f1h1j1l1d0Y041J1Q051T0G1T1V1Q1d0H0l0-101214160%0l0S0%0v1-0%0J1b050{0@0v0y1(1315011,1.1:1.0J1_1{1@0J0@0R0H1l1^0M1R0J0%101o0Q0Y0i0#160f011}1*010K0}0y0#1w0y1@2l2n2s1 2v1{2y0p2A040a0k0X0M0R0Y0R0Q0l1r1t0_2j0M0M0y0)2V1J2C0#1R0G2h2+0J2f2e2g0H2E161:0#2x2S1@1#1%111~2^0l2`0#2b1$1@0Y2!1R2)2+3c1e2m1t302t350M1i0v1b0k0r2(3g1c3f2D3i1 3k3m3o0f3r2n3t2)2@013y0i3n040k0P3C2*1d3F3w163I3K0k0d3O3E3g3G3U3o0b3Y3Q3!3S3H0R3l3J3o0s3)3u3h1)3x3.3z3L0w3?3R3_3T3{3:3L0o3 3+413-3/3V0A473v493$040r0U4e3^314a3|0r3q1K3s3*4f4n4h0r3B4s3D4u4m3j433K0r3N4A3P3@3#4F1b0r3X4J3Z4v4E4b4O3(4R1S3a1J2~2.0H2=3G0)2b2K0^1$1R390y3b3s3Y054+0_4?4T3x1b0u0Z0g0O3Y0k4L3,0R1b0(5456490p0l1b4k4R4C3#1b0m0L0m0B0!534R55404n58045a5s5c4n5e4O3)065j3,0I1b0_0K4^5u2t0;3o5M484w0K1b0S2x0y0M0i2%4Y5N1 1a040:5R4}3T5V0M0}1{5,4D5(1b0e0z3)0k5}5t5S3j1b0{5;0y5b5%165w5y3c5 5-3H0@1b2H5?3G5)5+5$604~040S5:0v5=6m6d5)0e5|5~5A6104350T0-0y6s655z670169666n5.6p6r1{0?3J0y5!0R0l2!6i3,6k6!4g620|6H6%4n5)0h6N6d5C045h3e6K6w5E5~6c5@165I040K3.6:6~3H1b0l743G0R5P0433793,0#6f045Z0#5W6,2t6$6u750#6)647n5^045`6y6|5}6A1 70720M7f6(040N7H5v7c7e6J6O6e1b7k7m7q6j1b6l6^7Q7s04636+7V6#5_5{5i7A7.6}3G700l5L7P6d7#6q7u7)495)0c7v6P787}6-1b0W80846B7K897w0W7L2t696a3s7:7g4 515r6b7C687c2n0H8f6o0-6X2T0#0Q0?0-1$2n0J1I8c167p7Z7_5/7|8L756.8v8281018R7^7r1b8b8P7W7x8S6L598i3D8k5d5f044I8#7*047,3c067/8{8-4w1b6D6F7(8=7~1b88938~7d8U5)878U7#8!4@6_868(6M8X5k045m5o5q7z8|8q01706G7?8(7`6R6I977o959d779a86969g7!8Z9H048e9l578*9y5l5n5p8o8j9t7b1b8t8(6=4z8p6K5w020v0J0D8+2*8}6B8x0l8z8B8D0-8F8H9C7w7Y9K8M6Q8Oa38Q1b6/9Q7I83a08Ja99T7J9N6xab5v1b9-9/9;3L9t6=8;a78$8^4t8|7/9t7#906G6tae8V9E8I7699aJ9b9J3DaB9MaM9ial8g59ah9o9W9r9t702!0J0T0M0#ahaD924t1J4`4=4Za=0G4$1J0J4(a`2:2,2a2c2.0i1`a@4$1P4|752!0p0?0K0i0I0y0?0%0P1b1B1D1F1H0kaxaP1W3t1Q0L0v0k1H0J0k0H0*0Q439_0k2R140lb4bA1|0)3J0)0T1{0MbA7?0K0*2!0#0Jbo0S0*0#bW5!0l1s0 1f0)0)1H2T6F0 0H0T0k0N0yb^2X120k8D0y0x1Sbt040Z1t392Q2S1|2Ra)106G0i0kb~720#2$b*1t4_4,7Jb{0?0_0?128C0l6Ia;3L0)0l0j0_140R0T0 7,1Z4.2 49211/1;1?b83G2G2x2z1b2M0F0)5:0Ybz0X0,2h1s4^4;b83d4@cza#5J0y7@aG7c55aJ0#5Ucq0Tcsbgcvc09Na2aP6K9za6d77Q8W9*9L6C0@0?5W2`5Z2V9 av8?7y7-6z6K7E73aU6o0?9j7Na+dw3T7i7T9Bdo945*9Fdgdi5Xdlcmdndb6v7+9r6|aQa5a.8,9ZaWdCaKdj5Yb)c+aSdJc|8NdY2*9t6`5ia:cpa?2+b61U040+000*1#bZcd8D1f3J9_d*2Wb|0*0@1qbLch000y0V5YcBb/2jbYcxbYbA003.bo0`bA0*0N0nbG1p2Tb{0M0 4+c}1-a)e90 330JbWb:8F1H0x060mcG0 cc6F0/0kba0Y12b/bS1{2j2X2me)000T2Weuej1x1{eFcCcEbDcHbpc31!1$3GcO231=2B7QcU2I2K0F2/0T2$a)bo0Q261Hc,4!3e4Yc;6K0)0r1b031A0*0S125Wb?1|0v002n0l1i5#8_dW0O0B0L0+0+0$0?0t0$fM0EfN9jd#de6;8/4XfHd81b0.fRfK0?0F0$0t0Z0!f(0FfV5x9%c~0U0x9)a/f$04f.fT0$0E0g0?aY5q0$f?aq9?1 0Q2q0401030w0y0b0s0)2q5E9tfqfsfufw0ifybAb^b`0T4l9mfJfLfUd$9kfX759(f|4BdW7{d:ar9+fW9Yf~gN6Sei1Ce$dGdRa8d-aGgd1b01fhb3e^01ajgA8ldLd(dOb+g99%fZ6@4t5G49gq04ft12ck1C2xbzb@b_b{g:7Ie50Te70Qe9d5dKgUgZd;9h04aagH9m7hdMdkeKg/d@0Gc;1W4!a^4/f0cM4nf3cQf66df8cW040C3.0v0R7U3ec-3@c/aPfo7Qh0ft0gfvfxbob}fC0#fEhhd@f~gCfMfOfQfSgEhq9Rf@d$6=f!f}dff(0+f*f,f.f:0$f=gFgRdZ6K0pf_f{hb98g0fNg3g59Vg7g_d$g(gfghgjglgn5ig~4nh!gsh(b?gxhah/dfh;h_gS7QgGiKfY1b0fg|gLgT9Aiph`7Ihk0?gWe@hlcS8?d6hm7Qir20hPhR2Ahwf#dfhsg?hviah|iW5Bg{gofpfrh1ch2nb/2Jeqh8gyih9@9_he1:hgfGdH85g$jh6Bhk9NhpiN8Yg=dNi_aGd?fHhyd_hAb5hDcLf21;f4cR9thL2J1b0qb$b(e3bS2X9}9_0Q6Vgz4YhUfm3ehY6diAh$gtgvh*fDfFcmja6oiIh?fR0+g1iVjp3Gh~j.6Pi2i4f-f/f;j^ic7Qie5g0x4ri=a4ijg2g4g60Og8i`ga9ti,itgkgmg.ixgpj1h#h%guh)iEjVkajqj:k39=as8/4jiR4KiTdakDgQi{j_g;iYi!gYhiaJi,jR14jU0Vkpju5_j|aKi@jsdmkCgPk58/iQkH1ciy2tiAh3j5h6gwh9kyi0a4hdhfh.k#jjg!9mjmd,jok4a4k)huk+d,akjwhzhUhC0-3ta^0`6*0Q04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280135[4)2R,a- iVà8mG16CMl7.e:9AH;US/dktfIrjT3sogu0x]PpONnEh=céLyvDz(wq_b050H0y0J0i0l0v0Q0k0)0v0i0Q0Q0(010J0l0Y010406050Q0T0p0p0i0M0,040F0R0v0T180R0#0k020i0p0Y0D0k0g0y1i0M0=0T0y0Q050G1f1h1j1l1d0Y041J1Q051T0G1T1V1Q1d0H0l0-101214160%0l0S0%0v1-0%0J1b050{0@0v0y1(1315011,1.1:1.0J1_1{1@0J0@0R0H1l1^0M1R0J0%101o0Q0Y0i0#160f011}1*010K0}0y0#1w0y1@2l2n2s1 2v1{2y0p2A040a0k0X0M0R0Y0R0Q0l1r1t0_2j0M0M0y0)2V1J2C0#1R0G2h2+0J2f2e2g0H2E161:0#2x2S1@1#1%111~2^0l2`0#2b1$1@0Y2!1R2)2+3c1e2m1t302t350M1i0v1b0k0r2(3g1c3f2D3i1 3k3m3o0f3r2n3t2)2@013y0i3n040k0P3C2*1d3F3w163I3K0k0d3O3E3g3G3U3o0b3Y3Q3!3S3H0R3l3J3o0s3)3u3h1)3x3.3z3L0w3?3R3_3T3{3:3L0o3 3+413-3/3V0A473v493$040r0U4e3^314a3|0r3q1K3s3*4f4n4h0r3B4s3D4u4m3j433K0r3N4A3P3@3#4F1b0r3X4J3Z4v4E4b4O3(4R1S3a1J2~2.0H2=3G0)2b2K0^1$1R390y3b3s3Y054+0_4?4T3x1b0u0Z0g0O3Y0k4L3,0R1b0(5456490p0l1b4k4R4C3#1b0m0L0m0B0!534R55404n58045a5s5c4n5e4O3)065j3,0I1b0_0K4^5u2t0;3o5M484w0K1b0S2x0y0M0i2%4Y5N1 1a040:5R4}3T5V0M0}1{5,4D5(1b0e0z3)0k5}5t5S3j1b0{5;0y5b5%165w5y3c5 5-3H0@1b2H5?3G5)5+5$604~040S5:0v5=6m6d5)0e5|5~5A6104350T0-0y6s655z670169666n5.6p6r1{0?3J0y5!0R0l2!6i3,6k6!4g620|6H6%4n5)0h6N6d5C045h3e6K6w5E5~6c5@165I040K3.6:6~3H1b0l743G0R5P0433793,0#6f045Z0#5W6,2t6$6u750#6)647n5^045`6y6|5}6A1 70720M7f6(040N7H5v7c7e6J6O6e1b7k7m7q6j1b6l6^7Q7s04636+7V6#5_5{5i7A7.6}3G700l5L7P6d7#6q7u7)495)0c7v6P787}6-1b0W80846B7K897w0W7L2t696a3s7:7g4 515r6b7C687c2n0H8f6o0-6X2T0#0Q0?0-1$2n0J1I8c167p7Z7_5/7|8L756.8v8281018R7^7r1b8b8P7W7x8S6L598i3D8k5d5f044I8#7*047,3c067/8{8-4w1b6D6F7(8=7~1b88938~7d8U5)878U7#8!4@6_868(6M8X5k045m5o5q7z8|8q01706G7?8(7`6R6I977o959d779a86969g7!8Z9H048e9l578*9y5l5n5p8o8j9t7b1b8t8(6=4z8p6K5w020v0J0D8+2*8}6B8x0l8z8B8D0-8F8H9C7w7Y9K8M6Q8Oa38Q1b6/9Q7I83a08Ja99T7J9N6xab5v1b9-9/9;3L9t6=8;a78$8^4t8|7/9t7#906G6tae8V9E8I7699aJ9b9J3DaB9MaM9ial8g59ah9o9W9r9t702!0J0T0M0#ahaD924t1J4`4=4Za=0G4$1J0J4(a`2:2,2a2c2.0i1`a@4$1P4|752!0p0?0K0i0I0y0?0%0P1b1B1D1F1H0kaxaP1W3t1Q0L0v0k1H0J0k0H0*0Q439_0k2R140lb4bA1|0)3J0)0T1{0MbA7?0K0*2!0#0Jbo0S0*0#bW5!0l1s0 1f0)0)1H2T6F0 0H0T0k0N0yb^2X120k8D0y0x1Sbt040Z1t392Q2S1|2Ra)106G0i0kb~720#2$b*1t4_4,7Jb{0?0_0?128C0l6Ia;3L0)0l0j0_140R0T0 7,1Z4.2 49211/1;1?b83G2G2x2z1b2M0F0)5:0Ybz0X0,2h1s4^4;b83d4@cza#5J0y7@aG7c55aJ0#5Ucq0Tcsbgcvc09Na2aP6K9za6d77Q8W9*9L6C0@0?5W2`5Z2V9 av8?7y7-6z6K7E73aU6o0?9j7Na+dw3T7i7T9Bdo945*9Fdgdi5Xdlcmdndb6v7+9r6|aQa5a.8,9ZaWdCaKdj5Yb)c+aSdJc|8NdY2*9t6`5ia:cpa?2+b61U040+000*1#bZcd8D1f3J9_d*2Wb|0*0@1qbLch000y0V5YcBb/2jbYcxbYbA003.bo0`bA0*0N0nbG1p2Tb{0M0 4+c}1-a)e90 330JbWb:8F1H0x060mcG0 cc6F0/0kba0Y12b/bS1{2j2X2me)000T2Weuej1x1{eFcCcEbDcHbpc31!1$3GcO231=2B7QcU2I2K0F2/0T2$a)bo0Q261Hc,4!3e4Yc;6K0)0r1b031A0*0S125Wb?1|0v002n0l1i5#8_dW0O0B0L0+0+0$0?0t0$fM0EfN9jd#de6;8/4XfHd81b0.fRfK0?0F0$0t0Z0!f(0FfV5x9%c~0U0x9)a/f$04f.fT0$0E0g0?aY5q0$f?aq9?1 0Q2q0401030w0y0b0s0)2q5E9tfqfsfufw0ifybAb^b`0T4l9mfJfLfUd$9kfX759(f|4BdW7{d:ar9+fW9Yf~gN6Sei1Ce$dGdRa8d-aGgd1b01fhb3e^01ajgA8ldLd(dOb+g99%fZ6@4t5G49gq04ft12ck1C2xbzb@b_b{g:7Ie50Te70Qe9d5dKgUgZd;9h04aagH9m7hdMdkeKg/d@0Gc;1W4!a^4/f0cM4nf3cQf66df8cW040C3.0v0R7U3ec-3@c/aPfo7Qh0ft0gfvfxbob}fC0#fEhhd@f~gCfMfOfQfSgEhq9Rf@d$6=f!f}dff(0+f*f,f.f:0$f=gFgRdZ6K0pf_f{hb98g0fNg3g59Vg7g_d$g(gfghgjglgn5ig~4nh!gsh(b?gxhah/dfh;h_gS7QgGiKfY1b0fg|gLgT9Aiph`7Ihk0?gWe@hlcS8?d6hm7Qir20hPhR2Ahwf#dfhsg?hviah|iW5Bg{gofpfrh1ch2nb/2Jeqh8gyih9@9_he1:hgfGdH85g$jh6Bhk9NhpiN8Yg=dNi_aGd?fHhyd_hAb5hDcLf21;f4cR9thL2J1b0qb$b(e3bS2X9}9_0Q6Vgz4YhUfm3ehY6diAh$gtgvh*fDfFcmja6oiIh?fR0+g1iVjp3Gh~j.6Pi2i4f-f/f;j^ic7Qie5g0x4ri=a4ijg2g4g60Og8i`ga9ti,itgkgmg.ixgpj1h#h%guh)iEjVkajqj:k39=as8/4jiR4KiTdakDgQi{j_g;iYi!gYhiaJi,jR14jU0Vkpju5_j|aKi@jsdmkCgPk58/iQkH1ciy2tiAh3j5h6gwh9kyi0a4hdhfh.k#jjg!9mjmd,jok4a4k)huk+d,akjwhzhUhC0-3ta^0`6*0Q04.

  1. il a ainsi été montré que le jeu de la vie est Turing-complet