Desafio
Dada uma forma de arte ASCII, você deve descobrir se a forma é um hexágono regular ou não.
Hexágonos
Um hexágono regular é definido usando duas regras:
- Tem seis lados
- Cada lado tem um número igual de caracteres
Por exemplo, a seguinte forma é regular, mas não possui seis lados e, portanto, não é um hexágono regular :
B a a h
s a i d
y o u r
g a o t
Da mesma forma, a forma a seguir tem seis lados, mas lados de comprimentos diferentes e, portanto, não é um hexágono regular :
* *
* * *
* * * *
* * *
* *
No entanto, a forma a seguir tem seis lados e todos os lados têm o mesmo número de caracteres, portanto, é um hexágono regular:
T h e
h e x a
g o n s a
r e c o
m i n
Regras
A saída deve ser um valor verdade ou falsey (verdade se a forma for um hexágono regular, falsey se não).
As formas sempre conterão caracteres ASCII imprimíveis.
A borda da forma nunca conterá espaços. Se isso acontecer, você pode retornar Falsey.
Pode haver quantidades arbitrárias de espaço em branco antes e / ou depois da forma.
Todos os ângulos na forma podem não ser iguais, por exemplo, a seguinte forma é uma entrada válida:
. . .
. . .
. . . . .
. . . .
. . .
Retornará um valor falsey.
Todas as entradas de forma estarão em uma grade separada por espaço. A entrada hexagonal estará em uma grade escalonada (cada linha é deslocada da seguinte).
Exemplos
Truthy
As seguintes formas devem retornar valores de verdade:
# _
+ + +
9 :
5 6 7
8 9 0 1
2 3 4 5 6
7 8 9 0
1 2 3
t h i s
i s
a h
e x
a g
o n
! ! ! !
5 6 7
8 9 0 1
2 3 4 5 6
7 8 9 0
1 2 3
Falsey
O seguinte deve retornar valores falsey
r e c t a
n g l e s
h e l l o
w o r l d s
t h i s i s b
e t a d e c
a y n o w
*
* *
* * *
.....
.......
.........
.......
.....
Essa forma não está em uma grade separada por espaço e não é escalonada.
* * * *
---------
* * * * * *
-------------
* * * * * *
---------
* * * *
5 6 7
8 9 0 1
2 3 4 5 6
7 8 9 0
1 2 3
Para entradas de um caractere, seu programa pode gerar truthy ou falsey:
&
Ganhando
O programa mais curto em bytes vence.
fonte
5 6 7\n8 9 0 1\n2 3 4 5 6\n7 8 9 0\n1 2 3
e um com um espaço adicional à frente de uma das linhas:ss5 6 7\nss8 9 0 1\n2 3 4 5 6\ns7 8 9 0\nss1 2 3
(os espaços à esquerda são substituídos pors
para tornar um pouco mais claro neste formato não formatado) . Todos os 10 casos de teste estão validando corretamente com meu código atualmente, mas esses dois casos falhariam com a abordagem que eu usei.Respostas:
R, 184 bytes
Golfed, provavelmente poderia ser golfed por alguns bytes
Ungolfed, muito bagunçado, mais como na metade do golfe
Como o formato de entrada não é especificado, a Entrada precisa ser especificada em um formato de matriz R, parecido com este.
Aqui está uma função geradora que gera a entrada. O gerador não gera um objeto que é alimentado na função de verificação hexagonal, mas o código que especifica a matriz (efetivamente a mesma coisa). Portanto, isso não deve contar como análise do texto. Lembre-se de que não estou inserindo texto, mas uma estrutura de matriz.
Por exemplo, o código gerado seria:
structure(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), .Dim = c(5L, 9L ))
que é idêntico aarray(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), dim = c(5, 9))
Esperemos que este método de entrada esteja em conformidade com as regras.
Aqui estão os casos de teste
Gere matrizes de entrada
Teste para hexágono
fonte
f(array(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), dim = c(5, 9)))
JavaScript (ES6), 214 bytes
Onde
\n
representa um caractere literal de nova linha. Ungolfed:fonte
" x\n g g\ng g g\n g g"
deve dar false, mas dá true.x
?SnakeEx , 200 bytes
O idioma certo para o trabalho ... mais ou menos.
SnakeEx é um idioma do desafio de Correspondência de Padrão 2-D . Deveria ser muito bom nessa tarefa, mas infelizmente todos os casos de canto realmente incharam o código. Também descobri alguns erros de intérprete. Ainda assim, foi um desafio divertido.
m
é a principal cobra que chama todas as outras para fazer o trabalho real. Corresponde a partir do canto superior direito do hexágono e no sentido horário. Grupos numerados são usados para verificar se os comprimentos laterais da diagonal são todos iguais e se o comprimento lateral horizontal corresponde à altura da figura inteira. Eu poderia escrever uma explicação mais detalhada, mas passei os últimos dois dias lidando com casos extremos, então tente você mesmo aqui . : ^)fonte
Perl,
127125124121 bytesInclui +4 para
-0p
Dê entrada no STDIN
fonte