Tour d'horizon

Série d'exercice

Cet exercice fait suit fait suite aux exercices « Soleil couchant » et « Soleil levant ».

Il est conseillé de les avoir résolus avant d'aborder celui-ci.

Un marcheur effectue une randonnée autour d'un quartier d'affaire d'une grande ville. Celui-ci comporte de nombreux immeubles disposés le long de rues perpendiculaires.

Les hauteurs des immeubles, en nombre d'étages, sont données dans une liste de listes de nombres entiers positifs. Certains blocs ne comportent pas d'immeubles et ont alors une hauteur de 0.

On fournit ci-dessous un exemple de petit quartier ainsi que la liste de listes le représentant :

Vue du quartier

Hauteurs des immeubles
quartier = [
    [1, 2, 3, 4],
    [5, 2, 6, 1],
    [3, 2, 0, 5]
]

Alors qu'il effectue le tour du quartier, le randonneur observe les façades des immeubles alignés le long de chaque rue. Certaines sont visibles, d'autres sont cachées par les précédents... Tous les immeubles étant bien « alignés » le long de leur rue, chaque façade ne peut être observée que d'un seul point de vue.

En considérant par exemple le petit quartier ci-dessus :

  • en observant la rue la plus au sud depuis l'ouest, on aperçoit 2 façades ;
  • en observant la rue la plus à l'est depuis le sud, on aperçoit 1 façade.

Une fois le tour complet du quartier effectué, le randonneur a au total observé 24 façades.

Les façades visibles
                Nord

             2  1  2  2
             v  v  v  v
        4 > [1, 2, 3, 4] < 1
Ouest   2 > [5, 2, 6, 1] < 2   Est
        2 > [3, 2, 0, 5] < 1
             ^  ^  ^  ^
             2  1  1  1

                Sud

Écrire la fonction nb_facades_visibles qui prend en paramètre la liste de listes hauteurs et renvoie le nombre de façades observées lors d'un tour complet du quartier.

Exemples
>>> quartier = [[1, 2, 3, 4], [5, 2, 6, 1], [3, 2, 0, 5]]
>>> nb_facades_visibles(quartier)
24
>>> quartier = [[1], [2]]
>>> nb_facades_visibles(quartier)
7

Cette version est laissée vide.

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

.128013:,kn9àSvsuO8;y7e[62-0w]r5_p»ag)R1IiN/=m«hb4x+jodt c(EP3qlf050W0q0X0D0J0)0j0Y0Z0)0D0j0j0M010X0J0B010406050j0k0N0N0D0y0o040h0V0)0k0~0V0e0Y020D0N0B0n0Y0G0q180y0(0k0q0j050L1517191b130B041z1G051J0L1J1L1G130W0J0i0?0^0`0|0P0J0E0P0)1Z0P0X11050.0Q0)0q1U0_0{011Y1!1$1!0X1,1.1*0X0Q0V0W1b1+0y1H0X0P0?1e0j0B0D0e0|0t011:1W010*0:0q0e1m0q1*2b2d2i1=2l1.2o0N2q040a0Y0$0y0V0B0V0j0J1h1j0,290y0y0q0Z2L1z2s0e1H0L272X0X2524260W2u0|1$0e2n2I1*1R1T0@1;2+0J2-0e211S1*0B2Q1H2V2X32142c1j2?2j2{0y180)110Y0H2U3612352t381=3a3c3e0t3h2d3j2V2*013o0D3d040Y0%3s2W133v3m0|3y3A0Y0R3E3u363w3K3e0z3O3G3Q3I3x0V3b3z3e0s3V3k371V3n3!3p3B0p3)3H3,3J3.3$3B0m3=3X3@3Z3#3L0f3}3l3 3S040H0v443+2@403/0H3g1A3i3W454d470H3r4i3t4k4c393_3A0H3D4q3F3*3R4v110H3N4z3P4l4u414E3U4H4s4C4L483(4O4B3Y4n3;4U3?4m4D483|4Z3~4#4R0H434)4J3-4R0t4a4/4t4;3/0t4h324P4W4$0t4p4~4V46514y544!4K4{4G594*5b3`0t4N341M301z2;2!0W2(3w0Z212A0+1S1H2 0q313i3O055t0,5B4:0|0d110,0*5D5a1=0w3e5O5f3n0*110i0J2J1-1x0A0y1w5T5I0110040!5*4_3J110P0D1g0q0k0y1y4H554d5-0F0b3V0Y650Y5 39112Q150)0.0X3O675P0|0V110M6g681=0N0J114@4~666h5U5=040B0^0*1i0W6n6i016k046m4H6w5+6q6s64666o5J116C0y6F6x3x5?6X5+0V5R042_6#5;6Z045@5_5{5}346G5-634O6v6v6S015K6)5N6L6}0e6!726G6I020E0X0n6+3R116A0D6C0e6E5~6@116_6u6{7q737f6B6D7d3Y6I6K326M6,746.6Q7q6|6G7D6b0k6d0D6f766Y6I0T7z3i7B3w6O487F7V3Y6 2Q0X5{0e7w466a1x7L6e3V064 3 6 5M5:3w6(677l6Y0e5W040e0Q0A0*0D0Z0D0,0j0A5Y5!1.6=5C7m5.7`4W111v190~0q6W7~5+617o4j7H7 7-6c7:7P6$6l7+4d7X6t8w6R7I5?5^0X5`8r7A6}7y8F390Q112x8k3 5-5/8s7C8m0k8o0J8q8Z60110F7Z7s040^0y0E8P8U1=8T8C7C8W8@2n8.2j8#943n8)8+8-8%3w5-0r970|8H9g5,110x8;6`8K6Y6 6V8|6y0J9t6H6(6*8 3R910y2d8`9j969c8l6.8N8{9I8!8:8v4r7G7!3 0Z0H11030Y0D0S1/0l0Y0u797b0Y0#7Z8x5+7J7.7M7O8R77117S9w7D8d0J5#8b5(0q9G118$6?8y048n0y8p8Q8h6Y9e9j7D9v9N8/049m9.9p5+9V9X9Z9#9,9(9*1p0lao658?7K9?9w7R7T3t9T4m5X5Z9 8f5%5)ak95a59faR98a98*ab8,ad3t6}agaV9ua4amaUa79:110Ua+0x9w9r3!9|a:aF9y7*9A4W9C9Ea3a)9k8jb47D8^8`5{aF110u9w7X4}ae8t110cbc04beb4bga+bla 3 6Iboa.6,bqb461an9oaB6Ga^a#2WaJ6904a;bt4d6%119z9^7 b10e9FbAa5ah8X19babH5H6,8uaAbJ1=ar049Y9!1/0Kaw7a1p0hb+aC9=8BbS8D049{bNbK9~a0aPb3bx9daTbZaX9ab%a%11a-bi8(6)a=cia$8LbLa=a@6Ua_c3aWajb 6,bP6)a~cy9B6ab2a+a6cj7e9K6:cf8i0FbC7p7r6Gb.b:au0hb@9+0Kb{cpaDb~7U8S9`aHbI8?c5aOa2cHcn2W8?aaaca+c?b(cKcxcJ3Y5-0xc|8?bMc9d19lcs049scva*dd9xbQcCc)7IbUbWd79Ob6dnaKcL8Obbdfbvbf6r7YbX04bscD7xbd9jbzdqaSdBbmbwd03 dHdNalcP9ncRb,6T047%7)a`dXb}7N3)0L5F5A1I5m0L5o1z0X5qd:2$2Y20222!0D5#2X5o1Fc}3Y2Q0N850D0d0q0A0P0%111r1t1v1x0Y9Qc@1M3j1G0I0)0Y1x0X9Z0k0`0J0Y2Heu5#0Y0W001g0:5Z8q0Y0^0Y7i2S0J1i67d*d#0i8q0j0q7keP0Y1vev0B8q2zer2N2c0y5t5{0J0y0Y0k2-0Y0j2#0k2S5{1/0O0Y0geH002neR5|0Y0Ceh1I3j2;3w1@1#1%1)e13 2w2n2p112C0h0Z0y0 er0$0o271i5D5zb(335CeP6}7^0q71dI5Q5Sb78183e5888a8caMa0cHccc_a!a+628=c$d$9@dj7Q8Edf9ibDdV6-6/dtb%f+8~dD46918YdAcIcoa8fT9bfF0|61fXa8b99Mf=bOf%g68V8X93f_fSaYc`dAd46Gf)f b5cQ8JbE9qctf/8?c aI8Sa}9|dlc8dQdJf`c@cpf-g5gB1=b*f*9/ckc;dvg8f#a/cdaZf~gIg0chccgugEafd9gLap6,cUat9$cY1p9-g(gpgSc%d%gPc1c,3Bc.fPc:aQgl9Hgl7Jh0gWb5dTgo6{6}g+b;av9)b^0Yazg;f+9;8Ag^g98}c+d!c/5$gOh1bYb79C0qf2eT7khvdph6h4gAf{bj040Fh89Rg)3wbGd!d6gRczgxdf83cFbVhHg#hJgDffdrg4duhDfWhjaCh5gv9_6J9wa(h399gUcNg$04gia8g!h(dJd3cchShIb)g%hodWdcia6-i1f:hVidhXdXcGgdb78McMfVa?h.cT9Wb/g,0Yb?hf9+b`isa8g@f!h;f$g`hrg~hth:h#i8hEi7cKhuh6g1iCaqiucV1/cXiz1pc!iVgNfZbmc2iiaL8eiLh!i2gJhwh3hyhAeUfRindXiMi=gXhKhM3FgMhP7-7(0ydiiGg?i*4Ud)5u2Xfw5n5x13d.0-0/0;04.

On propose dans cette version de décomposer le problème :

On définit tout d'abord une fonction visibles_rue qui compte le nombre de façades visibles le long d'une rue.

On organise la fonction principale autour de deux boucles : l'une parcourant la grille horizontalement, l'autre verticalement.

Dans chaque boucle, on étudie les hauteurs des bâtiments de chaque rue dans les deux directions. On utilise pour ce faire des listes en compréhensions.

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

.128013:,kn9àSvsuO8;y7e[62-0w]r5_p»ag)R1IiN/=m«hb4x+jodt c(EP3qlf050W0q0X0D0J0)0j0Y0Z0)0D0j0j0M010X0J0B010406050j0k0N0N0D0y0o040h0V0)0k0~0V0e0Y020D0N0B0n0Y0G0q180y0(0k0q0j050L1517191b130B041z1G051J0L1J1L1G130W0J0i0?0^0`0|0P0J0E0P0)1Z0P0X11050.0Q0)0q1U0_0{011Y1!1$1!0X1,1.1*0X0Q0V0W1b1+0y1H0X0P0?1e0j0B0D0e0|0t011:1W010*0:0q0e1m0q1*2b2d2i1=2l1.2o0N2q040a0Y0$0y0V0B0V0j0J1h1j0,290y0y0q0Z2L1z2s0e1H0L272X0X2524260W2u0|1$0e2n2I1*1R1T0@1;2+0J2-0e211S1*0B2Q1H2V2X32142c1j2?2j2{0y180)110Y0H2U3612352t381=3a3c3e0t3h2d3j2V2*013o0D3d040Y0%3s2W133v3m0|3y3A0Y0R3E3u363w3K3e0z3O3G3Q3I3x0V3b3z3e0s3V3k371V3n3!3p3B0p3)3H3,3J3.3$3B0m3=3X3@3Z3#3L0f3}3l3 3S040H0v443+2@403/0H3g1A3i3W454d470H3r4i3t4k4c393_3A0H3D4q3F3*3R4v110H3N4z3P4l4u414E3U4H4s4C4L483(4O4B3Y4n3;4U3?4m4D483|4Z3~4#4R0H434)4J3-4R0t4a4/4t4;3/0t4h324P4W4$0t4p4~4V46514y544!4K4{4G594*5b3`0t4N341M301z2;2!0W2(3w0Z212A0+1S1H2 0q313i3O055t0,5B4:0|0d110,0*5D5a1=0w3e5O5f3n0*110i0J2J1-1x0A0y1w5T5I0110040!5*4_3J110P0D1g0q0k0y1y4H554d5-0F0b3V0Y650Y5 39112Q150)0.0X3O675P0|0V110M6g681=0N0J114@4~666h5U5=040B0^0*1i0W6n6i016k046m4H6w5+6q6s64666o5J116C0y6F6x3x5?6X5+0V5R042_6#5;6Z045@5_5{5}346G5-634O6v6v6S015K6)5N6L6}0e6!726G6I020E0X0n6+3R116A0D6C0e6E5~6@116_6u6{7q737f6B6D7d3Y6I6K326M6,746.6Q7q6|6G7D6b0k6d0D6f766Y6I0T7z3i7B3w6O487F7V3Y6 2Q0X5{0e7w466a1x7L6e3V064 3 6 5M5:3w6(677l6Y0e5W040e0Q0A0*0D0Z0D0,0j0A5Y5!1.6=5C7m5.7`4W111v190~0q6W7~5+617o4j7H7 7-6c7:7P6$6l7+4d7X6t8w6R7I5?5^0X5`8r7A6}7y8F390Q112x8k3 5-5/8s7C8m0k8o0J8q8Z60110F7Z7s040^0y0E8P8U1=8T8C7C8W8@2n8.2j8#943n8)8+8-8%3w5-0r970|8H9g5,110x8;6`8K6Y6 6V8|6y0J9t6H6(6*8 3R910y2d8`9j969c8l6.8N8{9I8!8:8v4r7G7!3 0Z0H11030Y0D0S1/0l0Y0u797b0Y0#7Z8x5+7J7.7M7O8R77117S9w7D8d0J5#8b5(0q9G118$6?8y048n0y8p8Q8h6Y9e9j7D9v9N8/049m9.9p5+9V9X9Z9#9,9(9*1p0lao658?7K9?9w7R7T3t9T4m5X5Z9 8f5%5)ak95a59faR98a98*ab8,ad3t6}agaV9ua4amaUa79:110Ua+0x9w9r3!9|a:aF9y7*9A4W9C9Ea3a)9k8jb47D8^8`5{aF110u9w7X4}ae8t110cbc04beb4bga+bla 3 6Iboa.6,bqb461an9oaB6Ga^a#2WaJ6904a;bt4d6%119z9^7 b10e9FbAa5ah8X19babH5H6,8uaAbJ1=ar049Y9!1/0Kaw7a1p0hb+aC9=8BbS8D049{bNbK9~a0aPb3bx9daTbZaX9ab%a%11a-bi8(6)a=cia$8LbLa=a@6Ua_c3aWajb 6,bP6)a~cy9B6ab2a+a6cj7e9K6:cf8i0FbC7p7r6Gb.b:au0hb@9+0Kb{cpaDb~7U8S9`aHbI8?c5aOa2cHcn2W8?aaaca+c?b(cKcxcJ3Y5-0xc|8?bMc9d19lcs049scva*dd9xbQcCc)7IbUbWd79Ob6dnaKcL8Obbdfbvbf6r7YbX04bscD7xbd9jbzdqaSdBbmbwd03 dHdNalcP9ncRb,6T047%7)a`dXb}7N3)0L5F5A1I5m0L5o1z0X5qd:2$2Y20222!0D5#2X5o1Fc}3Y2Q0N850D0d0q0A0P0%111r1t1v1x0Y9Qc@1M3j1G0I0)0Y1x0X9Z0k0`0J0Y2Heu5#0Y0W001g0:5Z8q0Y0^0Y7i2S0J1i67d*d#0i8q0j0q7keP0Y1vev0B8q2zer2N2c0y5t5{0J0y0Y0k2-0Y0j2#0k2S5{1/0O0Y0geH002neR5|0Y0Ceh1I3j2;3w1@1#1%1)e13 2w2n2p112C0h0Z0y0 er0$0o271i5D5zb(335CeP6}7^0q71dI5Q5Sb78183e5888a8caMa0cHccc_a!a+628=c$d$9@dj7Q8Edf9ibDdV6-6/dtb%f+8~dD46918YdAcIcoa8fT9bfF0|61fXa8b99Mf=bOf%g68V8X93f_fSaYc`dAd46Gf)f b5cQ8JbE9qctf/8?c aI8Sa}9|dlc8dQdJf`c@cpf-g5gB1=b*f*9/ckc;dvg8f#a/cdaZf~gIg0chccgugEafd9gLap6,cUat9$cY1p9-g(gpgSc%d%gPc1c,3Bc.fPc:aQgl9Hgl7Jh0gWb5dTgo6{6}g+b;av9)b^0Yazg;f+9;8Ag^g98}c+d!c/5$gOh1bYb79C0qf2eT7khvdph6h4gAf{bj040Fh89Rg)3wbGd!d6gRczgxdf83cFbVhHg#hJgDffdrg4duhDfWhjaCh5gv9_6J9wa(h399gUcNg$04gia8g!h(dJd3cchShIb)g%hodWdcia6-i1f:hVidhXdXcGgdb78McMfVa?h.cT9Wb/g,0Yb?hf9+b`isa8g@f!h;f$g`hrg~hth:h#i8hEi7cKhuh6g1iCaqiucV1/cXiz1pc!iVgNfZbmc2iiaL8eiLh!i2gJhwh3hyhAeUfRindXiMi=gXhKhM3FgMhP7-7(0ydiiGg?i*4Ud)5u2Xfw5n5x13d.0-0/0;04.