Sua tarefa: dado um número inteiro n
, gere um padrão hexagonal incorporado seguindo as regras abaixo, até a enésima profundidade.
Um hexágono incorporado possui a forma básica disso: ( n=0
)
__
/ \
\__/
Hexágonos incorporados n=1
e n=2
:
____
/ \ \
/\__/ \
\ /
\____/
________
/ \ \ \
/\__/ \ \
/\ / \
/ \____/ \
\ /
\ /
\ /
\________/
O comprimento de cada lado é 2 vezes o comprimento do mesmo lado na profundidade anterior duas vezes. Os lados superior e inferior têm 2 caracteres quando n=0
e o restante começa com 1 caractere. Os comprimentos dos lados não superior e inferior devem ser 2^n
longos ( OEIS: A000079 ) e os lados superior e inferior devem seguir a regra 2^(n+1)
(o mesmo OEIS).
Os hexágonos atuais são indexados em 0; você pode optar por usar o indexado em 1, se desejar.
Isso é código-golfe , então a resposta mais curta vence!
code-golf
ascii-art
hexagonal-grid
Camarada SparklePony
fonte
fonte
n
?Respostas:
Carvão ,
4029 bytes11 bytes salvos graças ao @Neil, alterando o loop while para um loop for, entre outros truques
Experimente online!
Explicação (desatualizada)
Este programa começa com a geração do maior hexágono e, em seguida, executa os menores um a um em um loop while (indexado a 1). Para referência,
α
é o número de entrada,β
é a variável que contém2^(α-1)
eι
é a variável de iteração no loop.fonte
×_X²ι
é o mesmo que×__β
, e mais alguns bytes convertendo seuW
em umF
, o que também evita a necessidade de armazenar o número de entrada. Experimente online! .Haskell ,
230217207 bytesEDITAR:
#
poderia ser justomax
.zipWith
ep
poderia ser mesclado em um?
operador e que eu (de alguma forma!) Reimplementadoreplicate
.m
pega umInteger
e retorna umString
.Experimente online!
Como funciona
m
é a função principal. Ele usa&
para gerar os hexágonos com preenchimento adequado e depois os dobrao
.l&t
gera um pequeno hexágono de comprimento lateralt
, acolchoado dentro de um grande de comprimento laterall
, como uma lista deString
linhas.a
é a linha superior do hexágono, com sublinhados.b
é uma lista das outras linhas na metade superior do hexágono. As linhas deb
são centralizadas no preenchimento, que é retangular; isso permite que o próximo passo funcione.a
sobreposto no topo dosb
como
, em seguida, invertida (tanto a ordem das linhas e, dentro de cada linha).c
recebe dois argumentos, uma lista de comprimentos e uma sequência, e gera uma sequência que possui tantas cópias de cada caractere no original quanto o comprimento correspondente, por exemploc[1,3,2]"abc" == "abbbcc"
. É usado&
para gerar as linhas.o
pega dois argumentos representando imagens como listas de linhas e sobrepõe o primeiro, menor, em cima do segundo.?
duas vezes para preencher a primeira imagem com infinitos espaços, tanto para baixo quanto para a direita, e depois agrupando os caracteres correspondentes commax
, que seleciona o caractere não espacial, se houver um.(f?e)l m
preenche uma listal
anexando infinitamente muitos elementos 'e' e fecha a lista resultante e a listam
com af
funçãofonte
(#)
pode sermax
.p
a salvar bytes:o=max?' '?"";f?e=z f.(++repeat e)
. Pode ser mais curto sem ponto.(\n->(<$[1..n]))
éreplicate
.replicate
? Agora isso é apenas embaraçoso. Estou acostumado demais<$[1..n]
ou[1..n]>>
quase sempre ganhando. No entanto, não vejo como diminuir?
ainda mais. Eu já tentei fazer op
pointfree e ele++
está no lugar errado, explodindo as coisasflip
.JavaScript (ES6), 258 bytes
Explicação: Para hexágonos após o primeiro, o hexágono anterior é primeiro gerado e preenchido em cada lado (isso depende da saída ser um retângulo). (Para o primeiro cabeçalho, é criado algum preenchimento fictício.) Os lados superior e superior do hexágono são gerados e todos os espaços são mesclados com o hexágono anterior. (Existem alguns truques para alinhar os hexágonos; isso seria mais fácil se margens extras fossem permitidas.) Os lados inferiores do hexágono são gerados analogamente aos lados superiores, e a parte inferior do hexágono é preenchida. É necessário tomar cuidado para retornar a saída retangular, incluindo uma nova linha à direita, para que a recursão funcione.
fonte
/
são populares na arte ASCII e oreplace
método é uma maneira relativamente barata de gerá-las em JavaScript.1<<n>>1
: Simetria agradável ;-)v
mas infelizmente1
não é simétrica em nenhuma das minhas fontes usuais.PHP, 337 bytes
0 Indexação
Experimente online!
Expandido
fonte