Nombre serpent

On dira d'un entier qu'il serpente si ses chiffres alternent entre croissants et décroissants quand on les lit. Par exemple \(937\) est un nombre serpent : \(9\) ↘ \(3\) ↗ \(7\).

Nombre Ce nombre est serpent ? Justification
\(0\) Oui Un seul chiffre
... ... ...
\(9\) Oui Un seul chiffre
\(10\) Oui \(1\)↘\(0\)
\(11\) Non \(1\)➡\(1\)
\(12\) Oui \(1\)↗\(2\)
... ... ...
\(99\) Non \(9\)➡\(9\)
\(100\) Non \(1\)↘\(0\)➡\(0\)
\(101\) Oui \(1\)↘\(0\)↗\(1\)
... ... ...
\(123\) Non \(1\)↗\(2\)↗\(3\)
... ... ...

On dit qu'un nombre serpent est « croissant » si son dernier chiffre est strictement supérieur à son avant-dernier. Dans le cas contraire, il est dit « décroissant ».

On interdit, mis à part pour écrire \(0\), de placer le chiffre \(0\) en tête d'un nombre : ainsi \(08\) n'est pas une écriture autorisée et donc \(08\) ne compte pas comme un nombre serpent.

On se demande dans cet exercice combien il existe de de nombres serpents s'écrivant avec \(n\) chiffres (pour \(n\) inférieur à \(100\)).

Écrire la fonction nb_serpents qui prend en paramètre un entier n (1 <= n <= 100) et renvoie l'effectif des nombres serpent à n chiffres.

Exemples
>>> nb_serpents(1)
10
>>> nb_serpents(2)
81
>>> nb_serpents(3)
525

###(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:pbv(40i2+edm3s7= 1o5w_lSnatf)9h]6,crg*[yPku8/050m0l0C0B0i0y0p0s0K0y0B0p0p0r010C0i0c010406050p0S0n0n0B0L0P040z0u0y0S0/0u0A050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0m0i0e0%0)0+0-0G0i0M0G0y1y0G0C0=050Y0d0y0l1t0*0,011x1z1B1z0C1H1J1F0C0d0u0m0 1G0L1g0C0G0%120p0c0B0A0-0j011L1v010D0!0l0A0B0n0l1F1-1/1@1N1`1J1}1 0=0a0s0Q0L0u0c0u0p0i150A0s0W1+0L0L0l0K2k18220A1g0U1)2x0C1%1$1(0m240-1B0A1|2h1F1q1s0(1M2H0i2J0A1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0L0|0y0=0s0t2u2)0?2(232+1N2-2/2;0j2@1/2_2v2G012~0B2:040s0o322w0@352|0-383a0s0g3e342)363k2;0v3o3g3q3i370u2.392;0I3v2`2*1u2}3A2 3b0q3F3h3I3j3K3C3b0T3O3x3Q3z3B3l0F3W2{3Y3s040t0h3%3H2Q3Z3L0t2?192^3w3(3:3*0t313^333`3/2,3S3a0t3d403f3G3r450=0t3n492x2Y0l2x2N2A0m2E360K1Z201g4m1j2Z3G2$2^054r0W2!3X3:0R0=0W0D3o4b3y0w2;4L3P3|0D0=0A0d0x0p0l0L0c1|0C0p4Q4F1^0;040f4)3{2,4U4/431N4,0E0b3v0s4}0s4M3Y4H040i4K4h4 4R4;041756503:0u0=0r0r3o574*1N0n0i4e4?364,4{4h064~5w5k4:1N522q0C0S0L5b2#5y4@0-5n4e3-5u5w5d590K2e0i0+1/4%5j5Q1N5f045i5c584^0=0O5q3y5L045N2%5)0-4,0J5Y5?015/5;4A5{5^5`5l5K5o3+5-3Y615(635|653 5=6b695H5Z640=486f5z5@0=5_6a6o6c0=4g6n5J016h2^5I365/3u4h6j6z6q626t5/3E6G606J6s6y5/3N6O6g6Q6i5{5/3V6V6t4,0H5j6C3y0K0t0=030s2g5E0s2l0r0s6e3_5P5{0A4I2r5T5V0A5X6R365#5%6Y6W045,6$6S653$7e5r6X6B6H6!673:6A336+3Y6T7o4+7k7r7m656N6x7j046r7a6L656F7C3y7q2w7s3:5/6w5 7b7F7l6Z656m7S6%7x7N7z0=6{336H7M3b7%667i7L7#7-7W0=5~7*6P046)567O1^6-6/6;0u6?6^6`4|4~6H520D3A6K6y6 5a4W0K1x0D0D2q4(763y0u4O535G7V6b4V0=0L1/0M0l7v5*4-8D6k047Y7`7T8e3r4=8p3Y5#0k8M5.653@7K680=4`885x7 2}0=5S0u5U0p5W0p0x0C0n0c8T8Q5g8@7p5+8G6u5:8}6(8`1^5#0N925m8V7_3f8$4}6H8g0W8*8,8.8:8=960-789l6I7c8}5}900=7}7G6y949o5/3,8#5x8a0=8c0L9o8g0R9o8r0=2S9I0d8y8A8C7:8Y8F9U7P989t048!5O9b6}8w8)728-748/8;8?9X7w9q9=8(049K9^6p7|9L8_8P3|9Q041a9!4.9|37709g73758X8{9@ae590i9!9v8v6t8b8da1ai9L8s9Oaq2}a38z0A8Ba68}9J9!0E0E9C9(9daa9,9i9:9!7dah9_9{aQ9}al7y5{9nav3ja3a5a84,a7aTa904ab9-ad7Z6y4,aPa:8N53ak9oao9HaZa+aja~9M8t9P9Raz9Ta*a(aC0=aSam9x0=8Sa~9A9!7UaW6b9A994E7!9#aG9%8$aJa,aL9.9 5$9I9+8+ac9/9kbt9D6~aKbDa.8o9w77a0bO3y9e71bLaMbG2#5v895{5B0X5E8ubl6t8xa40`aBa88ga-8.aEbzbgbR3)a#b.a%0=a)a@bSbK9hbyb~9#3F0U4C4k1h4x0U4v2y4o182B2A1Y1!2A0B1Icbce1r2_ce0X0Z0#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

.128013:pbv(40i2+edm3s7= 1o5w_lSnatf)9h]6,crg*[yPku8/050m0l0C0B0i0y0p0s0K0y0B0p0p0r010C0i0c010406050p0S0n0n0B0L0P040z0u0y0S0/0u0A050U0_0{0}0 0@0c04181f051i0U1i1k1f0@0m0i0e0%0)0+0-0G0i0M0G0y1y0G0C0=050Y0d0y0l1t0*0,011x1z1B1z0C1H1J1F0C0d0u0m0 1G0L1g0C0G0%120p0c0B0A0-0j011L1v010D0!0l0A0B0n0l1F1-1/1@1N1`1J1}1 0=0a0s0Q0L0u0c0u0p0i150A0s0W1+0L0L0l0K2k18220A1g0U1)2x0C1%1$1(0m240-1B0A1|2h1F1q1s0(1M2H0i2J0A1Z1r1F0c2q1g2v2x2#0^1.2l2P1^2U0L0|0y0=0s0t2u2)0?2(232+1N2-2/2;0j2@1/2_2v2G012~0B2:040s0o322w0@352|0-383a0s0g3e342)363k2;0v3o3g3q3i370u2.392;0I3v2`2*1u2}3A2 3b0q3F3h3I3j3K3C3b0T3O3x3Q3z3B3l0F3W2{3Y3s040t0h3%3H2Q3Z3L0t2?192^3w3(3:3*0t313^333`3/2,3S3a0t3d403f3G3r450=0t3n492x2Y0l2x2N2A0m2E360K1Z201g4m1j2Z3G2$2^054r0W2!3X3:0R0=0W0D3o4b3y0w2;4L3P3|0D0=0A0d0x0p0l0L0c1|0C0p4Q4F1^0;040f4)3{2,4U4/431N4,0E0b3v0s4}0s4M3Y4H040i4K4h4 4R4;041756503:0u0=0r0r3o574*1N0n0i4e4?364,4{4h064~5w5k4:1N522q0C0S0L5b2#5y4@0-5n4e3-5u5w5d590K2e0i0+1/4%5j5Q1N5f045i5c584^0=0O5q3y5L045N2%5)0-4,0J5Y5?015/5;4A5{5^5`5l5K5o3+5-3Y615(635|653 5=6b695H5Z640=486f5z5@0=5_6a6o6c0=4g6n5J016h2^5I365/3u4h6j6z6q626t5/3E6G606J6s6y5/3N6O6g6Q6i5{5/3V6V6t4,0H5j6C3y0K0t0=030s2g5E0s2l0r0s6e3_5P5{0A4I2r5T5V0A5X6R365#5%6Y6W045,6$6S653$7e5r6X6B6H6!673:6A336+3Y6T7o4+7k7r7m656N6x7j046r7a6L656F7C3y7q2w7s3:5/6w5 7b7F7l6Z656m7S6%7x7N7z0=6{336H7M3b7%667i7L7#7-7W0=5~7*6P046)567O1^6-6/6;0u6?6^6`4|4~6H520D3A6K6y6 5a4W0K1x0D0D2q4(763y0u4O535G7V6b4V0=0L1/0M0l7v5*4-8D6k047Y7`7T8e3r4=8p3Y5#0k8M5.653@7K680=4`885x7 2}0=5S0u5U0p5W0p0x0C0n0c8T8Q5g8@7p5+8G6u5:8}6(8`1^5#0N925m8V7_3f8$4}6H8g0W8*8,8.8:8=960-789l6I7c8}5}900=7}7G6y949o5/3,8#5x8a0=8c0L9o8g0R9o8r0=2S9I0d8y8A8C7:8Y8F9U7P989t048!5O9b6}8w8)728-748/8;8?9X7w9q9=8(049K9^6p7|9L8_8P3|9Q041a9!4.9|37709g73758X8{9@ae590i9!9v8v6t8b8da1ai9L8s9Oaq2}a38z0A8Ba68}9J9!0E0E9C9(9daa9,9i9:9!7dah9_9{aQ9}al7y5{9nav3ja3a5a84,a7aTa904ab9-ad7Z6y4,aPa:8N53ak9oao9HaZa+aja~9M8t9P9Raz9Ta*a(aC0=aSam9x0=8Sa~9A9!7UaW6b9A994E7!9#aG9%8$aJa,aL9.9 5$9I9+8+ac9/9kbt9D6~aKbDa.8o9w77a0bO3y9e71bLaMbG2#5v895{5B0X5E8ubl6t8xa40`aBa88ga-8.aEbzbgbR3)a#b.a%0=a)a@bSbK9hbyb~9#3F0U4C4k1h4x0U4v2y4o182B2A1Y1!2A0B1Icbce1r2_ce0X0Z0#04.
Indice (1)

Combien existe-t-il de nombres serpents s'écrivant sur \(2\) chiffres sous la forme \(ab\) (\(a\) est le chiffre des dizaines, \(b\) celui des unités) ?

  • Tout d'abord, il est impossible d'avoir \(a = 0\) (pas de \(0\) en tête) ;

  • Il existe \(9\) nombres débutant par \(a=1\) : \(1\) décroissant (\(10\)) et \(8\) croissants (\(12\), \(13\), ..., \(19\)) ;

  • Il existe \(9\) nombres débutant par \(a=2\) : \(2\) décroissants (\(20\) et \(21\)) et \(7\) croissants (\(23\), \(24\), ..., \(29\)) ;
  • ...
  • Enfin il existe \(9\) nombres débutant par \(a=9\) : \(9\) décroissants (\(90\), \(91\), ..., \(98\)) et aucun croissant.

Au total, il existe donc \(81\) nombres serpents s'écrivant sur \(2\) chiffres. Leur répartition en nombres croissants et décroissants est la suivante :

Effectifs de nombres serpents sur 2 chiffres
# se terminant par  0  1  2  3  4  5  6  7  8  9
croissants =       [0, 0, 1, 2, 3, 4, 5, 6, 7, 8]
decroissants =     [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Indice (2)

Si un nombre est serpent s'écrit sur \(n\) chiffres et se termine par un chiffre \(b\) alors :

  • s'il est « croissant » alors son avant-dernier chiffre est strictement inférieur à \(b\) ;
  • s'il est « décroissant » alors son avant-dernier chiffre est strictement supérieur à \(b\).

On pourra donc garder trace à chaque étape de l'effectif de nombres serpents « croissants » et « décroissants » se terminant par \(0\), \(1\), ... et \(9\).

Illustration

Indice (3)

Calculer l'effectif de nombres serpents à \(n\) chiffres peut se faire en additionnant :

  • l'effectif des nombres serpents se terminant par \(0\) en croissant ;
  • l'effectif des nombres serpents se terminant par \(1\) en croissant ;
  • l'effectif des nombres serpents se terminant par \(2\) en croissant ;
  • ...
  • l'effectif des nombres serpents se terminant par \(9\) en croissant ;
  • l'effectif des nombres serpents se terminant par \(0\) en décroissant ;
  • l'effectif des nombres serpents se terminant par \(1\) en décroissant ;
  • l'effectif des nombres serpents se terminant par \(2\) en décroissant ;
  • ...
  • l'effectif des nombres serpents se terminant par \(9\) en décroissant.