Imagine que temos algum poliomino e gostaríamos de identificá-los exclusivamente, no entanto, os poliominos podem ser rotacionados, portanto, o hash cego não nos dará a mesma impressão digital de uma peça e uma rotação da mesma (em geral).
Por exemplo, se tivermos o L-tetromino
x
x
xx
gostaríamos que ela tivesse a mesma impressão digital que qualquer uma destas:
xx
x x xxx
xxx , x or x
Nota: somente permitimos rotações no plano (ou seja, são poliominos unilaterais) e, portanto, o seguinte poliomino seria diferente:
x
x
xx
Desafio
A tarefa para este desafio é implementar uma função / programa de impressão digital que utiliza uma matriz booleana / lista de listas / string / .. codificando um polyomino e retornando uma string - a impressão digital de um polyomino . A impressão digital deve ser igual para todas as rotações possíveis (em geral 4).
Entrada / Saída
- e (isto é. não Polyomino vazio)
- você tem a garantia de que são tão pequenos quanto possível (ie. todo são cortado para caber e
- você está garantido que a entrada é
- simplesmente conectado
- não tem buracos
- A saída deve ser uma sequência que seja a mesma para cada rotação possível de um poliomino
Exemplos
Aqui estão algumas classes de equivalência, para cada classe a impressão digital deve ser a mesma e, para quaisquer dois polioinos de duas classes distintas, eles devem diferir.
As rotações do L-tetromino a partir do exemplo:
[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]
O J-tetromino:
[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]
A unidade polyomino:
[[1]]
Uma barra :
[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]
A canto:
[[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]]
""
(a sequência vazia), atendi a todos os requisitos?Respostas:
Python 2 , 48 bytes
Experimente online!
Toma a maior das quatro rotações em termos de comparação de lista. Baseado na solução da FlipTack .
O código usa a capacidade do Python 2 para comparar objetos de diferentes tipos. O valor do caso base de
0
é inofensivomax
porque é menor que qualquer lista. Além disso,zip
produz uma lista de tuplas enquanto a entrada é uma lista de listas, mas as tuplas são maiores que as listas, portanto a lista de listas de entrada nunca é um candidato. É por isso que giramos 5 vezes em vez de 4, para voltarmos a uma versão tuplificada da lista inicial. (Fazer uma lista de tuplas também funcionaria, se essa for uma forma de entrada permitida.)fonte
Python 3 , 63 bytes
Experimente online!
Encontra a rotação com o mínimo lexográfico e imprime isso.
Um formulário lambda entra na mesma contagem de bytes:
Experimente online!
fonte
lambda
você pode chegar a 58lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M)
.. Funciona porqueexec
sempre retornaNone
.M
já está preenchida ...M[-4:]
pode levá-lo à mesma contagem de bytes.Gelatina , 5 bytes
Experimente online!
Programa completo.
Simplesmente gera todas as rotações possíveis e escolhe o mínimo lexicográfico.
Observe que as listas singleton não estão agrupadas na
[]
saída. Isso não importa, pois o único caso em que as listas de singleton existiriam na entrada seria uma linha vertical (incluindo a unidade polyomino), que é igual a uma linha horizontal com o mesmo tamanho (onde as que não estão agrupadas) ) O único caso em que o exterior[]
também não existe é a unidade polyomino.fonte
Limpo , 136 bytes
Experimente online!
Inclui verificador de teste.
fonte
K (ngn / k) , 16 bytes
Experimente online!
min de rotações
{
}
função com argumentox
{+|x}
rodar, ou seja, inverter (|
) e transpor (+
)3{
}\
aplicar 3 vezes preservando resultados intermediários; isso retorna uma lista das 4 rotaçõesa:
atribuir aa
<
ascender (calcular a permutação de classificação ascendente)*
primeiroa@
indexea
com issofonte
Japonês
-g
, 6 bytesTente
fonte
-g
bandeira é necessária? A classificação deve significar que todas as rotações iniciais terminam com a mesma lista, para que a lista completa funcione bem como a impressão digital, a menos que esteja faltando alguma coisa.J , 16 bytes
-2 bytes graças a Shaggy
Experimente online!
J , 18 bytes
Experimente online!
Retorna o primeiro item da lista de rotações lexicograpicamente classificadas do polyomino.
Explicação:
fonte
05AB1E ,
108 bytes-2 bytes graças a @Shaggy .
Experimente online ou verifique todos os casos de teste .
Explicação:
OBSERVAÇÃO: Tomar o mínimo com
ß
ouW
achatar implicitamente, o mesmo ocorrerá0
. E classificar com{
parece não funcionar para uma lista de matrizes, e é por isso que eu usoΣ˜
.fonte
}
é feito implicitamente se nada vier depois dele.