Aller au contenu

Le jeu de la Reine

Partie 1 : le mot de Fibonacci

Définition

Le mot de Fibonacci est une chaine de caractères infinie. Elle se construit par récurrence :

  • \(M_0 = \texttt{"0"}\)
  • \(M_1 = \texttt{"01"}\)
  • Ensuite, chaque terme est la concaténation du précédent et de celui qui le précède.
  • On constate donc que pour tout \(i\), \(M_i\) est un mot préfixe des suivants.

Le mot de Fibonacci est la limite de cette suite. Pour obtenir au moins les n premiers caractères, il suffit d'avoir un terme \(M_k\) de longueur supérieure ou égale à n.

On pourra vérifier que ce mot commence par \(\texttt{"010010100100101001010"}\cdots\)

Exercice 1

Coder une fonction mot_Fibonacci qui prend en paramètre un entier n et qui renvoie les n premiers caractères du mot de Fibonacci.

###(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 : /
.128013],5/fr;nb _o=ylaepcwgu)vd46F13kRmhtsP(S0+2è[i:050z0r0J0q0T0p0K0k0t0p0q0K0K0n010J0T0s010406050K0w0H0H0q0g0o040N0m0p0w0/0m0i050e0_0{0}0 0@0s04051f181i0e1f0@0z0T0y0%0)0+0-0I0T0v0I0p1w0I0J0=050Y0j0p0r1r0*0,011v1x1z1x0J1F1H1D0J0g1g0J0I1J1t010f0!0r0i0q0H0r010%120K0s0q0i0-0Q1D1;1?1!1L1%1H1*1,0=0a0k0L0g0m0s0m0K0T150i0k0W1/0g0g0r0t2d181{0i1g0e1Y2q1V1X1W1E0z1}0-1z0i1)2a1D1o1q0(1K2A0T2C0i0m2G1D0s2j1g2o2q2U0^1=2e2I1#2N0g0|0p0=0D2n2Y0?2X1|2!1L2$2(0=0Q2,1?2.2o2z012?0q2)040E2`2p0@2}2;0-30320A352|2Y2~3b0=0d3e373g392 0m2%310=0B3e1j2S182G2t0z1X2y3o0t2O1-1g3z1h3x2W192-053F0W2T3n1s1L0F0=0W0f3v383U0-0u0=0k3!3T2J2 0f0=0H0m0J0l0C0T0j160q0t0t0T3+2:3$010;040M402Z420i0=173N2{2/483-440x0U3l0k4m3*3#3-0K1_04010G1)0y0m0T1I1H0$2e2R0r0H4z0g0$0t0}3|0J0R2j0$0z0w0k3;0J2f1I3^3`1*3}0T014l4n4f3h0=0q472~440c3e4o3,2#0=0j4=4*3o0m0=0n4{4p1#0K0D0=000O004.3o4:514@1L54560O0D594d364n4?413-3W040u1v1H5d5p2#0j0=205a4244465l3S5x2=4_5C4h0=0x5w4g1#4~04020p0J0h5P4+044c2W521L444k5G065n5n4|494,5L1#5c5G5o5Q5J044`5^5/3-5S505~5%3a5K5G5 5?0=4;635e655|5Y4}0=0P6g5:044-5+5.64015r2j0J0w0g5#2-5_5Z5}5$6d430=0S5*6C5I6e6x4e6q440b3l183Q0r2q4E2q3J2r3B182u6!0q1G6T3y1p2.0e0W0Y0!0K04.

Partie 2 : le jeu de la Reine

Règle du jeu

  • Deux joueurs déplacent chacun leur tour une Reine sur un échiquier,
    • ayant des bords à gauche et en haut classiques,
    • infini sur les bords en bas et à droite.
  • Trois types de mouvement sur l'échiquier sont autorisés :
    • ← : vers la gauche
    • ↑ : vers le haut,
    • ↖ : en diagonale, en haut à gauche.
    • ⚠ une case ou plus, au choix !
  • Le joueur qui ne peut plus jouer a perdu.

Définitions

L'échiquier est assimilé à une grille infinie, mais on pourra le restreindre à un carré de côté donné.

Les cases sont identifiées avec leur ligne puis leur colonne : (i, j).

Ainsi, on aura 0 <= i et 0 <= j pour toute case (i, j) de l'échiquier.

⚠ L'indice 0 correspond donc à la première ligne ou la première colonne.

Une position perdante est une position de la Reine qui n'autorise aucun nouveau mouvement.

Il ne peut pas y avoir de match nul.

Une position gagnante est une position de la Reine qui garantit à un joueur stratège qui commence de pouvoir gagner.

Exemple

. . . . . . . .\n. . . . . . . .\n. . . . . . . .\n. . . . . . . .\n. . . . . . . .\n. . . . . . . .\n. . . . . Q . .\n. . . . . . . .

  • On a placé des croix sur toutes les positions perdantes de l'échiquier classique 8×8. Vous pouvez vérifier !
  • Une Reine placée en (6, 5) peut rejoindre, au choix, (3, 5) ou (2, 1), où le joueur suivant va perdre face à un stratège.

  • (6, 5) est donc une position gagnante.

  • (0, 0) est toujours la position perdante à la fin de ce jeu.

Propriété admise

Si on fait la liste des positions de chacun des caractères '0' et '1' dans le mot de Fibonacci, on obtient :

  • pos_zéros = [1, 3, 4, 6, 8, 9, 11, 12, 14, 16, 17, 19, 21, ...]
  • pos_uns = [2, 5, 7, 10, 13, 15, 18, 20, ...]

On admettra que les positions perdantes (i, j) avec i < j sont les termes de la suite [(1, 2), (3, 5), (4, 7), (6, 10), ...], obtenue en zippant pos_zéros et pos_uns.

⚠ Le terme position se comprend comme commençant à 1, ainsi le premier caractère du mot de Fibonacci est celui dont la position est 1, et ce chiffre est 0.

Exercice 2

Compléter la classe JeuReine.

  1. Coder l'initialisateur __init__() qui prend en paramètre n un entier, la taille de l'échiquier carré et prépare du matériel utile à la question 2. C'est à vous de décider ce que va contenir ce matériel, c'est votre choix !
  2. Coder une méthode est_gagnante qui prend en paramètres i et j la ligne et la colonne d'une case et qui renvoie un booléen : True si la case est une position gagnante à ce Jeu de la Reine, False sinon.

👍 Dans les tests secrets, il y a aura une initialisation jeu = JeuReine(n) (avec une valeur adaptée pour n) qui précèdera des utilisations de est_gagnante. De la même manière que dans les tests publics.

Contraintes - tests secrets

On garantit que n <= 100_000, ce qui est beaucoup.

D'autre part, la fonction est_gagnante sera sollicitée environ 200_000 fois dans les tests secrets, ce qui est beaucoup.

On attend que :

  • L'initialisation ait un cout linéaire en n.
  • La méthode est_gagnante ait un cout constant (rapide) à chaque appel. (Aucune boucle n'est attendue.)

Le problème a été testé en ligne sur une simple petite tablette Android. Sur PC, on peut travailler avec \(n=10^7\) sans problème.

###(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 : /
.128013ûx/.Tr;nbOylae%u)*dV6Jçz3^Am(P+02è-W],59fq!7B}8 N_o={pcwgvF41kRIéhtsSLC[jDi:E050t0o0?0n0~0m0@0W0%0m0n0@0@0!010?0~0$010406050@0q0C0C0n0g0l040^0Z0m0q1h0Z0i0W020n0C0$0h0W0/0o1r0g0Q0q0o0@050d1o1q1s1u1m0$04051Z1S1$0d1Z1m0t0~0*191b1d1f0=0~0)0=0m1@0=0?1k05140j0m0o1/1c1e011?1^1`1^0?20221~0?0g1!0?0=241;010P160o0i1F0o01191x0@0$0n0i1f0H1~2x2z2l262o222r0C2t040a0W0E0g0Z0$0Z0@0~1A1C122v0g0g0o0%2X1S2E0i1!0d2j2-2g2i2h1 0t2G1f1`0i2q2U1~1,1.1a252`0~2|0i0Z301~0$2$1!2+2-3e1n2y1C322m370g1r0m1k0W0-2*3i1l3h2F3k263m3o3q0H3t2z3v2+2_013A0n3p040W0z3E2,1m3H3y1f3K3M0W0,3Q3G3i3I3W3q0N3!3S3$3U3J0Z3n3L3q0v3+3w3j1:3z3:3B3N0S3^3T3{3V3}3=3N0V413-433/3;3X0O493x4b3(040-0G4g3`334c3~0-3s1T3u3,4h4p4j0-3D4u3F4w4o3l453M0-3P4C3R3_3%4H1k0-3Z4L3#4x4G4d4Q3*4T4E4O4X4k3@4!4N3.4z404*424y4P4k484/4a4;4%0-4f4^4V3|4%0H4m4~4F503~0H4t3e4#4,4=0H4B3g1)3c1S302:0t2i2^3.0%382M111-1!3b0o3d3u3!055q125y4 1f0.1k3y5A4:2m0(3q5K4_3l0%1k0w0o0q1K350o5P5F011j040 3+0W5+0W4+4b5H04120P5!551f5N3N5@3I0P0C1k0Y0Y352W615|3.5%0D664b0j5%0@0o0m5?4T5.4p5%0M3!5-5L3z1k0i6a6k1k0r5)4!5,6z6o5Q6q040C0Z0?6n6j2m0Z1k0!6I6p3V1k6F0?0Y0+0~0j1B0n0%0%0~6t2m686%6D6s6i6P5$6v5*6A5+6J6D2a2|1R4T6B5#6L046N6|6@1f5%0{0L6;6=733J5I1x1B6`6O6C1f6 713e6}5^6/0476786A7a5:0P3:7g5#0i1k0.6*741k6m726.7z040%7x7n0Z5`357L3%0j1k2q1p0o0g0n0?5Z6-7h7o697#7y6R6G7C7o7F7l7a0C0~4Q7-5%6w7r6=6?6.5:0~6h7:7H5I7Q3.7j7k3u7m3I0@0-1k000G007^1k6x5a7|8m8a4,1k6_1Q7-6 0e7-7I0n0$0$2q0t8i047(3g83047B7)7n7_7{7|7t7T177!8G7$5%8k4v8n8O8H5q0m7e8s8K3I8u8w1k8y8A0i8C8)671k8F5z8H8J8T5#8M4!068m7a6c1k6e6g8t1k8v8=4i8-1d0Z6#7Y0~1B854b7j9j6u7p7-0.5S040X1B8S8_8U1k777G7$6 0s9m6(8@8,046,829B1k0F9E267=7@9a9n0r8N7}7$930495819w6~989H259e0~9g9i9S9F9o9/9P7?04538|8L9y9O7i6M9}019Q9^9V8o5/1k7v0ga07I6$9=7D047/897a7I0|a07N1k7P9A7y7S040y1i8D8^3Fai8q1@7fad7.aa7c8$0iaB9`3I7_8W4D8Y9W5#9Y9!970499aJ8p049*9f2)aC759HacaW4b5%9z9K9%70aE04ak6yaO926d6f9#ax6.8+aC8x9da!9h9J9$9{9;a*4y1ka?b99:a-aha~9 ap7nab3+905,8P5;0oa|2,7a5`5-b00P7T0@6T0)0n0)2r0i7Zav7-aRa{8Dag3Fa5ba04a)b6aK7Ea;bcbT8?047`543Ibv8OaC0@0t1k01b.1K0i0*0Z0~230f0g1P0W2V0W0q1C0|0Z1P0q0gb|2g7Y0I0)231O0~2v1q2q0%231Q0?b|0bc52ZbCbE7WbN4M6.b+3q7|0+3L6eb|359.5a7acv3N7|b.01a4bp2$0?c4b5bOa_94bLaCa bd6DaZ9,a#cXae0{a(8DbfcRbh040R88c,7$aj3^0d5C5x1%5i0d5k1S0?5mc 2?2.0n21c`c}5u1Y5E7n2$0C0Y0P0n0.0o0Y0=0z1k1K1M1O1Q0WaMbt1)3v303I0n0t6F0i2Wb40Wd5bA7X2(1k1YdydA1BdD1B0J1h0?2e040_235U0q0W2Z0K0l2j0Z0P6h1*1#040`230|5V0Wcj0W0$1y185qaHdZ0@c218220W370Cd!23050n0W0=2$0P1=2c0$0@0 0d0d0P0g0e0(0~0.1i0o1,0n0e3:0)0deoeq0ddY0Y120Yd$d(d*1keG0=d)6h0naf0W16d?bAd?1C1`2qdF0*2%0We2e8eaecee0?egeiekemezeretev0gexe:0d0f0=0p0`0z0p0B0O3:e}e 0B0V2LeDdj0T0o7Y0?0l1k2j0;3:0I2Le60Wfbfd0l1SeO0e0W0ub?6#0Wdq0mdqd{0Z1G0m0;2LbG0@99d,d80*dw1-dMdBdP1C1O6G2MdL3.dzfR2XdR2WdU0}0;2odC2X0W0J0W0^0q2Wdr2Zfo2cfqdvda0Ec2c57a1s2W0=1r7Z0c1k090D093L0$0=e9020)0?1I0-099U4T0M6o2g1B0)bR2#9-aH6f2*gq0igsgo1Bd!f*63ck1bb|f=7Zfmf_feds1%fO314bg22jg50og704090{fngagcge0r0W0!0W09220P0?gag/0?g.0P8$3:g-g(e9090g1{g@0gg_0Z3:gog.brg@6gg`c50Hgb0mgdg~h02bg h4h6g-g?g^hc3Ohfhhg-hj1|hlhch70m0t6G18g h10r099z5kdadW180;fFfH0?18d bGe#dr2y0g1hdr2q1h0I2$1812180C0q0m1hd_dr371C0ih-h)e76.gUg47YgXg8g%hggegl3!fK3vfMgRfQdOf-357vdK1#iaf,b4f$dT2M2Q2Sh00;0?0;0W7v8:2sbG3L23f/0E1sdSdE2Zg1h0gVh~gYg909g50=0j0j0W0X0A0si46if|d-0^cdiGg3gWiKi1hugggi3riV7ld@1ngzgs0~gu2X2|0mgy2RgAeP3L3:18i#iIg6i0090j13e9g,09el6Z0#htge0Ujfg}f.3r0Ui.89d@0n0q1dcdi@7Xi_6f0W0D0neZ0%bP2mh|i%j6j8141DghgjjobO0;bC22hQ0rgo13gPiXdxfYiHh}j5gZ0{jcdIgkjk0Fg-jd0%gkjJjai-hJd95tgS4pjGiJg80{0Ti)g)g-0%0q0$g$j7j9g*jbiNiP0#iS0sjnj_fN1+fPj!i$j j(k2jg0ng*090%8yk9j?kcg-1L0$fe6eg@kki7hKj{ihfSd?0c1Fh:ifk8fYdNiidQdSdU0BjChViRfD0j2$d!000ka9iX1Zf~c4eQ0md`2g7W1913gL3bio0~iqisjBe!e2e4k)230t00g{j3j$h gZgagd0~jO2,go37jseY1B186xd,jZgTj#jHj(09lhg+j/dI0#0-jily1?jllEhI5jj`ltj}lvkqg!lG0~0A0HlAlS0Wj.gkkIkmj|jFlPj%lRlzjbj:lDlYg-0@0QhY0#0N0Uji0H0Ug|8z2R0c3r0e0v0-0V0G0z0z0O0V0V0SlKi8da101C2T0@2zcklclwiLjkjblhljePgDe9mnlQgaj?lWl.lSlFlz0JlElWlhlUmti6da0B352Vgomxl*lg1?mtd?mmh{l)leiLmJhegm7lhTckd|0|0q0)0q0;18jWmk1h0@iugHe9d|1,f-mSm#gal.lEjflhl}j.j*jen5lSlUl}g,gkm)3umMd-hMgJf?h_fnfcf`2!h(2TivbGdrm+dF8$0glqgQ1mh-3v1`dbdym!i(kslhg*0 3rgo0zgo0,go0vgo0Vgo0Ogo4sn$0Hn$nV3rnX3r0Sn$n#0W58go5en@n+kwhChRmW1of?5-e9ebbre*e,ej0Z0o0~fJew0d0B0Gof528d04oeog0G4teOfm0mk,100:0^99nI1mnIn1nMmUlT0HnPn=go0Ngon/3r0Gn$nT3roH3rnZn=oLn=oNn{hDn~gKe7o2e)27efeho7o9obe@odof4|0N0G1koko:53oo2Zoq0kosou1Sow1SnGmNk#chh_0qm1n 7Z0@lle00W0Z0j7Zh=18b 23hXiDgDiFmZkpmTiM7YiOiQkhmLnElLklkLkUf!dEid6 fXgTkVfSikdU0_b@1Cl3jDe26Sfm6V6X2r6!acd,1Zd/p7p9oZh)8%hU2218351,p6e6d{1s6Z0?h%dr5B5r048f8hc^p mX5-c_q00-q2q7d!2ze123pV2ZpX6Yp!ftd/fyf=d!8%b~2|dF1zk*dg0xpp23p/193Lk622em0W0`eL0~m1dqe3pejBlpd^h0182Tk=chckgX7W6#chnkmf5jj9160@04.