Dessiner un cuboïde ASCII

14

Étant donné trois entiers> = 2, créez un cube ASCII dans une projection orthogonale (armoire). Les trois entiers représentent la hauteur, la largeur et la profondeur (mesurées en caractères visibles), y compris les coins. Les coins doivent être «o» ou «+», libre choix.

w: 10, h: 5, d: 4 Donne ainsi:

   o--------o
  /        /|
 /        / |
o--------o  |
|        |  o
|        | /
|        |/
o--------o

Maintenant, pour rendre cela un peu plus difficile, toutes les faces peuvent être solides, transparentes ou manquantes. Nous commandons les visages comme ceci:

   o--------o
  /        /|
 /    2   / |
o--------o 3|
|        |  o
|   1    | /
|        |/
o--------o

  ---
  |2|
-------
|5|1|3|
-------
  |4|
  ---
  |6|
  ---

Et fournissez une liste de jetons, S, T ou M. L'exemple original est donc:

w 10
h 5
d 4
S S S S S S

   o--------o
  /        /|
 /        / |
o--------o  |
|        |  o
|        | /
|        |/ 
o--------o

Si une face est transparente, nous pouvons voir tout ce qui se trouve derrière:

T S S S S S

   o--------o
  /        /|
 /        / |
o--------o  |
|  o-----|  o
| /      | /
|/       |/
o--------o


T T T T T T

   o--------o
  /|       /|
 / |      / |
o--------o  |
|  o-----|--o
| /      | /
|/       |/
o--------o

Pour les paires de faces manquantes, les arêtes ou coins adjacents ne sont plus visibles:

M M S S S S

   o--------o
  /|       /|
 / |      / |
o  |     o  |
|  o-----|  o
| /      | /
|/       |/
o--------o

M M S S M S

   o--------o
   |       /|
   |      / |
   |     o  |
   o-----|  o
  /      | /
 /       |/
o--------o

Code golf, le code le plus court gagne! Les espaces de fin et les retours à la ligne conviennent, vous êtes libre de choisir la méthode de saisie et l'ordre de saisie.

NiklasJ
la source
5
Quelle est la rigueur de votre format d'entrée? puis-je faire une fonction avec 9 paramètres?
LiefdeWen
1
@LiefdeWen you're free to choose input method and input order. Et comme rien ne dit le contraire, n'importe laquelle des méthodes d'entrée / sortie par défaut peut être utilisée.
dzaima
Puis-je prendre un entier comme bitmap pour les drapeaux transparents / solides?
Titus
@Titus Eh bien .. d'accord. Je suppose que c'est un peu plus amusant si vous pouvez réellement tester les valeurs par vous-même.
NiklasJ

Réponses:

5

Charbon de bois , 190 181 octets

NωA⁻ω²ςNηA⁻η²γNδA⁻δ²χA⪪S αF›⊟αMF⟦ςγςγ⟧«oκ↶»F∧›⊟αM²«oς↷³oχ↷¹»F∧›⊟αM²«↷³oχ↷³oγ↶»M⁻ωδ⁻δηF⁼§α²SG↗δ↓η↙δ↑η F∧›⊟αM²«↶¹oχ↷³oγ↷»F⁼§α¹SG↗δ←ω↙δ→ω F∧›⊟αM²«↶¹oχ↶³oς»F⁼§α⁰SUO±ωη ↷F›⊟αMF⟦γςγς⟧«oκ↷

Essayez-le en ligne! Le lien est vers la version détaillée du code. Edit: économisé 9 octets en optimisant mes conditions. Le charbon de bois n'a pas de elsejeton, donc les ifcommandes ont toujours deux alternatives, à moins qu'elles ne soient à la fin d'un bloc ou d'un programme. Pour éviter cela, j'utilise à la for (<bool>)place de if (<bool>)qui a un effet similaire lorsque l'expression ne peut avoir que les valeurs 0 ou 1 mais enregistre un octet. (Pour y parvenir je devais changer les expressions afin qu'ils étaient toujours vrai quand le corps devait être exécuté.) J'ai pu optimiser if (<bool>) for (<int>)enfor (And(bool, int)) .

Neil
la source
Saint Christ O_O. Je ne pouvais même pas comprendre comment dessiner le cube lui-même en utilisant du charbon de bois. Pouvez-vous mettre un exemple pour dessiner un simple cube sur le dossier d'exemples github? Celui qui a été optimisé? Je veux comparer ma réponse ... 50 octets à ce qu'elle aurait dû être.
Magic Octopus Urn
@carusocomputing Désolé, je ne sais pas ce que vous entendez par "simple cube", et je ne suis pas l'auteur de Charcoal lui-même, donc je ne peux pas ajouter d'exemple.
Neil
Vous n'êtes pas?! Putain de merde, qui est-ce? Honnêtement, je pensais que tu l'étais. Aussi, je demanderais à être un contributeur au charbon de bois. Vous pouvez facilement en devenir un sur github :). Vous avez du talent dans la langue, évidemment. Et par "cube simple", je veux dire la première moitié du défi, juste faire un X * Y * Z cube ASCII.
Magic Octopus Urn
@carusocomputing ASCII-only est le principal contributeur pour autant que je sache, bien que le wiki esolang crédite un deuxième contributeur.
Neil
à tout le moins, je les contacterais avec quelques-uns de vos exemples, vous les avez poussés plus loin que quiconque que j'ai vu. J'adorerais avoir plus d'explications sur votre code, j'ai suivi vos réponses au fusain un peu maintenant car la langue m'intéresse.
Magic Octopus Urn
2

JavaScript (ES6), 318 314 308 octets

Prend la largeur, la hauteur et la profondeur sous forme d'entiers et les faces sous forme de tableau de caractères.

(w,h,d,l,M=(n,F)=>[...Array(n+1).keys()].map(F),a=M((L=w--+d)*(h--+--d),i=>++i%L?' ':`
`),D=(t,Y=0,X=d,W=t&1?d:w,H=t&2?d:h,F=l[t>>2])=>F>'R'&&M(W,i=>M(H,j=>a[p=L*(Y+j-i*(t&1))+X+i-(t&2?j:0)]=(x=!(i&&i-W)|2*!(j&&j-H))?' |-o|/o/-o'[t%4*3+x]:a[F>'S'?p:0])))=>D(20)&D(D(14,h)&D(17,d,0),d,D(9,d,w)&D(6))||a.join``

Comment?

La fonction M () traite un rappel F donné sur une plage donnée [0 ... n] .

M = (n, F) => [...Array(n + 1).keys()].map(F)

La variable a contient un tableau plat représentant une grille de taille (w + d) x (h + d-1) . Il est initialement rempli de rangées d'espaces terminées par des retours à la ligne.

a = M((L = w-- + d) * (h-- + --d), i => ++i % L ? ' ' : '\n')

La fonction D () est utilisée pour «dessiner» une face du cuboïde.

Les deux bits les moins significatifs du paramètre t contiennent le type de face:

  • 0 = arrière / avant
  • 1 = gauche / droite
  • 2 = bas / haut

Les bits # 2 à # 4 contiennent l'index de visage basé sur 0.

D = (                                           // given:
  t, Y = 0, X = d,                              // - the type and the initial coordinates
  W = t & 1 ? d : w,                            // - the drawing width
  H = t & 2 ? d : h,                            // - the drawing height
  F = l[t >> 2]                                 // - the character representing the status
) =>                                            //
  F > 'R' &&                                    // provided that the face is not missing:
  M(W, i =>                                     // for each i in [0...W]:
    M(H, j =>                                   //  for each j in [0...H]:
      a[                                        //    update the output
        p = L * (Y + j - i * (t & 1)) +         //    at position p
            X + i - (t & 2 ? j : 0)             //
      ] =                                       //    with either:
      (x = !(i && i - W) | 2 * !(j && j - H)) ? //    - '|', '-' or '/' on edges
        ' |-o|/o/-o'[t % 4 * 3 + x]             //    - or 'o' on vertices
      :                                         //
        a[F > 'S' ? p : 0]                      //    - or a space on solid faces
    )                                           //    - or the current character on
  )                                             //      transparent faces

Les visages sont dessinés dans l'ordre suivant:

D(5 * 4 + 0, 0, d)  // face #5 (rear)
D(3 * 4 + 2, h, d)  // face #3 (bottom)
D(4 * 4 + 1, d, 0)  // face #4 (left)
D(2 * 4 + 1, d, w)  // face #2 (right)
D(1 * 4 + 2, 0, d)  // face #1 (top)
D(0 * 4 + 0, d, 0)  // face #0 (front)

Démo

Arnauld
la source
1

SOGL V0.11 , 200 194 193 193 192 190 octets

b³@*⁶
ž}1}X⁵
;aκ⁴
2-³
* o1Ο²
d=?a³:?∫:¹
be.Aā6∫D,ζLI%:C?abe"DCa∫:c+H⁴d+ /ž}{"a+Hy"e³┐²čž|"b³┌²žz"EBAøp”,ōkB°s9θW=*↑(⅜⅞~υ=\⁰ōwūΧ►ΣΤP░¶Ο⁽◄Φ7⅟▲s#‘┌Θdwι+#¶ŗ!!6c=?6d=?2aI⁶e³∙ž}5¹b+⁴Ie³@∙⁵}4¹2+⁴⁶⁵

Prend la saisie dans l'ordre

width
height
depth
down-face
left-face
back-face
top-face
right-face
front-face

Lié!
Essayez-le ici! (la valeur compressée a été modifiée pour être compatible V0.12)

dzaima
la source