Desafio
Escreva um programa que utilize uma matriz 11x11 de números inteiros e construa uma construção de bloco ASCII 3D, em que cada valor na matriz represente a altura de uma coluna de blocos nas coordenadas correspondentes à posição da matriz. Uma altura negativa é uma coluna "flutuante" - apenas o bloco superior é visível.
Exemplo
__________________
___ /\__\__\__\__\__\__\
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\__\ /\/\__\__\__\__\__\__\
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\/__/ /\/\/__/__/__/__/__/__/
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\/\__\ /\/\/\__\ /\/\/__/
1, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0, \/\/\__\ /\/\/\/__/ /\/\/__/
0, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0, \/\/__/ /\/\/\/\__\ /\/\/__/
0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, \/\__\ /\/\/\/\/__/ /\/\/__/
0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, \/__/ \/\/\/\/\__\_ \/\/__/
1, 0, 0, 4, 3, 2, 1, 0, 0, 0, 1, \/\/\/\/__/_\_ \/__/
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ___ \/\/\/__/__/_\_ ___
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /\__\ \/\/__/__/__/_\ /\__\
1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \/\__\ \/__/__/__/__/ \/\__\
\/\__\_________ ______\/\__\
\/\__\__\__\__\ /\__\__\__\__\
\/__/__/__/__/ \/__/__/__/__/
Entrada
A entrada será uma lista de 121 números inteiros, lida a partir de stdin (a escolha do separador é sua) ou transmitida como uma matriz (pode ser 1D ou 2D).
As alturas estarão no intervalo de -11 a 11.
Resultado
A construção gerada pode ser gravada em stdout, exibida diretamente na tela ou retornada como uma sequência separada por nova linha.
Os espaços em branco à esquerda e à direita são permitidos.
Regras de construção
A forma de um bloco 3D individual é assim:
___
/\__\
\/__/
E um cubo 2x2x2 de blocos é assim:
______
/\__\__\
/\/\__\__\
\/\/__/__/
\/__/__/
Quando os blocos se sobrepõem, um bloco mais alto tem precedência sobre o mais baixo, os blocos da frente têm precedência sobre os que estão mais atrás, e os blocos à esquerda têm precedência sobre os da direita. O único caso especial é que a linha superior de um bloco nunca deve sobrescrever nenhum caractere não espacial por trás dele.
A interpretação das alturas das colunas pode ser melhor explicada olhando-se uma representação 2D do lado.
HEIGHT: 1 2 3 -3 -2 -1
__ __
__ |__| |__| __
__ |__| |__| |__| __
|__| |__| |__| |__|
Casos de teste
Se você quiser experimentar sua solução com mais algumas entradas, reuni alguns casos de teste aqui .
Ganhando
Isso é código-golfe , então o envio mais curto (em bytes) vence.
Respostas:
Carvão ,
706968 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Leia o array, divida cada linha em vírgulas e converta em número inteiro, mas também inverta cada linha, pois queremos desenhar da direita para a esquerda para que as colunas da esquerda substituam as da direita. (Outras dimensões já possuem o comportamento de substituição desejado.)
Loop através de i) linhas e corpos superiores k) altura l) linhas m) colunas. (Fazer um loop nas primeiras linhas principais e depois nos corpos evita a substituição de corpos pelas linhas superiores.)
Salte para a posição do cubo.
Busque a altura na linha e coluna atuais.
Teste se um cubo deve ser desenhado nessa altura para esta linha e coluna.
Desenhe o corpo ou a parte superior do cubo.
fonte
3
para a33
, recebo apenas 11 blocos na torre. Em geral, as torres parecem ter o limite de 11. Como isso acontece?F¹¹F¹¹F¹¹
não era uma pista ...C,
376350313309285 bytesAgradecemos a Jonathan Frech por salvar quatro bytes!
Experimente online!
Desenrolado:
fonte
26*66
ser1716
?*s==32
->*s<33
.for(e=k=1;e;++k)for(e=
->for(k=1;e;++k)for(e=
.#define B b(...)&++e
->#define B++e&b(...)
(assumindob
que não dependee
, o que eu acho que não).JavaScript (ES6),
277251bytesMostrar snippet de código
Salvo 26 bytes da sugestão de @ Neil .
Ungolfed
fonte
,$(w=>$(z=>$(y=>$(x=>(Z=a[y][x=10-x,X=x*3+y+z,Y=y-z+n,x])<=z&&Z+z+1?0:w?['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s)):S[Y].splice(X+1,3,...'___'))))),
parece salvar 26 bytes.Python 2 , 243 bytes
Experimente online!
Uma tradução em Python da abordagem de Neil's Charcoal.
fonte
+1+k
->-~k
.APL (Dyalog Unicode) ,
117116112 bytes SBCSExperimente online!
fonte
Tcl, 380
409bytesO usuário sergiol está ocupado analisando isso muito bem:
Experimente online!
Conteúdo original
Experimente online!
Infelizmente, é o que é. É apenas um pouco mais fácil para os olhos quando "não-destruído"
Constrói uma string, conforme os requisitos. Retorna a matriz do stdin. Vai de baixo para cima, da frente para trás, da direita para a esquerda sobre os dados da string. Faz isso em duas passagens, uma para a borda superior e outra para o resto do corpo de cada cubo.
Tentei torná-lo menor usando alguns lambda mojo funcionais, mas, infelizmente, isso o tornou maior.
fonte