Disegna un cuboide ASCII


14

Dati tre numeri interi> = 2, creare un cubo ASCII in una proiezione ortogonale (cabinet). I tre numeri interi rappresentano altezza, larghezza e profondità (misurati in caratteri visibili) compresi gli angoli. Gli angoli dovrebbero essere 'o' o '+', libera scelta.

w: 10, h: 5, d: 4 Quindi dà:

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

Ora, per renderlo leggermente più difficile, tutte le facce possono essere solide, trasparenti o mancanti. Ordiniamo i volti in questo modo:

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

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

E fornire un elenco di token, S, T o M. L'esempio originale è quindi:

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

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

Se una faccia è trasparente, possiamo vedere tutto ciò che c'è dietro:

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

Per le coppie di facce mancanti, i bordi o gli angoli adiacenti non sono più visibili:

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, il codice più corto vince! Gli spazi finali e le nuove righe vanno bene, sei libero di scegliere il metodo di input e l'ordine di input.


5
Quanto è rigoroso il tuo formato di input? posso fare una funzione con 9 parametri?
LiefdeWen

1
@LiefdeWen you're free to choose input method and input order. E poiché nulla dice diversamente, è possibile utilizzare uno qualsiasi dei metodi di input / output predefiniti .
dzaima,

Posso prendere un numero intero come bitmap per i flag trasparenti / solidi?
Tito,

@Titus Bene .. va bene. Immagino sia un po 'più divertente se in realtà riesci a testare i valori da solo.
NiklasJ,

Risposte:


5

Carbone , 190 181 byte

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κ↷

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: salvato 9 byte ottimizzando le mie condizioni. Il carbone non ha elsetoken, quindi i ifcomandi hanno sempre due alternative, a meno che non siano alla fine di un blocco o programma. Per evitare ciò, uso for (<bool>)invece di ciò if (<bool>)che ha un effetto simile quando l'espressione può avere solo i valori 0 o 1 ma salva un byte. (Al fine di raggiungere questo obiettivo ho dovuto cambiare le espressioni in modo che fossero sempre vero quando il corpo aveva bisogno di essere eseguito.) Sono stato anche in grado di ottimizzare if (<bool>) for (<int>)in for (And(bool, int)).


Santo Cristo O_O. Non riuscivo nemmeno a capire come disegnare il cubo stesso usando il carbone. Puoi fare un esempio per disegnare un semplice cubo nella cartella degli esempi di github? Uno che è stato ottimizzato? Voglio confrontare la mia risposta simile a ... 50 byte a quello che avrebbe dovuto essere.
Magic Octopus Urn,

@carusocomputing Siamo spiacenti, non sono chiaro cosa intendi per "cubo semplice" e non sono un autore del carbone stesso, quindi non posso aggiungere un esempio.
Neil,

Non lo sei ?! Merda santa, chi è? Onestamente pensavo che lo fossi. Inoltre, vorrei essere un collaboratore del carbone. Potresti facilmente diventare uno su Github :). Hai talento nella lingua, ovviamente. E per "cubo semplice" intendo la prima metà della sfida, realizzando solo un X * Y * Z cubo ASCII.
Magic Octopus Urn,

@carusocomputing Solo ASCII è il principale contributore, per quanto ne so, sebbene il wiki di esolang attribuisca un secondo contributo.
Neil,

per lo meno li contatterei con alcuni dei tuoi esempi, l'hai portato oltre rispetto a chiunque altro abbia visto. Mi piacerebbe avere maggiori spiegazioni sul tuo codice, ho seguito le tue risposte sul carbone per un po 'ora perché la lingua è interessante per me.
Magic Octopus Urn,

2

JavaScript (ES6), 318 314 308 byte

Accetta larghezza, altezza e profondità come numeri interi e le facce come una matrice di caratteri.

(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``

Come?

La funzione M () elabora un determinato callback F su un determinato intervallo [0 ... n] .

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

La variabile a contiene un array piatto che rappresenta una griglia di dimensioni (w + d) x (h + d-1) . Inizialmente è riempito con file di spazi terminati con newline.

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

La funzione D () viene utilizzata per 'disegnare' una faccia del cuboide.

I due bit meno significativi del parametro t mantengono il tipo di faccia:

  • 0 = posteriore / anteriore
  • 1 = sinistra / destra
  • 2 = inferiore / superiore

I bit da # 2 a # 4 contengono l'indice facciale basato su 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

I volti vengono disegnati nel seguente ordine:

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)

dimostrazione


1

SOGL V0.11 , 200 194 193 192 190 byte

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+⁴⁶⁵

Accetta input nell'ordine

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

Legato!
Provalo qui! (il valore compresso è cambiato per essere compatibile con V0.12)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.