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.
- Page de soumission des réponses en échange des pièces : https://events.planet-casio.com/avent2025
- 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 26/12/2025 16:34 | #
N'hésitez pas à garder des notes sur vos solutions, on pourra débriefer ça à partir du 1er Janvier (après quoi le Puzzle sera clôt du coup).
De mon côté j'ai déjà écrit les explications de mes solutions, ça fait un beau petit pavé. Je sais que vous en avez qui sont différentes et parfois meilleures, je serai curieux de voir vos approches.
Citer : Posté le 01/01/2026 13:19 | #
Comme le site était down et y'a quelques personnes qui bloquent, j'étends la deadline au 7 Janvier.
Un dernier indice pour court-circuit : non seulement il faut utiliser un caractère spéciale dans la chaîne d'entrée pour créer le court-circuit (et donc utiliser des chiffres et ce caractère spécial), mais le groupement le plus naturel est le suivant :
Désolé pour ce problème super dur, et bon courage à ceux qui essaient encore (Prgmprotogen et J2l, j'espère !).
Citer : Posté le 01/01/2026 19:28 | #
Phew, I got a little worried when I couldn’t access the site. I’m glad it got resolved. Thank you for extending the deadline!
I believe this new hint is enough for me to efficiently solve Short-Circuit! (I see exactly what you meant about the trap the spacing set in the original.) If I still can’t solve it after this hint, then I probably don’t deserve the title of Puzzle Master, but rather Puzzle Wimp, haha
(Honestly, that would be a pretty funny title to have if I managed to fail)
Good luck to the remaining contestants!
Citer : Posté le 03/01/2026 00:19 | #
Bonjour !
Je suis un peu en retard sur les problèmes et ça m'étonnerait que j'ai le temps de finir, mais au cas où j'aimerais savoir s'il est encore nécessaire d'envoyer le puzzle complété après avoir fini tous les problèmes ?
Citer : Posté le 03/01/2026 00:21 | #
Bonjour ! Non pas la peine, comme il a été publié dans l'article des voeux il vous suffirait de copier l'image de toute façon
Citer : Posté le 03/01/2026 00:22 | #
D'accord merci !
Citer : Posté le 05/01/2026 15:51 | #
Greetings to all!
I don't know French, am an amateur programmer and am extremely late; so the odds are completely stacked against me heh.
It took me several hours just to complete the second puzzle, so I can see the time for the puzzles was given reasonably.
Inevitably, I can only participate the next year if I hopefully do remember by then...
Best of luck to everyone who are participating!
Citer : Posté le 05/01/2026 16:37 | #
Hi! Don't worry about it too much, the second problem is quite hard. There's some activity, but two of the three winning slots are still open!
In any case, the deadline mostly exists so we can share solutions afterwards. If there are still competing people and available prizes there's no reason to cut the event short. Keep letting me know if you're trying...
I'm surprised to have so many new English-speaking members having a crack at the puzzle this year. Did the even get cross-posted somewhere?
Citer : Posté le 05/01/2026 17:42 | #
Earatozytet est la deuxième personne à finir ! Encore un lot et tous les titres de Maître du Puzzle à distribuer. Bon courage !!
Citer : Posté le 05/01/2026 18:10 | #
I'm surprised to have so many new English-speaking members having a crack at the puzzle this year. Did the even get cross-posted somewhere?
Personally, I had probably learned about this site as a whole through watching a YouTube video explaining how to install games onto my model of calculator. (I believe the first game I ever added was Wolfenstein.) More recently, right before the start of the challenge, I had been looking to install a few more games, so I visited the site again. And on the front page, I either saw the posting or the banner for the Advent Puzzle. I checked it out, and since there was the promise of free stuff, I was thoroughly entranced and had to at least give it a try. Towards the end, I had many of my solutions and pieces already (and, thanks to my so-called “Puzzle Place-O-Matic” tool I made, the jigsaw was largely assembled); so, I created an account to be able to safely participate and send my answer (and to also ask for for help on Short Circuit
Long story short, this event might’ve been a really good trap to recruit more members
Earatozytet est la deuxième personne à finir ! Encore un lot et tous les titres de Maître du Puzzle à distribuer. Bon courage !!
Congratulations, Earatozytet!!! If Afyu is okay with it, I think Earatozytet should be the one to receive the grand prize; I admittedly have been a little lazy lately, and keep forgetting to solve the puzzle (or usually just try to put it off until later).
Citer : Posté le 05/01/2026 19:32 | #
Oh so you've been hanging around for a while, cool!
For the record Prgmprotogen I have your almost-finished solve but I couldn't count it as is so if you have the chance to go back to Short-circuit there's still a prize potentially waiting for you. I'm slightly unsure there wasn't a misunderstanding so I just want to clarify.
Citer : Posté le 05/01/2026 20:31 | #
Yeah, I would occasionally visit, but I was just here for the games lol. Now that I have an account, I might look into polishing/finishing and releasing some of my own games
Oh, I understand, I'm just saying that I've been doing a lot of things other than solving Short Circuit, not because I'm struggling a ton with it, but because I'm procrastinating lol. I was just saying that Earatozytet would probably be more deserving of the prize Afyu offered since they actually put in the effort and finished it, unlike me
I'm going to actually try to finish it now, since I have some time to spare.
Citer : Posté le 05/01/2026 20:53 | #
Un dernier indice pour court-circuit : non seulement il faut utiliser un caractère spéciale dans la chaîne d'entrée pour créer le court-circuit (et donc utiliser des chiffres et ce caractère spécial), mais le groupement le plus naturel est le suivant :
In this, I noticed that for the first section of "b", the original problem showed 3 "b" in a row (if you read it as a continuous string), whereas the hint you gave shows only 2 "b" in a row in the first section. Should I still adhere to what the original problem showed?
Citer : Posté le 05/01/2026 21:11 | #
Sorry, formatting error on my end! There should be 3 "b"s. I'll edit the message.
Citer : Posté le 05/01/2026 21:13 | #
No worries, thank you! With 3 "b"s there, this might be a little trickier than I thought... (or maybe easier...?)
Citer : Posté le 05/01/2026 21:14 | #
I was just saying that Earatozytet would probably be more deserving of the prize Afyu offered since they actually put in the effort and finished it, unlike me
Ok I didn't realize Afyu had offered to shift the prizes publically. All participants will get to choose their prize in completion order, so Afyu first, Earatozytet second, and the next participant to complete the puzzle will go last. This will also include goodies from the treasury.
It doesn't make any difference.
Citer : Posté le 10/01/2026 14:13 | #
Je ne suis pas là demain, mais je regarderai les soumissions une dernière fois demain soir. Après quoi, même s'il n'y a que deux participations, je publierai les solutions et on passera à la distribution des lots
Citer : Posté le 12/01/2026 16:25 | #
Pas de nouvelle soumission, donc Afyu et Earatozytet sont nos deux gagnants ! Je poste les solutions "attendues" tout à l'heure, comme ça on pourra voir ce qui diffère chez vous
Citer : Posté le 14/01/2026 00:32 | #
Évidemment j'ai oublié la suite, grr. C'est pas grave. Donc quelques histoires sur les problèmes, explications, coulisses de mon côté. Racontez vos solutions à vous aussi, elles sont sûrement différentes !
Un monde de séquences
Ici le but était de se mettre dans le bain et de montrer qu'on n'a pas un joli langage tout lisse, on a une chaîne de caractères et "13x" ne veut pas dire 13 x mais bien 1 fois 3 x. Ma solution de référence en 12 caractères était
J'avais repéré qu'avec "?" on peut compacter pas mal, spécifiquement on peut faire 9 caractères :
Mais quelqu'un a tout de suite pointé (Hackell je crois ?) qu'on peut déjà faire 9 sans, en décomposant en 1 + 12 :
Déjà des surprises.
Théorème de factorisation
Le but de ce problème était de bien penser de façon circulaire à la chaîne d'entrée. Je voulais qu'il y ait un cycle dans la formule (avec un groupe "*") et un cycle dans la chaîne d'entrée (avec une lecture en boucle), mais pas alignés. Du coup j'ai choisi de faire un cycle de longueur 3 dans la formule et 4 dans la chaîne d'entrée, ce qui m'a donné la formule de longueur 14
Et là vous voyez que pour moi ce problème était facile à concevoir, et ainsi les périls de l'exercice, puisqu'il était beaucoup plus dur à résoudre que je ne l'avais prévu. :x
Prélude
J'aime vraiment celui-là. Initialement je voulais trouver plus « d'applications » des séquences et les transcrire ensuite en formule. Finalemment je l'ai pas beaucoup fait, pour deux raisons : d'une part c'est dur de trouver des applications pas trop complexes, d'autre part compacter une séquence quelconque est assez dur et ingrat. Du coup j'ai fait plus de problèmes sur les finesses théoriques des formules comme un modèle de calcul.
À ce stade j'avais déjà bien investigué les possibilités pour se déplacer silencieusement dans la chaîne d'entrée, et mon approchge initiale consistait à encoder les notes dans la chaîne d'entrée avec un motif de lecture un peu complexe (avec l'extension "<" dont je parlerai plus tard) :
Mais j'ai vite réalisé que c'était plus court de la coder directement, donc j'ai repoussé ces subtilités à plus tard, et je me suis arrêté sur cette solution de longueur 39 :
Pavé César
Cette fois-ci vous n'y échappiez plus : le 0. Quand j'ai conçu le langage de formules j'avais imaginé différents systèmes, et une des variations était d'avoir ou pas un parser. En gros la question c'est si la portée des opérateurs est connue à l'avance. Si j'écris :
on peut se demander : qu'est-ce que le 2 répète ? Si le prochain caractère de la chaîne d'entrée est une lettre, par exemple, x, ça fait 2 x et plus tard on avance au z. Donc on peut grouper mentalement comme dans "(2?)z". Mais si le prochain caractère de la chaîne d'entrée est un chiffre, disons 7, ça fait 2 fois 7 z, du coup il faut grouper comme dans "(2?z)".
Dans les variations où il y a un parser, le groupement est fixé de façon définitive au début de l'évaluation de la formule. Dans la variation que j'ai retenue, on a le comportement ci-dessus, et donc on ne sait pas à l'avance comment grouper. J'ai choisi ça en ayant l'intuition que ça donnerait des possibilités sympa.
Du coup, le 0. Si j'écris "0?zt", qu'est-ce qu'il se passe ? Si je ne lis pas le prochain caractère d'entrée je ne saurai pas s'il faut grouper comme "(0?)zt" et donc afficher zt, ou s'il faut grouper comme "(0?z)t" et donc afficher t.
Du coup, dans le code le 0 active un mode "silencieux" qui n'affiche plus rien mais calcule une fois son argument au lieu de zéro fois. Ça peut avoir comme effet de bord de faire avancer la chaîne. Comme dans la solution à ce problème, en 35 caractères :
La partie "55??" affiche 26 lettres, et ensuite "0?" n'affiche rien mais avance d'une position dans la chaîne, effectuant le décalage d'une ligne à la suivante.
Un million de variations
Encore un dont j'aimais beaucoup l'idée. Le principe que j'ai retenu pour ma solution est de prendre une séquence de longueur 7 (abcdefg) et de ne prendre que 6 des 7 caractères (abcdef) pour créer un décalage. Comme 6 et 7 sont premiers entre eux, ça me donne 42 caractères uniques (6 paquets) sans utiliser le g, et je pousse jusqu'à 48, i.e. un caractère juste avant que le dernier paquet ne se répète.
Trous : abcdef. abcdef. abcdef. abcdef. abcdef. abcdef. abcdef. abcdef.
Sortie : abcdefa bcdefab cdefabc defabcd efabcde fabcdef abcdef#
Et là, je décale une fois de plus, ce qui me saute le a. Du coup, je peux refaire le même motif, sauf que cette fois au lieu d'utiliser toutes les lettres sauf le g, j'utilise toutes les lettres sauf le a.
Trous : abcdef. abcdef. abcdef. abcdef. abcdef. abcdef. abcdef. . bcdefg. bcdefg.
Sortie : abcdefa bcdefab cdefabc defabcd efabcde fabcdef abcdefb cdefgbc defg### (etc)
Je peux répéter ça 7 fois, excluant le b, le c, le d, le e, et le f avant de retomber sur l'exclusion du g.
Gratter sur les 48 caractères me permet de répéter 48 segments avec cette formule de longueur 18.
Initialement je voulais des permutations, i.e. imposer que chaque lettre apparaisse exactement une fois par segment, juste dans un ordre différent. Je croyais avoir des bonnes façons d'en générer mais ça ne marchait pas bien, ça ne faisait qu'interférer avec mes idées sur l'exclusion... où d'ailleurs je voulais trouver un motif d'exclusion plus complexe pour que ça donne des variations plus longtemps. J'ai pas réussi à le faire bien marcher et je soupçonne que y'a un théorème de théorie des groupes quelque part qui dit que ce que je voulais faire est pas possible. x)
Toupie dans un labyrinthe
Rien d'extraordinaire sur celui-là. Je voulais qu'il y ait une solution pour laquelle la formule la plus courte ne produise pas le chemin le plus court, ce qui n'est pas facile pour un labyrinthe de cette taille. En fin de compte j'ai construit la majorité du labyrinthe pour la solution de taille 8 que j'avais retenue (après plusieurs itérations) :
Je serais très surpris qu'il y ait une autre solution courte. (Mais j'ai vu passer une solution qui passait par la droite !!)
Court-circuit
Celui-ci était prévu depuis le début quand j'ai conçu le langage des formules. Comme j'ai évoqué précédemment en discutant du 0, la présence de "?" rend impossible de déterminer à l'avance la portée des opérateurs. J'avais vu venir dès le début qu'il en serait de même avec les parenthèses, car dans
chaque fois que "?" produit une parenthèse fermante, cela ferme implicitement le groupe.
« Court-circuit » ne sert qu'à une seule chose et c'est montrer cette technique. Là aussi je suis parti de la solution pour m'assurer qu'il n'y ait pas d'autre façon de faire le même résultat :
Le groupe "(a?bc" peut avoir plusieurs comportements différents selon le caractère donné :
Ensuite j'ai choisi les paramètres de façon à donner un motif plaisant par groupes de 3, bien que ce ne soit pas du tout le bon découpage.
Solution : a ac a abbbc a ac abbc a abbc a ac
Entrée : ) 0 ) 3 ) 0 2 ) 2 ) 0
Ah oui et pour vous embêter un peu plus l'entrée cycle aussi, les deux derniers caractères ")0" sont récupérés au début. (sowwy :3)
Aux limites de la légalité
Rien de subtil ici, l'introduction laisse entendre qu'on peut analyser le texte pour comprendre ce qui se passe mais la contrainte d'unicité est beaucoup trop dure à démêler, il faut juste tester toutes les combinaisons avec un script. La réponse est 32650.
for i in range(1, maxlen + 1):
sources = [characters] * i
for expr in itertools.product(*sources):
yield "".join(expr)
total, total_valid = 0, 0
outputs = set()
for expr in all_exprs("()*?abc", 8):
formula = "a3b2c;" + expr
out, err = generate2(formula, outsize=10, timeout=100)
total += 1
if not err:
total_valid += 1
outputs.add(out)
print(total, total_valid, len(outputs))
# 6725600 6253235 32650
Vous noterez que la règle de légalité n'a pas beaucoup de sens, c'est ridicule qu'une erreur soit levée quand la chaîne de caractères se termine par "*" ou un chiffre alors que ça marche bien si le "*" ou le chiffre est suivi d'une parenthèse. Je n'avais juste pas envisagé ce cas quand j'ai codé le générateur et j'étais réticent à le modifier pendant le Puzzle. Ça rend certaines parenthèses fermantes non optionnelles sur les problèmes de fin (en tous cas pour mes solutions).
Vous avez peut-être vu dans le code que j'avais également planifié une extension avec un caractère "<" permettant de revenir en arrière d'une position dans la chaîne d'entrée. Cette idée était accompagnée d'un changement de sémantique pour "*" pour que l'itération s'arrête automatiquement si rien n'est affiché et la formule ne change plus. De cette façon, "*<" permettait de revenir au début de la chaîne et "*" de façon générale devenait plus intéressante. Mais pareil, je voulais pas trop changer le code après coup, donc j'ai laissé tomber.
Tri-formule
Un problème très improvisé, un peu trop peut-être ; l'intention était de faire apparaître quelques tricks. La solution prévue était :
= aabbabbaabbbbabbbbbb
a3b2*;*(a??2b)
= aabbbbbbabbbbbaabbbb
a3b2*;*(?a?2b)
= aabbbbbbbabbbbaaaaaa
mais vues les solutions l'étoile n'avait pas besoin d'être une étoile et y'a une solution encore plus simple (mais plus longue), donc c'est un résultat très mitigé. J'espère qu'il était au moins un peu fun à résoudre. ^^"
Complément à b
Ah, là on s'amuse ! Au début j'étais pas sûr de si on pouvait faire des vrais calculs avec les formules. J'étais resté sur le cas où l'entrée du calcul est donnée par "?" et du coup la formule prenait des "décisions" avec des extensions genre opérateur de comparaison ou des trucs du style. Mais je trouvais ça trop compliqué, donc j'avais relégué cette possibilité dans un coin de ma tête au début du mois.
Avec un peu plus de pratique j'ai fini par réaliser que le mécanisme de décision était tout bête : la position dans la chaîne d'entrée représente l'état. Du coup il fallait laisser la formuler utiliser la chaîne d'entrée pour sa logique interne, et donc j'ai introduit "!". C'est vachement redondant avec "?", mais j'étais vraaaiment plus à ça près.
Ma solution en 18 caractères est la suivante :
L'idée est que la chaîne d'entrée représente un automate. Chaque paire lettre/chiffre indique une lettre à afficher et un nombre de caractères à avancer dans la chaîne d'entrée pour revenir au début.
Dans la formule, la partie "0!2?0z" sert à avancer silencieusement dans la chaîne de 2 fois le chiffre reçu par le générateur (pour rappel quand le générateur donne "1" on veut afficher "b", quand il donne "2" on veut afficher "a"). Le premier "0" passe en silencieux, ensuite on répète "!" fois la sous-formule "2?" qui donc avance dans la chaîne.
Le "0z" est un peu subtil, et un peu con. Ça gère deux choses. D'une part, si on passe sur un chiffre dans "?", comme j'ai expliqué précédemment ça va lire plus loin, et la suite de la formule est un "?" (le groupe du milieu tout seul), ce qui menace de partir en vrille. Donc le "z" absorbe, pour que ça fasse genre "0!260z". Quant au deuxième zéro, c'est au cas où au contraire le dernier "?" soit une lettre, auquel cas l'exécution continuerait juste après ce "?", et il ne faut pas que le "z" s'affiche. Mettre des parenthèses aurait été plus simple, mais j'y ai pas pensé.
Bref, si on voit un "1" on avance de 2 caractères et on arrive sur le "b4". Si on voit un "2" on avance de 4 caractères et on arrive sur le "a6". Notez que la lettre correspondant à l'état d'arrivée est bien celle qu'on veut afficher.
Le groupe du milieu, "?", affiche donc cette lettre. Le groupe de fin, "?0?", avance du nombre de positions indiqués dans la chaîne d'entrée après la lettre. Donc si on a affiché "b" on avance maintenant de 4 positions, si on a affiché "a" on avance de 6 positions. Dans les deux cas ça nous ramène au début, et on peut recommencer avec le caractère suivant.
Derniers ajouts
Même idée de base que pour Complément à b, c'est une machine à états. L'idée est d'implémenter un additioneur complet, i.e. un additioneur qui prend trois entrées (prochain bit de p + prochain bit de q + retenue) et produit deux sorties (prochain bit de r et la nouvelle retenue). La retenue est encodée dans la position dans la chaîne d'entrée, ce qui me donnne une formule de 26 caractères :
L'idée est qu'à chaque étape, on part soit de l'état "a6" (si la retenue vaut 0) soit de l'état "b4" (si la retenue vaut 1), puis on avance de 2 caractères si le bit de p vaut 1, et on avance encore de 2 caractères si le bit de q vaut 1. Dans l'état où on arrive, le caractère sera le bit de r, et le chiffre nous dira de combien avancer dans la chaîne d'entrée pour se repositionner soit en "a6" (si la nouvelle retenue vaut 0) soit en "b4" (si la nouvelle retenue vaut 1).
La formule est donc très similaire à la précédente, à l'arnaque près que je voyais pas commencer utiliser les chiffres 1/2 donnés par "!" pour avancer de 0/2 caractères, donc j'avance de 2/4 à la place. Ça veut dire que j'avance 2 caractères de trop pour le bit de p et pareil pour le bit de q, soit un décalage de 4 positions. Je compense avec le groupe "40?z" qui avance silencieusement de la longueur de l'entrée moins 4 (8 - 4 = 4), complétant un cycle inutile de la chaîne d'entrée.
Pour la transition après avoir affiché un bit en sortie, si bit_p + bit_q + retenue ≤ 1 il n'y pas de nouvelle retenue, donc les deux premiers états "a6" et "b4" ramènent à "a6". Si bit_p + bit_q + retenue ≥ 2 il y a une nouvelle retenue donc les états "a4" et "b2" ramènent à "b4".
On a l'impression qu'on peut faire n'importe quel automate fini comme ça mais c'est pas évident parce qu'on s'appuie encore sur des transitions qui avancent tout droit quand on lit le prochain caractère généré par "!". C'est un peu limitant.
Castor affairé
Dernier problème et lui aussi un peu improvisé. (Pour info Afyu quand j'ai dit que le dernier problème serait facile je l'avais pas encore écrit, il est effectivement moins facile que prévu. ouuups :3)
Je pensais au classique du Busy Beaver mais sans contrainte la solution est évidemment triviale, avec par exemple 10 caractères la meilleure option est
et pouf, c'est fini. J'ai fini par tomber sur l'idée de ne pas utiliser le même caractère plusieurs fois d'affilée, ce pour quoi il y avait deux compromis possibles :
Par rapport à la solution optimale n'utilisant que des 9, la première approche paie une multiplication du nombre total de caractères par un facteur 8/9 pour chaque 8 qui est utilisé, un coût qui augmente quand la formule devient plus longue. La deuxième paie un facteur de 1/9 pour chacun des deux premiers caractères qui ne contribuent rien, soit un coût fixe de 1/81 peu importe la longueur.
La deuxième stratégie est donc meilleure sur le long terme, puisque les 8/9 répétés vont finir par peser plus fort que le coût fixe de 1/81, mais il faut attendre assez longtemps pour que ça se arrive. On peut calculer combien de temps avec un petit logarithme (log en base 8/9 de 1/81) ou avec un script ; il se trouve que les 8 gagnent pour les longueurs ≤ 76 et les "?" gagnent pour les longueurs ≥ 77.
Quand j'ai vu apparaître cette dynamique j'ai tout de suite décidé que ce serait ça le problème, puisque ça justifie de donner deux jeux de pièces le 23. Et aussi je trouvais ça cool que le 77 tombe absolument du ciel et que somehow la solution soit pas la même pour 76 et 77.
989898989898989898989898989898989898989898989898989898989898989898989898989a
// 77
9;9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?a
9;?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9a
Vous noterez que pour 77 y'a deux solutions, mais pas pour 76, puisqu'il y a un nombre impair de chiffres donc on est obligés de commencer par un 9 et de finir par un 9.
Voilà voilà, c'est tout pour ce Puzzle ! J'espère que ça vous a plus même si y'a pas eu énormément de soumissions finies. ^^"
Citer : Posté le 14/01/2026 03:30 | # |
Fichier joint
Wow, it's very interesting to see your process behind the development of the puzzles! I'm surprised to see that I actually not only got an alternate solution to Spinning Top in a Maze, but had I realized I could have formatted my solution differently, it would have actually been different! More on that further down
(For personal ease of copy-pasting, I'll refer to each puzzle by its French name.)
(Also, sorry for any awkward phrases. I got fatigued as I continued writing the below text
Un monde de séquences: abc;66?3?
I don't remember what exactly my first solution was, but it was very similar (if not the exact same) as what Lephe' had first shown. I later factored it using an input string for fun. Overall, this was a very straightforward puzzle, and was a good tutorial, not much else to comment on.
Théorème de factorisation: 3525;*(?a?b?a
This one, I actually had to wait until hints were given before I could start to solve it. When I got around to it, I eventually found the answer with a bit of factoring and... well, I just shifted the numbers in the input string until I got the correct answer
Prélude: uA;2(4(CDEGu)4(CdGED)d4(ABuCE)4(AECdB)?
This one was both a huge pain, and a lot of fun. It was a pain because I had to very carefully watch the video, type out each note, double-check I typed the note correctly, so on. Then from there, I started to factor it down, looking for duplicates and patterns. Sometimes I would do something weird in terms of how I factored it, but then I would realize that by shifting things a little I could format it in a way that would make sense. When I got towards the end, I had to figure out a way to repeat everything twice, but use a different character at the end of each loop; naturally, I found the input string to be a good fit for this. (This was a moment where I felt really clever for figuring it out.) I have a bit of a love-hate relationship with this one
Pavé César: abcdefghijklmnopqrstuvwxyz;*(55??0?
This one was really fun! I figured it must use a silent input string-reading, and that I'd probably need to use the input string cursor as a simple memory state, so this one was pretty easy and satisfying.
Un million de variations: abcdefg;*(?7(bcdef?
Eh, I kinda cheaped out on this one. I would use one character from the input string, and cycle through variations of the ending letter like "cbcdefa", "cbcdefb", etc. I got enough variations for a valid solution and called it good
Toupie dans un labyrinthe: dhhdb;*?
This one I broke out some graph paper for! I essentially tried using a mix of manual human brute-forcing and logical thinking to try to figure out a way through the maze. Judging based off of your hint about the long way not necessarily being the best way (or something along those lines), I figured I would have to roughly right and up, along the bottom and right edges of the maze. I had no idea there were any other solutions to the maze problem, so I'm pretty surprised to see my solution technically wasn't intended
Oh, and Lephe'... you never actually included the maze-stepping program with the posting of the maze puzzle... I wasn't a member then, and I forgot to mention it after I joined
Court-circuit:
No comment...
Aux limites de la légalité: 32650
I'm going to be honest, I wasn't sure if brute-forcing this was the correct answer... but I figured there probably wasn't any reasonable way of mathematically checking the number of possible unique solutions, so I just built a brute-forcer anyways ¯\_(ツ)_/¯
For fun (and since putting the number as my solution doesn't really feel right), I'm attaching the brute-forcer program I made. It's made by a professional Python hater, so the code probably isn't perfect, but oh well
Tri-formule: a3b26
I don't remember much from this, I basically just played around with it until I found the correct answer. Took some thinking and trial and error :P
Complément à b: !xb2a1xx;*(?0???20?)
This is some of the good stuff! I had to get creative with this. I figured out that I could take advantage of the system of using 1 and 2 for binary 0 and 1, by using 1 and 2 as skip multipliers. For example, if the character read is "1", then it'll substitute it in a way similar to "10?", or skip one character. We skip the dummy "x", and then read and print one character. It's a "b" here. Then, we read the next number, multiply it by 2, and skip the many times. We read a 2 after the "b", so it's "220?" or skip 4. (Remember that reading the 2 still moves the cursor forward by one character.) We skip "a", "1", and two dummy "x"s, ending back up at the start and ready for a new character. Now, when reading a "2", it actually behaves kind of weirdly at first glance. We read 2, skip 2, and read a 2, prompting us to run the next "?" two times. Okay, print an "a", and substitute in a 1 into the next set of characters (which form a skip), producing "120?" or skip 2. We're back at the start! It's a neat little automaton.
Derniers ajouts: xxxxa6b4a4b2;*(2(!20?)?(?0?)
This one is by far my favorite! I recognized pretty much immediately that this represented a full adder circuit. I don't have a huge amount of experience with circuitry (I think my strong suit is programming), but I knew the basic principle was that the program needed to remember a carry bit in order to properly do addition. (The principle is the same with elementary-level addition and multiplication, too; we just need to do it in base 2/binary, not base 10/decimal.) I figured I could use the input string cursor and skip multipliers to remember states and perform different "actions" of sorts, depending on the input. Dummy characters helped make my job easier. (They also look fun to include for some reason, I don't know why
À venir !
76: 989898989898989898989898989898989898989898989898989898989898989898989898989a
77: 9;9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?a
This one I found pretty easy (sorry Afyu).
76: I thought that to make a really large finite repetition that doesn't use the same character twice in a row, what could be better than to just spam my keyboard and alternate between the two largest single-digit base 10 numbers, 8 and 9!
77: 9898998... repeating that wouldn't work for this one, so I had to come up with something better. I thought about characters that would let me still print a large repetition, and "?" immediately came to mind. I could use 9 as an input string character, and alternate 9 and "?" repeatedly for the same effect as multiple 9s in a row! It was the perfect scam!
I love the pixel art jigsaw, too! As I was assembling the jigsaw (using my own custom program made specifically for this challenge
All in all, there were some rough patches, but I'm glad I participated! There were some very fun and clever puzzles here, and I hope to try my hand at more next year
Citer : Posté le 14/01/2026 08:20 | #
Actually I meant that the right way would be the long way around
Oh snap...! Why did no one tell me...? 😰
I'm blown away by how close your full adder looks to mine. It's incredible that we get exactly the same substring "a6b4a4b2". How cool is that xD