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

.128013s3o_8bcdufvg/0ly n7apSr1me,(P2=4:+twki9][5h*)6050i0A0J0u0M0p0b0r0h0p0u0b0b0F010J0M0v010406050b0j0z0z0u0x0q040w0d0p0j0/0d0s050n0_0{0}0 0@0v04181f051i0n1i1k1f0@0i0M0l0%0)0+0-0R0M0m0R0p1y0R0J0=050Y0g0p0A1t0*0,011x1z1B1z0J1H1J1F0J0g0d0i0 1G0x1g0J0R0%120b0v0u0s0-0E011L1v010k0!0A0s0u0z0A1F1-1/1@1N1`1J1}1 0=0a0r0D0x0d0v0d0b0M150s0r0W1+0x0x0A0h2k18220s1g0n1)2x0J1%1$1(0i240-1B0s1|2h1F1q1s0(1M2H0M2J0s1Z1r1F0v2q1g2v2x2#0^1.2l2P1^2U0x0|0p0=0r0y2u2)0?2(232+1N2-2/2;0E2@1/2_2v2G012~0u2:040r0c322w0@352|0-383a0r0G3e342)363k2;0Q3o3g3q3i370d2.392;0U3v2`2*1u2}3A2 3b0t3F3h3I3j3K3C3b0f3O3x3Q3z3B3l0N3W2{3Y3s040y0o3%3H2Q3Z3L0y2?192^3w3(3:3*0y313^333`3/2,3S3a0y3d403f3G3r450=0y3n492x2Y0A2x2N2A0i2E360h1Z201g4m1j2Z3G2$2^054r0W2!3X3:0L0=0W0k3o4b3y0K2;4L3P3|0k0=0s0g0e0b0A0x0v1|0J0b4Q4F1^0;040C4)3{2,4U4/431N4,0T0H3v0r4}0r4M3Y4H040M4K4h4 4R4;041756503:0d0=0F0F3o574*1N0z0M4e4?364,4{4h064~5w5k4:1N522q0J0j0x5b2#5y4@0-5n4e3-5u5w5d590h2e0M0+1/4%5j5Q1N5f045i5c584^0=0P5q3y5L045N2%5)0-4,0B5Y5?015/5;4A5{5^5`5l5K5o3+5-3Y615(635|653 5=6b695H5Z640=486f5z5@0=5_6a6o6c0=4g6n5J016h2^5I365/3u4h6j6z6q626t5/3E6G606J6s6y5/3N6O6g6Q6i5{5/3V6V6t4,0O5j6C3y0h0y0=030r2g5E0r2l0F0r6e3_5P5{0s4I2r5T5V0s5X6R365#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;0d6?6^6`4|4~6H520k3A6K6y6 5a4W0h1x0k0k2q4(763y0d4O535G7V6b4V0=0x1/0m0A7v5*4-8D6k047Y7`7T8e3r4=8p3Y5#0I8M5.653@7K680=4`885x7 2}0=5S0d5U0b5W0b0e0J0z0v8T8Q5g8@7p5+8G6u5:8}6(8`1^5#0S925m8V7_3f8$4}6H8g0W8*8,8.8:8=960-789l6I7c8}5}900=7}7G6y949o5/3,8#5x8a0=8c0x9o8g0L9o8r0=2S9I0g8y8A8C7:8Y8F9U7P989t048!5O9b6}8w8)728-748/8;8?9X7w9q9=8(049K9^6p7|9L8_8P3|9Q041a9!4.9|37709g73758X8{9@ae590M9!9v8v6t8b8da1ai9L8s9Oaq2}a38z0s8Ba68}9J9!0T0T9C9(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#3F0n4C4k1h4x0n4v2y4o182B2A1Y1!2A0u1Icbce1r2_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

.128013s3o_8bcdufvg/0ly n7apSr1me,(P2=4:+twki9][5h*)6050i0A0J0u0M0p0b0r0h0p0u0b0b0F010J0M0v010406050b0j0z0z0u0x0q040w0d0p0j0/0d0s050n0_0{0}0 0@0v04181f051i0n1i1k1f0@0i0M0l0%0)0+0-0R0M0m0R0p1y0R0J0=050Y0g0p0A1t0*0,011x1z1B1z0J1H1J1F0J0g0d0i0 1G0x1g0J0R0%120b0v0u0s0-0E011L1v010k0!0A0s0u0z0A1F1-1/1@1N1`1J1}1 0=0a0r0D0x0d0v0d0b0M150s0r0W1+0x0x0A0h2k18220s1g0n1)2x0J1%1$1(0i240-1B0s1|2h1F1q1s0(1M2H0M2J0s1Z1r1F0v2q1g2v2x2#0^1.2l2P1^2U0x0|0p0=0r0y2u2)0?2(232+1N2-2/2;0E2@1/2_2v2G012~0u2:040r0c322w0@352|0-383a0r0G3e342)363k2;0Q3o3g3q3i370d2.392;0U3v2`2*1u2}3A2 3b0t3F3h3I3j3K3C3b0f3O3x3Q3z3B3l0N3W2{3Y3s040y0o3%3H2Q3Z3L0y2?192^3w3(3:3*0y313^333`3/2,3S3a0y3d403f3G3r450=0y3n492x2Y0A2x2N2A0i2E360h1Z201g4m1j2Z3G2$2^054r0W2!3X3:0L0=0W0k3o4b3y0K2;4L3P3|0k0=0s0g0e0b0A0x0v1|0J0b4Q4F1^0;040C4)3{2,4U4/431N4,0T0H3v0r4}0r4M3Y4H040M4K4h4 4R4;041756503:0d0=0F0F3o574*1N0z0M4e4?364,4{4h064~5w5k4:1N522q0J0j0x5b2#5y4@0-5n4e3-5u5w5d590h2e0M0+1/4%5j5Q1N5f045i5c584^0=0P5q3y5L045N2%5)0-4,0B5Y5?015/5;4A5{5^5`5l5K5o3+5-3Y615(635|653 5=6b695H5Z640=486f5z5@0=5_6a6o6c0=4g6n5J016h2^5I365/3u4h6j6z6q626t5/3E6G606J6s6y5/3N6O6g6Q6i5{5/3V6V6t4,0O5j6C3y0h0y0=030r2g5E0r2l0F0r6e3_5P5{0s4I2r5T5V0s5X6R365#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;0d6?6^6`4|4~6H520k3A6K6y6 5a4W0h1x0k0k2q4(763y0d4O535G7V6b4V0=0x1/0m0A7v5*4-8D6k047Y7`7T8e3r4=8p3Y5#0I8M5.653@7K680=4`885x7 2}0=5S0d5U0b5W0b0e0J0z0v8T8Q5g8@7p5+8G6u5:8}6(8`1^5#0S925m8V7_3f8$4}6H8g0W8*8,8.8:8=960-789l6I7c8}5}900=7}7G6y949o5/3,8#5x8a0=8c0x9o8g0L9o8r0=2S9I0g8y8A8C7:8Y8F9U7P989t048!5O9b6}8w8)728-748/8;8?9X7w9q9=8(049K9^6p7|9L8_8P3|9Q041a9!4.9|37709g73758X8{9@ae590M9!9v8v6t8b8da1ai9L8s9Oaq2}a38z0s8Ba68}9J9!0T0T9C9(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#3F0n4C4k1h4x0n4v2y4o182B2A1Y1!2A0u1Icbce1r2_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.