Galton Evolution

Un nouveau jeu est sorti au casino : « Galton Evolution ». Le jeu s'inspire de la planche de Galton : il s'agit d'une planche posée verticalement sur laquelle on a planté des clous. Lors d'une partie, on laisse tomber une bille vers le clou supérieur. Celle-ci rebondit de clou en clou jusqu'à atteindre le bas de la planche.

Le jeu présente toutefois deux évolutions :

  • chaque clou possède un nombre quelconque de clous « descendants » situés directement sous lui ;
  • chaque clou est associé à une valeur. Cette valeur est un nombre entier positif ou nul.

Une planche de jeu

Pendant sa chute, si la bille heurte un clou possédant des descendants, au prochain choc elle heurtera nécessairement l'un de ceux-ci. Si à l'inverse le clou ne possède pas de descendant, la bille roule directement jusqu'au bas de la planche.

Le score d'une partie se calcule en additionnant les valeurs de tous les clous heurtés par la bille.

Un joueur perplexe regarde une planche et se demande quel est le score maximal qu'il est possible d'obtenir. Dans le cas de la planche dessinée ci-dessus, le score maximal vaut 27 = 12 + 6 + 9.

Représentation en machine

On représente les « planches » à l'aide de couples (valeur portée par le clou supérieur, liste des descendants). Chacun des descendants contenus dans la liste (s'ils existent) représente lui aussi une « planche ».

Par exemple, dans la figure ci-dessus :

  • la « planche » dont le clou supérieur a pour valeur 9 n'a pas de descendant. Elle est représentée par (9, []) ;

  • la « planche » dont le clou supérieur a pour valeur 3 est représentée par (3, [(8, []), (10, [])]).

  • La « planche » de la figure est représentée par le tuple (12, [(6, [(9, [])]), (13, []),(3, [(8, []), (10, [])]),]).

Écrire en Python la fonction score_max qui prend en paramètre un tuple planche représentant une planche contenant au moins un clou. Cette fonction renvoie le score maximal qu'il est possible d'obtenir sur cette planche.

Exemples
>>> planche = (9, [])
>>> score_max(planche)
9
>>> planche = (3, [(8, []), (10, [])])
>>> score_max(planche)
13
>>> planche = (
...  12,
...   [
...       (6, [(9, [])]),
...       (13, []),
...       (3, [(8, []), (10, [])]),
...   ],
...  )
>>> score_max(planche)
27
###(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)+2I«rR3,sao iug0xàm1]PpOnl»h.e=céLy:v(wq;S/b_dk050!0K0d0q0t0G0p0s0M0G0q0p0p0L010d0t0D010406050p0u0z0z0q0l0P040W0r0G0u0_0r0F0s020q0z0D0V0s0m0K130l0U0u0K0p050X101214160~0D041u1B051E0X1E1G1B0~0!0t0R0.0:0=0@0I0t0v0I0G1U0I0d0|050)0Y0G0K1P0;0?011T1V1X1V0d1%1)1#0d0Y0r0!161$0l1C0d0I0.190p0D0q0F0@0i011+1R010e0+0K0F1h0K1#26282d1-2g1)2j0z2l040a0s0C0l0r0D0r0p0t1c1e0%240l0l0K0M2G1u2n0F1C0X222S0d201 210!2p0@1X0F2i2D1#1M1O0/1,2$0t2(0F1|1N1#0D2L1C2Q2S2}0 271e2.2e2?0l130G0|0A2P310}302o331-35370|0i3b283d2Q2#013i0q38040n3m2R0~3p3g0@3s3u0f3x3o313q3D0|0b3G1D2{1u2,2V0!2Z3q0M1|2v0$1N1C2`0K2|3c3N3W0%3(3f1Q1-0#0|0%0e3N3A3/0@0T0|0s3^3I3B3r0e0|0p3W2L0Z130x3 3.2/010{040S4b323`3r0|0D0:0F0M0I0K4i3q4f0g0Q3G060s4A3~3_4d0F0|0R3t0K0u0l4t414f0o3G4C404k4F040%452i0!280d1t1v3c4R4c2e0r0|0L4Q3e4j4E4m4o4q4s4%3n4z4B4:3q3;040t3@4`2R4)4;340Y0|2s4M4k4f4h543-573h3=1s0M4Y4!4$2 4D2e4v4/5r1-4,040L4.5g563q0z0t0|0w5c4d4f4x5g4|4B4}5v0@502L0d4K0F5u4S4=044H1)4K4y5O4~415S0(5V5X4*5j5!4I5%5B5*4k5x0h5/5i3C5904495I5s0|0S0c635;450r47625g5_5J65683C5k456i4e0|0g5}4 0|0e6b6q414U4W0M6v5`3|515W5^5Q4l4V5l5n0F4#6m4f0B6p5M1u3+3%3O6U0X3R1u0d3T6Z2X2T1{1}2V0q1(6W3R1A5h3q2L0z0Z0e0q0#0K0Z0I0n0|1m1o1q1s0s5L2 1H3d1B0j0G0s1s0d0s0q0u0=0t0s2C7j6-0s2I2`0r0M0N0%0l0s0y0s0G000*2I0!000u2(0s1{0u0/1*056T3q1/1W1Y1!6;5+6s6u6e0X6T04753~781L1N7P1Y1;1Z2m5Y2e2r2i2k0|2x0W0M0l0`7f0C0P221d3N3$5h2~3)7!6f2e503?6m6C7%5q7:3h43046a6c0q4a6e6G5e6m4U4n284^6N6o763c5N5C6w4G5?4L8p8h0@4O6A5Z6y6K6M6F8I015x5A2}8C4T4?8v4r5(5P8R4U490t8L4+4-8+1-5E5G8#4A893:7W8G8V8@6j6I6l8Q5:0@0r6C2;8.8}8N0F4Z6L5p3)8q0|8z4{5O5)6G4U9c3n8W4d8T966H8l6|6d8g916n4g8s6k6z8H9x5t5M9i8$9x50529r8(8n8*905~8S0|020G0d0V9M448x049g3y9H9H8|6H8)9r9q9Q3J9Z9G9I9R5,5U0l6E8{9k8E5$8`4(9*5{9Y619O4y6S3X2S843Q3!6:0O740%0u0x0s0p191b0t1d0-2`0N7t0%6L74an1X0p2i7f0:0s0las4K2E0R2F0N7d7f0K0e0e2M5UaA7p1d0M7p74270l3WaG7d1e7r6t994J7w2IaC0k7l4@4r0s0H0J0s0Ea%4J7f7h7j7daOaQ1r7w7G7l14a!0l0-2i7l2Aa)ah7waJ0l0q0_0e751D3d2,7+1:7S7/9x7=2t2v7_7{7}2y800I826eab772 886G8baN8d3}8s8j9t488n9!5f9w9R8ta;4_bW4u8y8=9o344m2h9-8-9/4N0|0cbV9d8%8Y4p8!9D9R8Kb/4k8:045Hb|b$040g0Bb(9*9N0x9P9|8R9.ce9xc1c32}8B9*500T1T1)9M605bc4b:9zcv8X040Db,cy6gc6b-04020v9W9rcj9!9$0}9(b)1-8rcDb*5=9 9!4Pb 8M6J995o9!0gcZchbX440r12b!a16Gcgc=b^cAcCb#415x0J9AcA2BbU6QclcQcac.c:cG0h8Uc^9x4U5#a+b(9j8R9K53c,3Jct2ibUd0989a8Pc|5d6ocG5zcL5Fc2cNdi9(d7a5ccdzcs0|9vb@9E6hcU5;9,dR8J0|c+ddc-8kc/2uc)dF8?bK0|0K0,c;3n9*5Kd(9icn8_a46y9-949{dY9:8~5mc%9bdE9=cQ9)9}c`crdU9S04c eb4U0q0D0D4YbUb?d/e8d`ebb~dn8Dd!d9eq6od48Adj9J0|5T5.c!cVdTcla83,6V2S6/3Q0(0*0,04.