El grupo diédrico es el grupo de simetría del cuadrado, es decir, los movimientos que transforman un cuadrado a sí mismo a través de rotaciones y reflexiones. Consta de 8 elementos: rotaciones de 0, 90, 180 y 270 grados, y reflexiones a través de los ejes horizontal, vertical y dos diagonales.
Las imágenes son todas de esta hermosa página de Larry Riddle.
Este desafío se trata de componer estos movimientos: dados dos movimientos, genera el movimiento que es equivalente a hacerlos uno tras otro. Por ejemplo, hacer el movimiento 7 seguido del movimiento 4 es lo mismo que hacer el movimiento 5.
Tenga en cuenta que cambiar el orden para mover 4 y luego mover 7 produce el movimiento 6 en su lugar.
Los resultados se tabulan a continuación; Esta es la tabla de Cayley del grupo . Entonces, por ejemplo, las entradas deberían producir la salida .
Desafío
Su objetivo es implementar esta operación en la menor cantidad de bytes posible, pero además del código, también elige las etiquetas que representan los movimientos del 1 al 8. Las etiquetas deben ser 8 números distintos del 0 al 255 , o el 8 -byte caracteres que representan sus puntos de código.
Su código recibirá dos de las etiquetas de las 8 que ha elegido, y debe mostrar la etiqueta que corresponde a su composición en el grupo diédrico .
Ejemplo
Supongamos que ha elegido los caracteres C, O, M, P, U, T, E, R para los movimientos 1 a 8 respectivamente. Entonces, su código debe implementar esta tabla.
Dadas las entradas E y P, debe generar U. Sus entradas siempre serán dos de las letras C, O, M, P, U, T, E, R, y su salida siempre será una de estas letras.
Tabla de texto para copiar
1 2 3 4 5 6 7 8
2 3 4 1 8 7 5 6
3 4 1 2 6 5 8 7
4 1 2 3 7 8 6 5
5 7 6 8 1 3 2 4
6 8 5 7 3 1 4 2
7 6 8 5 4 2 1 3
8 5 7 6 2 4 3 1
Your choice of labels doesn't count against your code length.
mente elaborando? Tal como está, puedo codificar la matriz en mi código y afirmar que no cuenta para mi puntaje.Respuestas:
Ruby , 18 bytes
Sin golf
Pruébalo en línea!
Utiliza los siguientes números de codificación del 0 al 7
En orden nativo al código:
En orden por la pregunta
Explicación
/
representa un giro en la líneay=x
y|
un giro en el eje y.Es posible generar cualquiera de las simetrías del grupo D4 volteando alternativamente estas dos líneas. Por ejemplo,
/
seguido de|
dado/|
que es una rotación de 90 grados en sentido antihorario.El número total de vueltas consecutivas proporciona una representación muy conveniente para la manipulación aritmética.
Si el primer movimiento es una rotación, simplemente podemos agregar el número de vueltas:
Si el primer movimiento es un reflejo, descubrimos que tenemos algunos reflejos
/
y|
símbolos idénticos uno al lado del otro. Como la reflexión es inversa, podemos cancelar estos cambios uno por uno. Entonces necesitamos restar un movimiento del otrofuente
~0
con7
debido a la aritmética modular.Wolfram Language (Mathematica) , 31 bytes
Usando enteros0,5,2,7,1,3,6,4 como etiquetas.
Pruébalo en línea!
Explicación:
El grupo DiedroD4 es isomorfo al grupo matriz triangular unitario de grado tres sobre el campo F2 :
Y tenemos
que se puede escribir fácilmente en operaciones bit a bit.
fuente
Wolfram Language (Mathematica) , 51 bytes
Pruébalo en línea!
Usando etiquetas
{228, 57, 78, 147, 27, 177, 198, 108}
.Estos están
{3210, 0321, 1032, 2103, 0123, 2301, 3012, 1230}
en la base 4. Afortunadamente, 256 = 4 ^ 4.Implementación de nivel inferior, también 51 bytes
Pruébalo en línea!
fuente
Python 2 , 22 bytes
Pruébalo en línea!
fuente
Python 2 ,
262321 bytesand
xnor
fuente
(-1)
con7
debido a la aritmética modular para -3 bytes.y+x*7**y&7
TI-BASIC, 165 bytes
La entrada es una lista de longitud dos en
Ans
.La salida es el número en el
(row, column)
índice de la tabla.Podría haber un mejor método de compresión que ahorraría bytes, pero tendré que investigarlo.
Ejemplos:
Explicación:
(Se han agregado nuevas líneas para facilitar la lectura).
Aquí hay una solución de 155 bytes , pero solo codifica la matriz y obtiene el índice.
Lo encontré más aburrido, así que no lo hice mi presentación oficial:
Nota: TI-BASIC es un lenguaje tokenizado. El recuento de caracteres hace es igual al recuento de bytes.
fuente
0-7
de1-8
Jalea , 6 bytes
Un enlace diádico que acepta la primera transformación a la derecha y la segunda transformación a la izquierda que produce la transformación compuesta.
Donde están las transformaciones:
Pruébalo en línea! ... O vea la tabla asignada de nuevo a las etiquetas en la pregunta .
(Los argumentos podrían tomarse en el otro orden usando el byte 6
_+Ḃ?%8
)¿Cómo?
Cada etiqueta es la longitud de una secuencia de alternancia
hor
y+ve
transformaciones que es equivalente a la transformación (por ejemplo,180
es equivalente ahor, +ve, hor, +ve
).La composición
A,B
es equivalente a la concatenación de las dos secuencias equivalentes, y permite la simplificación de la resta o la suma del módulo ocho ...Usando el
7, 4
ejemplo de la pregunta tenemos+ve, 90c
cuál es:hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve
... pero ya
hor, hor
esid
que tenemos:hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve
... y como
+ve, +ve
esid
que tenemos:hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve
... y podemos repetir estas cancelaciones para:
hor
..equivalente a la resta de las longitudes (
7-6=1
).Cuando no hay cancelaciones posibles, solo estamos agregando las longitudes (como→ →
90a, 180
2+4=6
90c
)Por último, tenga en cuenta que una secuencia de longitud ocho es
id
para que podamos tomar la secuencia de longitud resultante módulo ocho.También es 1 byte más corto que esta implementación usando índices de permutación lexicográficos:
... un enlace monádico que acepta
[first, second]
, con etiquetas:fuente
JavaScript (Node.js) ,
2217 bytesPruébalo en línea! Puerto de mi respuesta a Cayley Table of the Dihedral Groupre3 pero jugué con las sugerencias de mi respuesta de Python. Utiliza el siguiente mapeo:
Las versiones anteriores de JavaScript se pueden admitir de varias maneras para 22 bytes:
fuente
x=>y=>(y&1?y-x:y+x)&7
luego llame a su función usandof(x)(y)
.Óxido , 16 bytes
Pruébalo en línea!
Port of alephalpha's Python answer. Pero mas corto.
fuente
Olmo ,
42 bytes19 bytesPuerto de los Neil's Versión Node.js
Pruébalo en línea
Versión previa:
fuente
f x
es una llamada de función, al igual que lo quef(x)
significa en lenguajes tipo C. Y no puedes evitarlo. Pero puede ser realmente agradable y menos abarrotado en muchos escenarios que no son de golf. Elm no tiene operadores bit a bit (como &), por lo queand x y
es solo una llamada de función simple aquí.<|
lugar de paréntesis. Gracias por cuestionar eso!Python,
8271 bytes0-7
-11 bytes gracias a ASCII de sólo
TIO
fuente
f=
se puede eliminar ya que no es recursivoint.from_bytes
una codificación que no sea UTF, pero ... no estoy seguro de cómo hacerlo en TIOScala , 161 bytes
Elegir ORDENADOR como etiquetas.
Pruébalo en línea!
fuente
Scala , 70 bytes
Elegir 0-7 enteros nativos como etiquetas.
Comprimió la matriz en una cadena ASCII de 32 bytes, cada par de números n0, n1 en 1 carácter c = n0 + 8 * n1 + 49. Comenzando desde 49 hasta que no tenemos \ en la cadena codificada.
Pruébalo en línea!
fuente
C # (compilador interactivo de Visual C #) , 17 bytes
Puerto de la respuesta Python de alpehalpha.
Pruébalo en línea!
fuente
Perl 6 , 19 bytes
Solución Python del puerto de Neil .
Pruébalo en línea!
fuente
Wolfram Language (Mathematica), 7 bytes (codificación UTF-8)
Una función pura que toma dos argumentos. El símbolo representado aquí como en
⊙
realidad es el símbolo privado Unicode de Mathematica F3DE (3 bytes), que representa la funciónPermutationProduct
.Mathematica sabe sobre grupos diédricos, y representa los elementos de varios grupos como permutaciones, escritos usando el
Cycles
comando. Por ejemplo, ejecutando el comandoproduce la salida:
PermutationProduct
es la función que multiplica los elementos del grupo cuando se escribe de esta forma.Como se nos permite elegir nuestras propias etiquetas, esta función asume estas etiquetas para los elementos del grupo; La asociación entre estas etiquetas y las de la publicación del problema viene dada por:
tl; dr Hay un incorporado.
fuente