Imaginez que nous ayons du polyomino et que nous aimerions les identifier de manière unique, mais les polyominos peuvent être tournés, donc les hacher aveuglément ne nous donnera pas la même empreinte digitale pour un morceau et une rotation de celui-ci (en général).
Par exemple, si nous avons le L-tetromino
x
x
xx
nous aimerions qu'il ait la même empreinte digitale que n'importe lequel d'entre eux:
xx
x x xxx
xxx , x or x
Remarque: Nous n'autorisons que les rotations sur le plan (c'est-à-dire qu'il s'agit de polyominos unilatéraux) et, par conséquent, le polyomino suivant serait différent:
x
x
xx
Défi
La tâche pour ce défi est d'implémenter une fonction / un programme d'empreintes digitales qui prend une matrice booléenne / évaluée / liste de listes / chaîne / .. encodant un polyomino et renvoyant une chaîne - l'empreinte digitale d'un polyomino. L'empreinte doit être égale pour toutes les rotations possibles (en général 4).
Entrée sortie
- et (c'est-à-dire pas de polyomino vide)
- vous êtes assuré que sont aussi petits que possible (c'est-à-dire que tous les sont coupés pour s'adapter à et
- vous êtes assuré que l'entrée est
- simplement connecté
- n'a pas de trous
- la sortie doit être une chaîne qui est la même pour chaque rotation possible d'un polyomino
Exemples
Voici quelques classes d'équivalence, pour chaque classe, l'empreinte digitale doit être la même et pour deux polyominos de deux classes distinctes, elles doivent différer.
Les rotations du L-tétromino de l'exemple:
[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]
Le J-tétromino:
[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]
L'unité polyomino:
[[1]]
Une barre :
[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]
Un coin :
[[1,1],[1,0]]
[[1,0],[1,1]]
[[0,1],[1,1]]
[[1,1],[0,1]]
W-pentomino:
[[1,0,0],[1,1,0],[0,1,1]]
[[0,0,1],[0,1,1],[1,1,0]]
[[1,1,0],[0,1,1],[0,0,1]]
[[0,1,1],[1,1,0],[1,0,0]]
""
(la chaîne vide), ai-je satisfait à toutes les exigences?Réponses:
Python 2 , 48 octets
Essayez-le en ligne!
Prend la plus grande des quatre rotations en termes de comparaison de liste. Basé sur la solution de FlipTack .
Le code utilise la capacité de Python 2 pour comparer des objets de différents types. La valeur de cas de base de
0
est inoffensivemax
car elle est plus petite que n'importe quelle liste. Produit égalementzip
une liste de tuples alors que l'entrée est une liste de listes, mais les tuples sont plus gros que les listes, de sorte que la liste de listes d'entrée n'est jamais un concurrent. C'est pourquoi nous effectuons une rotation 5 fois plutôt que 4, afin de revenir à une version tuplifiée de la liste initiale. (Prendre une liste de tuples fonctionnerait également, si c'est une forme d'entrée autorisée.)la source
Python 3 , 63 octets
Essayez-le en ligne!
Recherche la rotation avec le minimum lexographique et l'imprime.
Une forme lambda arrive au même nombre d'octets:
Essayez-le en ligne!
la source
lambda
peut vous amener à 58lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M)
.. Fonctionne carexec
revient toujoursNone
.M
est déjàM[-4:]
peut vous amener au même nombre d'octets.Gelée , 5 octets
Essayez-le en ligne!
Programme complet.
Génère simplement toutes les rotations possibles et sélectionne le minimum lexicographique.
Notez que les listes singleton ne sont pas encapsulées
[]
dans la sortie. Cela n'a pas d'importance, car le seul cas où des listes singleton existeraient dans l'entrée serait une ligne verticale (y compris l'unité polyomino), qui est la même qu'une ligne horizontale de même taille (où celles-ci ne sont pas encapsulées) ). Le seul cas où l'extérieur[]
n'existera pas non plus est l'unité polyomino.la source
Nettoyer , 136 octets
Essayez-le en ligne!
Comprend un vérificateur de test.
la source
K (ngn / k) , 16 octets
Essayez-le en ligne!
min de rotations
{
}
fonction avec argumentx
{+|x}
tourner, c.-à-d. inverser (|
) et transposer (+
)3{
}\
appliquer 3 fois en préservant les résultats intermédiaires; cela renvoie une liste des 4 rotationsa:
affecter àa
<
ascend (calculer la permutation de tri croissant)*
premiera@
indexa
avec celala source
Japt
-g
, 6 octetsEssayez-le
la source
-g
drapeau est-il nécessaire? Le tri doit signifier que toutes les rotations initiales se retrouvent avec la même liste afin que la liste complète fonctionne correctement comme empreinte digitale, sauf si je manque quelque chose.J , 16 octets
-2 octets grâce à Shaggy
Essayez-le en ligne!
J , 18 octets
Essayez-le en ligne!
Renvoie le premier élément de la liste des rotations triées lexicograpiquement du polyomino.
Explication:
la source
05AB1E ,
108 octets-2 octets grâce à @Shaggy .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
REMARQUE: Prendre le minimum avec
ß
ouW
s'aplatira implicitement, ainsi sortira0
. Et le tri avec{
ne semble pas fonctionner pour une liste de matrices, c'est pourquoi j'utilise à laΣ˜
place.la source
}
cela se fait implicitement si rien ne vient après.