Escreva um programa ou função que utilize uma grade de texto 4 × 4 composta exatamente por 4 A
, 4 B
, 4 C
e 4 D
, como:
ACDC
BBCA
BADD
ABCD
Os ABCD
podem estar em qualquer arranjo, mas sempre haverá 4 de cada. Você pode assumir que a entrada é válida. Se desejado, você também pode assumir que ela possui uma nova linha à direita e / ou que vem como uma linha na ordem de leitura, por exemplo ACDCBBCABADDABCD
. Você também pode substituir os caracteres ABCD
com 0123
ou 1234
respectivamente, se desejar (mas isso é tudo).
Emita um valor verdadeiro se a grade de texto tiver qualquer forma de simetria refletiva ou rotacional. Especificamente:
Se houver uma linha horizontal central de simetria. por exemplo
BACD BACD BACD \___ bottom mirrors top BACD /
Se houver uma linha vertical central de simetria. por exemplo
BCCB DAAD CAAC BDDB \/___ right mirrors left
Se houver uma linha diagonal de simetria (em qualquer direção). por exemplo
___ diagonally mirrored / ABDC BACD DCAB CDBA \___ diagonally mirrored
Se houver simetria rotacional de 90 °. por exemplo
BDAB ACCD same if rotated 90 degrees (or 180 or 270) DCCA BADB
Se houver simetria rotacional de 180 °. por exemplo
DBCA BDCA same if rotated 180 degrees ACDB ACBD
(Observe que a simetria da tradução não entra em jogo aqui.)
Emita um valor falso se a grade não tiver uma das simetrias mencionadas acima. por exemplo, o primeiro exemplo de grade.
O código mais curto em bytes vence.
Respostas:
CJam, 16 bytes
Um bloco sem nome que espera a entrada como uma lista de quatro cadeias no topo da pilha e deixa um
0
(falso) para entradas assimétricas e um número inteiro positivo (verdade) para entradas simétricas.Teste aqui. Ou execute um conjunto de testes completo.
Explicação
As simetrias do quadrado são os elementos da grupo diédrico da ordem 8 (que são apenas as 4 rotações do quadrado e as mesmas 4 rotações de alguma versão refletida do quadrado). Não é possível gerar esse grupo a partir da aplicação repetida de uma única permutação. Mas duas reflexões sempre dão alguma rotação. Portanto, todo o grupo pode ser gerado alternando entre duas reflexões quatro vezes. (Precisamos apenas garantir que as duas reflexões produzam rotação de 90 ou 270 graus, e não 0 ou 180.)
O desafio pergunta se o quadrado de entrada é igual a qualquer uma das outras 7 simetrias. Portanto, essa resposta apenas gera todos eles e depois verifica se a entrada está entre as outras.
Para ver como a aplicação repetida de
z
eW%
gera todas as simetrias, dê uma olhada neste "diagrama":fonte
z
é a transposição e aW%
reversão das linhas, por isso estou gerando todas as simetrias pela aplicação repetida delas .Pitão, 11 bytes
Suíte de teste
Isso usa a técnica de transposição e reversão de Martin, mas com um toque. Enquanto outras soluções geraram explicitamente todas as 8 simetrias e contaram o número de aparências do original, este programa usa a
.u
função de Pyth .A
.u
função é "Aplicar até que a repetição seja encontrada". Nesse caso, transpomos e invertemos alternadamente até que uma repetição aconteça e, em seguida, acumulamos os resultados em uma lista. Em seguida, removo os últimos 7 valores, para que restará apenas um valor se não houvesse simetria e a primeira repetição ocorreu depois que todas as 8 reflexões e repetições foram geradas.Explicação:
fonte
05AB1E , 13 bytes
Explicação
Usa o método habilmente explicado por Martin em sua resposta CJam .
Experimente online
fonte
Perl,
6160 bytesInclui +3 para
-p0a
Dê um quadrado de entrada em STDIN, imprime 0 sem simetria, caso contrário, algum número positivo
symmetry.pl
:fonte
Dyalog APL ,
371917 bytes@ngn reduziu em 20 bytes!
TryAPL online!
fonte
⍉¨
em vez de⌽∘⍉¨
funciona também.Braquilog ,
3836 bytesExperimente online!
Isso espera uma lista de strings como entrada. Isso imprime
true.
oufalse.
.Explicação
Predicado principal:
Predicado 1: A saída é uma das 8 simetrias da entrada.
fonte
TSQL, 229 bytes
Esteja ciente de que o TSQL não possui build-in para rotação, portanto isso está incluído no código.
Golfe:
Ungolfed:
Violino
fonte
Python 2,
154146 bytesVerifica se alguma das transformações necessárias é equivalente ao original usando matrizes numpy. A entrada é tomada como uma lista de quatro cadeias.
Experimente online
Receber a entrada como uma única string é um caractere mais longo, com
A=array(list(input())).reshape(4,4)
.A[:,::-1]
é o mesmo quefliplr(A)
.A[::-1]
é o mesmo queflipud(A)
.fonte
map(list,input())
vez de[list(r)for r in input()]
any
usa uma expressão de gerador, para que você possa salvar alguns bytes, removendo o par externo de colchetes.print
instrução não funcione. Tente digitar meu código on-line e executá-lo dessa maneira para ver.print
.Python 3, 99 bytes
Uma função que recebe entrada, via argumento, de uma lista de strings e retornos
True
ouFalse
como relevante.Isso usa a mesma abordagem da resposta do @ MartinEnder .
Como funciona
Experimente no Ideone
fonte
JavaScript (ES6), 131 bytes
17 bytes podem ser removidos se você passar uma matriz de 4 seqüências diretamente. Eu tentei mexer em bits (entrada em
"0123301223011230"
formato), mas isso me levou em 199 bytes:fonte