O grupo diédrico é o grupo de simetria do quadrado, ou seja, os movimentos que transformam um quadrado em si mesmo por meio de rotações e reflexões. Consiste em 8 elementos: rotações de 0, 90, 180 e 270 graus e reflexões nos eixos horizontal, vertical e dois diagonais.
As imagens são desta página adorável de Larry Riddle.
Esse desafio é sobre a composição desses movimentos: dados dois movimentos, produza o movimento equivalente a executá-los um após o outro. Por exemplo, fazer o movimento 7 seguido pelo movimento 4 é o mesmo que fazer o movimento 5.
Observe que alternar a ordem para mover 4 e depois mover 7 produz o movimento 6.
Os resultados estão tabulados abaixo; esta é a tabela de Cayley do grupo . Por exemplo, as entradas devem produzir a saída .
Desafio
Seu objetivo é implementar essa operação no menor número de bytes possível, mas, além do código, você também escolhe os rótulos que representam os movimentos de 1 a 8. Os rótulos devem ter 8 números distintos, de 0 a 255 , ou o número 8. caracteres de bytes que seus pontos de código representam.
Seu código receberá dois dos rótulos dos 8 que você escolheu e deve exibir o rótulo que corresponde à sua composição no grupo diédrico .
Exemplo
Digamos que você tenha escolhido os caracteres C, O, M, P, U, T, E, R para os movimentos de 1 a 8, respectivamente. Em seguida, seu código deve implementar esta tabela.
Dadas as entradas E e P, você deve enviar U. Suas entradas sempre serão duas das letras C, O, M, P, U, T, E, R, e sua saída sempre deve ser uma dessas letras.
Tabela 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á, posso codificar a matriz no meu código e afirmar que não conta na minha pontuação.Respostas:
Ruby , 18 bytes
Ungolfed
Experimente online!
Usa os seguintes números de código de 0 a 7
Em ordem nativa para o código:
Em ordem de acordo com a pergunta
Explicação
/
representa um giro na linhay=x
e|
representa um giro no eixo y.É possível gerar qualquer uma das simetrias do grupo D4 alternando alternadamente nessas duas linhas. Por exemplo,
/
seguidas de|
give,/|
que é uma rotação de 90 graus no sentido anti-horário.O número total de lançamentos consecutivos fornece uma representação muito conveniente para manipulação aritmética.
Se o primeiro movimento for uma rotação, podemos simplesmente adicionar o número de movimentos:
Se o primeiro movimento é um reflexo, descobrimos que temos alguns reflexos
/
e|
símbolos idênticos um ao lado do outro. Como a reflexão é auto-inversa, podemos cancelar esses movimentos um a um. Então, precisamos subtrair um movimento do outrofonte
~0
com7
aritmética modular.Wolfram Language (Mathematica) , 31 bytes
Usando números inteiros0,5,2,7,1,3,6,4 como rótulos.
Experimente online!
Explicação:
O grupo diédricoD4 é isomórfico ao grupo da matriz unitriangular de grau três sobre o campo F2 :
E nós temos
que pode ser facilmente escrito em operações bit a bit.
fonte
Wolfram Language (Mathematica) , 51 bytes
Experimente online!
Usando etiquetas
{228, 57, 78, 147, 27, 177, 198, 108}
.Estes estão
{3210, 0321, 1032, 2103, 0123, 2301, 3012, 1230}
na base 4. Felizmente, 256 = 4 ^ 4.Implementação de nível inferior, também 51 bytes
Experimente online!
fonte
Python 2 , 22 bytes
Experimente online!
fonte
Python 2 ,
262321 bytesand
xnor
fonte
(-1)
por7
causa da aritmética modular para -3 bytes.y+x*7**y&7
TI-BASIC, 165 bytes
Entrada é uma lista de comprimento dois
Ans
.Saída é o número no
(row, column)
índice da tabela.Poderia haver um método de compactação melhor que economizasse bytes, mas precisarei analisar isso.
Exemplos:
Explicação:
(Novas linhas foram adicionadas para facilitar a leitura.)
Aqui está uma solução de 155 bytes , mas apenas codifica a matriz e obtém o índice.
Eu achei que era mais chato, então não fiz a minha inscrição oficial:
Nota: TI-BASIC é um idioma tokenizado. Contagem de caracteres não é igual à contagem de bytes.
fonte
0-7
to1-8
Gelatina , 6 bytes
Um link diádico que aceita a primeira transformação à direita e a segunda transformação à esquerda, que produz a transformação composta.
Onde as transformações são:
Experimente online! ... Ou veja a tabela mapeada de volta para os rótulos na pergunta .
(Os argumentos podem ser tomados na outra ordem usando o 6 byter,
_+Ḃ?%8
)Quão?
Cada etiqueta é o comprimento de uma sequência de alternância
hor
e+ve
transformação que é equivalente à transformação (por exemplo,180
é equivalente ahor, +ve, hor, +ve
).A composição
A,B
é equivalente à concatenação das duas seqüências equivalentes e permite simplificar a subtração ou adição do módulo oito ...Usando o
7, 4
exemplo da pergunta, temos o seguinte+ve, 90c
:hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve
... mas como
hor, hor
éid
que temos:hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve
... e uma vez que
+ve, +ve
éid
, temos:hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve
... e podemos repetir esses cancelamentos para:
hor
..equivalente à subtração dos comprimentos (
7-6=1
).90a, 180
2+4=6
90c
Por fim, observe que uma sequência de comprimento oito é
id
para que possamos pegar o módulo de comprimento de sequência resultante oito.Também é 1 byte menor que esta implementação usando índices de permutação lexicográficos:
... um link monádico aceitando
[first, second]
, com rótulos:fonte
JavaScript (Node.js) ,
2217 bytesVersões mais antigas do JavaScript podem ser suportadas de várias maneiras por 22 bytes:
fonte
x=>y=>(y&1?y-x:y+x)&7
e chame sua função usandof(x)(y)
.Ferrugem , 16 bytes
Experimente online!
Resposta Python do porto de alefhalpha. Mas mais curto.
fonte
Olmo ,
42 bytes19 bytesPorta da versão Node.js do Neil
Experimente online
Versão anterior:
fonte
f x
é uma chamada de função, assim como o quef(x)
significa em linguagens C. E você não pode evitar. Mas pode ser realmente agradável e menos confuso em muitos cenários que não são de golfe. Elm não possui operadores bit a bit (como &), portanto,and x y
é apenas uma chamada de função simples aqui.<|
vez de parênteses. Obrigado por questionar isso!Python,
8271 bytes0-7
-11 bytes graças apenas ao ASCII
TIO
fonte
f=
pode ser removido porque não é recursivoint.from_bytes
e codificação não-UTF, mas ... não sei como fazer isso no TIOScala , 161 bytes
Escolhendo COMPUTADOR como etiquetas.
Experimente online!
fonte
Scala , 70 bytes
Escolhendo 0-7 números inteiros nativos como rótulos.
Compactou a matriz em uma string ASCII de 32 bytes, cada par de números n0, n1 em um caractere c = n0 + 8 * n1 + 49. A partir de 49, não temos \ na string codificada.
Experimente online!
fonte
C # (compilador interativo do Visual C #) , 17 bytes
Resposta do Python do porto de alpehalpha.
Experimente online!
fonte
Perl 6 , 19 bytes
Solução Python do Porto de Neil .
Experimente online!
fonte
Wolfram Language (Mathematica), 7 bytes (codificação UTF-8)
Uma função pura usando dois argumentos. O símbolo aqui representado como
⊙
na verdade é o símbolo Unicode privado F3DE do Mathematica (3 bytes), que representa a funçãoPermutationProduct
.O Mathematica conhece grupos dédricos e representa os elementos de vários grupos como permutações, escritas usando o
Cycles
comando Por exemplo, executando o comandoproduz a saída:
PermutationProduct
é a função que multiplica elementos de grupo quando escritos neste formulário.Como podemos escolher nossos próprios rótulos, essa função assume esses rótulos para os elementos do grupo; a associação entre esses rótulos e os da postagem do problema é dada por:
tl; dr Há um builtin.
fonte