Écrivez un programme ou une fonction qui prend dans une grille de texte 4 × 4 composée exactement de 4 A
, 4 B
, 4 C
et 4 D
, tels que:
ACDC
BBCA
BADD
ABCD
Les ABCD
peuvent être dans n'importe quel arrangement mais il y en aura toujours 4 de chaque. Vous pouvez supposer que l'entrée est valide. Si vous le souhaitez , vous pouvez également supposer qu'il a un saut de ligne et / ou qu'il se présente comme une ligne dans l' ordre de lecture, par exemple ACDCBBCABADDABCD
. Vous pouvez également remplacer les caractères ABCD
par 0123
ou 1234
respectivement, si vous le souhaitez (mais c'est tout).
Générez une valeur véridique si la grille de texte présente une forme de symétrie réfléchissante ou rotationnelle. Plus précisément:
S'il y a une ligne de symétrie horizontale centrale. par exemple
BACD BACD BACD \___ bottom mirrors top BACD /
S'il y a une ligne de symétrie verticale centrale. par exemple
BCCB DAAD CAAC BDDB \/___ right mirrors left
S'il y a une diagonale de symétrie (dans les deux sens). par exemple
___ diagonally mirrored / ABDC BACD DCAB CDBA \___ diagonally mirrored
S'il y a une symétrie de rotation de 90 °. par exemple
BDAB ACCD same if rotated 90 degrees (or 180 or 270) DCCA BADB
S'il y a une symétrie de rotation de 180 °. par exemple
DBCA BDCA same if rotated 180 degrees ACDB ACBD
(Notez que la symétrie translationnelle n'entre pas en jeu ici.)
Générez une valeur fausse si la grille n'a pas l'une des symétries mentionnées ci-dessus. par exemple le tout premier exemple de grille.
Le code le plus court en octets gagne.
Réponses:
CJam, 16 octets
Un bloc sans nom qui attend l'entrée comme une liste de quatre chaînes au-dessus de la pile et laisse un
0
(faux) pour les entrées asymétriques et un entier positif (vrai) pour les entrées symétriques.Testez-le ici. Ou exécutez une suite de tests complète.
Explication
Les symétries du carré sont les éléments du groupe dièdre d'ordre 8 (qui ne sont que les 4 rotations du carré et les mêmes 4 rotations d'une version réfléchie du carré). Il n'est pas possible de générer ce groupe à partir de l'application répétée d'une seule permutation. Mais deux reflets donnent toujours une rotation. Par conséquent, le groupe entier peut être généré en alternant quatre fois deux réflexions. (Nous devons juste nous assurer que les deux réflexions donnent la rotation de 90 degrés ou 270 degrés, pas 0 ou 180.)
Le défi demande si le carré d'entrée est égal à l'une des 7 autres symétries. Donc, cette réponse les génère tous et vérifie ensuite si l'entrée est parmi les autres.
Pour voir comment l'application répétée de
z
etW%
génère toutes les symétries, jetez un œil à ce "diagramme":la source
z
c'est la transposition etW%
inverse les lignes, donc je ne fais que générer toutes les symétries en les appliquant de façon répétée.Pyth, 11 octets
Suite de tests
Cela utilise la technique de transposition et d'inversion de Martin, mais avec une touche. Alors que d'autres solutions ont généré explicitement les 8 symétries, puis compté le nombre d'apparitions de l'original, ce programme utilise la
.u
fonction de Pyth .La
.u
fonction est "Appliquer jusqu'à ce que la répétition soit trouvée". Dans ce cas, nous transposons et inversons alternativement jusqu'à ce qu'une répétition se produise, puis accumulons les résultats dans une liste. Ensuite, je supprime les 7 dernières valeurs, donc il ne restera qu'une valeur s'il n'y avait pas de symétries, et la première répétition s'est produite après que les 8 réflexions et répétitions ont été générées.Explication:
la source
05AB1E , 13 octets
Explication
Utilise la méthode savamment expliquée par Martin dans sa réponse CJam .
Essayez-le en ligne
la source
Perl,
6160 octetsComprend +3 pour
-p0a
Donne le carré d'entrée sur STDIN, imprime 0 pour aucune symétrie, sinon un certain nombre positif
symmetry.pl
:la source
Dyalog APL ,
371917 octets@ngn l'a réduit de 20 octets!
TryAPL en ligne!
la source
⍉¨
au lieu de⌽∘⍉¨
travaux aussi.Brachylog ,
3836 octetsEssayez-le en ligne!
Cela attend une liste de chaînes en entrée. Cela imprime soit
true.
oufalse.
.Explication
Prédicat principal:
Prédicat 1: la sortie est l'une des 8 symétries de l'entrée.
la source
TSQL, 229 octets
Soyez conscient que TSQL n'a pas de build pour la rotation, donc cela est inclus dans le code.
Golfé:
Non golfé:
Violon
la source
Python 2,
154146 octetsVérifie si l'une des transformations nécessaires est équivalente à l'original à l'aide de tableaux numpy. L'entrée est considérée comme une liste de quatre chaînes.
Essayez-le en ligne
Prendre l'entrée comme une seule chaîne est un caractère de plus, avec
A=array(list(input())).reshape(4,4)
.A[:,::-1]
est le même quefliplr(A)
.A[::-1]
est le même queflipud(A)
.la source
map(list,input())
place de[list(r)for r in input()]
any
prend une expression de générateur, vous pouvez donc économiser quelques octets en supprimant la paire extérieure de crochets.print
instruction ne fonctionne pas. Essayez de bifurquer mon code en ligne et de l'exécuter de cette façon pour voir.print
.Python 3, 99 octets
Une fonction qui prend en entrée, via un argument, une liste de chaînes et retourne
True
ouFalse
selon le cas.Cela utilise la même approche que la réponse de @ MartinEnder .
Comment ça marche
Essayez-le sur Ideone
la source
JavaScript (ES6), 131 octets
17 octets pourraient être supprimés si vous passez directement un tableau de 4 chaînes. J'ai essayé le bit-twiddling (entrée au
"0123301223011230"
format) mais cela m'a pris 199 octets:la source