Sie erhalten ein verschachteltes Array. Ihr Programm muss das Array visualisieren.
Aber wie?
Nehmen wir zum Beispiel an, wir haben ein verschachteltes Array wie [["1","2"],[["1","2"],"3"],"4",[[[["5"]]]],"6"]
.
Dieses verschachtelte Array kann wie folgt dargestellt werden:
->1
->2
-->1
-->2
->3
>4
---->5
>6
Beispiele
Input 1:
["Atom",["Proton",["Up Quark", "Up Quark", "Down Quark"], "Neutron", ["Up Quark", "Down Quark", "Down Quark"], "Electron"]]
Output 1:
>Atom
->Proton
-->Up Quark
-->Up Quark
-->Down Quark
->Neutron
-->Up Quark
-->Down Quark
-->Down Quark
->Electron
Input 2:
[["1","2"],["3","4"]]
Output 2:
->1
->2
->3
->4
Regeln
- Sie können Zeichenfolgen (oder andere Typen, die wie ein verschachteltes Array funktionieren) als Eingabe verwenden.
- Die maximale Ebene der "Ebenen" ist 2 ^ 32-1.
code-golf
printable-ascii
Matthew Roh
quelle
quelle
Antworten:
APL, 32 Bytes
Prüfung:
Erläuterung:
{
...}∘0
: führe die folgende Funktion aus mit0
gebunden an⍵
:1=≡⍺:
: Wenn die Eingabe Tiefe 1 hat (dh ein Array, das keine anderen Arrays enthält):⍵/'->'
: Erstelle einen String mit⍵
-
s und⍵
>
s,1↓
: Lasse das erste Element fallen,⍵↑
: und nimm die ersten⍵
Elemente. Dies führt zu einer Zeichenfolge mit⍵-1
Bindestrichen und einer>
.⍺,⍨
: füge die Eingabe hinzu,⎕←
: und gib das auf dem Bildschirm aus⋄
: Andernfalls,⍺∇¨⍵+1
: addiere 1 zu⍵
und wende die Funktion auf jedes verschachtelte Array anquelle
('Atom' ('Proton' ('Up Quark' 'Up Quark' 'Down Quark') 'Neutron' ('Up Quark' 'Down Quark' 'Down Quark') 'Electron'))
.Mathematica,
585756 BytesVielen Dank an Greg Martin für das Speichern von 1 Byte.
Dank an ngenisis für das Speichern von 1 Byte.
quelle
Java 7,
153141114 Bytes-39 Bytes dank @ Barteks2x
Erläuterung:
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
for(int j=i;j-->0;r+="-");
um auch das zu tun, was die nächste Zeile tut, und ein generisches Argument anstelle von Object [] verwenden:String r="";<T>String c(int i,T[] o){for(T x:o)if(x instanceof Object[])c(i+1,(T[])x);else for(int j=i;j-->=0;r+=j<0?">"+x+"\n":"-");return r;}
Und sogar 1 Zeichen weniger, wenn Sie 1 anstelle von 0 als erstes übergeben argument ist ok[]
aus dem Parameter, um 1 zusätzliches Byte zu speichern, zu einem Fehler. Den Fehler finden Sie hier unter > Debuggen nach dem Ausführen.String r="";<T>String c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return r;}
das funktioniert. Sie können auch einen ähnlichen generischen Trick mit einer Zeichenfolge ausführen, um ein zusätzliches Byte zu speichern. Sie müssen jedoch entweder das Ergebnis vor dem Drucken in einer Variablen speichern oder eine explizite Umwandlung (mehrdeutiger Methodenaufruf)String r="";<T,S>S c(int i,T a){for(T x:(T[])a)if(x instanceof Object[])c(i+1,x);else for(int j=i;j-->0;r+=j<1?">"+x+"\n":"-");return(S)r;}
String r="";<T,S>S c(S p,T a){for(T x:(T[])a)if(x instanceof Object[])c("-"+p,x);else r+=p+">"+x+"\n";return(S)r;}
und der Anforderung, dass der Rückgabetyp beim Aufruf einen String enthält es ist weg.PHP,
77 7473 Bytes4 Bytes gespeichert dank @manatwork.
rekursive Funktion, benötigt PHP 7.1 oder neuer für den negativen Stringindex.
"$e"
istArray
für Arrays; so"$e"!=$e
ist das gleiche wieis_array($e)
.>
-
dem Präfix für jede Ebene ein voranquelle
function f($a,$p=""){foreach($a as$e)echo$p,is_array($e)?f($e,"-"):">$e\n";}
is_array($e)
könnte das durch ersetzt werden$e[-1]!==""
.$e[-]==""
... und mit umgekehrter Bedingung möglich$e[-1]>""
. Nizza zu finden!$e[-1]>""
man sie durch ersetzen"$e"==$e
. Zumindest in dem alten PHP 5.6 verwende ich.C99 (GCC),
201187140112109erweiterte Form:
Dies nimmt eine Zeichenfolge im richtigen Format und endet, wenn die letzte Übereinstimmung gefunden wird
]
.Es verwendet keine Rekursion und verwendet lange Typen, um die zweite Regel zu erreichen: 2 ^ 32-1 Ebenen . Die meisten Skriptsprachen haben eine begrenzte Rekursionstiefe oder stürzen einfach beim Stapelüberlauf ab.
Ich bin es nicht gewohnt in C Golf zu spielen, jede Hilfe wird geschätzt :)
Danke an bolov für seine Tipps! Besonders danke an Titus, der immer für eine gute Runde Golf (auch in C) bereit ist!
Weitere zwei Bytes werden durch die Tatsache gespart, dass wir fertig werden können, sobald wir das letzte Zeichen gefunden haben
]
und kein Nullzeichen mehr benötigen.Es kann an der Wandbox getestet werden .
quelle
for(int d=1 ...
?long
hat 4 Zeichen, währendint
nur 3 Zeichen , und es gibt keinen Grund, dass Sie es über das zulassen müssen, damit2^32 - 1
Ihre Einreichung gültig ist, wodurch Sie ein einzelnes Byte sparen.2^31-1
.The maximum level of "layers" is 2^32-1.
.2^31-1
ist viel weniger als2^32-1
.2^32-1
passt eineint
Weile nicht, es passt einunsigned
oderlong
(das ist auf den meisten Systemen / Compilern natürlich). Daherint
würde ich keine richtige Antwort geben (wie die meisten Antworten hier nicht sein).JavaScript (ES6),
5851 ByteBearbeiten: 7 Bytes gespart, als @Arnauld darauf hinwies, dass ich meine beiden Ansätze kombinieren könnte.
quelle
PHP,
129 123 112 109 95 9391 BytesDie iterative Lösung übernimmt die Zeichenfolge von STDIN:
Führen Sie sie mit aus,
echo '<input>' | php -nR '<code>'
oder testen Sie sie online .Nervenzusammenbruch
Glücklich, dass die Zahlen in Anführungszeichen stehen; Ich brauche also immer nur eine Aktion.
ASCII-Geigen
Hinzufügen von 3 Strichen zu
$p
und Entfernen von 2 für[
, 4 für Hinzufügen von]
einem für[
und Entfernen von einem für]
.quelle
Python 2,
6564 BytesGerade jetzt meine Antwort beginnt konsequent ohne Bindestriche, so
["foo", "bar"]
ist:quelle
import sys, pprint; pprint.pprint(sys.argv)
ist 43 Bytes, aber ich weiß nicht, ob es Code Golfregeln bricht.f=lambda o,d=0:o<''and'\n'.join(f(e,d+1)for e in o)or'-'*d+'>'+o
import sys, pprint.pprint as p; p(sys.argv)
ist immer noch 43, aber trotzdem ein guter Vorschlag; D Der Versuchimport sys.argv as v
verlängert ihn tatsächlich etwas ~ 48 Bytes. Wenn man sys.argv eliminieren könnte, würde man viel sparen, aber das Programm wird dann ziemlich unbrauchbar. Ein rekursiver Ansatz ist ziemlich langdef p(L,d=0): [p(i,d+1) if isinstance(i,list) else print(">"*d + i) for i in L]
, ~ 80 Bytes.Perl 5 , 55 Bytes
53 Byte Code +
-nl
Flags.Probieren Sie es online!
Nicht optimal für reguläre Ausdrücke, da einige unruhige Fälle auftreten können (insbesondere, wenn ein Element des Arrays Klammern enthält).
Eine rekursive anonyme Funktion wäre allerdings kaum länger (61 Bytes):
Probieren Sie es online!
Die Art und Weise, wie Perl mit Parametern umgeht, ist jedoch für Golffunktionen nicht optimal: Keine optionalen Parameter bedeuten, dass ich eine zweite Funktion (anonym) ausführen muss, die die erste aufruft, und ich muss den letzten Parameter mit dieser Länge explizit abrufen
my$v=pop
.quelle
Ruby,
49 4546 BytesBeispiel:
Erläuterung:
Rekursive Funktion: Wenn
x==[*x]
dann x ein Array ist, iterieren wir darüber. Wenn nicht, rücken Sie es ein.quelle
Haskell, 104 Bytes
Haskell hat keine verschachtelten Listen mit unterschiedlichen Tiefen, daher muss ich die Eingabezeichenfolge selbst analysieren. Glücklicherweise kann die Bibliotheksfunktion
reads
Strings (d. H"
-enclosed char sequence) , daher habe ich hier eine kleine Hilfe.Anwendungsbeispiel:
Probieren Sie es online!.
Wie es funktioniert:
Die Funktion
#
durchläuft die Zeichenfolge char by char und behält die Verschachtelungsebene (den ersten Parameterl
) als Zeichenfolge-
mit einem Finale bei>
. Wenn der Kopf der Liste als String analysiert werden kann, nehmen Siel
und der String gefolgt von einem rekursiven Aufruf, wobei der String entfernt wird. Wenn das erste Zeichen ein Leerzeichen ist, überspringen Sie es. Wenn,
ja, nehmen Sie eine neue Zeile und fahren Sie fort, wenn ja]
, senken Sie die Verschachtelungsebene und fahren Sie fort. Andernfalls (nur[
links) erhöhen Sie die Verschachtelungsebene und fahren Sie fort. Die Rekursion endet mit der leeren Eingabezeichenfolge. Die Hauptfunktion(">"#)
setzt die Verschachtelungsebene auf">"
und ruft auf#
.quelle
SWI-Prolog, 115 Bytes
Zeilenumbrüche wurden nur zur besseren Lesbarkeit hinzugefügt und sind nicht in der Byteanzahl enthalten.
p
Das Prädikat durchläuft die Arrays rekursiv und fügt dem Präfix ein '-' hinzu,F
wenn es eine Ebene tiefer verschoben wird.w
wird verwendet, um das Präfix-Array sowie das eigentliche Element in die Ausgabe zu schreiben.Beispiel:
quelle
Batch, 249 Bytes
Ärgerlicherweise hat Batch Probleme beim Vergleichen von Kommas. Probelauf:
quelle
Retina ,
635452 Bytes2 Bytes gespart dank Martin Ender
Probieren Sie es online!
Erläuterung
Zunächst wird das Array durch Ersetzen der einzelnen Zeichenfolgen in Anführungszeichen durch die vorangegangenen Zeichenfolgen sowie durch eine neue Zeile aufgelöst. Wenn Sie es so aufteilen, ist es möglich, die nicht passenden öffnenden Klammern vor jeder Saite zu finden.
Diese Transliteration wird ersetzt
[
durch-
, bleibt]
unverändert und löscht alle anderen Zeichen (-~
alle druckbaren ASCII-Zeichen). Es ersetzt jedoch nur Zeichen, die in jeder Zeile vor der letzten Zeichenfolge stehen.Als nächstes werden alle Instanzen von
-]
entfernt. Diese entsprechen übereinstimmenden Klammerpaaren, und wir möchten nur nicht passende Klammern. Nachdem diese entfernt wurden, hat jede Zeile eine Anzahl von-
s, die der Anzahl nicht übereinstimmender öffnender Klammern entspricht.Der letzte
-
vor a"
wird durch ersetzt>
, um die Pfeile zu bilden.Schließlich werden alle verbleibenden
]
s und"
s gelöscht.quelle
Röda , 54 Bytes
Probieren Sie es online!
Es ist eine Funktion, die das Eingabearray aus dem Stream liest. Für jedes Element ruft es sich entweder selbst rekursiv auf oder druckt das Element aus.
quelle
Python 3, 80 Bytes
Pythons Lambdas unterstützen anscheinend die Rekursion, wer wusste das schon?
Dies ist ein Gegenstück / Kompliment zu Orlps Antwort.
quelle
=
. Ich vermute auch, dass Sie alle Felder nach den dreien löschen können)
, aber ich bin nicht sehr vertraut mit dem Golfen in Python.Groovy, 92 Bytes
quelle
Gestapelt , 27 Bytes
Probieren Sie es online!
Übernimmt die Eingabe von der Stapelspitze und lässt die Ausgabe auf STDOUT. Dies ist einfach, indem Sie eine Tiefenkarte erstellen, die
-
d
Zeiten wiederholen , mit '>' und dem Element selbst verknüpfen.quelle
Gema, 63 Zeichen
Genauso wie bei den anderen Analyselösungen wird davon ausgegangen, dass die Zeichenfolgen keine Anführungszeichen enthalten.
Probelauf:
quelle
jq,
7067 zeichen(
6764 Zeichen Code + 3 Zeichen Befehlszeilenoption)Probelauf:
Online-Test
quelle