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
.128013w»l.;à,a/: +Lq]r0npmx3_kséRhf45(Ovtb=ocgeS1)[2iIPd«uy050Y0P0J0i0V0d0z0l0N0d0i0z0z0L010J0V0t010406050z0!0u0u0i0q0#040Q0M0d0!0_0M0s0l020i0u0t0f0l0B0P130q0o0!0P0z050j101214160~0t041u1B051E0j1E1G1B0~0Y0V0I0.0:0=0@0C0V0O0C0d1U0C0J0|050)0K0d0P1P0;0?011T1V1X1V0J1%1)1#0J0K0M0Y161$0q1C0J0C0.190z0t0i0s0@0U011+1R010D0+0P0s1h0P1#26282d1-2g1)2j0u2l040a0l0X0q0M0t0M0z0V1c1e0%240q0q0P0N2G1u2n0s1C0j222S0J201 210Y2p0@1X0s2i2D1#1M1O0/1,2$0V2(0s1|1N1#0t2L1C2Q2S2}0 271e2.2e2?0q130d0|0R2P310}302o331-35370|0U3b283d2Q2#013i0i38040w3m2R0~3p3g0@3s3u0E3x3o313q3D0|0F3G1D2{1u2,2V0Y2Z3q0N1|2v0$1N1C2`0P2|3c3N3W0%3(3f1Q1-0y0|0%0D3N3A3/0@0b0|0l3^3I3B3r0D0|0z3W2L0x130v3 3.2/010{040G4b323`3r0|0t0:0s0N0C0P4i3q4f0S0k3G060l4A3~3_4d0s0|0I3t0P0!0q4t414f0h3G4C404k4F040%452i0Y280J1t1v3c4R4c2e0M0|0L4Q3e4j4E4m4o4q4s4%3n4z4B4:3q3;040V3@4`2R4)4;340K0|2s4M4k4f4h543-573h3=1s0N4Y4!4$2 4D2e4v4/5r1-4,040L4.5g563q0u0V0|0r5c4d4f4x5g4|4B4}5v0@502L0J4K0s5u4S4=044H1)4K4y5O4~415S0(5V5X4*5j5!4I5%5B5*4k5x0m5/5i3C5904495I5s0|0G0T635;450M47625g5_5J65683C5k456i4e0|0S5}4 0|0D6b6q414U4W0N6v5`3|515W5^5Q4l4V5l5n0s4#6m4f0p6p5M1u3+3%3O6U0j3R1u0J3T6Z2X2T1{1}2V0i1(6W3R1A5h3q2L0u0x0D0i0y0P0x0C0w0|1m1o1q1s0l5L2 1H3d1B0W0d0l1s0J0l0i0!0=0V0l2C7j6-0l2I2`0M0N0A0%0q0l0g0l0d000*2I0Y000!2(0l1{0!0/1*056T3q1/1W1Y1!6;5+6s6u6e0j6T04753~781L1N7P1Y1;1Z2m5Y2e2r2i2k0|2x0Q0N0q0`7f0X0#221d3N3$5h2~3)7!6f2e503?6m6C7%5q7:3h43046a6c0i4a6e6G5e6m4U4n284^6N6o763c5N5C6w4G5?4L8p8h0@4O6A5Z6y6K6M6F8I015x5A2}8C4T4?8v4r5(5P8R4U490V8L4+4-8+1-5E5G8#4A893:7W8G8V8@6j6I6l8Q5:0@0M6C2;8.8}8N0s4Z6L5p3)8q0|8z4{5O5)6G4U9c3n8W4d8T966H8l6|6d8g916n4g8s6k6z8H9x5t5M9i8$9x50529r8(8n8*905~8S0|020d0J0f9M448x049g3y9H9H8|6H8)9r9q9Q3J9Z9G9I9R5,5U0q6E8{9k8E5$8`4(9*5{9Y619O4y6S3X2S843Q3!6:0n740%0!0v0l0z191b0V1d0-2`0A7t0%6L74an1X0z2i7f0:0l0qas4K2E0I2F0A7d7f0P0D0D2M5UaA7p1d0N7p74270q3WaG7d1e7r6t994J7w2IaC0Z7l4@4r0l0c0e0l0Ha%4J7f7h7j7daOaQ1r7w7G7l14a!0q0-2i7l2Aa)ah7waJ0q0i0_0D751D3d2,7+1:7S7/9x7=2t2v7_7{7}2y800C826eab772 886G8baN8d3}8s8j9t488n9!5f9w9R8ta;4_bW4u8y8=9o344m2h9-8-9/4N0|0TbV9d8%8Y4p8!9D9R8Kb/4k8:045Hb|b$040S0pb(9*9N0v9P9|8R9.ce9xc1c32}8B9*500b1T1)9M605bc4b:9zcv8X040tb,cy6gc6b-04020O9W9rcj9!9$0}9(b)1-8rcDb*5=9 9!4Pb 8M6J995o9!0ScZchbX440M12b!a16Gcgc=b^cAcCb#415x0e9AcA2BbU6QclcQcac.c:cG0m8Uc^9x4U5#a+b(9j8R9K53c,3Jct2ibUd0989a8Pc|5d6ocG5zcL5Fc2cNdi9(d7a5ccdzcs0|9vb@9E6hcU5;9,dR8J0|c+ddc-8kc/2uc)dF8?bK0|0P0,c;3n9*5Kd(9icn8_a46y9-949{dY9:8~5mc%9bdE9=cQ9)9}c`crdU9S04c eb4U0i0t0t4YbUb?d/e8d`ebb~dn8Dd!d9eq6od48Adj9J0|5T5.c!cVdTcla83,6V2S6/3Q0(0*0,04.