Sandkasten
Für die Zwecke der aktuellen Aufgabe wird ein Würfel mit Einheitslänge in Schrägprojektion mit ASCII-Symbolen wie folgt gerendert:
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
+
für die Eckpunkte.-
für die X-Kanten. Die Einheitslänge entlang X wird durch fünf-
zwischen zwei Eckpunkten dargestellt.|
für die Y-Kanten. Die Einheitslänge entlang Y wird durch zwei|
zwischen zwei Eckpunkten dargestellt./
für die Z-Kanten. Die Einheitslänge entlang Z wird durch einen/
zwischen zwei Eckpunkten dargestellt.- Scheitelpunkte werden nur dort gezeichnet, wo sich alle drei Ebenen schneiden.
- Kanten werden nur dort gezeichnet, wo sich genau zwei Ebenen schneiden.
Wenn eine Einheitsfläche extrudiert wird, wird sie von ihrer ursprünglichen Position um eine Einheitslänge versetzt, und für jede Richtung (positiv und negativ) werden vier neue Kanten erstellt.
Bei der Extrusion werden die Achsen eines kartesischen 3D-Koordinatensystems gezeichnet, wobei jede Achse als Quader mit einem Querschnitt von 1x1 und einer Länge n
von (0,0,0) dargestellt wird.
Mit 1 entlang X extrudiert:
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
Aufgabe
Extrudieren Sie bei drei Zahlen für die XYZ-Achsen die Flächen eines Einheitswürfels symmetrisch um die angegebenen Beträge und geben Sie das Ergebnis mit den oben angegebenen ASCII-Symbolen wieder.
Eingang
x, y, z - nicht negative Zahlen - Extrusionslängen für die jeweiligen Achsen. 0 bedeutet keine Extrusion. Die Eingabe kann aus drei Zahlen, einer Liste mit drei Zahlen, einem Tripel, einer Zeichenfolge oder einem beliebigen für Sie geeigneten Wert bestehen.
Ausgabe
Die ASCII-Zeichnung des Würfels nach der Extrusion. Führende und nachfolgende Leerzeichen sind erlaubt.
Testfälle
X Y Z
0 0 0
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
1 0 0
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
0 0 1
+-----+
/ /|
/ / |
/ / +
/ / /
/ / /
+-----+ /
| | /
| |/
+-----+
1 1 0
+-----+
/ /|
+-----+ |
+---| | +-----+
/ | |/ /|
+-----+ +-----+ |
| | +
| |/
+-----+ +-----+
| | +
| |/
+-----+
2 0 1
+-----+
/ /|
+-----------+ +-----------+
/ /|
+-----------+ +-----------+ |
| / /| | +
| +-----+ | |/
+---------| | +-----------+
| |/
+-----+
1 1 1
+-----+
/ /|-+
+-----+ |/|
+---| | +-----+
/ | |/ /|
+-----+-----+-----+ |
| / /| | +
| +-----+ | |/
+---| | +-----+
| |/| +
+-----+ |/
+-----+
Gewinnkriterien
Die kürzeste Lösung in Bytes in jeder Sprache gewinnt. Bitte fügen Sie eine kurze Beschreibung der verwendeten Methode und Ihres Codes hinzu.
Antworten:
JavaScript (ES6),
525 ... 475 471459 Bytes13 Bytes dank @Neil eingespart
Übernimmt die Eingabe als Array
[X,Y,Z]
. Gibt eine Zeichenmatrix zurück.Probieren Sie es online!
Wie?
Zeichenschritte
Die Ausgabe besteht aus 15 Seiten, die in einer bestimmten Reihenfolge gezeichnet werden.
Implementierung
Zusammenfassend ist eine Seite vollständig beschrieben mit:
Daher müssen wir für jede Seite die folgenden 10 Parameter speichern:
Nachfolgend sind die Parameter der 15 Seiten aufgeführt, die gezeichnet werden müssen:
Es ergeben sich 15 Zahlen mit genau 10 Dezimalstellen, die als 15 Gruppen mit 7 Stellen in der Basis 36 gespeichert werden.
Beispielsweise wird die erste Seite als codiert
4032070460
und als gespeichert1uol9h8
.quelle
Array(W*2+9).fill` `
spart ein Byte.APL (Dyalog Classic) ,
162161132130 BytesProbieren Sie es online!
(1 + 4*cx + 2*cy + cz) mod 16
denencx
,cy
,cz
entlang der Achse x, y, z, dh Vektoren entlang dieser Achse die Anzahl von gleich Wert „rods“ sind , die besteht aus mit dem gleichen Wert: 0 0 oder 1 1. Wir machen eine Ausnahme, wenn das Subarray nur Null ist (oder nur Eins - das ist egal) und wir betrachten seine Nummer 0 anstelle von 28-|/+
Vielen Dank, Scott Milner, für das Erkennen einiger
+
s, die als?
s gerendert wurdenquelle
Holzkohle , 325 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie die Extrusionen ein, multiplizieren Sie sie jedoch vorab, um Bytes zu sparen.
Wenn mindestens zwei der Extrusionen Null sind, zeichnen Sie einfach einen Quader mit Abmessungen (2x + 1, 2y + 1, 2z + 1). Andernfalls:
Drucken Sie die linke Extrusion, falls vorhanden.
Drucken Sie die Daunenextrusion, falls vorhanden.
Drucken Sie ggf. die hintere Extrusion.
Die verbleibenden Extrusionen treffen sich alle an diesem Punkt (der erst am Ende gezeichnet wird!)
Drucken Sie die vordere Extrusion, falls vorhanden, und achten Sie darauf, Teile der linken und unteren Extrusion zu entfernen, die sich möglicherweise überlappen.
Drucken Sie die Extrusion nach oben, falls vorhanden, und achten Sie darauf, Teile der hinteren und linken Extrusion, die sich möglicherweise überlappen, zu entfernen.
Drucken Sie gegebenenfalls die richtige Extrusion aus, und achten Sie darauf, Teile der Daunen- und Rückenextrusion zu entfernen, die sich möglicherweise überlappen.
Zeichnen Sie die Verbindungen zwischen den letzteren Extrusionen.
quelle
Charcoal ,
195164144 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Ich poste dies als separate Antwort, da es einen völlig anderen Ansatz zum Zeichnen der Extrusion verwendet. Erläuterung:
Geben Sie die Extrusionen ein und berechnen Sie die Hälfte der Größe des einschließenden Quaders, jedoch in Ganzzahlarithmetik, da die Bereiche von Charcoal immer Ganzzahlen sind. Der Ursprung der Ausgabe wird auf die Mitte des ursprünglichen Einheitswürfels abgebildet.
Alle Koordinaten innerhalb (einschließlich der Begrenzung) des Quaders mit der Extrusion durchlaufen.
Springe zu der Ausgabeposition, die diesen Koordinaten entspricht.
Schauen Sie von den angegebenen Koordinaten aus in alle acht diagonalen Richtungen, um festzustellen, ob sich die Extrusion in dieser Richtung überlappt. Es wird überprüft, ob die gespähten Koordinaten noch im Quader liegen, und dann muss die Anzahl der Achsen, in denen die Koordinate im ursprünglichen Würfel liegt, größer als 1 sein Das sind ganze Zahlen, während die anderen Achsen Bruchkoordinaten verwenden.
Berücksichtigen Sie die Anzahl der Richtungen, in die sich die Extrusion überlappt. Es gibt fünf Fälle von Interesse, in denen wir etwas drucken möchten, wie im Fall von Null, was bedeutet, dass dies ein leerer Raum ist und wir nichts drucken möchten, während im Fall von Acht dies bedeutet, dass dies drinnen ist Die Extrusion und alles, was wir gedruckt haben, würde durch eine Schicht näher am Augenpunkt überdruckt.
Wenn sich die Extrusion nur in einer Richtung überlappt, ist dies eine äußere Ecke und wir müssen a ausgeben
+
.Wenn die Extrusion in zwei Richtungen überlappt, ist dies eine Außenkante. Welche Art von Kante wird aus dem Abstand zwischen den beiden Überlappungen bestimmt; 6 und 7 sind nach hinten gerichtete Kanten und werden überschrieben, 4 ist eine diagonale Kante, 2 ist eine vertikale Kante und 1 ist eine horizontale Kante. (Ich berechne eigentlich 7 minus der Trennung, da es einfacher zu sein scheint.)
Wenn sich die Extrusion in drei Richtungen überlappt, ist dies eine innere Ecke für den Fall, dass eine der Extrusionen Null ist und wir a ausgeben müssen
+
.Wenn sich die Extrusion in vier Richtungen überlappt, gibt es zwei Fälle: Flächen (jede Richtung) und innere Ecken im Fall mit drei positiven Extrusionen. Im letzteren Fall gibt es eine ungerade Anzahl von Überlappungen zum Betrachter hin.
Wenn die Extrusion in sechs Richtungen überlappt, ist dies eine Innenkante. Es funktioniert wie das Komplement einer Außenkante, außer dass es uns nur interessiert, wenn einer der beiden leeren Bereiche die Richtung zum Augenpunkt ist (der letzte Eintrag im Array).
quelle
K (ngn / k) , 172 Bytes
Probieren Sie es online!
obligatorisches umschreiben meiner apl-lösung
Der gleiche Algorithmus, außer dass das Rendern von 3d-> 2d mit (dem k-Äquivalent von) Streuindexzuweisung durchgeführt wird, anstatt 2d-Matrizen für jedes 3d-Element zu erstellen und diese zu mischen
quelle
ngn/apl
Leistung im Vergleich zu IhrerDyalog APL
Lösung entwickeln?⍤
⌺