Zeichnen Sie den Inhalt eines Arrays beliebiger Tiefe mit Rahmen +-|
um jedes Subarray. Dies sind die ASCII-Zeichen für Plus, Minus und vertikale Pipe.
Wenn das Array beispielsweise ist [1, 2, 3]
, zeichnen Sie
+-----+
|1 2 3|
+-----+
[[1, 2, 3], [4, 5], [6, 7, 8]]
Zeichnen Sie für ein verschachteltes Array wie
+-----------------+
|+-----+---+-----+|
||1 2 3|4 5|6 7 8||
|+-----+---+-----+|
+-----------------+
[[[1, 2, 3], [4, 5]], [6, 7, 8]]
Zeichnen Sie für ein zerlumptes Array wie
+-------------------+
|+-----------+-----+|
||+-----+---+|6 7 8||
|||1 2 3|4 5|| ||
||+-----+---+| ||
|+-----------+-----+|
+-------------------+
Beachten Sie, dass nach dem Zeichnen mehr Platz vorhanden ist [6, 7, 8]
. Sie können den Inhalt entweder in der obersten, in der Mitte oder in der untersten Zeile zeichnen, aber je nachdem, was Sie auswählen, müssen Sie konsistent bleiben.
Diese Herausforderung wurde durch das Box- Verb <
von J. inspiriert.
Regeln
- Das ist Code-Golf, also gewinnt der kürzeste Code.
- Builtins, die dies lösen, sind nicht erlaubt.
- Das Eingabearray enthält nur nicht negative Ganzzahlwerte oder Arrays. Jedes Array ist homogen, dh, seine Elemente bestehen entweder nur aus Arrays oder nur aus ganzen Zahlen, jedoch niemals aus einer Mischung aus beiden.
- Jedes Subarray kann bis zu einer beliebigen Tiefe verschachtelt sein.
- Die Ausgabe kann entweder als Zeichenfolge oder als Array von Zeichenfolgen erfolgen, wobei jede Zeichenfolge eine Ausgabezeile ist.
Testfälle
[]
++
||
++
[[], []]
+---+
|+++|
|||||
|+++|
+---+
[[], [1], [], [2], [], [3], []]
+-----------+
|++-++-++-++|
|||1||2||3|||
|++-++-++-++|
+-----------+
[[[[[0]]]]]
+---------+
|+-------+|
||+-----+||
|||+---+|||
||||+-+||||
|||||0|||||
||||+-+||||
|||+---+|||
||+-----+||
|+-------+|
+---------+
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|+-------+|+---+|1||
|||+---------+|||+-----+|||2 1|| ||
||||+-------+|||||3 2 1|||+---+| ||
|||||4 3 2 1|||||+-----+|| | ||
||||+-------+|||+-------+| | ||
|||+---------+|| | | ||
||+-----------+| | | ||
|+-------------+---------+-----+-+|
+---------------------------------+
-1
weil ich auch die Ganzzahlen auf nicht negative Werte beschränkt habe. Dann müsste nur noch die Ausgabe für diese ungültigen Werte bereinigen.Antworten:
Dyalog APL , 56 Bytes
Vielen Dank an ngn für die Hilfe beim Entfernen von ungefähr einem Drittel der Bytes.
TryAPL
Definieren Sie die Funktion , führen Sie dann jeden Testfall aus und vergleichen Sie ihn mit dem integrierten
]Display
Dienstprogramm.[1, 2, 3]
[[1, 2, 3], [4, 5], [6, 7, 8]]
[[[1, 2, 3], [4, 5]], [6, 7, 8]]
[]
[[], []]
[[], [1], [], [2], [], [3], []]
[[[[[0]]]]]
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
Erläuterung
Insgesamt handelt es sich hierbei um eine anonyme Funktion
{...}
auf einem Gehäuse⊂
. Letzteres fügt lediglich eine weitere Verschachtelungsebene hinzu, die das erstere zum Hinzufügen eines äußeren Rahmens auffordert.Die anonyme Funktion mit Leerzeichen (
⋄
ist das Anweisungstrennzeichen):Hier ist es wieder, aber mit getrennten Hilfsfunktionen:
Lassen Sie mich nun jede Funktion erklären:
CloseBox
Nimmt eine Tabelle und gibt dieselbe Tabelle zurück, wobei jedoch die erste Spalte der Tabelle rechts von der Tabelle angehängt wird. Ausgehend von der 1-mal-3-TabelleXYZ
gibt diese Funktion die 1-mal-4-Tabelle zurückXYZX
wie folgt zurück:⊢
Das Argument (lit. what is the right) steht vor der,
äußersten⊣/
linken Spalte (lit. the left-reduction of each Reihe)CreateVertical
Nimmt eine Tabelle und gibt die a-Zeichenfolge zurück, die aus den Zeichen besteht, die|
s an den Seiten der Tabelle entsprechen, wobei jedoch zwei+
s vorangestellt werden, um zwei Zeilen von zu entsprechen-
. Schließlich wird die Tabelle zyklisch um eine Zeile gedreht, um eine einzelne+---...
Zeile darüber und darunter zu erhalten. Aus diesem Grund gibt diese Funktion bei einer Tabelle mit drei Zeilen++|||
Folgendes zurück:'++' ,
Grund Zwei Pluszeichen vor'|' ⍴⍨
einem Stil, der durch≢
die (Zeilen-) Zählung des Arguments umgeformt wurdeAddHorizontals
Nimmt eine Listenliste, erstellt eine Tabelle, fügt oben zwei Zeilen mit-
s hinzu, fügt links die entsprechenden Zeichen am linken Rand hinzu und dreht dann eine Zeile nach unten, sodass die Tabelle oben einen Rand hat , links und unten. So1 ⊖
drehen Sie eine Reihe (die obere Reihe geht nach unten)CreateVertical ,
der Zeichenfolge++|||...
(als Spalte) vorangestellt ist, um das'-' ⍪⍣2
Minus, das zweimal am Anfang des↑
von der Liste der Listen in die Tabelle umgewandelten Arguments hinzugefügt wird{
Die anonyme Funktion}
: Wenn das Argument eine einfache (nicht verschachtelte) Liste ist, machen Sie es zu einer Zeichentabelle (daher1 2 3
gibt diese Funktion bei einer Liste mit 3 Elementen die visuell identische 1 × 5-Zeichentabelle zurück1 2 3
). Wenn das Argument keine einfache Liste ist, stellen Sie sicher, dass die Elemente einfache Zeichentabellen sind. polstern sie auf gleiche Höhe; rahmen jeweils oben, unten und links ein; kombiniere sie; und schließlich nehmen Sie die allererste Spalte und fügen Sie es auf der rechten Seite. Wie folgt:{
Beginnen Sie mit der Definition einer anonymen Funktion,⍵ ≡ ∊⍵:
wenn das Argument mit dem abgeflachten Argument identisch ist (dh es ist eine einfache Liste), und⍉
transponieren Sie die⍪
kolumnisierten einschließt⍉
transponiert⍕ ⍵
Zeichenfolge Argument; sonst:CloseBox
Fügen Sie die äußerste linke Spalte rechts von hinzu⊃ ,/
Die offenbarten (weil die Reduktion einschließt) überlappendenAddHorizontals¨
Add--
s am oberen und unteren Rand jeder der auf * Lit. Machen Sie jede Tabelle zu einer Liste von Listen, kombinieren Sie die Listen von Listen (Auffüllen mit leeren Zeichenfolgen, um kurze Zeilen zu füllen) zu einer Tabelle und teilen Sie die Tabelle dann in eine Liste von Listen von Listen auf↓ ↑ ↓¨
Die Auffüllung∇¨ ⍵
dieser anonymen Funktion auf die gleiche Höhe *, die auf jedes Argument angewendet wird,}
beendet die Definition der anonymen Funktionquelle
JavaScript (ES6),
223203 BytePort von @ MitchSchwartz's Ruby-Lösung. Vorherige Version, in der die Arrays rekursiv umgebrochen wurden (und daher für beliebigen Inhalt und nicht nur für ganze Zahlen):
Hinweis: Obwohl ich den Operator spread in meiner Argumentliste verwende, müssen Sie zur Erzielung der gewünschten Ausgabe einen einzelnen Parameter des ursprünglichen Arrays angeben, anstatt zu versuchen, das Array zu verbreiten. Dies hat den Effekt, dass die Ausgabe in die gewünschte äußere Box eingepackt wird. Leider kostet mich die äußere Box 18 Bytes, und das Trennen der ganzen Zahlen durch Leerzeichen kostet mich 8 Bytes, andernfalls würde die folgende alternative Visualisierung für 197 Bytes ausreichen:
quelle
Cannot read property 'map' of undefined
für leere Arrays wie[]
. Denn[1,2,[]]
das letzte Subarray wird mir nicht angezeigt.[1,2,[]]
da in Ihren Beispielen nur Arrays angezeigt werden, die entweder Ganzzahlen oder Arrays enthalten, jedoch nicht beide.Rubin, 104 Bytes
Anonyme Funktion, die eine Zeichenfolge erwartet. Zum Beispiel
{{{{{4 3 2 1}}}}{{{3 2 1}}}{{2 1}}{1}}
produziertSie können diesen Code zum Testen verwenden:
Dies beginnt in der mittleren Reihe und funktioniert nach außen. Zunächst werden Instanzen von
}{
durch ersetzt|
. Dann, während es noch geschweifte Klammern gibt, werden alle innersten{...}
Zeichenfolgen in die entsprechenden+-
Sequenzen umgewandelt, während andere Zeichen als|{}
in Leerzeichen umgewandelt werden. Am Ende werden die Zwischenstreben zu Rohren.quelle
Brainfuck, 423 Bytes
Mit einigen Kommentaren formatiert:
Probieren Sie es online aus.
Erwartet eine Eingabe, die wie
(((((4 3 2 1))))(((3 2 1)))((2 1))(1))
eine nachgestellte Zeile formatiert ist , und gibt die folgende Form aus:Die Grundidee ist die Berechnung des zu druckenden Zeichens anhand der Schachtelungstiefe. Das Ausgabeformat ist so, dass der Zeilenindex des oberen Rahmens einer Box der Tiefe des entsprechenden Arrays entspricht, wobei die Symmetrie über die mittlere Zeile verteilt ist.
Das Band ist in 7-Zellen-Knoten unterteilt, wobei jeder Knoten eine Spalte in der Ausgabe darstellt.
Die erste Schleife verwendet die Eingabe und initialisiert die Knoten, verfolgt dabei die Tiefe und ob die Spalte einer Klammer entspricht (dh ob die Spalte einen vertikalen Rand enthält) und reduziert Vorkommen von
)(
in einzelne Knoten.Die nächste Schleife gibt eine Zeile pro Iteration aus. Innerhalb dieser Schleife durchläuft eine weitere Schleife die Knoten und gibt pro Iteration ein Zeichen aus. Hier findet die meiste Arbeit statt.
Während der Initialisierungsschleife ist das Speicherlayout eines Knotens am Anfang einer Iteration
x d 0 c 0 0 0
Dabei
x
ist ein Boolesches Flag, das angibt, ob das vorherige Zeichen eine schließende Klammer war,d
die Tiefe (plus eins) undc
das aktuelle Zeichen.Während der Zeichendruckschleife ist das Speicherlayout eines Knotens am Anfang einer Iteration
0 0 d1 d2 c p y
wo
d1
zeigt Tiefe verglichen mit Zeilenindex für die obere Hälfte;d2
ist ähnlich,d1
aber für die untere Hälfte;c
ist das Eingabezeichen für diese Spalte, wenn es sich um eine Ziffer oder ein Leerzeichen handelt, andernfalls Null;p
gibt die Phase an, dh die obere Hälfte, die mittlere oder die untere Hälfte; undy
ist eine Flagge, die sich von links nach rechts ausbreitet und verfolgt, ob wir die mittlere Reihe noch erreicht haben. Beachten Sie, dassy
wir nach der Verarbeitung eines Knotens diey
Zelle des vorherigen Knotens verwenden können, um mehr Arbeitsraum zu gewinnen , da sie Null wird .Mit diesem Setup können wir vermeiden, die maximale Tiefe während der Initialisierungsphase explizit zu berechnen. das
y
Flag wird zurückpropagiert, um diep
Zellen entsprechend zu aktualisieren .Es gibt eine
-1
Zelle auf der linken Seite der Knoten Navigation zu erleichtern, und es gibt eine Zelle rechts von Knoten , die Spur hält , ob wir die letzte Zeile gedruckt haben noch.quelle
PHP + HTML, nicht konkurrierend (
170141135130 Bytes)29 Bytes gespeichert, inspiriert von SteeveDroz
nicht konkurrieren, weil es keine ASCII-Ausgabe ist und weil ich den Browser die ganze interessante Arbeit machen lasse
quelle
<b>
stattdessen Tags erstellen<div>
und müssen die Farbe der nicht angebenborder
. (Sparen von 9 Bytes)<b>
kann ich auch daswhite-space
Attribut entfernen und weitere 19 Bytes sparen. toll! Und ich kannpadding
mitmargin
JavaScript (ES6), 221
Eine nicht rekursive Funktion, die ein Array von Zeichenfolgen zurückgibt (in der immer noch eine rekursive Unterfunktion verwendet wird)
Dies funktioniert in 2 Schritten.
Schritt 1: Erstellen Sie rekursiv eine Zeichenfolgendarstellung des verschachtelten Eingabearrays. Beispiel:
[[[1, 2, 3], [],[4, 5]], [6, 7, 8]]
->"OOO1 2 3,,4 5C,6 7 8CC"
O
undC
markiere open und close subarray. Einfache numerische Subarrays werden mit durch Leerzeichen getrennten Elementen gerendert, während Array-Mitglieder, wenn sie Subarrays sind, durch Kommas getrennt werden. Diese Saite hält die Multi - Level - Struktur des Eingangsfeldes verfolgen, während ich die mittlere Reihe des Ausgang nur ersetzt bekommenOC,
mit|
. Während ich diese temporäre Zeichenfolge rekursiv aufbaue, finde ich auch die maximale Tiefenebene und initialisiere ein Array von leeren Zeichenfolgen, die den halben oberen Teil der Ausgabe enthalten.Hinweis: Die äußere Box ist schwierig. Ich verschachtele die Eingabe in einem anderen äußeren Array und lasse dann die erste Zeile der Ausgabe fallen, die nicht benötigt wird
Schritt 2: Scannen Sie die temporäre Zeichenfolge und erstellen Sie die Ausgabe
Jetzt habe ich eine Reihe von leeren Zeichenfolgen, eine für jede Ebene. Ich scanne die temporäre Zeichenfolge und verfolge den aktuellen Pegel, der für jede Zeichenfolge zunimmt
O
und für jede Zeichenfolge abnimmtC
. Ich visualisiere das so:Das Pluszeichen für Auf und Ab folgt dem aktuellen Pegel
Für jedes Zeichen füge ich jeder Ausgabezeile ein Zeichen hinzu, wobei ich die folgenden Regeln befolge:
- Wenn Ziffer oder Leerzeichen, setze ein '-' auf die aktuelle Ebene und darunter, setze ein Leerzeichen darüber,
andernfalls ein '+' auf das aktuelles Level, setze ein '-' wenn darunter und setze ein '|' wenn oben
Während des temporären Scans baue ich auch die mittlere Zeile, die
OC,
durch ersetzt wird|
Am Ende dieses Schritts habe ich die obere Hälfte und die mittlere Reihe, ich muss nur die obere spiegeln, um die untere Hälfte zu erhalten, und ich bin fertig
Weniger Golf, kommentierter Code
)
Prüfung
quelle
Ruby,
245241 BytesDer Overhead, der benötigt wird, um alles in Kisten zu wickeln und auszurichten, ist ziemlich schwer ...
Gibt Zeichenfolgenarrays mit einer Zeichenfolge pro Zeile gemäß der Spezifikation aus. Unten ausgerichtet anstelle der oben ausgerichteten Beispieltestfälle, da 1 Byte eingespart wird.
Probieren Sie es online!
quelle
PHP, 404 Bytes
Alle Lösungen arbeiten mit einer maximalen Tiefe des Arrays von weniger als 10. Für größere Werte muss die Tiefe in einem Array und nicht in einer Zeichenfolge gespeichert werden.
Erweitert
für 425 Bytes können wir das mit REGEX machen
Erweitert
455 Bytes für eine rekursive Lösung
Erweitert
quelle
$j!="]"?:$c--;
->$c-=$j=="]";
(-2). 2)($l=="]"?"":" ")
->" "[$l==$j]
(-5). Höchstwahrscheinlich ähnliche Substitutionen in der zweiten Schleife. 3)if($r!=""){$n.=$r;$d.=+$c;}
->$n.=$r;if($r>"")$d.=+$c;
(-3). 4)$l=$j;$j!="["?:$c++;
->$c+="["==$l=$j;
(-5). 5)$x=0
wird nicht benötigt (-4). 6)for($y=0;$y<$m;$y++)
->for($y=$m;$y--;)
(-4). 7)join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));
->join("\n",array_merge($z,[$n],array_reverse($z)));
(-4) 8) unnötiges Leerzeichen:foreach($e[0]as$f)
(-1)($j==",")
(-2). 10)if($r>"")$d.=+$c;
->$d.=$r>""?+$c:"";
(-0)$d.=$l?$t;
ist veraltet (-10) 2)$s.=$l?"|":"";return$s;
->return$s."|"[$l];
(-6). 3) veraltete Klammern{$e=v($v,$t+1,$k+1==$c);}
(-2). 4){$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}
->$d.=str_pad("",strlen($e=$v." "[$k+1==$c]),$t+1);
(-5).