Le Puzzle de l'Avent 2019
Posté le 01/12/2019 11:47
Bienvenue à tous dans la période de l'Avent. Pour vous aider à attendre Noël, Planète Casio vous propose son calendrier aux 24 problèmes mathématiques et informatiques.
Le Puzzle de l'Avent de cette année est un jeu dans lequel vous devez résoudre des petits problèmes mathématiques et informatiques. Chaque jour, je vous donnerai des pièces du puzzle codées par un
code couleur. Votre tâche est de retrouver le code de chaque image et de les décoder ! À la fin du mois, les pièces se combineront pour former une
image de Noël.
J'ai demandé une Graph 35+E II à Casio pour récompenser la première personne qui résoud le puzzle. Casio a confirmé qu'ils sont d'accord, je pourrai donc envoyer le lot dès que je l'aurai reçu.
Voici l'énoncé précis du jeu !
Le but du jeu est de reconstituer intégralement l'image de Noël. Il s'agit d'une image de 128x64 pixels en quatre niveaux de gris (noir, gris foncé, gris clair, blanc). Il y a 128 pièces à ce puzzle, que je distribuerai tous les jours jusqu'à Noël.
Pour participer, envoyez-moi un MP avec votre image. La personne qui aura reconstitué le plus fidèlement l'image le 24 Décembre à 23h59 remportera le Puzzle et aura le titre de
Maître du Puzzle.
Toutes les personnes qui m'auront envoyé une participation ayant plus de 90% de pixels justes (soit 7372 sur 8192) auront également le titre.
Les pièces sont réparties en quatre cadrants comme ceci :
Contrairement à l'année dernière, les indices ne sont pas cachés, donc vous pouvez poser des questions et je vous répondrai dans une certaine mesure (sans révéler les résultats). Donc n'hésitez pas à demander dans les commentaires si vous avez du mal, je donnerai des explications !
Tous à vos postes, on commence maintenant !
Notes du futur.
• Le 23 Décembre, Filoji a reconstitué l'intégralité de l'image !
• La solution des problèmes est disponible au format PDF !
Liste des indices et pièces de l'image
1er Décembre
Pour les premiers jours, on va se concentrer sur le code couleur. Toutes les images, sauf la première, ont été un peu modifiées et bougées. Le
carré code à droite de chaque image indique quelle opération j'ai faite.
Les pièces ont été agrandies fois 2 (elles font 16x16 pixels au lieu de 8x8), je vous conseille de les réduire avant de commencer à travailler avec.
2 Décembre
Contrairement à hier, aujourd'hui les transformations se marchent un peu sur les pieds. Il faut donc trouver la bonne façon de les combiner...
Sinon le principe est exactement comme hier. Si vous avez déjà utilisé des couleurs en programmation, ça vous posera pas de problème.
3 Décembre
Il n'y a rien de vraiment nouveau, mais parfois durant les problèmes j'aurai besoin de transformer les pièces plusieurs fois.
4 Décembre
Vous avez déjà tous les éléments concernant le fonctionnement du code couleur. Désormais, on va jouer un peu avec des problèmes de maths et d'informatique.
Attention, ne vous précipitez pas car j'ai
mélangé les carrés codes.
Pour retrouver qui va avec qui, voici une aide. L'image ci-dessous représente un
graphe, avec des
noeuds (les ronds) et des
arêtes (les traits). Les noeuds de gauche représentent les pièces d'aujourd'hui, les noeuds de droite représentent les carrés codes mélangés.
J'ai fait en sorte que chaque pièces à gauche soit reliée par une arête à son carré code à droite. Mais j'ai aussi rajouté des arêtes inutiles pour vous embêter.
Votre tâche est de retrouver l'unique façon de faire correspondre les pièces avec les carrés codes par des arêtes. Ça s'appelle un
couplage parfait.
5 Décembre
Cette fois, j'ai
mélangé les pièces. Pour retrouver l'ordre correct, vous devez trier les nombres inscrits à gauche des pièces par ordre de qui se divise le mieux. L'image à côté du nombre qui se divise le moins bien se décode par le carré code
#. L'image à côté du nombre qui se divise le mieux se décode par le carré code
O. Tout le reste est dans l'ordre, vous verrez qu'il n'y a pas d'ambiguité.
6 Décembre
Aujourd'hui, j'ai encodé toutes les pièces avec
le même carré code. Pour trouver lequel, utilisez le programme Python suivant. Vous devez chercher
n et
m de sorte que la fonction
A renvoie 61. Caclulez alors
n*m%6 et vous aurez le numéro du carré code à utiliser. (Ils sont numérotés de 1 à 6 de haut en bas).
def A(m, n):
if m == 0:
return n+1
elif n == 0:
return A(m-1, 1)
else:
return A(m-1, A(m, n-1))
7 Décembre
Là encore j'ai été sympa, j'ai tout codé avec le même carré code. Pour savoir lequel, utilisez le graphe ci-dessous. Dans ce graphe, il y a des
arêtes pleines et des
arêtes pointillées, et un noeud marqué par un double trait. Je prétends qu'il existe une suite de "plein" et de "pointillé" telle que peu importe d'où vous partez, si vous suivez des arêtes du type indiqué par la suite, vous arriverez toujours au noeud marqué.
Le numéro du carré code à utiliser aujourd'hui est la longueur de la plus petite séquence de "plein" et "pointillé" qui a cette propriété.
Cela s'appelle un
mot synchronisant.
8 Décembre
Pas d'indice, vous devriez trouver tous seuls quelle pièce a été encodée comment.
9 Décembre
Je continue sur mon format simple pour l'instant, j'ai tout encodé avec le même carré code (j'espère que ça vous simplifie un peu le travail). Lequel ? Tout est inscrit dans le graphe ci-dessous.
Ce graphe contient un certain nombre de
cliques. Une clique, c'est k sommets différents qui sont totalement reliés entre eux. Cela signifie que si vous regardez deux des sommets, il y a forcément une arête entre les deux. Pour avoir une clique de taille k, il faut donc que chacun des sommets soit directement reliés aux k-1 autres !
La taille de la plus grande clique dans ce graphe est le numéro du carré code à utiliser aujourd'hui. Et pour votre information, ce problème de la
clique maximale est très difficile à résoudre (on ne connaît pas d'algorithme rapide qui trouve la plus grande clique d'un graphe).
10 Décembre
Comme d'habitude, un des carrés codes a été utilisé pour coder toutes les image. Pour retrouver lequel, déterminez le chiffre des dizaines dans le prochain élément de cette suite suite relativement connue.
18, 9, 28, 14, 7, 22, 11, 34, 17, ?
11 Décembre
Le programme ci-dessous affiche le numéro (toujours entre 1 et 6) du bon carré code... si vous arrivez au bout.
def h(x):
return not not x and g(x - (not not x))
def g(x):
return not x or h(x - (not not x))
a = 67091015026795951534974163063551679485
b = 14869428421844477043415143396333267370
c = 18130045244705851716678308487239340348
d = 27737016800392073340078206984446832421
e = 27050830777865150327799699254308046502
f = 31380753929535438225805729259152129373
print(h(a) + g(b) + h(c) + g(d) + h(e) + g(f))
12 Décembre
Comme d'habitude, un seul carré code a été utilisé pour tout encoder. Aujourd'hui, ils sont numéros de 0 (le plus haut) à 5 (le plus bas). Pour savoir quel carré j'ai utilisé, trouvez un chemin le plus long possible de s à t dans le graphe ci-dessous, et calculez sa longueur modulo 6.
13 Décembre
Les pièces sont de nouveau numérotées de 0 à 5. Trouvez p et q non triviaux tels que p×q = 142941853471579. Le numéro de la pièce aujourd'hui est égal au modulo 6 de p. Pour vous aider, sachez que le modulo 6 de q doit désigner la même pièce.
14 Décembre
Comptez le nombre de triangles dans le graphe du 9 Décembre. Un triangle, c'est quand trois noeuds sont complètement reliés entre eux (une clique de taille 3). Le résultat modulo 6 est le numéro du carré code permettant de décoder les pièces d'aujourd'hui, comptées de 0 à 5.
Pour les gens très chauds type
Dark Storm : Compter le nombre de mineurs isomorphes à K₃. Programme fortement conseillé.
15 Décembre
Comptez le nombre de façons différentes d'obtenir 15 par somme de 5, 2, 1 (sans prendre l'ordre en compte). Par exemple, 5+5+2+2+1, ou 2+2+2+2+2+2+1+1+1. Le nombre de façons modulo 6 est le numéro du carré code d'aujourd'hui.
Pour les gends très chauds type
Dark Storm : Compter le nombre de façons, toujours sans prendre l'ordre en compte, mais avec le parenthésage. Par exemple, ((5+5)+(2+2))+1 ou ((5+5)+2)+(2+1).
16 Décembre
Les carrés code sont encore numérotés de 0 à 5. Pour trouver le bon, déterminez le nombre d'arêtes minimum qu'il faut enlever pour couper la grille de taille 5 (ci-dessous) en deux parties :
Ça s'appelle une
coupe minimum.
Pour les gens très chauds type
Dark Storm : Trouver la coupe minimum du tore n×n pour tout n.
17 Décembre
Prenez la liste [7,4,2,5,1,3,6]. Elle n'est pas croissante, mais en supprimant des éléments on peut la rendre croissante. Par exemple, si je supprime 7, 4, 5 et 1, il me reste [2,3,6] qui est croissante. On appelle ça une sous-liste croissante (rien de surprenant ici).
Comptez le nombre de sous-listes croissantes de [7,4,2,5,1,3,6].
Pour les gens très chauds type
Dark Storm : Caractériser le nombre de sous-listes croissantes de taille 2 dans la liste [σ(i) : 1 ≤ i ≤ n] pour σ ∈ Sn (permutations de {1..n}).
18 Décembre
Aujourd'hui on ne fait pas très intellectuel, voici les pièces et leurs carrés codes associés, comme les premiers jours. Rassurez-vous, c'est pas aussi méchant.
19 et 20 Décembre
Pas de codage pour aujourd'hui. On arrive à la fin !
21 Décembre
Comptez le nombre de faces de la rosace au dos de la Graph 35+E II !
Il s'agit du nombre de face sur la rosace complète (la Graph 35+E II étant rectangulaire, elle n'est pas imprimée entièrement). Vous pouvez le faire sans quitter votre chaise, y compris si vous n'avez pas de Graph 35+E II.
Calculez le nombre de faces modulo 157, 97, 79 et 71. L'un de ces modulos a une parité différente des autres, et il correspond au carré code à utiliser pour déchiffrer les 8 pièces centrales.
22 Décembre Il y a des schémas de la rosace dans le manuel.
23 Décembre À cause des symétries de la rosace, il suffit de compter environ 4% des faces.
Fichier joint
Citer : Posté le 26/12/2019 11:40 | #
Bonjour,
Je viens (enfin !) poster sur le forum.
Bravo à Filoji pour la résolution du puzzle !! Pour avoir longuement essayé, je sais que ça représente un sacré boulot et un paquet d'heures !
Bravo également à Lephenixnoir pour la construction de cet impressionnant puzzle avec de nombreuses, variées et instructives énigmes !
Il fallait résoudre les énigmes quotidiennes, puis décoder les pièces du puzzle, puis les assembler dans le bon ordre.
Faute de temps en décembre, j'ai regardé les énigmes quotidiennes presque quotidiennement mais je n'avais pas trop de temps pour le décodage et ça m'a fait un peu peur d'avoir autant de pièces à décoder. D'autant plus que je ne suis pas un expert en programmation.
Puis les vacances sont arrivées et je me suis finalement lancé dimanche midi (oui, le 22/12 ! à 3 jours de la fin...) pour la partie programmation du décodage. J'ai même hésité à le faire avec Paint (Kolourpaint, précisément) avec les retournements/miroir... Ça aurait été plus rapide à décoder, mais pas réutilisable s'il faut changer de carré de décodage et tout refaire ou s'il faut décoder les 6 pièces du jour avec le même carré de décodage. J'ai programmé le décodage en Python. Je vous montrerai tout ça bientôt
Si vous voulez quelques détails tout de suite : j'ai utilisé le module PIL(LOW) de Python et les fonctions getpixel et putpixel avec quelques conditions et beaucoup de repérage à la main pour compter les colonnes et les lignes. Je n'ai pas suivi le conseil préconisant de réduire les images au format 8x8 alors qu'elles sont en 16x16. J'ai tout calculé sur les images proposées.
En fait, j'ai eu beaucoup plus de mal à remettre les pièces dans l'ordre qu'à les décoder. Pour les remettre dans l'ordre, j'ai utilisé Kolourpaint avec lequel j'ai tracé une grille (rouge) constituée de cases (blanches) de 16x16 pixels, dans lesquelles j'ai déplacé, déplacé et encore déplacé mes pièces décodées, jusqu'à trouver le bon ordre. Il est troublant de ne pas avoir en noir le haut des arbres...
Je compte fournir un dernier effort pour la résolution du puzzle, mais un dernier hein ! J'ai encore quelques pièces qui ne sont pas très "propres" visuellement. Je pense que j'ai choisi un mauvais carré de décodage pour certaines pièces et ça donne presque ce qu'il faut, mais certaines lignes de pixels sont coupées. Je vais revoir ça une dernière fois, avant d'aller voir l'image résolue.
Je prendrai le temps d'expliquer ma méthode et ma réflexion autour des énigmes quotidiennes. @Lephe m'expliquera sous quelle forme je peux fournir une telle explication pour qu'elle soit visible de toutes et tous Je vous montrerai également mes différentes participations. L'évolution visuelle entre chaque est appréciable (satisfaisante ?) Pour l'instant tout est consultable sur Repl.it avec un lien que j'ai envoyé à Lephe. Mais comme c'est public et modifiable, je voudrais m'assurer de garder une trace (non modifiable) de mon travail, avant de partager ce lien !
Merci @Lephe d'avoir pris le temps de noter mes participations, même après la date limite.
Merci @Massena.
Passez une bonne journée ! À bientôt pour mes explications
Citer : Posté le 26/12/2019 12:04 | #
Merci à toi ! Ça me rappelle que j'ai aussi codé l'inversion du codage avec Pillow. Je vais mettre mon code en ligne quand je l'aurai nettoyé un peu. S'il y en a que ça intéresse de voir comment j'ai travaillé...
La meilleure façon de fournir une explication visible de tous est de poster ici, comme tu viens de le faire ! N'hésite pas à couper en plusieurs posts si c'est long et/ou si tu veux mettre des images (tu peux mettre une image jointe par post).
Au passage des explications de @Filoji seraient bienvenues aussi, vu la perfection avec laquelle il a terminé le jeu.
Je suppose qu'il y aura un autre Puzzle l'année prochaine du coup !
Citer : Posté le 26/12/2019 18:16 | #
Bravo d'avoir réussi à rester caché jusqu'au 24, on a jamais vu ça xD
Citer : Posté le 27/12/2019 08:24 | #
Comme annoncé, Afyu m'a envoyé une version ultime avec 8170/8192 pixels justes, soit 99.7%.
À quelques oublis de décodage près, c'est clairement l'image d'origine...
Citer : Posté le 27/12/2019 20:57 | #
Bonsoir,
Je crois que c'est clairement de l'acharnement (ou du perfectionnisme) mais j'ai épluché mon code et toutes les images proposées et j'ai finalement trouvé 22 pixels à corriger. Je pense donc avoir tout bon.
J'ai enfin vraiment compris comment décoder les pièces, pour les couleurs bleue et rouge. Je pensais qu'on pouvait considérer comme une unique zone l'ensemble des pixels d'une même couleur qui sont adjacents. Or dans le dernier carré de codage du jour 5, le "O" de "CASIO" est à considérer par tranches horizontales. Même si le "O" est en un seul morceau, il ne faut pas le considérer comme une seule zone. Le haut du "O" est en un morceau, le bas également, mais les côtés sont deux morceaux séparés et à traiter séparément.
@Lephenixnoir, peux-tu me dire si mon "Final_8.png" est bon ?
Je vais maintenant arrêter de me retenir d'aller voir l'image d'origine ! C'est parti
Et je vais commencer à rédiger mon explication...
Ce puzzle était un peu long à résoudre (surtout quand on n'a pas trop de temps en dehors des vacances) et les 24 jours ne sont pas de trop, je pense. Et à le résoudre d'un coup, c'est un sacré défi et ça prend du temps. Mais il était vraiment intéressant et l'image est très jolie ! Bravo Lephenixnoir !! C'est un travail remarquable, qui donne envie de faire des efforts pour arriver au bout du puzzle !
Et j'en profite pour vous souhaiter à toutes et à tous une heureuse fin d'année !!
Citer : Posté le 27/12/2019 21:19 | #
Eh oui, dans ta soumissions finale, tu as 8192/8192 pixels justes, soit 100% ! Félicitations !
Donc oui, la façon de procéder des symétries est par zone adjacente. Donc pour le rouge par exemple, on regarde chaque colonne individuellement, et sur chaque colonne on inverse verticalement les zones de rouge. L'intuition c'est qu'il n'y a aucune raison pour que l'ensemble des zones de rouge soit symétrique, donc il faut se restreindre à une méthode qui donne un résultat sur tous les carrés codes.
Je pense que le Puzzle prend cette tournure, après deux ans, de non trivial à résoudre. Ça demande du travail. Mais la contrepartie est qu'il n'y a pas beaucoup de concurrence. Autrement dit, pour quelqu'un qui essaie vraiment, les chances de succès sont très élevées ! Et je pense que c'est une formule qui convient à la période de Noël.
En tous cas, merci pour tes retours gentils, qui justifient le temps passé à préparer le jeu.
N'hésite pas à partager ton code quand tu auras fini.
Citer : Posté le 27/12/2019 21:23 | #
Bravo à tous !
Pour ma part, j'ai résolu toutes les énigmes de bases, et quelques unes des optionnelles. J'ai appris beaucoup de trucs, en allant chercher on tombait souvent sur de la doc de qualité
Par contre par flemme, je n'ai pas pas décodé les pièces. Je pensais faire un script pour les décoder automatiquement, mais concrètement je n'ai pas pris le temps de le faire, et ce n'est pas la partie que j'ai trouvé la plus intéressante…
Je ne suis pas chez moi, mais quand ce sera le cas j'essaierai de partager mes méthodes pour trouver les solutions aux énigmes
Citer : Posté le 27/12/2019 22:04 | # | Fichier joint
Ah, génial !! Youhouuuuu !!!
Sans vous faire attendre plus longtemps, voici un lien vers l'ensemble des fichiers que j'ai créés/utilisés. Tout est sur Repl.it, sauf l'assemblage final des pièces que j'ai fait sur (Kolour)paint (je vous joins un exemple). https://repl.it/@afyu17/Concours-de-lAvent-Planete-Casio
Pour faire court : le site Repl.it est un des nombreux sites qui permettent d'apprendre à programmer, avec une interface plutôt agréable à utiliser. Je vous laisse consulter le site pour voir le grand nombre de langages supportés. On peut également s'inscrire à des "cours" qui se présentent sous forme de défis à relever (116 "assigments" pour Python et quelques uns en plus avec le module Turtle).
Sur l'interface Repl.it, on retrouve un éditeur de texte, une console (qui sert aussi à la sortie texte) et éventuellement une petite fenêtre en plus avec une sortie graphique. Tout à gauche, un gestionnaire de fichiers minimaliste permet de... gérer les fichiers et les dossiers. Je l'ai beaucoup utilisé pour la découpe des images et la création des images décodées. Je n'ai pas réussi à créer des images directement dans les dossiers, alors ils sont créés en dehors et je les déplace ensuite dans les dossiers correspondants. Si quelqu'un sait comment on fait pour créer un fichier dans un dossier ou pour le déplacer dans un dossier automatiquement, je suis preneur
J'ai créé un dossier par jour d'énigme. Chacun de ces dossiers contient l'image donnée quotidiennement, ainsi que le carré codé, le carré de codage et le carré décodé pour chaque carré donné (à l'exception des carrés de codage multiples du 3ème jour).
En dehors des dossiers, il y a 4 scripts pour le décodage des jours 1 à 5, des jours 6 à 10, des jours 11 à 15 et des jours 16 à 20 (en fait 16 à 18, les carrés des jours 19 et 20 étant donnés sans codage). Le découpage en 4 scripts évite d'avoir 20 scripts éparpillés et évite d'avoir un seul énorme script.
Le fichier requirements.txt contient "pillow" et est indispensable à l'installation de Pillow lorsqu'on clique sur "run" pour la première fois.
Si on veut exécuter le contenu d'un fichier joursXàY.py, il faut d'abord copier son contenu dans main.py.
En haut de l'éditeur de texte, il y a un bouton "saved" accompagné d'une flèche. Il permet de consulter l'historique des scripts et des fichiers texte.
J'écris la suite dans un autre post, bientôt
Bonne lecture !