bac à sable
Pour les besoins de la tâche en cours, un cube de longueur unitaire est rendu en projection oblique avec des symboles ASCII comme suit:
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
+
pour les sommets.-
pour les X bords. L'unité de longueur le long de X est représentée par cinq-
entre deux sommets.|
pour les bords en Y. L'unité de longueur le long de Y est représentée par deux|
entre deux sommets./
pour les bords Z. L'unité de longueur le long de Z est représentée par une/
entre deux sommets.- Les sommets ne sont tracés que là où les trois plans se coupent.
- Les bords ne sont dessinés que là où exactement deux plans se croisent.
Lorsqu'une face d'unité est extrudée, elle est décalée d'une longueur d'unité par rapport à sa position d'origine et quatre nouvelles arêtes sont créées pour chaque direction (positive et négative).
Vous pouvez imaginer que l'extrusion consiste à dessiner les axes d'un système de coordonnées cartésien 3D, chaque axe étant représenté par un cuboïde avec une section transversale de 1x1 et une n
distance de (0,0,0).
Extrudé par 1 le long de X:
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
Tâche
A partir de trois nombres pour les axes XYZ, extrudez les faces d'un cube unité de manière symétrique par les quantités indiquées et restituez le résultat avec les symboles ASCII comme spécifié ci-dessus.
Contribution
x, y, z - nombres non négatifs - longueurs d'extrusion pour les axes respectifs. 0 signifie pas d'extrusion. L'entrée peut être trois chiffres, une liste de trois chiffres, un triple, une chaîne ou tout ce qui vous convient.
Sortie
Le dessin ASCII du cube après extrusion. Les espaces libres de début et de fin sont autorisés.
Cas de test
X Y Z
0 0 0
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
1 0 0
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
0 0 1
+-----+
/ /|
/ / |
/ / +
/ / /
/ / /
+-----+ /
| | /
| |/
+-----+
1 1 0
+-----+
/ /|
+-----+ |
+---| | +-----+
/ | |/ /|
+-----+ +-----+ |
| | +
| |/
+-----+ +-----+
| | +
| |/
+-----+
2 0 1
+-----+
/ /|
+-----------+ +-----------+
/ /|
+-----------+ +-----------+ |
| / /| | +
| +-----+ | |/
+---------| | +-----------+
| |/
+-----+
1 1 1
+-----+
/ /|-+
+-----+ |/|
+---| | +-----+
/ | |/ /|
+-----+-----+-----+ |
| / /| | +
| +-----+ | |/
+---| | +-----+
| |/| +
+-----+ |/
+-----+
Critères gagnants
La solution la plus courte en octets dans toutes les langues gagne. Veuillez ajouter une brève description de la méthode utilisée et votre code.
Réponses:
JavaScript (ES6),
525 ... 475 471459 octets13 octets sauvés grâce à @Neil
Prend les entrées sous forme de tableau
[X,Y,Z]
. Retourne une matrice de caractères.Essayez-le en ligne!
Comment?
Étapes de dessin
La sortie comprend 15 côtés, dessinés dans un ordre spécifique.
la mise en oeuvre
La fonction de dessin estg . Cela fonctionne avec les paramètres suivants:
Les sommets sont toujours dessinés. Selon la valeur d'un autre paramètrec , les arêtes sont dessinées ou effacées.
Sit=0 , la fonction dessine une face avant:
Sit=1 , il dessine un côté supérieur:
Pour résumer, un côté est complètement décrit avec:
Par conséquent, nous devons stocker les 10 paramètres suivants pour chaque côté:
Vous trouverez ci-dessous les paramètres des 15 côtés à dessiner:
Il en résulte 15 chiffres d’exactement 10 chiffres décimaux, qui sont stockés dans 15 groupes de 7 chiffres en base 36.
Par exemple, le premier côté est codé
4032070460
et stocké sous1uol9h8
.la source
Array(W*2+9).fill` `
sauve un octet.APL (Dyalog Classic) ,
162161132130 octetsEssayez-le en ligne!
(1 + 4*cx + 2*cy + cz) mod 16
oùcx
,cy
,cz
sont le nombre de même valeur « tiges » le long de l' axe x, y, z, à savoir des vecteurs le long de cet axe qui se composent de la même valeur: 0 0 ou 1 1. Nous faisons une exception si le sous-tableau est tout à zéro (ou tout à un - ceux qui comptent n'a pas d'importance) et nous considérons son nombre 0 au lieu de 28-|/+
Merci Scott Milner pour repérer que certains
+
s rendus comme?
sla source
Charbon de bois , 325 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Entrez les extrusions, mais prémultipliez-les pour économiser des octets.
Si au moins deux des extrusions sont nulles, tracez simplement un cuboïde de dimensions (2x + 1, 2y + 1, 2z + 1). Autrement:
Imprimer l'extrusion de gauche, le cas échéant.
Imprimez l'extrusion vers le bas, le cas échéant.
Imprimer l'extrusion arrière, le cas échéant.
Les extrusions restantes se rencontrent toutes à ce stade (qui ne sera pas tiré avant la fin!)
Imprimez les extrusions avant, le cas échéant, en prenant soin d’effacer les parties des extrusions gauche et inférieure qui peuvent se chevaucher.
Imprimez l’extrusion, le cas échéant, en prenant soin d’effacer les parties du dos et les extrusions laissées qui peuvent se chevaucher.
Imprimez la bonne extrusion, le cas échéant, en prenant soin d’effacer les parties des extrusions vers le bas et vers le bas qui peuvent se chevaucher.
Dessinez les jointures entre ces dernières extrusions.
la source
Charbon de bois ,
195164144 octetsEssayez-le en ligne! Le lien est vers la version verbeuse du code. Je publie cette réponse séparément, car elle utilise une approche complètement différente pour dessiner l'extrusion. Explication:
Entrez les extrusions et calculez la moitié de la taille du cuboïde englobant, mais en arithmétique sur nombres entiers, car les plages de Charcoal sont toujours des entiers. L'origine de la sortie est mappée sur le centre du cube d'unité d'origine.
Boucle sur toutes les coordonnées à l'intérieur (y compris la limite) du cuboïde contenant l'extrusion.
Aller à la position de sortie correspondant à ces coordonnées.
À partir des coordonnées indiquées, examinez les huit directions en diagonale afin de déterminer si l’extrusion se chevauche dans cette direction. Les coordonnées détectées sont vérifiées dans le cuboïde, puis le nombre d'axes dans lesquels la coordonnée se trouve dans le cube d'origine doit être supérieur à 1. Notez que, comme le cube a une hauteur d'affichage impaire, les valeurs de l'axe Y qui sont regardés sont des entiers tandis que les autres axes utilisent des coordonnées fractionnaires.
Considérez le nombre de directions dans lesquelles l'extrusion se chevauche. Il y a cinq cas d’intérêt où nous voulons imprimer quelque chose, comme dans le cas de zéro, cela signifie que c’est un espace vide et que nous ne voulons rien imprimer, alors que dans le cas de huit, cela signifie que c’est à l’intérieur. l'extrusion et tout ce que nous avons imprimé seraient surimprimés par une couche plus proche du point de vue.
Si l'extrusion ne se chevauche que dans une direction, il s'agit d'un coin externe et nous devons générer un
+
.Si l'extrusion se chevauche dans deux directions, il s'agit d'un bord extérieur. Quelle sorte d'arête est déterminée à partir de la séparation entre les deux chevauchements; 6 et 7 sont des bords tournés vers l'arrière et seront écrasés, 4 est un bord diagonal, 2 est un bord vertical et 1 est un bord horizontal. (En fait, je calcule 7 moins la séparation car cela semble être plus facile à faire.)
Si l'extrusion se chevauche dans trois directions, il s'agit d'un coin interne dans le cas où l'une des extrusions est égale à zéro et que nous devons générer un
+
.Si l'extrusion se chevauche dans quatre directions, il y a deux cas: les faces (toutes directions) et les angles intérieurs dans le cas de trois extrusions positives. Dans ce dernier cas, il existe un nombre impair de chevauchements vers le spectateur.
Si l'extrusion se chevauche dans six directions, il s'agit d'un bord intérieur. Cela fonctionne comme le complément d'un bord extérieur, sauf que nous ne sommes intéressés que lorsqu'un des deux espaces vides est la direction vers le point de l'oeil (la dernière entrée du tableau).
la source
K (ngn / k) , 172 octets
Essayez-le en ligne!
réécriture k obligatoire de ma solution apl
Même algorithme, sauf que le rendu 3d-> 2D est réalisé avec (l'équivalent de k) d'affectation d'indice de dispersion au lieu de créer des matrices 2D pour chaque élément 3D et de les mélanger.
la source
ngn/apl
performance par rapport à votreDyalog APL
solution?⍤
) et le stencil (⌺
)