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

.128013s3Oo8;bcdufvgMI/T0ly n7AapS.r1-meR,(P2=4V:+Njtwki9][5h)6050j0H0U0z0X0t0b0v0i0t0z0b0b0N010U0X0A010406050b0k0G0G0z0D0u040B0e0t0k0|0e0w050q13151719110A041i1p051s0q1s1u1p110j0X0m0;0?0^0`0$0X0n0$0t1I0$0U0 050,0h0t0H1D0@0_011H1J1L1J0U1R1T1P0U0h0e0j191Q0D1q0U0$0;1c0b0A0z0w0`0M011V1F010l0.0H0w0z0G0H1P1`1|211X241T27290 0a0v0L0D0e0A0e0b0X1f0w0v0*1^0D0D0H0i2u1i2c0w1q0q1?2H0U1;1:1=0j2e0`1L0w262r1P1A1C0=1W2R0X2T0w1-1B1P0A2A1q2F2H2/121{2v2Z222(0D160t0 0v0E2E2?102=2d2^1X2`2|2~0M311|332F2Q01380z2}040v0c3c2G113f360`3i3k0v0O3o3e2?3g3u2~0#3y3q3A3s3h0e2{3j2~0(3F342@1E373K393l0x3P3r3S3t3U3M3l0f3Y3H3!3J3L3v0Y3*353,3C040E0s3;3R2!3-3V0E301j323G3=3}3@0E3b423d443|2_3$3k0E3n4a2G1r2-1i2X2K0j2O3g0i1-2a1q4o1t4m2;4j1q4t0*2.3+460 0o0d0I0r3y0v3Q3g0e0 0N4N4P3I0G0X0 3`4B4c3B0 0P0p0P0y0S4M4B4O3Z3}4R044T4/4V3,4X0 412/06504`3}0W0 0*0l3y52220V2~584;2_0l0 0m0e0X2s0w0b5d4G220~040K5o452_0 0n0D0.1T5u4d1X5r0J4U5e370 0X5C3g5F5H5p5J040T5M3I5r0%0Q3F0v5!4:5Q3t0 0,5A0H5P5v1X4?4^2/5$5.3t0h0 2h5U3,5r5t4B595R5y5+5|3}5W3F065#5?5D5(041A2A2C0X1g5n4_5I0`5:5-6c015~5 2;6m014?0F65224|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 0%742G765}6{7a6:786=6!6@6F6_774}7i7s7u3l6W7f7z7H797q6`6,7G3,7m7D7o786P3d7N7K7V667y7S7Q7#4k6v7j6V6N7B7J047t7)5q7+7Y6q7p7~7T7L7w3}807$7:7s0%5Z5#6W0w0 2A130t0,0U7{5/4S8l6S0 0!0Z8b5!6W54040l3K8o3h555L7P7x7U7k4%6e5T8H3I0e5b042$8A8e6e0X6g2u6k7,8F5Y4#6a6a8v5K578L4{7@8+4=0 028i0g5;6.8d5K8A4?0R8R8C8{8:8=8~045*0t5B8.228N0 1|0j8A7h988m048;0U8?938K7=6I8|930j9n8^6#919k9395978Y7*048!4 8$9G845w048g0k8i0z8k8E8/040C6*8S0z0A0A269d9Q7|5s6Z876I8S8D9o729q9g6d1A7^838_5S90048}9:8B8J7^0%8a8#8c6v8w2A0U0k0D1h9}8S9L9N9P4 1i4D0H2H2,ak4n1B4p2K2M2I1,1.2K0z1San0q4o11aA0+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

.128013s3Oo8;bcdufvgMI/T0ly n7AapS.r1-meR,(P2=4V:+Njtwki9][5h)6050j0H0U0z0X0t0b0v0i0t0z0b0b0N010U0X0A010406050b0k0G0G0z0D0u040B0e0t0k0|0e0w050q13151719110A041i1p051s0q1s1u1p110j0X0m0;0?0^0`0$0X0n0$0t1I0$0U0 050,0h0t0H1D0@0_011H1J1L1J0U1R1T1P0U0h0e0j191Q0D1q0U0$0;1c0b0A0z0w0`0M011V1F010l0.0H0w0z0G0H1P1`1|211X241T27290 0a0v0L0D0e0A0e0b0X1f0w0v0*1^0D0D0H0i2u1i2c0w1q0q1?2H0U1;1:1=0j2e0`1L0w262r1P1A1C0=1W2R0X2T0w1-1B1P0A2A1q2F2H2/121{2v2Z222(0D160t0 0v0E2E2?102=2d2^1X2`2|2~0M311|332F2Q01380z2}040v0c3c2G113f360`3i3k0v0O3o3e2?3g3u2~0#3y3q3A3s3h0e2{3j2~0(3F342@1E373K393l0x3P3r3S3t3U3M3l0f3Y3H3!3J3L3v0Y3*353,3C040E0s3;3R2!3-3V0E301j323G3=3}3@0E3b423d443|2_3$3k0E3n4a2G1r2-1i2X2K0j2O3g0i1-2a1q4o1t4m2;4j1q4t0*2.3+460 0o0d0I0r3y0v3Q3g0e0 0N4N4P3I0G0X0 3`4B4c3B0 0P0p0P0y0S4M4B4O3Z3}4R044T4/4V3,4X0 412/06504`3}0W0 0*0l3y52220V2~584;2_0l0 0m0e0X2s0w0b5d4G220~040K5o452_0 0n0D0.1T5u4d1X5r0J4U5e370 0X5C3g5F5H5p5J040T5M3I5r0%0Q3F0v5!4:5Q3t0 0,5A0H5P5v1X4?4^2/5$5.3t0h0 2h5U3,5r5t4B595R5y5+5|3}5W3F065#5?5D5(041A2A2C0X1g5n4_5I0`5:5-6c015~5 2;6m014?0F65224|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 0%742G765}6{7a6:786=6!6@6F6_774}7i7s7u3l6W7f7z7H797q6`6,7G3,7m7D7o786P3d7N7K7V667y7S7Q7#4k6v7j6V6N7B7J047t7)5q7+7Y6q7p7~7T7L7w3}807$7:7s0%5Z5#6W0w0 2A130t0,0U7{5/4S8l6S0 0!0Z8b5!6W54040l3K8o3h555L7P7x7U7k4%6e5T8H3I0e5b042$8A8e6e0X6g2u6k7,8F5Y4#6a6a8v5K578L4{7@8+4=0 028i0g5;6.8d5K8A4?0R8R8C8{8:8=8~045*0t5B8.228N0 1|0j8A7h988m048;0U8?938K7=6I8|930j9n8^6#919k9395978Y7*048!4 8$9G845w048g0k8i0z8k8E8/040C6*8S0z0A0A269d9Q7|5s6Z876I8S8D9o729q9g6d1A7^838_5S90048}9:8B8J7^0%8a8#8c6v8w2A0U0k0D1h9}8S9L9N9P4 1i4D0H2H2,ak4n1B4p2K2M2I1,1.2K0z1San0q4o11aA0+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

.128013s3Oo_8bcdufvgMI/T0ly n7AapSr1meR,(P2=4V:+Njtwki9][5h)6050j0F0S0z0V0t0b0v0i0t0z0b0b0L010S0V0A010406050b0k0E0E0z0C0u040B0e0t0k0`0e0w050q111315170 0A041g1n051q0q1q1s1n0 0j0V0m0/0;0?0^0!0V0n0!0t1G0!0S0}050*0h0t0F1B0=0@011F1H1J1H0S1P1R1N0S0h0e0j171O0C1o0S0!0/1a0b0A0z0w0^0K011T1D010l0,0F0w0z0E0F1N1^1`1 1V221R25270}0a0v0J0C0e0A0e0b0V1d0w0v0(1?0C0C0F0i2s1g2a0w1o0q1;2F0S1/1.1:0j2c0^1J0w242p1N1y1A0:1U2P0V2R0w1+1z1N0A2y1o2D2F2-101_2t2X202$0C140t0}0D2C2;0~2:2b2?1V2^2`0}0K2~1`302D2O01350z2{040c392E0 3c330^3f3h0M3k3b2;3d3q0}0Z3t3m3v3o3e0e2_3g0}0$3A312=1C343F36040x3K3n3N3p3P3H040g3T3C3V3E3G3h0W3t1p2+1g2V2I0j2M3d0i1+281o3:1r3.2/1h2 053^0(2,3$2Y3e0}0o0d0G0r3t0v3L3d0e0}0L4e4g3D0E0V0}0s3#323%0w0}0N0p0N0y0Q4d403a4f3U474i044k4D2E4F46204o2|3A063B4t470U0}0(0l3,4G200T0}4f4L454V2@0l0}0m0e0V2q0w0b0f0m1z1`0S0b4#4O1V0|040I504-340}0n0C0,1R563M47530H4l4$58040V5e3d5h5j513p0}0R5o3D530#0O3A0v5C4N575t040S0e0*0t5r5F014I4K2-5E5f4P4p044r4+065D5S3d4X040l3F5M5T5l0V4`4=4@5w3%5q4+5#3D4v040R5/4?2!5+4h4(5m1f5^4m4u4:5:2!4 4+675g0}556d5k5G5a5c0F5=6f045i666j485m6o205@5R6e2@5u6w520}5z5B5!5D6A5l5I5K613D4I0P5Q2 5_68046l0t5d6i5s01530Y6D5G5.4;5 652/6t530X6(6!5N5{5}6,5;6@5,0^6;6H5C6K0^5%2y0S0k0C6.6T736u6M3g3K0q430F2F2*7j3/1z3;2I2K2G1*1,2I0z1Q7m0q3: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

.128013s3Oo_8bcdufvgMI/T0ly n7AapSr1meR,(P2=4V:+Njtwki9][5h)6050j0F0S0z0V0t0b0v0i0t0z0b0b0L010S0V0A010406050b0k0E0E0z0C0u040B0e0t0k0`0e0w050q111315170 0A041g1n051q0q1q1s1n0 0j0V0m0/0;0?0^0!0V0n0!0t1G0!0S0}050*0h0t0F1B0=0@011F1H1J1H0S1P1R1N0S0h0e0j171O0C1o0S0!0/1a0b0A0z0w0^0K011T1D010l0,0F0w0z0E0F1N1^1`1 1V221R25270}0a0v0J0C0e0A0e0b0V1d0w0v0(1?0C0C0F0i2s1g2a0w1o0q1;2F0S1/1.1:0j2c0^1J0w242p1N1y1A0:1U2P0V2R0w1+1z1N0A2y1o2D2F2-101_2t2X202$0C140t0}0D2C2;0~2:2b2?1V2^2`0}0K2~1`302D2O01350z2{040c392E0 3c330^3f3h0M3k3b2;3d3q0}0Z3t3m3v3o3e0e2_3g0}0$3A312=1C343F36040x3K3n3N3p3P3H040g3T3C3V3E3G3h0W3t1p2+1g2V2I0j2M3d0i1+281o3:1r3.2/1h2 053^0(2,3$2Y3e0}0o0d0G0r3t0v3L3d0e0}0L4e4g3D0E0V0}0s3#323%0w0}0N0p0N0y0Q4d403a4f3U474i044k4D2E4F46204o2|3A063B4t470U0}0(0l3,4G200T0}4f4L454V2@0l0}0m0e0V2q0w0b0f0m1z1`0S0b4#4O1V0|040I504-340}0n0C0,1R563M47530H4l4$58040V5e3d5h5j513p0}0R5o3D530#0O3A0v5C4N575t040S0e0*0t5r5F014I4K2-5E5f4P4p044r4+065D5S3d4X040l3F5M5T5l0V4`4=4@5w3%5q4+5#3D4v040R5/4?2!5+4h4(5m1f5^4m4u4:5:2!4 4+675g0}556d5k5G5a5c0F5=6f045i666j485m6o205@5R6e2@5u6w520}5z5B5!5D6A5l5I5K613D4I0P5Q2 5_68046l0t5d6i5s01530Y6D5G5.4;5 652/6t530X6(6!5N5{5}6,5;6@5,0^6;6H5C6K0^5%2y0S0k0C6.6T736u6M3g3K0q430F2F2*7j3/1z3;2I2K2G1*1,2I0z1Q7m0q3: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

.128013sH3_8ufvIy n7GaS1me(P2C4V:jtwi]D[hE)6Oo;bcdUgM/T0làqAp.rL-,=Nzk95Rxé050R0t0C0p0E0Y0b0l0Q0Y0p0b0b0,010C0E0$010406050b0g0s0s0p0(0k040q0N0Y0g180N0m0l020p0s0$0O0l0=0t1i0(0!0g0t0b050V1f1h1j1l1d0$041J1Q051T0V1T1V1Q1d0R0E0i101214160I0E0T0I0Y1-0I0C1b050{0P0Y0t1(1315011,1.1:1.0C1_1{1@0C0P0N0R1l1^0(1R0C0I101o0b0$0p0m160w011}1*010h0}0t0m1w0t1@2l2n2s1 2v1{2y0s2A040a0l0v0(0N0$0N0b0E1r1t0_2j0(0(0t0Q2V1J2C0m1R0V2h2+0C2f2e2g0R2E161:0m2x2S1@1#1%111~2^0E2`0m2b1$1@0$2!1R2)2+3c1e2m1t302t350(1i0Y1b0l0r2(3g1c3f2D3i1 3k3m3o0w3r2n3t2)2@013y0p3n040l0d3C2*1d3F3w163I3K0l0y3O3E3g3G3U3o0;3Y3Q3!3S3H0N3l3J3o0L3)3u3h1)3x3.3z3L0n3?3R3_3T3{3:3L0f3 3+413-3/3V0:473v493$040r0X4e3^314a3|0r3q1K3s3*4f4n4h0r3B4s3D4u4m3j433K0r3N4A3P3@3#4F1b0r3X4J3Z4v4E4b4O3(4R1S3a1J2~2.0R2=3G0Q2b2K0^1$1R390t3b3s3Y054+0_4?4T3x1b0U0M0=0W3Y0l4L3,0N1b0,5456490s0E1b4k4R4C3#1b0z0j0z0#0-534R55404n58045a5s5c4n5e4O3)065j3,0/1b0_0h4^5u2t0D3o5M484w0h1b0T2x0t0(0p2%4Y5N1 1a040u5R4}3T5V0(0}1{5,4D5(1b0K0A3)0l5}5t5S3j1b0{5;0t5b5%165w5y3c5 5-3H0P1b2H5?3G5)5+5$604~040T5:0Y5=6m6d5)0K5|5~5A6104350g0i0t6s655z670169666n5.6p6r1{0e3J0t5!0N0E2!6i3,6k6!4g620|6H6%4n5)0+6N6d5C045h3e6K6w5E5~6c5@165I040h3.6:6~3H1b0E743G0N5P0433793,0m6f045Z0m5W6,2t6$6u750m6)647n5^045`6y6|5}6A1 70720(7f6(040B7H5v7c7e6J6O6e1b7k7m7q6j1b6l6^7Q7s04636+7V6#5_5{5i7A7.6}3G700E5L7P6d7#6q7u7)495)0H7v6P787}6-1b0F80846B7K897w0F7L2t696a3s7:7g4 515r6b7C687c2n0R8f6o0i6X2T0m0b0e0i1$2n0C1I8c167p7Z7_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=4z8p6K5w020Y0C0O8+2*8}6B8x0E8z8B8D0i8F8H9C7w7Y9K8M6Q8Oa38Q1b6/9Q7I83a08Ja99T7J9N6xab5v1b9-9/9;3L9t6=8;a78$8^4t8|7/9t7#906G6tae8V9E8I7699aJ9b9J3DaB9MaM9ial8g59ah9o9W9r9t702!0C0g0(0mahaD924t1J4`4=4Za=0V4$1J0C4(a`2:2,2a2c2.0p1`a@4$1P4|752!0s0e0h0p0/0t0e0I0d1b1B1D1F1H0laxaP1W3t1Q0j0Y0l1H0C0l0R0@0b439_0l2R140Eb4bA1|0Q3J0Q0g1{0(bA7?0h0@2!0m0Cbo0T0@0mbW5!0E1s0 1f0Q0Q1H2T6F0 0R0g0l0B0tb^2X120l8D0t0%1Sbt040M1t392Q2S1|2Ra)106G0p0lb~720m2$b*1t4_4,7Jb{0e0_0e128C0E6Ia;3L0Q0E0*0_140N0g0 7,1Z4.2 49211/1;1?b83G2G2x2z1b2M0q0Q5:0$bz0v0k2h1s4^4;b83d4@cza#5J0t7@aG7c55aJ0m5Ucq0gcsbgcvc09Na2aP6K9za6d77Q8W9*9L6C0P0e5W2`5Z2V9 av8?7y7-6z6K7E73aU6o0e9j7Na+dw3T7i7T9Bdo945*9Fdgdi5Xdlcmdndb6v7+9r6|aQa5a.8,9ZaWdCaKdj5Yb)c+aSdJc|8NdY2*9t6`5ia:cpa?2+b61U040)000@1#bZcd8D1f3J9_d*2Wb|0@0P1qbLch000t0?5YcBb/2jbYcxbYbA003.bo0`bA0@0B0ZbG1p2Tb{0(0 4+c}1-a)e90 330CbWb:8F1H0%060zcG0 cc6F0.0lba0$12b/bS1{2j2X2me)000g2Weuej1x1{eFcCcEbDcHbpc31!1$3GcO231=2B7QcU2I2K0q2/0g2$a)bo0b261Hc,4!3e4Yc;6K0Q0r1b031A0@0T125Wb?1|0Y002n0E1i5#8_dW0W0#0j0)0)0J0e0x0JfM0SfN9jd#de6;8/4XfHd81b0GfRfK0e0q0J0x0M0-f(0qfV5x9%c~0X0%9)a/f$04f.fT0J0S0=0eaY5q0Jf?aq9?1 0b2q0401030n0t0;0L0Q2q5E9tfqfsfufw0pfybAb^b`0g4l9mfJfLfUd$9kfX759(f|4BdW7{d:ar9+fW9Yf~gN6Sei1Ce$dGdRa8d-aGgd1b01fhb3e^01ajgA8ldLd(dOb+g99%fZ6@4t5G49gq04ft12ck1C2xbzb@b_b{g:7Ie50ge70be9d5dKgUgZd;9h04aagH9m7hdMdkeKg/d@0Vc;1W4!a^4/f0cM4nf3cQf66df8cW040c3.0Y0N7U3ec-3@c/aPfo7Qh0ft0=fvfxbob}fC0mfEhhd@f~gCfMfOfQfSgEhq9Rf@d$6=f!f}dff(0)f*f,f.f:0Jf=gFgRdZ6K0sf_f{hb98g0fNg3g59Vg7g_d$g(gfghgjglgn5ig~4nh!gsh(b?gxhah/dfh;h_gS7QgGiKfY1b0wg|gLgT9Aiph`7Ihk0egWe@hlcS8?d6hm7Qir20hPhR2Ahwf#dfhsg?hviah|iW5Bg{gofpfrh1ch2nb/2Jeqh8gyih9@9_he1:hgfGdH85g$jh6Bhk9NhpiN8Yg=dNi_aGd?fHhyd_hAb5hDcLf21;f4cR9thL2J1b0ob$b(e3bS2X9}9_0b6Vgz4YhUfm3ehY6diAh$gtgvh*fDfFcmja6oiIh?fR0)g1iVjp3Gh~j.6Pi2i4f-f/f;j^ic7Qie5g0%4ri=a4ijg2g4g60Wg8i`ga9ti,itgkgmg.ixgpj1h#h%guh)iEjVkajqj:k39=as8/4jiR4KiTdakDgQi{j_g;iYi!gYhiaJi,jR14jU0?kpju5_j|aKi@jsdmkCgPk58/iQkH1ciy2tiAh3j5h6gwh9kyi0a4hdhfh.k#jjg!9mjmd,jok4a4k)huk+d,akjwhzhUhC0i3ta^0`6*0b04.

###(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

.128013sH3_8ufvIy n7GaS1me(P2C4V:jtwi]D[hE)6Oo;bcdUgM/T0làqAp.rL-,=Nzk95Rxé050R0t0C0p0E0Y0b0l0Q0Y0p0b0b0,010C0E0$010406050b0g0s0s0p0(0k040q0N0Y0g180N0m0l020p0s0$0O0l0=0t1i0(0!0g0t0b050V1f1h1j1l1d0$041J1Q051T0V1T1V1Q1d0R0E0i101214160I0E0T0I0Y1-0I0C1b050{0P0Y0t1(1315011,1.1:1.0C1_1{1@0C0P0N0R1l1^0(1R0C0I101o0b0$0p0m160w011}1*010h0}0t0m1w0t1@2l2n2s1 2v1{2y0s2A040a0l0v0(0N0$0N0b0E1r1t0_2j0(0(0t0Q2V1J2C0m1R0V2h2+0C2f2e2g0R2E161:0m2x2S1@1#1%111~2^0E2`0m2b1$1@0$2!1R2)2+3c1e2m1t302t350(1i0Y1b0l0r2(3g1c3f2D3i1 3k3m3o0w3r2n3t2)2@013y0p3n040l0d3C2*1d3F3w163I3K0l0y3O3E3g3G3U3o0;3Y3Q3!3S3H0N3l3J3o0L3)3u3h1)3x3.3z3L0n3?3R3_3T3{3:3L0f3 3+413-3/3V0:473v493$040r0X4e3^314a3|0r3q1K3s3*4f4n4h0r3B4s3D4u4m3j433K0r3N4A3P3@3#4F1b0r3X4J3Z4v4E4b4O3(4R1S3a1J2~2.0R2=3G0Q2b2K0^1$1R390t3b3s3Y054+0_4?4T3x1b0U0M0=0W3Y0l4L3,0N1b0,5456490s0E1b4k4R4C3#1b0z0j0z0#0-534R55404n58045a5s5c4n5e4O3)065j3,0/1b0_0h4^5u2t0D3o5M484w0h1b0T2x0t0(0p2%4Y5N1 1a040u5R4}3T5V0(0}1{5,4D5(1b0K0A3)0l5}5t5S3j1b0{5;0t5b5%165w5y3c5 5-3H0P1b2H5?3G5)5+5$604~040T5:0Y5=6m6d5)0K5|5~5A6104350g0i0t6s655z670169666n5.6p6r1{0e3J0t5!0N0E2!6i3,6k6!4g620|6H6%4n5)0+6N6d5C045h3e6K6w5E5~6c5@165I040h3.6:6~3H1b0E743G0N5P0433793,0m6f045Z0m5W6,2t6$6u750m6)647n5^045`6y6|5}6A1 70720(7f6(040B7H5v7c7e6J6O6e1b7k7m7q6j1b6l6^7Q7s04636+7V6#5_5{5i7A7.6}3G700E5L7P6d7#6q7u7)495)0H7v6P787}6-1b0F80846B7K897w0F7L2t696a3s7:7g4 515r6b7C687c2n0R8f6o0i6X2T0m0b0e0i1$2n0C1I8c167p7Z7_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=4z8p6K5w020Y0C0O8+2*8}6B8x0E8z8B8D0i8F8H9C7w7Y9K8M6Q8Oa38Q1b6/9Q7I83a08Ja99T7J9N6xab5v1b9-9/9;3L9t6=8;a78$8^4t8|7/9t7#906G6tae8V9E8I7699aJ9b9J3DaB9MaM9ial8g59ah9o9W9r9t702!0C0g0(0mahaD924t1J4`4=4Za=0V4$1J0C4(a`2:2,2a2c2.0p1`a@4$1P4|752!0s0e0h0p0/0t0e0I0d1b1B1D1F1H0laxaP1W3t1Q0j0Y0l1H0C0l0R0@0b439_0l2R140Eb4bA1|0Q3J0Q0g1{0(bA7?0h0@2!0m0Cbo0T0@0mbW5!0E1s0 1f0Q0Q1H2T6F0 0R0g0l0B0tb^2X120l8D0t0%1Sbt040M1t392Q2S1|2Ra)106G0p0lb~720m2$b*1t4_4,7Jb{0e0_0e128C0E6Ia;3L0Q0E0*0_140N0g0 7,1Z4.2 49211/1;1?b83G2G2x2z1b2M0q0Q5:0$bz0v0k2h1s4^4;b83d4@cza#5J0t7@aG7c55aJ0m5Ucq0gcsbgcvc09Na2aP6K9za6d77Q8W9*9L6C0P0e5W2`5Z2V9 av8?7y7-6z6K7E73aU6o0e9j7Na+dw3T7i7T9Bdo945*9Fdgdi5Xdlcmdndb6v7+9r6|aQa5a.8,9ZaWdCaKdj5Yb)c+aSdJc|8NdY2*9t6`5ia:cpa?2+b61U040)000@1#bZcd8D1f3J9_d*2Wb|0@0P1qbLch000t0?5YcBb/2jbYcxbYbA003.bo0`bA0@0B0ZbG1p2Tb{0(0 4+c}1-a)e90 330CbWb:8F1H0%060zcG0 cc6F0.0lba0$12b/bS1{2j2X2me)000g2Weuej1x1{eFcCcEbDcHbpc31!1$3GcO231=2B7QcU2I2K0q2/0g2$a)bo0b261Hc,4!3e4Yc;6K0Q0r1b031A0@0T125Wb?1|0Y002n0E1i5#8_dW0W0#0j0)0)0J0e0x0JfM0SfN9jd#de6;8/4XfHd81b0GfRfK0e0q0J0x0M0-f(0qfV5x9%c~0X0%9)a/f$04f.fT0J0S0=0eaY5q0Jf?aq9?1 0b2q0401030n0t0;0L0Q2q5E9tfqfsfufw0pfybAb^b`0g4l9mfJfLfUd$9kfX759(f|4BdW7{d:ar9+fW9Yf~gN6Sei1Ce$dGdRa8d-aGgd1b01fhb3e^01ajgA8ldLd(dOb+g99%fZ6@4t5G49gq04ft12ck1C2xbzb@b_b{g:7Ie50ge70be9d5dKgUgZd;9h04aagH9m7hdMdkeKg/d@0Vc;1W4!a^4/f0cM4nf3cQf66df8cW040c3.0Y0N7U3ec-3@c/aPfo7Qh0ft0=fvfxbob}fC0mfEhhd@f~gCfMfOfQfSgEhq9Rf@d$6=f!f}dff(0)f*f,f.f:0Jf=gFgRdZ6K0sf_f{hb98g0fNg3g59Vg7g_d$g(gfghgjglgn5ig~4nh!gsh(b?gxhah/dfh;h_gS7QgGiKfY1b0wg|gLgT9Aiph`7Ihk0egWe@hlcS8?d6hm7Qir20hPhR2Ahwf#dfhsg?hviah|iW5Bg{gofpfrh1ch2nb/2Jeqh8gyih9@9_he1:hgfGdH85g$jh6Bhk9NhpiN8Yg=dNi_aGd?fHhyd_hAb5hDcLf21;f4cR9thL2J1b0ob$b(e3bS2X9}9_0b6Vgz4YhUfm3ehY6diAh$gtgvh*fDfFcmja6oiIh?fR0)g1iVjp3Gh~j.6Pi2i4f-f/f;j^ic7Qie5g0%4ri=a4ijg2g4g60Wg8i`ga9ti,itgkgmg.ixgpj1h#h%guh)iEjVkajqj:k39=as8/4jiR4KiTdakDgQi{j_g;iYi!gYhiaJi,jR14jU0?kpju5_j|aKi@jsdmkCgPk58/iQkH1ciy2tiAh3j5h6gwh9kyi0a4hdhfh.k#jjg!9mjmd,jok4a4k)huk+d,akjwhzhUhC0i3ta^0`6*0b04.

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