Qui veut un puzzle marrant inspiré de l’univers de Harry Potter, généré avec du fourchelang le langage python et les librairies numpy + opencv ?
Voilà comment ça se présente :

Ceci est un quadrillage composé de 12 cases (3 lignes 4 colonnes), chaque case contient un groupe de 4 clés.
Chaque clé est présente une ou deux fois dans tout le quadrillage.
Si vous prenez deux cases adjacentes, elles ont toujours une clé en commun. Leurs emplacements à l’intérieur des cases sont aléatoires.
Or donc, :
- pour les cases du milieu, les 4 clés ont une jumelle sur chacune des 4 cases adjacentes,
- pour les cases du bord, 3 clés sur 4 ont une jumelle, et la quatrième est unique (sont emplacement à l’intérieur de la case est aléatoire),
- pour les cases des coins, 2 clés sur 4 ont une jumelle, les deux autres sont uniques.
Imprimez cette feuille, découpez les cases, mélangez-les et essayez de retrouver la disposition originale. Quel distrayant puzzle !
Il m’en faut plus
Pas de problème, en voilà un fonctionnant sur le même principe, mais sur un quadrillage de 8×8 cases.

Pour des images plus grandes et de meilleure qualité, c’est par ici dans ce repository git. Elles doivent être disposées comme ceci :
plank_00.png | plank_03.png | plank_06.png | plank_09.png
plank_01.png | plank_04.png | plank_07.png | plank_10.png
plank_02.png | plank_05.png | plank_08.png | plank_11.png
Comment c’est construit ?
Les clés
Pour commencer, il vous faut des images pour générer les clés.

Nous avons donc : (3 types d’aile) x (4 types de bas de clé) x (4 types de haut de clé) x (3 types de tige). Soit 3 * 4 * 4 * 3 = 144 combinaisons différentes de clés.
On peut maintenant construire une image d’une des clés à partir d’un numéro entre 0 et 143. Il vous faudra effectuer quelques divisions entières, quelques modulos et utiliser open-cv (la lib python de manipulation d’image). Je vous fais grâce de ces détails bassement techniques.
Les associations horizontales
Vous prenez ensuite tous les nombres entre 0 et 143, vous les mélangez, et vous les séparez en deux listes de 72 nombres chacune. La première servira pour les clés définissant les liens d’adjacence horizontaux, la deuxième sera pour les liens verticaux.
Réarrangez la première liste en un rectangle de 8 lignes 9 colonnes. Mettons que ça donne ceci :
7 17 38 4 68 125 96 135 16
101 118 97 73 46 143 92 89 2
86 14 62 56 10 9 6 19 3
134 36 37 93 13 57 81 52 74
66 8 71 109 60 40 65 69 27
59 105 0 76 41 49 91 107 99
115 95 75 48 83 142 141 130 64
1 51 104 102 22 54 80 34 129
Ensuite, vous recopiez la deuxième colonne juste à sa droite, puis la troisième, et ainsi de suite jusqu’à l’avant-dernière. Ça donne ce rectangle de 8 lignes 16 colonnes (que je vous mets sous forme de tableau, sinon ça fait des retours à la ligne pourris dans wordpress) :
7 | 17 | 17 | 38 | 38 | 4 | 4 | 68 | 68 | 125 | 125 | 96 | 96 | 135 | 135 | 16 |
101 | 118 | 118 | 97 | 97 | 73 | 73 | 46 | 46 | 143 | 143 | 92 | 92 | 89 | 89 | 2 |
86 | 14 | 14 | 62 | 62 | 56 | 56 | 10 | 10 | 9 | 9 | 6 | 6 | 19 | 19 | 3 |
134 | 36 | 36 | 37 | 37 | 93 | 93 | 13 | 13 | 57 | 57 | 81 | 81 | 52 | 52 | 74 |
66 | 8 | 8 | 71 | 71 | 109 | 109 | 60 | 60 | 40 | 40 | 65 | 65 | 69 | 69 | 27 |
59 | 105 | 105 | 0 | 0 | 76 | 76 | 41 | 41 | 49 | 49 | 91 | 91 | 107 | 107 | 99 |
115 | 95 | 95 | 75 | 75 | 48 | 48 | 83 | 83 | 142 | 142 | 141 | 141 | 130 | 130 | 64 |
1 | 51 | 51 | 104 | 104 | 102 | 102 | 22 | 22 | 54 | 54 | 80 | 80 | 34 | 34 | 129 |
Pour finir, sur chaque ligne, vous regroupez les numéros par couple. Ce qui vous donne un rectangle de 8 lignes et (8×2) colonnes :
7,17 | 17,38 | 38,4 | 4,68 | 68,125 | 125,96 | 96,135 | 135,16 |
101,118 | 118,97 | 97,73 | 73,46 | 46,143 | 143,92 | 92,89 | 89,2 |
86,14 | 14,62 | 62,56 | 56,10 | 10,9 | 9,6 | 6,19 | 19,3 |
134,36 | 36,37 | 37,93 | 93,13 | 13,57 | 57,81 | 81,52 | 52,74 |
66,8 | 8,71 | 71,109 | 109,60 | 60,40 | 40,65 | 65,69 | 69,27 |
59,105 | 105,0 | 0,76 | 76,41 | 41,49 | 49,91 | 91,107 | 107,99 |
115,95 | 95,75 | 75,48 | 48,83 | 83,142 | 142,141 | 141,130 | 130,64 |
1,51 | 51,104 | 104,102 | 102,22 | 22,54 | 54,80 | 80,34 | 34,129 |
Chaque couple de deux numéros correspond à deux clés, dans une case du quadrillage initial de 8×8. Il s’agit des clés réalisant les adjacences horizontales.
Les deux autres clés de chaque case ne sont pas encore définies, ce qui nous amène au chapitre suivant.
Mais avant, une petite pause. Puisque nous sommes dans l’univers de Harry Potter, voici Dawn French, l’actrice qui joue « La Grosse Dame » dans le Prisonnier d’Azkaban.

Les associations verticales
C’est pareil, mais en inversant les lignes/colonnes.
Prenez les 72 valeurs qui restent, disposez-les randomement dans un rectangle de 9 lignes 8 colonnes.
12 114 15 45 128 120 44 28
5 110 136 132 126 72 39 88
78 11 70 127 47 124 117 33
25 103 20 82 29 139 26 113
106 140 123 122 94 30 119 32
79 23 21 98 24 55 137 111
77 138 108 100 53 67 85 133
58 112 84 90 35 131 121 31
43 61 87 116 63 42 50 18
Au lieu de doubler les colonnes, doublez les lignes : de la 2ème à l’avant-dernière. Ce qui donne un rectangle de 16 lignes 8 colonnes :
12 114 15 45 128 120 44 28
5 110 136 132 126 72 39 88
5 110 136 132 126 72 39 88
78 11 70 127 47 124 117 33
78 11 70 127 47 124 117 33
25 103 20 82 29 139 26 113
25 103 20 82 29 139 26 113
106 140 123 122 94 30 119 32
106 140 123 122 94 30 119 32
79 23 21 98 24 55 137 111
79 23 21 98 24 55 137 111
77 138 108 100 53 67 85 133
77 138 108 100 53 67 85 133
58 112 84 90 35 131 121 31
58 112 84 90 35 131 121 31
43 61 87 116 63 42 50 18
Faites des couples, en prenant deux valeurs l’une au-dessus de l’autre. Ça donne un carré de 8×8. Cette fois-ci, je le mets sous forme de texte-code, car les lignes sont plus courtes et ne vont pas faire de stupides retours à la ligne. Tant que ça ne nuit pas à l’affichage et à la présentation, je préfère le texte brut, c’est plus facile à générer et à copier-coller dans l’article. Vive le texte brut !
12|114| 15| 45|128|120| 44| 28
5|110|136|132|126| 72| 39| 88
-------------------------------
5|110|136|132|126| 72| 39| 88
78| 11| 70|127| 47|124|117| 33
-------------------------------
78| 11| 70|127| 47|124|117| 33
25|103| 20| 82| 29|139| 26|113
-------------------------------
25|103| 20| 82| 29|139| 26|113
106|140|123|122| 94| 30|119| 32
-------------------------------
106|140|123|122| 94| 30|119| 32
79| 23| 21| 98| 24| 55|137|111
-------------------------------
79| 23| 21| 98| 24| 55|137|111
77|138|108|100| 53| 67| 85|133
-------------------------------
77|138|108|100| 53| 67| 85|133
58|112| 84| 90| 35|131|121| 31
-------------------------------
58|112| 84| 90| 35|131|121| 31
43| 61| 87|116| 63| 42| 50| 18
Chaque couple de deux numéros correspond aux deux autres clés, dans chaque case du quadrillage initial de 8×8. Elles définissent les adjacences verticales.
Enfin, pour chaque case, vous mélangez randomement les 4 clés contenues dedans.
Y’a plus qu’à coder tout ça. Vous avez une implémentation (un peu à l’arrache) dans ce repository, dans lequel je stockais déjà d’autres bazars pour des mini-jeux et mini-énigmes.
Vérification de l’unicité de la solution
J’ai vérifié avec mon feeling de maître de conférence en arithmancie combinatorio-serrurologique, j’en conclus que oui c’est bon. Aux rotations et aux symétries verticales/horizontales près : y’a qu’une solution.
J’ai utilisé ce puzzle pour une sorte de mini escape-game en famille, et j’ai profité des rotations et symétries pour ajouter une mini-post-énigme. J’ai écrit une lettre derrière chaque carte. Une fois que le puzzle était reconstitué, il fallait toutes les retourner, et retrouver la phrase composée par ces lettres. L’astuce amusante, c’est qu’on ne peut pas déterminer à l’avance le sens de lecture, ni la position de la carte de départ, ni celle d’arrivée. Ça dépend de la manière dont le puzzle a été résolu. Il faut donc tester différents sens pour trouver la phrase finale. Hi hi hi !!
Et hop, d’autres chouettes images de Dawn French.


Tchuss.