Défi
Ecrivez un programme qui prend un tableau d'entiers 11x11 et construit un bloc de construction 3D ASCII, où chaque valeur du tableau représente la hauteur d'une colonne de blocs aux coordonnées correspondant à la position du tableau. Une hauteur négative est une colonne "flottante" - seul le bloc supérieur est visible.
Exemple
__________________
___ /\__\__\__\__\__\__\
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, \/\__\ \/__/__/__/__/ \/\__\
\/\__\_________ ______\/\__\
\/\__\__\__\__\ /\__\__\__\__\
\/__/__/__/__/ \/__/__/__/__/
Contribution
L'entrée sera une liste de 121 nombres entiers, soit lus à partir de stdin (le choix du séparateur dépend de vous), soit transmis sous forme de tableau (peut être 1D ou 2D).
Les hauteurs seront comprises entre -11 et 11.
Sortie
Le bâtiment généré peut être écrit sur stdout, affiché directement à l'écran ou renvoyé sous forme de chaîne séparée par une nouvelle ligne.
Les espaces de début et de fin sont autorisés.
Règles de construction
La forme d'un bloc 3D individuel ressemble à ceci:
___
/\__\
\/__/
Et un cube de blocs 2x2x2 ressemble à ceci:
______
/\__\__\
/\/\__\__\
\/\/__/__/
\/__/__/
Lorsque des blocs se chevauchent, un bloc supérieur a priorité sur un bloc inférieur, les blocs situés en avant ont priorité sur ceux situés plus en arrière et les blocs situés à gauche ont priorité sur ceux situés à droite. Le seul cas particulier est que la ligne supérieure d'un bloc ne doit jamais écraser un caractère autre qu'un espace derrière ce dernier.
L’interprétation des hauteurs de colonne s’explique le mieux en regardant une représentation 2D du côté.
HEIGHT: 1 2 3 -3 -2 -1
__ __
__ |__| |__| __
__ |__| |__| |__| __
|__| |__| |__| |__|
Cas de test
Si vous souhaitez essayer votre solution sur quelques entrées supplémentaires, j'ai mis en place quelques cas de test ici .
Gagnant
C'est du code-golf , donc la soumission la plus courte (en octets) gagne.
Réponses:
Charbon de bois ,
706968 octetsEssayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Lisez le tableau, divisez chaque ligne en virgules et transformez-le en entier, mais inversez également chaque ligne, car nous souhaitons dessiner de droite à gauche afin que les colonnes de gauche remplacent les colonnes de droite. (Les autres dimensions ont déjà le comportement de réécriture souhaité.)
Boucle entre i) les lignes du haut et les corps k) hauteur l) rangées m) colonnes. (La boucle entre les premières lignes du haut, puis les corps évite d’écraser les corps avec les lignes du haut.)
Aller à la position du cube.
Récupère la hauteur à la ligne et à la colonne en cours.
Testez si un cube doit être dessiné à cette hauteur pour cette ligne et cette colonne.
Dessine le corps ou le haut du cube.
la source
3
en a33
, je n'ai que 11 blocs dans la tour. En général, les tours semblent être plafonnées à 11. Comment cela se produit-il?F¹¹F¹¹F¹¹
n'était pas un indice ...C,
376350313309285 octetsMerci à Jonathan Jonathan Frech d'avoir économisé quatre octets!
Essayez-le en ligne!
Déroulé:
la source
26*66
pas être1716
?*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(...)
(en supposant queb
cela ne dépende pas dee
ce que je pense, non).JavaScript (ES6),
277251 octetsAfficher l'extrait de code
Sauvegardé 26 octets de la suggestion de @ Neil .
Ungolfed
la source
,$(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,...'___'))))),
semble économiser 26 octets.Python 2 , 243 octets
Essayez-le en ligne!
Une traduction en Python de l'approche charbon de Neil.
la source
+1+k
->-~k
.APL (Dyalog Unicode) ,
117116112 octets SBCSEssayez-le en ligne!
la source
Tcl, 380
409octetsL'utilisateur sergiol a été très occupé à résoudre ce problème :
Essayez-le en ligne!
Contenu original
Essayez-le en ligne!
Hélas, c'est ce que c'est. Ce n'est qu'un peu plus facile pour les yeux quand il est «non-golfé»
Construit une chaîne, selon les exigences. Prend le tableau de stdin. Va de bas en haut, d'avant en arrière, de droite à gauche sur les données de la chaîne. Le fait en deux passes, une pour le bord supérieur et une autre pour le reste du corps de chaque cube.
J'ai essayé de le rendre plus petit en utilisant du lambda mojo doux et fonctionnel, mais hélas, cela l'a rendu plus grand.
la source