O primeiro Ascii Cube (PAC 1) concluído com o antecessor é um cubo simples com comprimento lateral 1 e tem a seguinte aparência:
/////\
///// \
\\\\\ /
\\\\\/
O PAC 2 é uma forma geométrica tal que combiná-lo com seu antecessor (o PAC 1 ) completa um cubo de comprimento lateral 2:
front back
/////////\ /////////\
///////// \ ///////// \
/////\\\\\ \ ///////// \
///// \\\\\ \ ///////// \
\\\\\ ///// / \\\\\\\\\ /
\\\\\///// / \\\\\\\\\ /
\\\\\\\\\ / \\\\\\\\\ /
\\\\\\\\\/ \\\\\\\\\/
Como a visão traseira é meio chata, estamos interessados apenas na visão frontal .
O mesmo vale para o PAC 3 : com algumas idéias visuais, o PAC 2 pode ser girado e conectado ao PAC 3 para formar um cubo sólido de comprimento lateral 3:
/////////////\
///////////// \
/////\\\\\\\\\ \
///// \\\\\\\\\ \
///// /////\\\\\ \
///// ///// \\\\\ \
\\\\\ \\\\\ ///// /
\\\\\ \\\\\///// /
\\\\\ ///////// /
\\\\\///////// /
\\\\\\\\\\\\\ /
\\\\\\\\\\\\\/
E assim por diante com o PAC 4 :
/////////////////\
///////////////// \
/////\\\\\\\\\\\\\ \
///// \\\\\\\\\\\\\ \
///// /////////\\\\\ \
///// ///////// \\\\\ \
///// /////\\\\\ \\\\\ \
///// ///// \\\\\ \\\\\ \
\\\\\ \\\\\ ///// ///// /
\\\\\ \\\\\///// ///// /
\\\\\ \\\\\\\\\ ///// /
\\\\\ \\\\\\\\\///// /
\\\\\ ///////////// /
\\\\\///////////// /
\\\\\\\\\\\\\\\\\ /
\\\\\\\\\\\\\\\\\/
Tarefa:
Escreva um programa ou função completa que use um número inteiro positivo n como entrada e retorne ou imprima a vista frontal correspondente do PAC n exatamente como mostrado acima. Espaço em branco à direita adicional é aceitável.
Isso é código-golfe , então tente usar o mínimo de bytes possível no idioma de sua escolha.
Respostas:
JavaScript (ES6), 229 bytes
fonte
Lote,
559432400 bytesExplicação: A metade inferior do cubo é desenhada refletindo a metade superior. As metades são ainda divididas em
seteseistrês partes detiras, conforme este diagrama que mostra a metade superior:Editar: economizou mais de 20%, melhorando o código que refletia a parte superior para a metade inferior. Economizou quase 10% mesclando as duas faixas da esquerda e as três do meio.
fonte
Tela , 36 bytes
Experimente aqui!
fonte
SOGL V0.12 , 32 bytes
Experimente aqui!
Explicação simples:
1. itere para cada um de 1..x
2. faça uma
⌐
forma com a largurai*4+1
e a altura =(0-indexed)i // 2
3. preencha-a para que pareça
⦧
4. acrescente uma forma "\" horizontalmente
5. insira a etapa anterior dentro que inverteu 6. depois de tudo, espelho na vertical
programa completo:
fonte
Haskell ,
232227224187183180175 bytesA função anônima na última linha usa um argumento inteiro e produz as linhas a serem impressas para um cubo desse tamanho.
A idéia é usar a recursão para desenhar cubos maiores dos menores. Vamos olhar para a metade superior de um cubo de tamanho 1. Em seguida, obtemos a metade superior de um cubo de tamanho 2 espelhando a metade anterior e adicionamos um padrão fixo de barras e espaços ao seu redor:
Portanto, o algoritmo para desenhar um cubo de tamanho n é
/
s e\
s), e uma almofada////
e\
volta.////
n mais/\
e/ \
.fonte
g=
.(\l->r l++k(k m)l)
é o mesmo queliftM2 (++) r (k(k m))
, que novamente pode ser reduzido para(++).r<*>k(k m)
. Experimente online!Ruby ,
174 167 169167 bytesExperimente online!
cria uma matriz de
n*4
cadeias preenchidas com espaços e a substitui por cubos sucessivamente menores.Código comentado
fonte
Python 2 ,
254234226203201199 bytesFinalmente sub 200!
Truques:
Esta função é utilizada para swap all
\
com/
e vice-versaum pouco longo em python2 - funciona apenas com unicode
Confira este para como ele funciona
Gera novas duas linhas principais para cada iteração
Por enquanto, não consigo encontrar uma maneira compacta de receber essas linhas da iteração anterior
Inverter todas as linhas da iteração anterior e trocar barras
Copie a metade superior, invertida por linhas, troque barras
Método elegante para cordas de preenchimento central
Experimente online!
fonte
Stax , 36 bytes
Execute e depure
Essa abordagem cria a metade superior da saída de forma iterativa. Ele executa o bloco principal o número especificado de vezes. Nesse bloco, cada linha é espelhada e possui um prefixo e sufixo adicionados. As duas novas linhas principais são adicionadas separadamente. Quando todas as linhas são construídas, elas são centralizadas e a parte inferior é espelhada verticalmente.
Aqui está o programa descompactado, não destruído e comentado.
Execute este
fonte
Haskell, 193 bytes
Mais tempo que o vencedor, mas a abordagem pode ser interessante - usa par
cos
epi
:)Código:
Execute-o assim:
Este programa basicamente 'desenha' muitos diamantes como este:
A função
i s e f
'desenha' um diamante de tamanhos
, ondee, f
estão(abs$z-y)(abs$z+y-1)
.Função
w
move os diamantes desenhados pori
para corrigir locais.head
usado em sua definição é responsável por examinar apenas a camada superior.Experimente aqui
fonte
Carvão , 42 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Desenhe os cubos do menor para o maior. (Desenhar do maior para o menor significava que eu acabei com uma imagem espelhada para números ímpares que custam muitos bytes para corrigir.)
Imprima uma linha de
/
s. (Isso se tornará o\
s à direita, mas o desenho é espelhado porque é mais espelhado no final do loop.)Imprima as duas primeiras linhas de
\
s. (Desenhar todos os\
s em um polígono significava que o cursor terminava em uma posição incômoda, que custava muitos bytes para corrigir.)Imprima as quatro linhas esquerdas de
\
s. (A quinta linha vem do cubo anterior.)Vá para o início do próximo cubo.
Reflita horizontalmente pronto para o próximo cubo.
Espelhe tudo verticalmente para concluir o cubo.
fonte