Aller au contenu

Mineur (le meilleur filon)⚓︎

Armé de sa pioche, Steve est à la surface d'une mine. Une étude précise du terrain lui a permis de mesurer la richesse de chaque "bloc" de la mine.

Par exemple :

La mine

Comme on peut le voir, toutes les richesses sont des nombres entiers positifs.

Ces richesses sont fournies dans une liste de listes Python :

🐍 Script Python
mine = [[7,  9, 10,  7, 10,  8,  5],
        [5,  3,  1,  7,  5,  7,  1],
        [8,  9,  7,  7,  2,  3,  2],
        [7,  7,  2,  4,  6,  5,  7],
        [6,  7,  1,  6,  6,  6,  1],
        [3,  2,  5,  3,  2,  2, 10]]

Ainsi, le 9 sur la troisième ligne, deuxième colonne, indique que le bloc de coordonnées (i, j) = (2, 1) a une richesse de mine[2][1] = 9. De façon générale, dans la notation mine[i][j], i désigne l'indice de la ligne et j celui de la colonne.

On garantit que la mine possède au moins une ligne et deux colonnes.

Afin de ne pas user prématurément sa pioche, Steve ne souhaite pas creuser l'intégralité de la mine. À chaque niveau, il envisage plutôt de creuser soit :

  • ↙️ vers le bas à gauche,
  • ⬇️ vers le bas,
  • ↘️ vers le bas à droite.

Lorsque Steve creuse un bloc, il récupère la richesse de celui-ci. Ainsi, en partant du bloc de gauche de la première ligne et en creusant toujours sous ses pieds, il gagnerait un total de \(7+5+8+7+6+3=36\).

Attention

Lorsqu'il atteint le fond de la mine (la dernière ligne de la grille), Steve trouve sous ses pieds une roche sombre incassable : il ne peut plus creuser !

Il se demande donc quel est le meilleur filon à explorer : quelles richesses cumulées maximales peut-il espérer accumuler en creusant à partir de chacun des points de la surface et surtout, parmi celles-ci, laquelle est la meilleure ?

La figure suivante met en évidence un des chemins de richesse cumulée maximale. Elle vaut \(10+7+7+6+6+10=46\).

Chemin de richesse cumulée maximale

Son raisonnement est le suivant : " Si je suis en un bloc précis, la richesse cumulée maximale que je peux obtenir à partir de ce bloc est égale à la somme :

  • de la richesse de ce bloc,
  • et de la richesse maximale d'un des trois blocs inférieurs que je peux explorer. "

Afin de résoudre ce problème, on fournit une fonction dimensions renvoyant un tuple formé de la hauteur et de la largeur de la "mine" :

🐍 Script Python
def dimensions(mine):
    """Renvoie le tuple (hauteur, largeur) de la mine"""
    return len(mine), len(mine[0])

On pourra utiliser cette fonction en faisant : hauteur, largeur = dimensions(mine).

Écrire la fonction meilleure_richesse_cumulee :

  • prenant comme paramètre la mine (liste de listes),

  • et renvoyant la plus grande richesse cumulée que l'on peut obtenir à partir d'un des blocs de la surface.

Exemples

Avec une mine de 3 blocs de largeur :

🐍 Console Python
>>> mine = [[1, 2, 3],
...         [0, 1, 0],
...         [0, 1, 0],
...         [4, 0, 0]]
>>> meilleure_richesse_cumulee(mine)
9

Avec une mine de 1 bloc de haut :

🐍 Console Python
>>> mine = [[1, 2, 5]]
>>> meilleure_richesse_cumulee(mine)
5

Avec la mine citée plus haut :

🐍 Console Python
>>> mine = [[7,  9, 10,  7, 10,  8,  5],
...         [5,  3,  1,  7,  5,  7,  1],
...         [8,  9,  7,  7,  2,  3,  2],
...         [7,  7,  2,  4,  6,  5,  7],
...         [6,  7,  1,  6,  6,  6,  1],
...         [3,  2,  5,  3,  2,  2, 10]]
>>> meilleure_richesse_cumulee(mine)
46

La fonction calculera de façon itérative les richesses cumulées de chaque niveau i en commençant par le bas de la mine et en remontant vers la surface. Ces valeurs seront stockées dans la liste richesses_cumulees.

A chaque étape, on calculera les richesses d'un niveau à l'aide des valeurs de richesses cumulées du niveau du dessous. Ces calculs se feront dans une liste temporaire temp. On parcourra alors les colonnes j en prenant soin de traiter séparément les colonnes de gauche et de droite de la mine (certains des voisins du niveau inférieur sont alors absents).

Une fois les calculs de la nouvelle ligne terminés, on remplacera la valeur de richesses_cumulees par celle de temp avant d'aborder une nouvelle ligne.

La fonction calculera donc les richesses cumulées depuis le fond de la mine et en remontant ligne par ligne vers la surface.

Calcul d'un niveau

En dernier lieu, elle renverra la valeur maximale des richesses cumulées du niveau 0.

###(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- ià8m16Cl7.e:9;S/dktf+Irj3sogu0x]Pp*Onh=cLéyv(wq_b050B0v0D0i0l0s0K0k0Y0s0i0K0K0X010D0l0S010406050K0N0o0o0i0H0#040z0L0s0N0 0L0V0k020i0o0S0y0k0g0v190H0)0N0v0K050A16181a1c140S041A1H051K0A1K1M1H140B0l0$0@0_0{0}0W0l0M0W0s1!0W0D12050/0+0s0v1V0`0|011Z1#1%1#0D1-1/1+0D0+0L0B1c1,0H1I0D0W0@1f0K0S0i0V0}0f011;1X010E0;0v0V1n0v1+2c2e2j1?2m1/2p0o2r040a0k0R0H0L0S0L0K0l1i1k0-2a0H0H0v0Y2M1A2t0V1I0A282Y0D2625270B2v0}1%0V2o2J1+1S1U0^1=2,0l2.0V221T1+0S2R1I2W2Y33152d1k2@2k2|0H190s120k0p2V3713362u391?3b3d3f0f3i2e3k2W2+013p0i3e040k0J3t2X143w3n0}3z3B0k0d3F3v373x3L3f0b3P3H3R3J3y0L3c3A3f0q3W3l381W3o3#3q3C0t3*3I3-3K3/3%3C0n3?3Y3^3!3$3M0x3~3m403T040p0O453,2^413:0p3h1B3j3X464e480p3s4j3u4l4d3a3`3B0p3E4r3G3+3S4w120p3O4A3Q4m4v424F3V4I4t4D4M493)4P4C3Z4o3=4V3@4n4E493}4!3 4$4S0p444*4K3.4S0f4b4:4u4=3:0f4i334Q4X4%0f4q4 4W47524z554#4L4|4H5a4+5c3{0f4O5f4;3_4?4U5l4`5n4|4Z5q4R4|4)5v514?4/5z574S0J4^351N311A2=2#0B2)3x0Y222B0,1T1I300v323j3P055R0-5Z5m010C120-0E5#5b1?0(3f5:5g3o0E122A0;1/0N2R0*0H0l0Y0W1y0K0v0*0Y170N1/0v5^5*11040%6g5r3y5|2`6f4I564e6i0e0w3W0k6y0k6s3a120W0i1h0v606l3x6i0h3P6A5;3K120_0H0M6H0H6N6B1?0L120X6X6P6n041S2A0V2K1j1z6r6(6i6k6;5_6Q040o6p6J3Z6u3W066z6O6_010Y0p12030k0G0V2L0l3A0l0K0i2U4P736Y6`6365671y6a6c6e6:33745*6!046$4I7y6m6i0c6~406|125H5!6=120Q7I4e7A0T7R6C046S6U6I4P726z7n5+120E3#6%750V120l7-7z5?042`7=6m0V0+120H2e6U7V1?6?826`6E6G7!7x7(7A0j7`3x7K4985016L8e3Z8c8i8g4~7N758k7D8b128d6^5*8p8i6u6w7l737%6(7/040D1t0S8l407A7C8a7O047H8y6m8g7M3u7(6i7Q8V3x7T8i8I7Y6V718F8G7577790k0r1f1j2.0k2O0M6F7q6x8/7E3S128K1o8B128U356(8X98048$8R758P8N4n6o2.9e9a8r5*8I7;8%6 7P9p8Z9c0l7L9e9g3j938m120F6N097$928:9r7}6{0i0P9e6@9b7.7~64660{7s6b0o6d0v1y9o8o9A048Y2X8!7P6M8u8H9X7q9!0K7t9%7v9+9u7J9-8q9y8s7P0e8.927(8=047a8^0s8`1y0@2o2$3A9*8E8/7(5,047+6W9@9W040I9k2k0L7@7_av9O7~806q9V6h129U9q8Wa39e9?9h9r6R1a7ZauaS6m8naEaO4F9e6v919M6y7(8I968Ma16t998*12aya;2k8#az6Z6#a}6`6|9na`83a?b46`9taJ7F9wa@ax9Cb0017A9Ia#3S9P199Sb78jaLbd7p9Z689|9$9(anba6Kb6bA4Xa^bga!aY8faPbp8#aR4ka+bPbQa+a-9_bu9#7u9)7waNbB8Tbda_bD40bMa*bRb-bQbT04bt7rbwbXbzb!9vb$bp8Ib(9E8v04bjbI3Z8AbLa7a9ap6(acae8_0V8{2O0B2G2LaIbOaa9^8J8La0b)9l7XaV8-bpbHb`a2a%c79fbGa bkbE6{6}cC9x9:cob9cza=9fcL5)7{aU6Tcwc48O8wbgc6csa{7PcEc29J9LbS8Hbm9R9Tbs9Yb?9}bybZa5aKb|c%3ocVaWc*8xcY4e8g54cPc(9fbN3u9F47bUc^bx9 cKbd8,89c06(cydd7(c$d9b59fa87#9Mb:b=9{c_djd5aAcFdFd0cp97aode4ear2R0D600Vbg7|5|c;cCaMc|cUb;c@dCdibYa(715040ar5.8i7@6Ab}5{6*0l6,6.6-c=b}9mcld!b#a)4_3xd=7%bp0K0B1201ed1s0V0$0L0l1:1/0kdR0Sel0%878K600h0kdm0H0e8|ek0i0kb22redb,aq7~0.dSdU9P2yd~c b1cJePbq040edc2XdN3aeM2oeOdueQb3eS7G9,9BcC0Qdx550A5%5Y1J5K0A5M1A0D5Oe|2%2Z21232#0i1.e@e`5V1GcT3x2R0o0*0E0i0C690W0J121s1u1wai8D5I1Q1L040G0s0k0K000i0M2L0k2o0kfp0sfpfy3#8Kezem2G0N0$0v0Hev1:7qb2fO0ifR0H7i0V0DeveB0M630sel2O2I0l0B0?bnd`3A0u0k0U1k1h0;7h1:640l0k0N8{0i0S300L7qfNg9f+1n192M8|0#2z0lfp0u1J3k1H0ZfAg82Ggb2L0!7 0 fR0k0i0B2H0D0!g10Yg30SfS2Af(2O8{0Y3A6b1/fT1/0?dBbv0@7ugG0?fJ0B00g5ek1!8{0mf)0k7+7hfEf(010!5R2|6|682i0:6-g30_eC0!0oei2Rgn1Ngp04f|0k2I607 fD6F0{g3f~1%68fTg*gBgtga660k0Hg_602KgAfZ2Sg48{7+0V2T0l1j0k012`8K0H2.2ig.h2hEhGhI2O0+0`0vf`0ZfV0`fNhW68fE0Kf(3A3#0?elhE2*2Oh2eD0k0%7dfR6F6Ae?04er6V0k0j3g1Ah ey8Dft2=3x1^1$1(1*fb3Z2x2o2q122D0z0Y630Sf(0R0#281j5#5XcT345!h eH6*0v5/bpd=8*d^5}f-6V69gX69d)e1cMa66jbdeDa(frcma,coi1dne2b{eW3Cb:ewc*8Qdoaw6+2od|c{iTc}dZi`d#iXcCe:i!eY1?d/iFd;5@d@dgdCh{0v6Fe$i)dfcIe)e%eTi+j36`jcjej0iZ4sdz6(ar0liGdIjo1Tjd0Ni/i:dri$6FesaXi;7zc!cGcA8hcCjseXab78ad8@h$hVhXh_h:1jh=eAeC6pj1jtb/jveIdRhNbge+d d$9`68bgaratdUjaj{jO7SaCdTk27Wi e*bCjk8Ii%jKjG9ijNjz01dtjgcQ0Q9Dj-ca75ar0v0=iSihb*12jS3Cjn76jVaeh$0M0!0Vgx3Ab,juawiP9|jp0N0*0-0{0L0Ni_i,dpdHjLd#kO0*kQjfi}94jikv9;04jmb:k)k6a~c+k@0}kkk+b{j,3GbRdAd%bv6a69k(jBjqki9jk`eTcSds9-9/kwkm8i8)j^i.dMkM5*cc8@cecg1:8~0N90locnkNl39#l6k?k9c~jk9de.i/j k-crkb12lFjk8#le9ze-lGkojTkZk_kidV9QbolGi|li7Wk%kQkS67kVkXk/lU75lJlXi+c-b.l~l lAaTj_bVkPl8kRkT0Kl=lOkl2kk|l,dve/kLm16mlrafah0?0Yak7 gVmikq5*j}7,lcb~bGk4eLaG0V81dYe,jQlGk;colnlakhk#bJcBlGe44 l l2j`lD0*l7h|jDdkj^b mcmglLmye0mbk}jhlRm*0}lTb%bflcbimCl(k*mf7olCm5m#l:kUkWm/n06)m)lZkg04d4mPc5bKl{mtm0nlnlmWm4m!jCn5m9n7m%eSmze.l|nmnAnBnoc^l/m8manvlPbem{9Hc#nilSc8lzmumkkDlsagcf1:chcj8Knk7mcok%mpmZm=m:cQl^jMnemHa4n-dalYkYndjFncm2k8nPlHm?6)n,n9m^cxmOo2mek/n_kBm|myc:l)o0l+nDjbm6nsnHlGn/aZo8n@1?d79CnznBoymVn(n2nq6Fonnuoplkosn9oa8SmhnRkBdPeJj=m-m3dhlEm6c9oPj:eKofdWoho284j^l.oXmGj^n o)12mKl_lga(k 3ke=5S2Yiy5Lf95L0.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[4)2R,a- ià8m16Cl7.e:9;S/dktf+Irj3sogu0x]Pp*Onh=cLéyv(wq_b050B0v0D0i0l0s0K0k0Y0s0i0K0K0X010D0l0S010406050K0N0o0o0i0H0#040z0L0s0N0 0L0V0k020i0o0S0y0k0g0v190H0)0N0v0K050A16181a1c140S041A1H051K0A1K1M1H140B0l0$0@0_0{0}0W0l0M0W0s1!0W0D12050/0+0s0v1V0`0|011Z1#1%1#0D1-1/1+0D0+0L0B1c1,0H1I0D0W0@1f0K0S0i0V0}0f011;1X010E0;0v0V1n0v1+2c2e2j1?2m1/2p0o2r040a0k0R0H0L0S0L0K0l1i1k0-2a0H0H0v0Y2M1A2t0V1I0A282Y0D2625270B2v0}1%0V2o2J1+1S1U0^1=2,0l2.0V221T1+0S2R1I2W2Y33152d1k2@2k2|0H190s120k0p2V3713362u391?3b3d3f0f3i2e3k2W2+013p0i3e040k0J3t2X143w3n0}3z3B0k0d3F3v373x3L3f0b3P3H3R3J3y0L3c3A3f0q3W3l381W3o3#3q3C0t3*3I3-3K3/3%3C0n3?3Y3^3!3$3M0x3~3m403T040p0O453,2^413:0p3h1B3j3X464e480p3s4j3u4l4d3a3`3B0p3E4r3G3+3S4w120p3O4A3Q4m4v424F3V4I4t4D4M493)4P4C3Z4o3=4V3@4n4E493}4!3 4$4S0p444*4K3.4S0f4b4:4u4=3:0f4i334Q4X4%0f4q4 4W47524z554#4L4|4H5a4+5c3{0f4O5f4;3_4?4U5l4`5n4|4Z5q4R4|4)5v514?4/5z574S0J4^351N311A2=2#0B2)3x0Y222B0,1T1I300v323j3P055R0-5Z5m010C120-0E5#5b1?0(3f5:5g3o0E122A0;1/0N2R0*0H0l0Y0W1y0K0v0*0Y170N1/0v5^5*11040%6g5r3y5|2`6f4I564e6i0e0w3W0k6y0k6s3a120W0i1h0v606l3x6i0h3P6A5;3K120_0H0M6H0H6N6B1?0L120X6X6P6n041S2A0V2K1j1z6r6(6i6k6;5_6Q040o6p6J3Z6u3W066z6O6_010Y0p12030k0G0V2L0l3A0l0K0i2U4P736Y6`6365671y6a6c6e6:33745*6!046$4I7y6m6i0c6~406|125H5!6=120Q7I4e7A0T7R6C046S6U6I4P726z7n5+120E3#6%750V120l7-7z5?042`7=6m0V0+120H2e6U7V1?6?826`6E6G7!7x7(7A0j7`3x7K4985016L8e3Z8c8i8g4~7N758k7D8b128d6^5*8p8i6u6w7l737%6(7/040D1t0S8l407A7C8a7O047H8y6m8g7M3u7(6i7Q8V3x7T8i8I7Y6V718F8G7577790k0r1f1j2.0k2O0M6F7q6x8/7E3S128K1o8B128U356(8X98048$8R758P8N4n6o2.9e9a8r5*8I7;8%6 7P9p8Z9c0l7L9e9g3j938m120F6N097$928:9r7}6{0i0P9e6@9b7.7~64660{7s6b0o6d0v1y9o8o9A048Y2X8!7P6M8u8H9X7q9!0K7t9%7v9+9u7J9-8q9y8s7P0e8.927(8=047a8^0s8`1y0@2o2$3A9*8E8/7(5,047+6W9@9W040I9k2k0L7@7_av9O7~806q9V6h129U9q8Wa39e9?9h9r6R1a7ZauaS6m8naEaO4F9e6v919M6y7(8I968Ma16t998*12aya;2k8#az6Z6#a}6`6|9na`83a?b46`9taJ7F9wa@ax9Cb0017A9Ia#3S9P199Sb78jaLbd7p9Z689|9$9(anba6Kb6bA4Xa^bga!aY8faPbp8#aR4ka+bPbQa+a-9_bu9#7u9)7waNbB8Tbda_bD40bMa*bRb-bQbT04bt7rbwbXbzb!9vb$bp8Ib(9E8v04bjbI3Z8AbLa7a9ap6(acae8_0V8{2O0B2G2LaIbOaa9^8J8La0b)9l7XaV8-bpbHb`a2a%c79fbGa bkbE6{6}cC9x9:cob9cza=9fcL5)7{aU6Tcwc48O8wbgc6csa{7PcEc29J9LbS8Hbm9R9Tbs9Yb?9}bybZa5aKb|c%3ocVaWc*8xcY4e8g54cPc(9fbN3u9F47bUc^bx9 cKbd8,89c06(cydd7(c$d9b59fa87#9Mb:b=9{c_djd5aAcFdFd0cp97aode4ear2R0D600Vbg7|5|c;cCaMc|cUb;c@dCdibYa(715040ar5.8i7@6Ab}5{6*0l6,6.6-c=b}9mcld!b#a)4_3xd=7%bp0K0B1201ed1s0V0$0L0l1:1/0kdR0Sel0%878K600h0kdm0H0e8|ek0i0kb22redb,aq7~0.dSdU9P2yd~c b1cJePbq040edc2XdN3aeM2oeOdueQb3eS7G9,9BcC0Qdx550A5%5Y1J5K0A5M1A0D5Oe|2%2Z21232#0i1.e@e`5V1GcT3x2R0o0*0E0i0C690W0J121s1u1wai8D5I1Q1L040G0s0k0K000i0M2L0k2o0kfp0sfpfy3#8Kezem2G0N0$0v0Hev1:7qb2fO0ifR0H7i0V0DeveB0M630sel2O2I0l0B0?bnd`3A0u0k0U1k1h0;7h1:640l0k0N8{0i0S300L7qfNg9f+1n192M8|0#2z0lfp0u1J3k1H0ZfAg82Ggb2L0!7 0 fR0k0i0B2H0D0!g10Yg30SfS2Af(2O8{0Y3A6b1/fT1/0?dBbv0@7ugG0?fJ0B00g5ek1!8{0mf)0k7+7hfEf(010!5R2|6|682i0:6-g30_eC0!0oei2Rgn1Ngp04f|0k2I607 fD6F0{g3f~1%68fTg*gBgtga660k0Hg_602KgAfZ2Sg48{7+0V2T0l1j0k012`8K0H2.2ig.h2hEhGhI2O0+0`0vf`0ZfV0`fNhW68fE0Kf(3A3#0?elhE2*2Oh2eD0k0%7dfR6F6Ae?04er6V0k0j3g1Ah ey8Dft2=3x1^1$1(1*fb3Z2x2o2q122D0z0Y630Sf(0R0#281j5#5XcT345!h eH6*0v5/bpd=8*d^5}f-6V69gX69d)e1cMa66jbdeDa(frcma,coi1dne2b{eW3Cb:ewc*8Qdoaw6+2od|c{iTc}dZi`d#iXcCe:i!eY1?d/iFd;5@d@dgdCh{0v6Fe$i)dfcIe)e%eTi+j36`jcjej0iZ4sdz6(ar0liGdIjo1Tjd0Ni/i:dri$6FesaXi;7zc!cGcA8hcCjseXab78ad8@h$hVhXh_h:1jh=eAeC6pj1jtb/jveIdRhNbge+d d$9`68bgaratdUjaj{jO7SaCdTk27Wi e*bCjk8Ii%jKjG9ijNjz01dtjgcQ0Q9Dj-ca75ar0v0=iSihb*12jS3Cjn76jVaeh$0M0!0Vgx3Ab,juawiP9|jp0N0*0-0{0L0Ni_i,dpdHjLd#kO0*kQjfi}94jikv9;04jmb:k)k6a~c+k@0}kkk+b{j,3GbRdAd%bv6a69k(jBjqki9jk`eTcSds9-9/kwkm8i8)j^i.dMkM5*cc8@cecg1:8~0N90locnkNl39#l6k?k9c~jk9de.i/j k-crkb12lFjk8#le9ze-lGkojTkZk_kidV9QbolGi|li7Wk%kQkS67kVkXk/lU75lJlXi+c-b.l~l lAaTj_bVkPl8kRkT0Kl=lOkl2kk|l,dve/kLm16mlrafah0?0Yak7 gVmikq5*j}7,lcb~bGk4eLaG0V81dYe,jQlGk;colnlakhk#bJcBlGe44 l l2j`lD0*l7h|jDdkj^b mcmglLmye0mbk}jhlRm*0}lTb%bflcbimCl(k*mf7olCm5m#l:kUkWm/n06)m)lZkg04d4mPc5bKl{mtm0nlnlmWm4m!jCn5m9n7m%eSmze.l|nmnAnBnoc^l/m8manvlPbem{9Hc#nilSc8lzmumkkDlsagcf1:chcj8Knk7mcok%mpmZm=m:cQl^jMnemHa4n-dalYkYndjFncm2k8nPlHm?6)n,n9m^cxmOo2mek/n_kBm|myc:l)o0l+nDjbm6nsnHlGn/aZo8n@1?d79CnznBoymVn(n2nq6Fonnuoplkosn9oa8SmhnRkBdPeJj=m-m3dhlEm6c9oPj:eKofdWoho284j^l.oXmGj^n o)12mKl_lga(k 3ke=5S2Yiy5Lf95L0.0:0=04.