Escreva o programa mais curto possível que capte um conjunto de números inteiros positivos distintos e produza uma renderização ASCII de hexágonos concêntricos com esses comprimentos laterais, feitos de barras, sublinhados, espaços e novas linhas.
O programa mais curto em bytes, contado por https://mothereff.in/byte-counter, vence.
Exemplos
(Eles ficam melhores com menos espaçamento entre linhas.)
Se a entrada é 1
a saída, o hexágono deve ter o comprimento lateral 1:
__
/ \
\__/
Observe que dois sublinhados são usados na parte superior e inferior do hexágono, para que seja melhor proporcionado.
Em geral, o tamanho do hexágono N contém N barras em cada lado angular e 2 * N sublinhados na parte superior e inferior.
Se a entrada é 1 2
a saída, devem ser os hexágonos concêntricos com comprimento lateral 1 e 2:
____
/ __ \
/ / \ \
\ \__/ /
\____/
Se a entrada for 1 3
a saída deve ser:
______
/ \
/ __ \
/ / \ \
\ \__/ /
\ /
\______/
Se a entrada for 1 3 2
a saída deve ser:
______
/ ____ \
/ / __ \ \
/ / / \ \ \
\ \ \__/ / /
\ \____/ /
\______/
etc.
Regras de E / S
A entrada deve vir da linha de comando ou do stdin, mas pode estar no formato que for mais conveniente.
Por exemplo, você pode fornecer cada número como um argumento de linha de comando: > myprogram 1 3 2
ou pode solicitar ao usuário que insira os números como uma lista pré-formatada:[1, 3, 2]
.
A saída deve ir para stdout ou o equivalente mais próximo do seu idioma.
Regras adicionais
- A entrada sempre será um conjunto de números inteiros positivos distintos, não necessariamente em qualquer ordem .
- A saída deve ...
- não contém nenhum caractere além de
/\ _
e novas linhas. - não tem espaços à direita ou espaços à esquerda desnecessários.
- não contém novas linhas iniciais estranhas, mas pode ter uma nova linha posterior opcional .
- não contém nenhum caractere além de
- Se nada for inserido, nada será gerado (exceto possivelmente uma nova linha).
- Se ajudar, você pode assumir que os números inteiros de entrada são menores que 2 16 .
1
se ao hexágono mais interno ou mais externo?1
(ou qualquer número) refere-se ao hexágono com comprimento lateral de 1. (Com a ressalva de que 1 barra = 2 sublinhados.) Portanto1
, sempre se referirá ao hexágono mais interno.Respostas:
CJam,
148116109 bytesIsso levou muito mais tempo do que eu esperava. Originalmente, eu só queria criar iterativamente o quadrante superior esquerdo, como nos desafios de diamante, e depois tirar o restante do espelhamento. Mas não notei que os sublinhados não obedecem à simetria de espelho entre a metade superior e a inferior. Então eu tive que refazer a maior parte disso, para gerar a metade direita iterativamente e depois espelhar apenas uma vez (à esquerda).
Teste aqui.
Um exemplo de Fibonacci-esque:
Explicação:
Conforme declarado no topo, começo construindo a metade direita iterativamente. Ou seja, inicialmente eu tenho apenas um espaço na grade e, em seguida, para cada anel possível, envolvo a grade existente em espaços ou um novo semi-hexágono.
Feito isso, espelho cada linha à esquerda e as preencho com espaços à esquerda para o alinhamento correto. Aqui está um detalhamento do código:
fonte
Python -
251, 240, 239228Abordagem alternativa (251):
fonte
APL (222 bytes em UTF-8)
(e 133 caracteres)
Como essa pergunta solicita especificamente a quantidade de bytes na representação UTF8, tive que desmontá- la um pouco para que seja mais longa, mas sua representação UTF8 é mais curta. (Em particular, o caractere do operador de comutação
⍨
é de três bytes, enquanto()
apenas dois, para que a otimização não funcione mais e também torne a atribuição muito cara.)Versão anterior, que é mais curta em caracteres (124), mas usa mais bytes quando representada em UTF-8 (230, o que colocaria em segundo lugar):
Teste:
fonte
Perl 5, 352 (349 bytes + 3 para
anE
sinalizadores)Provavelmente isso poderia ser jogado muito mais.
Ungolfed:
Exemplo (
1 5 3 14
):fonte
C # -
388316 bytesEdit: Alterado como evita a impressão de espaços à direita e lançou alguns LINQ
Programa simples que aceita argumentos de linha de comando. Ele itera através de todos os caracteres possíveis em cada linha de um retângulo definido pela dimensão máxima do hexágono e o anexa à linha atual, antes de aparar as linhas e imprimi-las sucessivamente (produz a nova linha à direita opcional).
Código de golfe:
Código não destruído:
fonte
APL (Dyalog Classic) , 151 bytes (93 com a codificação APL clássica)
Experimente online!
fonte