Zeichnen Sie einen ASCII-Quader

14

Erstellen Sie bei drei Ganzzahlen> = 2 einen ASCII-Würfel in einer orthogonalen (Kabinett-) Projektion. Die drei Ganzzahlen stehen für Höhe, Breite und Tiefe (gemessen in sichtbaren Zeichen) einschließlich der Ecken. Die Ecken sollten 'o's' oder '+' sein, freie Wahl.

w: 10, h: 5, d: 4 So ergibt sich:

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

Um dies etwas zu erschweren, können nun alle Gesichter entweder fest, transparent oder fehlend sein. Wir bestellen die Gesichter so:

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

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

Und liefern Sie eine Liste von Token, S, T oder M. Das ursprüngliche Beispiel lautet also:

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

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

Wenn ein Gesicht transparent ist, können wir alles sehen, was dahinter steckt:

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

Bei fehlenden Flächenpaaren sind benachbarte Kanten oder Ecken nicht mehr sichtbar:

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

Codegolf, der kürzeste Code gewinnt! Nachgestellte Leerzeichen und Zeilenumbrüche sind in Ordnung. Sie können die Eingabemethode und die Eingabereihenfolge frei wählen.

NiklasJ
quelle
5
Wie streng ist Ihr Eingabeformat? Kann ich eine Funktion mit 9 Parametern erstellen?
LiefdeWen
1
@LiefdeWen you're free to choose input method and input order. Und wie nichts anderes sagt, kann jede der Standard-Eingabe- / Ausgabemethoden verwendet werden.
Dzaima
Kann ich eine Ganzzahl als Bitmap für die transparenten / durchgehenden Flags verwenden?
Titus
@Titus Na gut. Ich denke, es ist ein bisschen unterhaltsamer, wenn Sie die Werte selbst testen können.
NiklasJ

Antworten:

5

Kohle , 190 181 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 9 Bytes durch Optimierung meiner Bedingungen gespeichert. Charcoal hat kein elseToken, daher haben ifBefehle immer zwei Alternativen, es sei denn, sie befinden sich am Ende eines Blocks oder Programms. Um dies zu vermeiden, verwende ich for (<bool>)stattdessen if (<bool>)einen ähnlichen Effekt, wenn der Ausdruck nur die Werte 0 oder 1 haben kann, aber ein Byte speichert. (Um dies zu erreichen , ich hatte die Ausdrücke zu ändern , so dass sie immer wahr wären , wenn der Körper benötigte ausgeführt werden.) Ich optimize auch in der Lage war if (<bool>) for (<int>)in for (And(bool, int)).

Neil
quelle
Heiliger Christus O_O. Ich konnte nicht einmal herausfinden, wie man den Würfel selbst mit Holzkohle zeichnet. Können Sie ein Beispiel erstellen, um einen einfachen Würfel im Ordner github examples zu zeichnen? Eine, die optimiert wurde? Ich möchte meine 50-Byte-Antwort mit der vergleichen, die es hätte sein sollen.
Magic Octopus Urn
@carusocomputing Entschuldigung, mir ist nicht klar, was Sie mit "einfacher Würfel" meinen, und ich bin kein Autor von Charcoal selbst, daher kann ich kein Beispiel hinzufügen.
Neil
Bist du nicht ?! Heiliger Mist, wer ist das? Ich dachte ehrlich, du wärst es. Ich würde auch darum bitten, einen Beitrag zur Kohle zu leisten. Du könntest leicht einer auf Github werden :). Sie sind offensichtlich in der Sprache talentiert. Und mit "einfacher Würfel" meine ich die erste Hälfte der Herausforderung, nur einen X * Y * Z ASCII-Würfel zu erstellen.
Magic Octopus Urn
@carusocomputing Nur ASCII ist der Hauptbeitrag, soweit ich das beurteilen kann, obwohl das esolang-Wiki einen zweiten Beitrag liefert.
Neil
Zumindest würde ich sie mit ein paar Ihrer Beispiele kontaktieren, Sie haben es weiter gebracht als jeder andere, den ich gesehen habe. Ich würde gerne mehr Erklärungen zu Ihrem Code erhalten. Ich bin Ihren Charcoal-Antworten jetzt ein bisschen gefolgt, weil die Sprache für mich interessant ist.
Magic Octopus Urn
2

JavaScript (ES6), 318 314 308 Bytes

Nimmt Breite, Höhe und Tiefe als Ganzzahlen und die Gesichter als Zeichenfolge.

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

Wie?

Die Funktion M () verarbeitet einen gegebenen Rückruf F in einem gegebenen Bereich [0 ... n] .

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

Die Variable a enthält ein flaches Array, das ein Raster der Größe (w + d) x (h + d-1) darstellt . Es ist anfangs mit Leerzeilen gefüllt, die mit Zeilenumbrüchen abgeschlossen sind.

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

Mit der Funktion D () wird eine Fläche des Quaders 'gezeichnet'.

Die zwei niedrigstwertigen Bits des Parameters t enthalten den Gesichtstyp:

  • 0 = hinten / vorne
  • 1 = links / rechts
  • 2 = unten / oben

Die Bits 2 bis 4 enthalten den 0-basierten Gesichtsindex.

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

Gesichter werden in der folgenden Reihenfolge gezeichnet:

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)

Demo

Arnauld
quelle
1

SOGL V0.11 , 200 194 193 192 190 Bytes

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

Übernimmt die Eingabe in der Reihenfolge

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

Gebunden!
Probieren Sie es hier aus! (komprimierter Wert geändert, um V0.12-kompatibel zu sein)

dzaima
quelle