Hinweis: Dies ist die Nummer 2 in einer Reihe von Array-Manipulationsherausforderungen . Für die vorherige Herausforderung klicken Sie hier .
Geschachtelte Listen trennen
Um Werte in einer verschachtelten Liste zu trennen, reduzieren Sie diese und schließen Sie jeden Wert so ab, dass er dieselbe verschachtelte Tiefe aufweist wie zuvor.
Das heißt, diese Liste:
[1, [2, 3], [4, 4, [5, 2], 1]]
Würde werden:
[1, [2], [3], [4], [4], [[5]], [[2]], [1]]
Die Herausforderung
Ihre Aufgabe ist es, ein Programm zu schreiben, das eine verschachtelte Liste positiver Ganzzahlen (innerhalb der Grenzen Ihrer Sprache) verwendet und diese Trennoperation ausführt.
Sie können eine Funktion übergeben, die die Liste als Argument verwendet, oder ein vollständiges Programm, das E / A ausführt.
Da dies Codegolf ist , gewinnt die kürzeste Einsendung (in Bytes)! *
* Standard-Golflöcher sind verboten. Sie kennen die Übung.
Testfälle
Eingabelisten enthalten immer nur Ganzzahlen in der Standard-Ganzzahlgröße Ihrer Sprache. Um zu vermeiden, dass die Einschränkungen der Sprachen den Wettbewerb behindern, werden die Werte nicht in Tiefen von mehr als 10 verschachtelt.
Sie können davon ausgehen, dass die Eingabe keine leeren Unterlisten enthält: Zum Beispiel - [[5, []]]
wird nicht angegeben. Die Hauptliste könnte jedoch leer sein.
[] -> []
[[1, 2]] -> [[1], [2]]
[3, [4, 5]] -> [3, [4], [5]]
[3, [3, [3]]] -> [3, [3], [[3]]]
[[6, [[7]]]] -> [[6], [[[7]]]]
[[5, 10], 11] -> [[5], [10], 11]
Zögern Sie nicht, einen Kommentar zu hinterlassen, wenn ich einen Eckfall verpasst habe.
Beispiel
Ich habe eine schnelle (ungolfed) Python 3-Lösung als Beispiel zusammengestellt - Sie können sie auf repl.it testen .
quelle
Antworten:
Brachylog , 16 Bytes
Probieren Sie es online!
Erläuterung
quelle
Z
Argument auf TIO? Ohne es scheint dies mit true / false auszugeben, was es so erscheinen lässt, als obZ
es in der Byteanzahl notwendig ist.Z
teilt Brachylog mit, dass das Ausgabeargument eine Variable ist. Dies ist diese Variable, die mit der resultierenden Ausgabe vereinheitlicht wird. Wenn Sie es entfernen, wird Brachylog mitgeteilt, dass es sich bei der Ausgabe um eine anonyme Variable handelt. Stattdessen wird gedruckt, ob das Hauptprädikat erfolgreich ist oder fehlschlägt. Dies ist dasselbe wie in Prolog, wo das Ergebnis in eine Variable "geschrieben" wird.Mathematica,
2421 Bytesoder eines davon:
Erläuterung
Der Grund dafür ist, dass es sich im Grunde genommen um eine Rekursion handelt, für die kein expliziter Basisfall erforderlich ist.
Hier ist viel syntaktischer Zucker, also fangen wir damit an, dies zu beseitigen.
&
bezeichnet eine unbenannte davon übrig gebliebene Funktion, deren Argument als geschrieben ist#
. Innerhalb dieser Funktion#0
bezieht sich auf die Funktion selbst, mit der man unbenannte rekursive Funktionen schreiben kann. Beginnen wir aber damit, dass wir der inneren Funktion einen Namen geben und sie herausziehen:Der andere wichtige syntaktische Zucker ist,
f/@x
was kurz ist,Map[f, x]
dh er ruftf
jedes Element von aufx
. Der Grundf[x_] := ... f /@ x
für die unendliche Rekursion ist nicht, dass die Abbildung von etwas über ein Atom das Atom unverändert lässt, ohne die Funktion aufzurufen. Daher müssen wir nicht explizit nach dem Basisfall suchen (aktuelles Element ist eine Ganzzahl).Die Funktion
f
kehrt also zuerst zur tiefsten Liste im Inneren zurückx
, an welcher Stellef/@
ein No-Op wird. Dann nennen wir das use##& @@ List /@
on. MappingList
über die Liste wickelt einfach jedes Element in einer separaten Liste, so{1, 2, 3}
wird{{1}, {2}, {3}}
. Dann wenden wir##&
es an, was bedeutet, dass der Kopf (dh die äußere Liste) durch ersetzt wird##&
, also wird dies zu##&[{1}, {2}, {3}]
. Aber##&
einfach gibt sie die Argumente als einSequence
(die Sie als eine ungeöffnete Liste denken können, oder eine Art „Klecks“ Operator in anderen Sprachen).Also
##& @@ List /@
wandelt sich eine Liste{1, 2, 3}
in{1}, {2}, {3}
(Art, das letzte Ding wird tatsächlich in den Kopf gewickeltSequence
, aber das verschwindet, sobald wir den Wert irgendwo verwenden).Das lässt die Frage offen, warum
f
selbst nicht schon die Lösung für die Herausforderung ist. Das Problem ist, dass die äußerste Liste anders behandelt werden sollte. Wenn wir Input{{1, 2}, {3, 4}}
haben, wollen wir{{1}, {2}, {3}, {4}}
und nicht{{1}}, {{2}}, {{3}}, {{4}}
. Meine ursprüngliche Lösung hat dies behoben, indem das Endergebnis als eine Liste von Argumenten übergeben wurde, anJoin
die die äußere Ebene von Listen wiederhergestellt werden soll. Diese überspringt jedoch die äußere Ebene, indem sie sichf
selbst in einer Karte in der Ausgabe verwendet. Daherf
wird es nur auf die einzelnen Elemente der äußersten Liste angewendet und darf diese Liste nie berühren.Bei den anderen drei Lösungen wendet die erste einfach die Rekursion an, die auch außerhalb der Rekursion
f
funktioniert. Die anderen beiden Lösungen vermeiden eine wiederholteMap
Operation, indem sie zuerst zwei Funktionen zusammenstellen und dann das Ergebnis nur einmal abbilden.quelle
J ,
19-18BytesDies ist ein anonymes Verb, das geschachtelte Arrays akzeptiert und zurückgibt. Dies ist Js (ziemlich umständliche) Version verschachtelter Arrays. Sehen Sie, wie alle Testfälle bestanden werden.
Erläuterung
Dies nutzt die etwas exotischen Operationen
{::
( map ) undS:
( spread ), die auf Boxed Arrays ausgeführt werden.{::
Ersetzt jedes Blatt durch den eingepackten Pfad zu diesem Blatt.S:
Wendet ein bestimmtes Verb auf eine bestimmte Verschachtelungstiefe an und teilt die Ergebnisse in ein Array auf.quelle
R, 199 Bytes
Diese Frage war hart. Die Listen von R sind etwas seltsam und es ist absolut nicht einfach, alle Elemente von Unterlisten zu durchlaufen. Es ist auch nicht einfach, dann die Tiefe dieser Liste zu bestimmen. Dann besteht die Herausforderung darin, die Liste mit allen getrennten Elementen neu zu erstellen. Daher benötigen wir auch eine Möglichkeit, eine Liste mit einer bestimmten Tiefe adaptiv zu erstellen.
Die Lösung besteht aus zwei großen Teilen. Eine rekursive Funktion, die alle Listen durchläuft und die Tiefe aufzeichnet:
Wenn wir die Tiefen jedes Eintrags des Vektors
unlist(l)
gespeichert habend
, erstellen wir implizit eine Listelapply
und füllen sie mit der folgenden Funktion:In diesem Aufruf von apply erstellen wir ein Objekt
q
mit dem Wert des Eintrags in der Liste, überprüfen seine Tiefe und prüfen, ob er ungleich Null ist. Wenn es Null ist, können wir es einfach als numerischen Wert belassen. Wenn es nicht Null ist, müssen wir es in dieser Anzahl von Listen verschachteln. Also rufen wird
mal eine for-Schleife auf und rufen immer wieder aufq=list(q)
.lapply
Dann werden alle diese Werte vonq
in eine Liste aufgenommen und die gewünschte Ausgabe erstellt.Vollständiges Programm mit dem richtigen Abstand und so weiter:
quelle
is.list(y)
stattclass(y)=='list'
? Ich kann nicht überprüfen, ob dies tatsächlich funktioniert.Retina , 34 Bytes
Probieren Sie es online!
quelle
(?<-2>)
Arbeit?C (gcc) 147 Bytes
Beispiel Eingabe:
Beispielausgabe:
quelle
gestapelt , nicht konkurrierend, 25 Bytes
Dies ist eine Funktion, die das oberste Element des Stapels ändert. Wenn Sie eine Bonafide-Funktion wünschen, fügen Sie einfach
[
und]
an den Anfang und das Ende. Probieren Sie es hier aus!Hier ist eine lesbare Version:
Testfall:
Ausgabe ohne Zeilenumbruch:
quelle
*
wie ein Argument zum Codeblock?d-1
mal.$func
ist eine manipulierbare Funktion.PHP,
10194 Bytes1 Byte dank @Christoph gespeichert, weitere 6 davon inspiriert.
rekursive Funktion, ziemlich einfach
Nervenzusammenbruch
quelle
$r
Elemente in der Schleife ab oder die Funktion gibt ein leeres Array zurück. Es kann Hinweise geben, die jedoch nicht mit der Standardkonfiguration gedruckt werden.!cos()
.cos()
kehrtnull
jedes Array für und einen Schwimmer! = 0 für jede positiv ganze Zahl ist . Ich meine ... wer kümmert sich um Warnungen?is_int
: Das Umkehren der Bedingung speichert nichts. Ich brauche ein Leerzeichen zwischenelse
undforeach
. ABER:$b[0]
für eine ganze Zahl istNULL
.Python 2,
122106 BytesZiemlich schreckliche Punktzahl, nur eine einfache Implementierung.
Vielen Dank an @Zachary T für die Unterstützung beim Speichern von 16 Bytes!
Rufen Sie
x
mit einem Argument auf, um auszuführen. Aus irgendeinem Grund kann es nur einmal ausgeführt werden.quelle
a+=[n(l,d)]
uma+=n(l,d),
(das folgende Komma beachten)t
?n
zur Funktion wechseln und das erste Argument entfernen, da dies immer der Fall sein wirdl
.JavaScript (Firefox 30-57), 53 Byte
Die beste Antwort auf ES6, die ich bisher habe, ist 76 Byte:
quelle
f=
.Pyth - 29 Bytes
Test Suite .
quelle
Perl 6 ,
6047 Bytes( Probieren Sie es online. )
Erläuterung:
[... for |$^a]
: Iterieren Sie über das Eingabearray und erstellen Sie daraus ein neues Array.$_ ~~ List ?? ... !! ...
: Überprüfen Sie für jedes Element, ob es selbst ein Array ist.|([$_] for .&f)
: Wenn das Element ein Array ist, wenden Sie die Funktion rekursiv darauf an, iterieren Sie über die Elemente des neuen Arrays, die von diesem rekursiven Aufruf zurückgegeben wurden, umschließen Sie jedes Element in einem eigenen Array und fügen Sie sie in die äußere Liste ein.$_
: Wenn das Element kein Array ist, geben Sie es so wie es ist weiter.quelle
Haskell, 71 Bytes
Wieder muss ich meinen eigenen Listentyp definieren, da Haskells native Listen nicht beliebig verschachtelt werden können. Dieser neue Typ
L
kann von einer Funktion zurückgegeben, aber nicht standardmäßig gedruckt werden. Um ein Ergebnis zu erhalten, definiere ich eineshow
Instanz fürL
:Jetzt können wir einige Tests in der REPL machen:
So funktioniert es: Eine einfache Rekursion, die die Verschachtelungsebene als Funktion von
C
Konstruktoren übergibt . Wir beginnen mit der Identitätsfunktionid
undd#C l=
fügen bei jeder Liste (-> Musterübereinstimmung ) eine weitere EbeneC
(->C .pure.d
) zum rekursiven Aufruf#
aller Elemente der Liste hinzu. Wenn wir auf eine Zahl stoßen, wenden wir einfach die Funktion der Verschachtelungsebened
auf die Zahl an.quelle
APL (Dyalog) , 44 Byte *
Anonyme implizite Präfixfunktion. Nimmt die verschachtelte APL-Liste als Argument und gibt ein verschachteltes APL-Array zurück.
Probieren Sie es online!
{
…}
Wende die folgende explizite Funktion an, in der das Argument dargestellt wird durch⍵
:⎕JSON⍵
Konvertieren Sie das Argument in JSONj←
speichern inj
'[]'∘.=
Tabelle mitj
offenen (obere Reihe) und geschlossenen (untere Reihe) Klammern-⌿
obere Reihe minus untere Reihe (vertikale Differenzreduzierung)+\
kumulative Summe (gibt die Verschachtelungsebene für jedes Zeichen an)(
…)⊆
Partition, beginnt eine neue Partition, wenn vor einer 1 in… keine 1 stehtj∊⎕D
wobei jedes Zeichen derj
ein Mitglied des Satzes von D igits⊃¨
wähle den ersten von jedem (dies gibt die Verschachtelungsebene pro mehrstelliger Zahl)∊{
… Wenden Sie}¨
auf jede Verschachtelungsebene (⍵
) die folgende Funktion an , wobei Sie das entsprechende Element aus dem Argument ϵ nlisted (abgeflacht) als linkes Argument (⍺
) verwenden:,⍺
ravel (listify) die Zahl (weil Skalare nicht eingeschlossen werden können)⊂⍣⍵
⍵
mal beilegen⊃
enthüllen (weil die innerste Liste selbst ein Gehege ist)* Verwenden von Dyalog Classic mit
⎕ML←3
(Standardeinstellung bei vielen Systemen), Ersetzen⊂
von⊆
und↑
für⊃
. Tio!quelle