Le Puzzle de l'Avent 2025
Posté le 02/12/2025 03:33
Décembre est de retour, et du même coup le Puzzle de l'Avent de Planète Casio ! La neige n'est peut-être pas au rendez-vous mais les activités de saison n'attendent pas.
On en est à pas moins de la
6ème édition (
2018,
2019,
2021,
2023,
2024) et la formule est proche de ce qu'on a fait ces dernières années.
Principe et lots
Le but du jeu est de
reconstituer un puzzle en pixel art (en l'occurrence de 192x112 pixels) en résolvant des problèmes d'informatique posés durant le moins de Décembre. Cette année j'ai retenu ma leçon que poser un problème pas trivial tous les jours c'est beaucoup (pour vous comme pour moi), donc on va la jouer cool avec en gros des problèmes 1 jour sur 2.
Il y aura
3 lots à remporter gracieusement sponsorisés par
Calcuso !
- Une calculatrice Graph Math+ (normalement gravée laser avec un message personnalisé--je vous confirme ça) ;
- Deux housses pour calculatrices (ou, selon les goûts, une coque d'édition limitée pour Graph Light/Math+ offerte par Casio Éducation).

Fonctionnement des problèmes et attribution des lots
Je change un poil la formule cette année pour élargir le type de problèmes !
- Chaque problème sera posé sous la forme d'un "énoncé" que vous devrez résoudre. Généralement du code Python sera fourni, à utiliser sur votre calculatrice ou ordinateur, et parfois vous devrez écrire du code Python pour trouver une réponse.
- Une solution sera soit un nombre soit une chaîne de caractères. Contrairement aux années précédentes, il pourra y avoir plusieurs solutions, auquel cas vous devrez en trouver une « suffisamment bonne ».
- Une page sur le site sera à votre disposition pour soumettre vos réponses en échange des pièces du puzzle du jour.
- Réassemblez le puzzle dans un outil d'édition d'images (comme GIMP ou Photoshop) pour remporter des lots et le titre de Maître du Puzzle !
Le dernier problème sera posté le 24 Décembre. Comme d'habitude, les premières personnes qui m'enverront par MP le puzzle résolu avec leurs solutions/scripts remporteront les lots. Je préciserai quand on approchera de la fin
Avant que j'oublie, pour que ça tourne un peu les membres qui ont déjà gagné une Math+ en 2025 ne pourront prétendre qu'aux deux lots de housses/coques. Si vous n'avez jamais joué, c'est le meilleur moment pour vous lancer !
Le titre de
Maître du Puzzle pourra être collecté au moins jusqu'à début Janvier, et ceux qui auront trouvé des solutions meilleures que ce qui était attendu dans les problèmes auront bien sûr la classe éternelle. :3
Les premiers jours
Une fois n'est pas coutume, mon planning cette année est ridicule (récemment j'ai
fait des trucs et changé de job). Du coup j'ai un peu de retard sur le code et j'ai pas tout à fait fini le puzzle. Je mettrai en ligne la page permettant de récupérer les pièces d'ici quelques jours, donc gardez bien vos solutions au chaud. En échange de ce désagrément, je ferai une animation pour montrer la progression du dessin du puzzle
Allez, à vos neurones !
Liste des puzzles
Citer : Posté le 02/12/2025 03:54 | # |
Fichier joint
Un monde de séquences
Un thème récurrent de cette année ça va être les séquences ! On va en écrire, en générer, en optimiser, et surtout on va en golfer. C'est-à-dire qu'on va essayer de créer des codes les plus courts possibles pour produire des séquences intéressantes
Je commence en douçeur aujourd'hui avec un outil qu'on va utiliser plein de fois : un "générateur" de séquences. C'est une fonction generate() à qui on donne une formule en entrée et qui produit une séquence de lettres :
abcd
>>> generate("3a2b")
aaabb
>>> generate("5(a2c)")
accaccaccaccacc
Vous pouvez tester la fonction sur votre calculatrice ou ordinateur en téléchargeant le fichier Dec01.py en pièce jointe.
Une formule est une suite de d'éléments (atomes) lus dans l'ordre. Les éléments sont produits avec différents caractères :
Je vous laisse jouer un peu avec, n'hésitez pas à demander si vous avez des questions. Le code est fait pour que vous vous puissiez le lire. Notez qu'il y a des fonctionnalités en plus dans le code que j'expliquerai un peu plus tard avec "?" et ";".
Trouvez une formule la plus courte possible qui génère exactement la séquence :
Une formule de 12 caractères ou moins compte comme une solution. Une fois qu'on aura vu toutes les fonctionnalités de generate() vous pourrez le faire en 9 (pour le fun).
Gardez votre solution au chaud le temps que je mette en ligne la page sur laquelle vous pourrez saisir votre solution et obtenir les premières pièces.
Citer : Posté le 04/12/2025 01:00 | #
Théorème de factorisation
Le problème du 1er était vraiment un échauffement. Je réalise qu'il va falloir un peu de temps pour chauffer les moteurs donc je posterai peut-être plus qu'un jour sur deux au début. Commençons à jouer donc...
Pour l'instant les formules ne prennent aucun paramètre ; "2(ab)" produit toujours "abab" peu importe le contexte. Du coup c'est pas très drôle.
Introduisons donc un moyen de prendre un paramètre avec un nouveau caractère :
Pour indiquer une chaîne d'entrée, on ajoutera un préfixe à la formule, avec un point-virgule pour séparer. Par exemple :
aabbbccccc
Dans cet exemple la formule est "?a?b2?c" et la chaîne d'entrée est "23". Chaque fois qu'on évalue un "?", on prend un caractère dans la chaîne d'entrée et on avance. Si on arrive au bout, ça repart au début.
Ici, on obtient donc 2a, puis 3b. Ensuite on évalue deux fois l'atome ?c. Au premier passage, il nous donne 2c, au deuxième passage 3c, et donc ça fait 5 "c" en tout.
Bien sûr dans ce cas on pourrait juste écrire la formule "2a3b5c", mais il y a... "des" cas où passer par une chaîne d'entrée est plus court.
Trouvez une formule de longueur ≤ 14 dont les 42 premiers caractères sont :
Pour appliquer la limite, passez un deuxième argument à generate() :
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Pour votre information, avec ces nouveaux outils, le problème "Un monde de séquences" peut se résoudre en 9 caractères.
(Promis je vais poster les prochains à des heures raisonnables)
Citer : Posté le 04/12/2025 10:46 | #
Pour information, comme Cakeisalie5 en parlait sur la shout : comme en Basic CASIO, les parenthèses fermantes sont optionnelles. Pour l'instant les problèmes donnés peuvent être résolus sans abuser de ça, mais c'est un peu plus simple avec
Citer : Posté le 04/12/2025 23:12 | #
Quelques indices !
Pour "Un monde de séquences", faire 12 devrait être assez facile. Si vous voulez cherchez le minimum, Hackcell a trouvé une version en 9 sans utiliser la chaîne d'entrée (!), que j'avais pas vue venir. Avec la chaîne d'entrée, pensez que vous êtes pas obligés de mettre que des chiffres dedans.
Pour "Théorème de factorisation", vous allez vouloir trouver le motif récurrent. Remarquez que dans l'exemple 23;?a?b2?c, à la fin on fait 2c puis 3c et ça donne 5 "c". On n'est pas obligés de faire 5c pour avoir 5 "c".
Citer : Posté le 05/12/2025 20:26 | #
Prélude
Le « Prélude » de la série Final Fantasy est une des compositions les plus iconiques du jeu vidéo. Ce thème est utilisé sur l'écran titre de tous les jeux old school de la série. En voici un exemple...
On peut représenter les arpèges initiaux comme une séquence. Pour ça il nous faudrait une lettre par note... ce qui est pas dur, on a déjà une notation classique : C, D, E, F, G, A, B pour Do, Ré, Mi, Fa, Sol, La, Si.
Si vous êtes pas musicien·nes, pas de panique, voici une vidéo où vous avez une transcription au piano et chaque note s'affiche avec la lettre associée.
Pour ce problème on s'intéresse aux 4 premiers allers-retours de gauche à droite puis de nouveau à gauche. Si vous avez un doute, on s'arrête à 0:31 de la vidéo, la dernière note qu'on joue est un A (et deux notes après ce A apparaît le premier F de tout le morceau).
Bien sûr, pour identifier une note il faut aussi connaître son octave.
Puisqu'on est sur des séquences on n'a qu'à les compter en séquence aussi, en utilisant une lettre pour monter d'un octate : u (comme "up") et une lettre pour descendre d'un octave : d (comme "down").
Chaque octave va d'un C au B suivant, et chaque fois qu'on monte d'un B à un C ou qu'un descend d'un C à B ça fait un changement d'octave.
Ici, la séquence commence par CDEGuC, puisqu'on monte d'un octate entre le premier G et le second C. Octaves et notes compris, la sortie attendue fait 164 notes
Problème : Trouvez une séquence de longueur ≤ 40 produisant exactement 164 caractères formant le début du Prélude de Final Fantasy.
Demain je mets en ligne la page de test comme ça vous pourrez soumettre la chaîne complète pour vérifier que votre solution est correcte avant de réfléchir à la compresser. Si vous êtes pressés, envoyez-moi un MP.
Edit : reporté à Lundi, j'ai du mal à finir le dessin. Désolé x_x
Citer : Posté le 06/12/2025 11:57 | #
Hello ! Question, est ce que pour les changements d'octaves il n'y aurait pas une petite faute de frappe ? Chaque octave va du C au B suivant donc on a bien qu'à chaque fois qu'on passe du B au C suivant on monte d'un octave, mais par contre c'est à chaque fois qu'on descend d'un C au B d'en dessous qu'on descend d'un octave non ?
Citer : Posté le 06/12/2025 11:59 | #
Oui tout à fait, j'ai tapé un peu vite ! C'est corrigé
Citer : Posté le 08/12/2025 00:16 | #
Pavé César
Le code de César est une méthode de chiffrement classique consistant à décaler les lettres de l'alphabet d'une quantité prédéterminée. On écrit alors dans un alphabet décalé, ce qui rend le texte dur à identifier à l'oeil nu.
Ça reste un chiffrement très mauvais qui s'effondre assez vite, notamment par analyse fréquentielle, en regardant quelles lettres apparaissent le plus souvent.
Problème : Trouvez une séquence de longueur ≤ 35 dont les 26 × 26 = 676 premiers caractères sont :
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
efghijklmnopqrstuvwxyzabcd
fghijklmnopqrstuvwxyzabcde
ghijklmnopqrstuvwxyzabcdef
hijklmnopqrstuvwxyzabcdefg
ijklmnopqrstuvwxyzabcdefgh
jklmnopqrstuvwxyzabcdefghi
klmnopqrstuvwxyzabcdefghij
lmnopqrstuvwxyzabcdefghijk
mnopqrstuvwxyzabcdefghijkl
nopqrstuvwxyzabcdefghijklm
opqrstuvwxyzabcdefghijklmn
pqrstuvwxyzabcdefghijklmno
qrstuvwxyzabcdefghijklmnop
rstuvwxyzabcdefghijklmnopq
stuvwxyzabcdefghijklmnopqr
tuvwxyzabcdefghijklmnopqrs
uvwxyzabcdefghijklmnopqrst
vwxyzabcdefghijklmnopqrstu
wxyzabcdefghijklmnopqrstuv
xyzabcdefghijklmnopqrstuvw
yzabcdefghijklmnopqrstuvwx
zabcdefghijklmnopqrstuvwxy
c'est-à-dire l'alphabet entier, répété 26 fois mais décalé à chaque fois d'une lettre.
Comme le générateur de séquences ne dispose d'aucune fonctionnalité pour afficher des lettres qui ne sont pas écrites quelque part dans la formule ou dans la chaîne d'entrée, ça vous laisse un choix assez restreint.
Notez qu'à partir de maintenant, omettre les parenthèses fermantes facultatives est compté dans les longueurs des solutions.
Citer : Posté le 08/12/2025 19:52 | #
Je commence juste de regarder.
Un monde de séquence avec les outils à jour doit se résoudre en 7 caractères je pense (je suis sûr même)
Citer : Posté le 08/12/2025 20:07 | #
Une solution en 7, j'ai pas ! Ce sera très intéressant à discuter
Citer : Posté le 08/12/2025 20:51 | #
Quelques indices !
Pour "Un monde de séquences", faire 12 devrait être assez facile. Si vous voulez cherchez le minimum, Hackcell a trouvé une version en 9 sans utiliser la chaîne d'entrée (!), que j'avais pas vue venir. Avec la chaîne d'entrée, pensez que vous êtes pas obligés de mettre que des chiffres dedans.
Pour "Théorème de factorisation", vous allez vouloir trouver le motif récurrent. Remarquez que dans l'exemple 23;?a?b2?c, à la fin on fait 2c puis 3c et ça donne 5 "c". On n'est pas obligés de faire 5c pour avoir 5 "c".
Pardon mais j'ai l'impression de devenir folle : Pourquoi est-ce que 2;2?c donne cccc (quatre c) alors que 23;2?c donne ccccc (cinq c) ?
Citer : Posté le 08/12/2025 20:53 | #
Dans la formule "2?c" tu exécutes deux fois l'atome "?c", et à chaque fois il réévalue le ? avec un caractère pris dans la chaîne d'entrée. Il y a donc deux lectures de la chaîne d'entrée.
Dans "2;2?c", la première lecture donne bien sûr le 2, et ensuite comme tu atteins la fin de la chaîne d'entrée ça repart du début et tu relis le même 2 donc ça fait 4 "c".
Dans "23;2?c" la première lecture donne le 2, la seconde le 3, et donc ça fait 5 "c".
Citer : Posté le 08/12/2025 20:54 | #
Ah oui c'est vrai on en avait parlé, je trouve juste ça tellement contre-intuitif j'ai du mal. Merci pour l'explication !
Citer : Posté le 08/12/2025 20:57 | #
Comme aide mentale pense que c'est pas un parser + évaluateur propre, il reparse la formule à chaque exécution. Sinon tu pourrais substituer tous les ? durant le parsing et après ça changerait rien à l'exécution, ce qui serait pas fun
Citer : Posté le 08/12/2025 20:59 | #
Oui mais il pourrait le faire avec différentes priorités ! je pense que c'est ça qui me mindfuck, je suppose qu'on a l'habitude de parser mentalement les « statements » avec différentes priorités. Enfin, au moins la prochaine fois que je me mindfuck, j'aurais cette discussion à laquelle je pourrai retourner haha
Citer : Posté le 08/12/2025 21:29 | #
Une solution en 7, j'ai pas ! Ce sera très intéressant à discuter
Je viens de te MP la solution en 7 caracteres.
Citer : Posté le 08/12/2025 21:38 | #
Dans la formule "2?c" tu exécutes deux fois l'atome "?c", et à chaque fois il réévalue le ? avec un caractère pris dans la chaîne d'entrée. Il y a donc deux lectures de la chaîne d'entrée.
Dans "2;2?c", la première lecture donne bien sûr le 2, et ensuite comme tu atteins la fin de la chaîne d'entrée ça repart du début et tu relis le même 2 donc ça fait 4 "c".
Dans "23;2?c" la première lecture donne le 2, la seconde le 3, et donc ça fait 5 "c".
Attends mais du coup maintenant j'y réfléchis et je comprends pas pourquoi ça fait pas 6. 23c donne six c, alors pourquoi pas 23;2?c ? Si ça fait 2?c -> ??c -> 23c -> six c ?
Citer : Posté le 08/12/2025 21:44 | #
Je viens de te MP la solution en 7 caracteres.
Merci. C'est pas valide parce que sur ce problème le limiteur n'est pas activé, tu dois afficher exactement 39 caractères.
Citer : Posté le 08/12/2025 21:45 | #
Oui, c'était en réaction à "avec les outils à jour", pas pour la 1ere épreuve.
Citer : Posté le 08/12/2025 21:47 | #
2?c -> ??c -> 23c -> six c ?
Ah mais y'a des priorités justement.
L'émulateur commence à la position #0, voit le 2 dans 2?c, et il se prépare donc à évaluer l'atome suivant deux fois, atome qui commence à la position #1.
Donc première itération, l'atome à la position #1 il commence par ?, que l'on remplace par le première caractère d'entrée 2, ce qui déclenche la double évaluation de l'atome à la position #2. Le première évaluation imbriquée trouve le caractère c à la position #2 donc l'affiche ; la deuxième fait pareil. On affiche donc 2 "c".
Maintenant seconde itération, l'atome à la position #1 n'a pas changé et commence toujours par ?, que l'on remplace par le prochain caractère d'entrée, cette fois 3. Cela déclenche une triple évaluation de l'atome à la position #2, et chacune de ces évaluations affiche le caractère "c".
Du coup, 5 "c".