Herausforderung
Schreiben Sie ein Programm, das ein 11x11-Array von Ganzzahlen verwendet und ein 3D-ASCII-Blockgebäude erstellt, wobei jeder Wert im Array die Höhe einer Blockspalte an den Koordinaten darstellt, die mit der Arrayposition übereinstimmen. Eine negative Höhe ist eine "schwebende" Spalte - nur der obere Block ist sichtbar.
Beispiel
__________________
___ /\__\__\__\__\__\__\
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\__\ /\/\__\__\__\__\__\__\
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\/__/ /\/\/__/__/__/__/__/__/
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\/\__\ /\/\/\__\ /\/\/__/
1, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0, \/\/\__\ /\/\/\/__/ /\/\/__/
0, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0, \/\/__/ /\/\/\/\__\ /\/\/__/
0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, \/\__\ /\/\/\/\/__/ /\/\/__/
0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, \/__/ \/\/\/\/\__\_ \/\/__/
1, 0, 0, 4, 3, 2, 1, 0, 0, 0, 1, \/\/\/\/__/_\_ \/__/
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ___ \/\/\/__/__/_\_ ___
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /\__\ \/\/__/__/__/_\ /\__\
1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \/\__\ \/__/__/__/__/ \/\__\
\/\__\_________ ______\/\__\
\/\__\__\__\__\ /\__\__\__\__\
\/__/__/__/__/ \/__/__/__/__/
Eingang
Die Eingabe ist eine Liste von 121 Ganzzahlen, die entweder von stdin gelesen (die Wahl des Trennzeichens liegt bei Ihnen) oder als Array übergeben werden (kann 1D oder 2D sein).
Die Höhen liegen im Bereich von -11 bis 11.
Ausgabe
Das generierte Gebäude kann in stdout geschrieben, direkt auf dem Bildschirm angezeigt oder als durch Zeilenumbrüche getrennte Zeichenfolge zurückgegeben werden.
Führende und nachfolgende Leerzeichen sind zulässig.
Gebäuderegeln
Die Form eines einzelnen 3D-Blocks sieht folgendermaßen aus:
___
/\__\
\/__/
Und ein 2x2x2-Blockwürfel sieht so aus:
______
/\__\__\
/\/\__\__\
\/\/__/__/
\/__/__/
Wenn sich Blöcke überlappen, hat ein höherer Block Vorrang vor einem niedrigeren, vorne liegende Blöcke haben Vorrang vor den weiter hinten liegenden und links liegende Blöcke haben Vorrang vor den rechts liegenden Blöcken. Der einzige Sonderfall ist, dass die oberste Zeile eines Blocks niemals ein dahinterstehendes Nicht-Leerzeichen überschreiben darf.
Die Interpretation der Spaltenhöhen lässt sich am besten anhand einer 2D-Darstellung von der Seite erklären.
HEIGHT: 1 2 3 -3 -2 -1
__ __
__ |__| |__| __
__ |__| |__| |__| __
|__| |__| |__| |__|
Testfälle
Wenn Sie Ihre Lösung an einigen weiteren Eingaben ausprobieren möchten, habe ich hier einige Testfälle zusammengestellt .
Gewinnen
Dies ist Code-Golf , also gewinnt die kürzeste Übermittlung (in Bytes).
Antworten:
Kohle ,
706968 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Lesen Sie das Array, teilen Sie jede Zeile durch Kommas auf und setzen Sie es in eine Ganzzahl um, kehren Sie aber auch jede Zeile um, da Sie von rechts nach links zeichnen möchten, sodass die linken Spalten die rechten Spalten überschreiben. (Andere Dimensionen haben bereits das gewünschte Überschreibverhalten.)
Schleife durch i) obere Zeilen und Körper k) Höhe l) Zeilen m) Spalten. (Durchlaufen Sie zuerst die oberen Zeilen und dann die Körper, um das Überschreiben von Körpern mit den oberen Zeilen zu vermeiden.)
Springe zur Position des Würfels.
Ruft die Höhe in der aktuellen Zeile und Spalte ab.
Testen Sie, ob für diese Zeile und Spalte ein Würfel in dieser Höhe gezeichnet werden soll.
Zeichne den Körper oder die Oberseite des Würfels.
quelle
3
in eine ändere33
, bekomme ich nur 11 Blöcke im Turm. Im Allgemeinen scheinen die Türme auf 11 begrenzt zu sein. Wie passiert das?F¹¹F¹¹F¹¹
war kein Hinweis ...C
376350313309285 BytesVielen Dank an Jonathan Frech für das Speichern von vier Bytes!
Probieren Sie es online!
Abgerollt:
quelle
26*66
nicht sein1716
?*s==32
->*s<33
.for(e=k=1;e;++k)for(e=
->for(k=1;e;++k)for(e=
.#define B b(...)&++e
->#define B++e&b(...)
(vorausgesetzt esb
kommt nicht darauf ane
, was ich glaube nicht).JavaScript (ES6),
277251 ByteCode-Snippet anzeigen
26 Bytes von @ Neils Vorschlag gespeichert .
Ungolfed
quelle
,$(w=>$(z=>$(y=>$(x=>(Z=a[y][x=10-x,X=x*3+y+z,Y=y-z+n,x])<=z&&Z+z+1?0:w?['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s)):S[Y].splice(X+1,3,...'___'))))),
scheint 26 Bytes zu sparen.Python 2 , 243 Bytes
Probieren Sie es online!
Eine Python-Übersetzung von Neils Charcoal-Ansatz.
quelle
+1+k
->-~k
.APL (Dyalog Unicode) ,
117116112 Byte SBCSProbieren Sie es online!
quelle
Tcl, 380 bis
409BytesUser sergiol war damit beschäftigt, das sehr gut zu machen:
Probieren Sie es online!
Ursprünglicher Inhalt
Probieren Sie es online!
Ach, es ist was es ist. Es ist nur ein bisschen leichter für die Augen, wenn "ungolfed"
Erstellt eine Zeichenfolge gemäß den Anforderungen. Nimmt das Array von stdin. Geht von unten nach oben, von vorne nach hinten, von rechts nach links über die Zeichenfolgendaten. In zwei Durchgängen, einmal für die Oberkante und noch einmal für den Rest des Körpers jedes Würfels.
Ich habe versucht, es mit einem süßen funktionellen Lambda-Mojo zu verkleinern, aber das hat es leider größer gemacht.
quelle