Escriba un programa o función que tome una cuadrícula de texto de 4 × 4 que consta exactamente de 4 A
's, 4 B
' s, 4 C
's y 4 D
' s, tales como:
ACDC
BBCA
BADD
ABCD
El ABCD
's puede estar en cualquier disposición, pero siempre habrá 4 de cada uno. Puede asumir que la entrada es válida. Si lo desea, también puede suponer que tiene una nueva línea final y / o que viene como una línea en el orden de lectura, por ejemplo ACDCBBCABADDABCD
. También puede reemplazar los caracteres ABCD
con 0123
o 1234
respectivamente, si lo desea (pero eso es todo).
Produzca un valor verdadero si la cuadrícula de texto tiene alguna forma de simetría reflexiva o rotacional. Específicamente:
Si hay una línea horizontal central de simetría. p.ej
BACD BACD BACD \___ bottom mirrors top BACD /
Si hay una línea vertical central de simetría. p.ej
BCCB DAAD CAAC BDDB \/___ right mirrors left
Si hay una línea diagonal de simetría (en cualquier dirección). p.ej
___ diagonally mirrored / ABDC BACD DCAB CDBA \___ diagonally mirrored
Si hay una simetría rotacional de 90 °. p.ej
BDAB ACCD same if rotated 90 degrees (or 180 or 270) DCCA BADB
Si hay una simetría rotacional de 180 °. p.ej
DBCA BDCA same if rotated 180 degrees ACDB ACBD
(Tenga en cuenta que la simetría traslacional no entra en juego aquí).
Genere un valor falso si la cuadrícula no tiene una de las simetrías mencionadas anteriormente. por ejemplo, la primera cuadrícula de ejemplo.
El código más corto en bytes gana.
Respuestas:
CJam, 16 bytes
Un bloque sin nombre que espera la entrada como una lista de cuatro cadenas en la parte superior de la pila y deja un
0
(falso) para entradas asimétricas y un entero positivo (verdadero) para entradas simétricas.Pruébalo aquí. O ejecute un conjunto de pruebas completo.
Explicación
Las simetrías del cuadrado son los elementos del grupo diédrico de orden 8 (que son solo las 4 rotaciones del cuadrado y las mismas 4 rotaciones de alguna versión reflejada del cuadrado). No es posible generar este grupo a partir de la aplicación repetida de una sola permutación. Pero dos reflexiones siempre dan algo de rotación. Por lo tanto, todo el grupo se puede generar alternando entre dos reflexiones cuatro veces. (Solo necesitamos asegurarnos de que las dos reflexiones den una rotación de 90 grados o 270 grados, no 0 o 180).
El desafío pregunta si el cuadrado de entrada es igual a cualquiera de las otras 7 simetrías. Entonces, esta respuesta solo los genera a todos y luego verifica si la entrada está entre las demás.
Para ver cómo la aplicación repetida de
z
yW%
genera todas las simetrías, eche un vistazo a este "diagrama":fuente
z
es transponer eW%
invertir las líneas, así que solo estoy generando todas las simetrías mediante la aplicación repetida de esas.Pyth, 11 bytes
Banco de pruebas
Utiliza la técnica de transposición y reversa de Martin, pero con un giro. Mientras que otras soluciones han generado explícitamente las 8 simetrías, luego contaron el número de apariencias del original, este programa utiliza la
.u
función de Pyth .La
.u
función es "Aplicar hasta que se encuentre la repetición". En este caso, transponemos e invertimos alternativamente hasta que ocurre una repetición, luego acumulamos los resultados en una lista. Luego, elimino los últimos 7 valores, por lo que solo quedará un valor si no hubiera simetrías, y la primera repetición ocurrió después de que se generaron las 8 reflexiones y repeticiones.Explicación:
fuente
05AB1E , 13 bytes
Explicación
Utiliza el método experto explicado por Martin en su respuesta de CJam .
Pruébalo en línea
fuente
Perl,
6160 bytesIncluye +3 para
-p0a
Proporcione un cuadrado de entrada en STDIN, imprime 0 sin simetría, de lo contrario, algún número positivo
symmetry.pl
:fuente
Dyalog APL ,
371917 bytes¡@ngn lo redujo en 20 bytes!
TryAPL en línea!
fuente
⍉¨
en lugar de⌽∘⍉¨
obras también.Brachylog ,
3836 bytesPruébalo en línea!
Esto espera una lista de cadenas como entrada. Esto imprime ya sea
true.
ofalse.
.Explicación
Predicado principal:
Predicado 1: La salida es una de las 8 simetrías de la entrada.
fuente
TSQL, 229 bytes
Tenga en cuenta que TSQL no tiene una función incorporada para la rotación, por lo que se incluye en el código.
Golfizado:
Sin golf:
Violín
fuente
Python 2,
154146 bytesComprueba si alguna de las transformaciones necesarias es equivalente a la original usando matrices numpy. La entrada se toma como una lista de cuatro cadenas.
Pruébalo en línea
Tomar la entrada como una sola cadena es un carácter más largo, con
A=array(list(input())).reshape(4,4)
.A[:,::-1]
es el mismo quefliplr(A)
.A[::-1]
es el mismo queflipud(A)
.fuente
map(list,input())
lugar de[list(r)for r in input()]
any
toma una expresión de generador, por lo que puede guardar algunos bytes al soltar el par externo de corchetes.print
declaración no funcione. Intente bifurcar mi código en línea y ejecutarlo de esa manera para ver.print
.Python 3, 99 bytes
Una función que toma la entrada, a través del argumento, de una lista de cadenas y retornos
True
oFalse
según sea relevante.Utiliza el mismo enfoque que la respuesta de @ MartinEnder .
Cómo funciona
Pruébalo en Ideone
fuente
JavaScript (ES6), 131 bytes
17 bytes podrían eliminarse si pasa una matriz de 4 cadenas directamente. Intenté bit-twiddling (entrada en
"0123301223011230"
formato) pero eso me llevó 199 bytes:fuente