Uma string cujo comprimento é um número triangular positivo (1, 3, 6, 10, 15 ...) pode ser organizada em um "triângulo de texto equilateral" adicionando alguns espaços e novas linhas (e mantendo-os na mesma ordem de leitura).
Por exemplo, a cadeia de comprimento 10 ABCDEFGHIJ
se torna:
A
B C
D E F
G H I J
Escreva um programa ou função que aceite essa sequência, exceto que ela conterá apenas os caracteres 0
e 1
. (Você pode assumir que a entrada é válida.)
Para o "triângulo de texto equilateral" resultante, imprima (imprima ou retorne) um dos quatro números que denota o tipo de simetria exibida:
Saída
2
se o triângulo tiver simetria bilateral. isto é, tem uma linha de simetria de qualquer canto até o ponto médio do lado oposto.Exemplos:
0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 1 1
Saída
3
se o triângulo tiver simetria rotacional. isto é, poderia ser girado 120 ° sem alteração visual.Exemplos:
0 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1
Saída
6
se o triângulo tem tanto simetria bilateral e rotação. isto é, corresponde às condições para a saída de ambos2
e3
.Exemplos:
0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0
Saída
1
se o triângulo não tiver simetria bilateral nem rotacional.Exemplos:
1 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1
O código mais curto em bytes vence. O desempatador é a resposta anterior.
Além de uma nova linha à direita opcional, a sequência de entrada pode não ter preenchimento de espaço / nova linha ou estrutura - ela deve ser simples 0
e simples 1
.
Se desejar, você pode usar dois caracteres ASCII imprimíveis distintos no lugar de 0
e 1
.
Casos de teste
Tomado diretamente de exemplos.
011 -> 2
101 -> 2
001010 -> 2
1111010111 -> 2
0100110100 -> 3
0011000010 -> 3
101111111010111 -> 3
101001100010000100111 -> 3
0 -> 6
1 -> 6
000 -> 6
100101 -> 6
0000100000 -> 6
110000 -> 1
001101 -> 1
1101111111 -> 1
111111000111111 -> 1
"Girar" qualquer entrada em 120 ° resultará obviamente na mesma saída.
Respostas:
CJam,
37292827 bytesAgradecimentos ao Sp3000 por salvar 3 bytes.
Suíte de teste.
Isso reutiliza alguns truques de rotação de triângulo desse desafio .
Isso também funciona para a mesma contagem de bytes:
Explicação
Primeiro, uma rápida recapitulação do post do triângulo a que vinculei acima. Representamos um triângulo como uma lista 2D (irregular), por exemplo
O grupo de simetria do triângulo possui 6 elementos. Existem ciclos de comprimento 3 girando o triângulo e ciclos de 2 espelhando-o ao longo de algum eixo. Convenientemente, as rotações correspondem a duas reflexões diferentes. Usaremos as seguintes reflexões para fazer isso:
Transpor a lista significa refleti-la na diagonal principal, para obtermos:
A reversão de cada linha representa uma reflexão que alterna os dois cantos superiores. Aplicando isso ao resultado da transposição, obtemos:
Usando essas duas transformações e mantendo o resultado intermediário, podemos gerar todas as seis simetrias da entrada.
Um outro ponto de observação é o comportamento da transposição em uma lista como esta:
Porque é assim que acabaremos depois de dividir a entrada. Convenientemente, após a transposição, o CJam libera todas as linhas para a esquerda, o que significa que isso se livra do estranho
[]
e o traz para uma forma útil para as duas transformações acima (todas sem alterar o layout real do triângulo além da simetria reflexiva):Com isso fora do caminho, aqui está o código:
fonte