Sua tarefa: faça um triângulo hexagonal com comprimento lateral n
, onde n
é um número inteiro positivo ou 0.
Primeiro, deixe-me definir um hexágono:
/ \
| |
\ /
(Incrível arte ASCII, certo?)
Os hexágonos podem ser interligados compartilhando lados:
/ \ / \
| | |
\ / \ /
/ \
| |
/ \ /
| |
\ /
Um triângulo hexagonal é o seguinte:
/ \
| |
/ \ / \
| | |
\ / \ /
Esse triângulo hexagonal tem um comprimento lateral de 2 a 2 hexágonos para formar um lado. Um triângulo hexagonal com comprimento lateral 1 é apenas um único hexágono e um hexágono com comprimento lateral 0 está vazio.
Mais formalmente, um triângulo hexagonal é um triângulo feito de hexágonos ligados pelos lados. O hexágono superior é vinculado aos dois abaixo nos dois lados inferiores. O triângulo no canto inferior esquerdo está vinculado ao que está à direita e no canto superior direito, e o triângulo no canto inferior direito está vinculado aos que estão à esquerda e no canto superior esquerdo. Existem hexágonos entre os de canto, conectados pelos lados opostos, e seu número é n-2
. Os triângulos não são preenchidos.
Mais exemplos:
Side length 3:
/ \
| |
/ \ / \
| | |
/ \ / \ / \
| | | |
\ / \ / \ /
Side length 4:
/ \
| |
/ \ / \
| | |
/ \ / \ / \
| | | |
/ \ / \ / \ / \
| | | | |
\ / \ / \ / \ /
(This triangle isn't really filled, the borders make it look like there is a hexagon in the middle, but there is not.)
Side length 5:
/ \
| |
/ \ / \
| | |
/ \ / \ / \
| | | |
/ \ / \ / \
| | | |
/ \ / \ / \ / \ / \
| | | | | |
\ / \ / \ / \ / \ /
Side length 6:
/ \
| |
/ \ / \
| | |
/ \ / \ / \
| | | |
/ \ / \ / \
| | | |
/ \ / \ / \
| | | |
/ \ / \ / \ / \ / \ / \
| | | | | | |
\ / \ / \ / \ / \ / \ /
fonte
Respostas:
Carvão ,
624339 bytesExperimente online! Edit: Salvei alguns bytes graças a @ ASCII-only (não sei exatamente quantos também salvei outros
610 bytes, mas depois precisei gastar 4 bytes em uma correção de bug). Agora, usando loops aninhados, o que deveria ter sido o tempo todo.fonte
A / \¶| |¶ \ /αNβFβ«α←←»Fβ«α↖↖M⁶←»Fβ«αM⁴↑←←
(btw carvão preenche automaticamente todos os necessários»
no final)Assign(hexagon_with_space_to_left, a);InputNumber(b);for(b){Print(a);Move(:Left);Move(:Left);}for(b){Print(a);Move(:UpLeft);Move(:UpLeft);Move(6, :Left);}for(b){Print(a);Move(4, :Up);Move(:Left);Move(:Left);}
, cada loop for desenha um ladoPython 2,
184177174164 bytesExperimente Online!
-7 bytes graças a Ørjan Johansen
fonte
|
s mais à direita nos três primeiros e na linha inferior do hexágono.p[:4]*(i+2)
em vez dep[:4]*(i+1)
parece corrigi-lo.b
um local, então, combinando isso com o seu~
truque,w=' '*2*~(i-n)
é 7 bytes mais curto.JavaScript (ES6), 243 bytes
fonte
JavaScript (ES6),
133129128126 bytesCria o caractere de saída por caractere com dois para loops.
Como funciona
No loop externo, y itera de n * 2-1 a -1 . No loop interno, x itera de n * 4-1 a -1 . Definimos k = (x + y) & 3 , que é o padrão subjacente usado para gerar os hexágonos.
Abaixo está a grade resultante para n = 4 :
Em linhas pares, uma célula é preenchida com um caractere de barra quando k = 3 e um espaço caso contrário. O pipe é o quinto caractere em nossa string de referência
" \ /|"
; portanto, o índice correto é dado por (k + 1) e 4 .Em linhas ímpares, cada célula é preenchida diretamente com o caractere correspondente na cadeia de referência:
Abaixo está o nosso exemplo atualizado (espaços substituídos por pontos):
Nas fórmulas a seguir, definimos N = n * 4 para facilitar a leitura (embora a mesma variável seja usada no código).
A forma do triângulo é obtida testando:
E a parte interna é removida testando:
Demo
Mostrar snippet de código
fonte
[x>y-2&x<n-y&(x>n-y-6|x<y+4|y<2)&&y&1?x+y&3:x-~y&4]
?(x+y+1)&4
não é o mesmo que(((x+y)&3)+1)&4
.Geléia ,
6261 bytesAtualmente contendo seis seis.
Experimente online!
Quão?
fonte
>
na explicação (<space
)ẋ
espaço abaixo da explicação está desalinhado", avise-me.Pitão , 82 bytes
Experimente online!
fonte
Mathematica, 155 bytes
com
\n
substituído por uma nova linha.Mais legível:
Cria uma matriz de caracteres, indexados por i de 1 a 4 n + 1 na horizontal ej de 1 a 2 n + 1 na vertical. Primeiro,
Switch[Mod[i+d+{j,-j},4],{1,3},"/",{3,1},"\\",{1,1},"|",_," "]
preenche uma grade hexagonal:então
If[i+j<d||i-j>d+1||i+j>d+5&&i-j<d-3&&j<d-1," ",...]
substitui isso por" "
fora do triângulo não preenchido.fonte