Diese Herausforderung wurde durch eine Frage zu Mathematica.SE inspiriert .
Angenommen, Sie haben eine verschachtelte Liste / ein Array mit einer beliebigen Struktur (die Listen auf jeder Ebene müssen nicht unbedingt die gleiche Länge haben). Der Einfachheit halber nehmen wir an, dass die Knoten nicht negative ganze Zahlen oder leere Arrays sind. Als Beispiel
[[[1, 3], 2], [1, 4], 12, [[0, [], 0], [5, [7]]]]
Manchmal ist es bequemer, diese Liste zu reduzieren, um die Knoten zu manipulieren, z
--> [1, 3, 2, 1, 4, 12, 0, 0, 5, 7]
--> [1, 1, 0, 1, 0, 0, 0, 0, 1, 1]
Am Ende möchten Sie jedoch die ursprüngliche Struktur beibehalten und diese dann wieder herstellen
--> [[[1, 1], 0], [1, 0], 0, [[0, [], 0], [1, [1]]]
Ihre Aufgabe ist es, diesen letzten Schritt durchzuführen.
Wenn eine verschachtelte Liste beliebiger nicht negativer Ganzzahlen, die die gewünschte Struktur des Ergebnisses darstellt, und eine flache Liste nicht negativer Ganzzahlen, die die gewünschten Werte darstellen, die flache Liste in die Form der strukturierten Liste umformen. Sie können davon ausgehen, dass beide Listen die gleiche Anzahl von ganzen Zahlen enthalten.
Wie üblich müssen Sie sich nicht mit ungültigen Eingaben befassen (z. B. wenn die zweite Liste nicht flach ist, die Eingabe syntaktisch fehlerhaft ist, keine Ganzzahlen als Knoten usw.). Sie können die Eingabearrays in Ihrem Code ändern.
Sie können eine Funktion oder ein Programm schreiben, indem Sie eine Eingabe über STDIN, ein Befehlszeilenargument oder ein Funktionsargument vornehmen, und Sie können das Ergebnis zurückgeben oder es an STDOUT ausgeben. Sie können jedes beliebige Listen- oder Zeichenfolgenformat verwenden, um die Eingabe und Ausgabe darzustellen (sofern das Format eindeutig ist und die Eingabe nicht vorverarbeitet wurde). Außerdem muss das Format beider Eingaben konsistent sein (sodass Sie eine Eingabe beispielsweise nicht als Zeichenfolge und die andere nicht als Liste verwenden können). Sie können die Eingabelisten in beliebiger Reihenfolge verwenden, geben Sie jedoch in Ihrer Antwort die genaue Eingabemethode an.
Eine weitere Einschränkung: Sie dürfen keine regulären Ausdrücke verwenden. Dies ist eine Array-Manipulationsaufforderung, keine String-Manipulationsaufforderung.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
Structure Values Result
[[[1,3],2],[1,4],12,[[0,0],[5,[7]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[[[0,0],0],[0,0],0,[[0,0],[0,[0]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[] [] []
[[]] [] [[]]
[0,1,2,3] [5,1,0,5] [5,1,0,5]
[[[[[0]]]]] [123] [[[[[123]]]]]
[0,[1,[]],[[]],[2,3],[]] [1,6,1,8] [1,[6,[]],[[]],[1,8],[]]
quelle
Antworten:
CJam,
18 1613 BytesÜbernimmt die Eingabe über STDIN im selben Format wie die vorherige CJam-Antwort:
und gibt die Ergebniszeichenfolge an STDOUT aus
Ich behandle einfach die erste Zeile als Zeichenfolge, wandle alle Ziffern in Zeilenumbrüche um, teile sie bei einem oder mehreren Vorkommen von Zeilenumbrüchen auf, lege die zweite Zeile als Array auf einen Stapel, wickle ein Array ein und reiße die beiden Arrays (Zeilen) zusammen. Der Ausdruck erfolgt automatisch, und da die erste Zeile als Zeichenfolge behandelt wurde, bleiben ihre Klammern erhalten.
Code-Erweiterung
Vielen Dank an @ user23013 für das Speichern von 3 Bytes.
Probieren Sie es hier online aus
quelle
/La-
:%
.%
für die Aufteilung gilt, und es wird auch auf mehrere Vorkommen aufgeteilt!JavaScript, ES6, 44 Byte
Dies erzeugt eine Funktion,
f
die wie folgt aufgerufen werden kanndh das verschachtelte Array und das Werte-Array als Eingabeargumente. Die Ausgabe der Funktion ist das konvertierte verschachtelte Array.
Diese Frage ist eine sehr schöne Frage für die Rekursion, deshalb ist die Antwort eine nette und nette Rekursionsfunktion. Ich erstelle eine Funktion
f
, die das erste Argument mit dermap
Methode konvertiert . Wenn das Element ein Array ist, ruft es für jedes Elementf
erneut auf. Andernfalls ruft es für Ganzzahlen das i- te Element ab und gibt dieses zurück, wobei der Wert von inkrementiert wirdi
. Der Wert voni
wird bei jedem rekursiven Aufruf weitergegeben, um die Reihenfolge korrekt zu halten.Die Array-gegen-Integer-Erkennung wird erneut mit dieser
map
Methode durchgeführt. Für eine Array-Variablemap
ist eine gültige Funktion, während für ganzzahlige Variablen keine Eigenschaft oder Funktionmap
definiert ist, die als definiert bezeichnet wird.Dies funktioniert in einem aktuellen Firefox-Browser (aufgrund von ES6).
quelle
.map
im Code gab. Gibt es eine Möglichkeit, es weiter zu verkürzen? Trotzdem netter Code!map
ist an den Kontext gebunden, so dass die erste Karte zu gehört,a
während die nächste Karte zu jederx
in der Iteration gehört. Es gibt keinen anderen kürzeren Weg, ummap
auf ein Array zu verweisen oder es von ganzen Zahlen zu unterscheidenJavaScript, ES6, 41 Byte
Die Antwort von Optimizer hat mich wirklich beeindruckt , es war sehr geschickt und ich habe viel gelernt. Als ich es mir jedoch ansah, fand ich eine Möglichkeit, es leicht zu verkürzen und einen kleinen Fehler zu beheben:
Ich nahm die
i
Variable heraus und ersetzte sie durch eineshift()
. Dies macht es etwas kürzer und behebt das Problem mit der Tatsache, dassi
es als Wert und nicht als Referenz übergeben wird, wodurch einige Zahlen aus dem endgültigen Array wiederholt und einige am Ende nicht verwendet wurden. Auch hier war die Antwort von Optimizer sehr gut durchdacht, besser als ich es hätte tun können, ich habe sie nur ein wenig korrigiert.quelle
Dyalog APL, 14 Zeichen
Dies ist ein Kinderspiel:
(∊a)←b
.Normalerweise
∊a
bedeuteta
abgeflacht, aber wenn es auf der linken Seite einer Aufgabe auftritt, tut es genau das, wonach dieses Problem verlangt. Um die Anforderung zu erfüllen, eine Funktion zu sein, sind einige zusätzliche Kringel erforderlich:{a←⍺⋄(∊a)←⍵⋄a}
(geschweifte Klammern für Lambda;⍺
und⍵
für linkes und rechtes Argument;⋄
für Anweisungstrennzeichen).Test auf tryapl.org. Beachten Sie, dass in APL der leere numerische Vektor mit
⍬
("zilde") bezeichnet wird. Vektoren mit einem Element werden konstruiert,(,A)
weil(A)
dies einen Skalar bedeuten würde. In der Ausgabe dieses Ding:steht für einen leeren numerischen Vektor. Die
0
in der Mitte zeigt das "prototypische Element", das kein Element des Arrays ist.quelle
(,1)
und(1)
warum wird das letzte Bit nur als[1|1]
statt dargestellt[1|[1]]
?]box on
), unterscheidet sie nicht. Es gibt eine andere Funktion in Dyalog (display
fromdfns.dws
), die eine Unterscheidung macht, aber leider schränkt tryapl das Laden zusätzlicher Arbeitsbereiche (dh Bibliotheken) ein. :(∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(∇¨⍵)']'}a
. Oder dies:∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(1↓,'|',[1.5]∇¨⍵)']'}a
wenn Sie auf dem Separator bestehen,|
.]display a
in tryapl verwenden. Es gibt vollständige Informationen über die Struktur. Entschuldigung, das habe ich zuerst nicht gemerkt.Python, 51
Beispiel:
quelle
Python 2, 50
Das war ein sehr schönes Problem. Während ich weiter daran arbeitete, bemerkte ich immer wieder, dass Teile meines Codes unnötig waren und die Logik zu einem einfachen Ausdruck zusammenfiel. Das meiste Golfspiel bestand darin, den richtigen Algorithmus zu finden.
s
ist die Struktur undv
ist die flache Liste der Liste. Die Idee ist zu überprüfen, obs
eine Ganzzahl mits<[]
(Python 2 behandelt Zahlen als kleiner als Listen). Wenn dies der Fall ist, nehmen Sie einfach das erste Element von und geben Sie es zurück, undv
entfernen Sie es ausv
. Andernfalls lesen Sie die Unterlisten vons
.Das
pop
ist ein Stück imperativer Magie in sehr funktionalem Code. Da allev
auf dieselbe Instanz verweisen, wird ein Element, das von einer Instanz abgesetzt wird, ausv
der gesamten Ausführungsstruktur entfernt, sodass jede Zahl inv
nur einmal verwendet wird. Das Listenverständnis[f(x,v)for x in s]
erstellt einen Aufrufbaum, der von links nach rechts und von unten nach unten erweitert wird, sodass die Elementev
in der richtigen Reihenfolge angeordnet werden.Ich schrieb dies unabhängig von der Antwort von grc , aber es stellte sich heraus, dass es sich um das Verschieben eines einzelnen
[
(und von Variablennamen) handelte. Die Bewegung spart ein Zeichen aufgrund des Abstands. Das Verschieben der Klammern bedeutet, dass der Knotenfall sofort in der Funktion behandelt wird und nicht als Teil des Listenverständnisses, das ich nicht berücksichtigt habe.Wir können ein Zeichen für 49 speichern, wenn wir die Eingabeanforderungen erweitern, um den Wert aus STDIN und der Struktur als Funktionsargument zu übernehmen. Dies können wir verwenden
map
.quelle
Rubin, 39
Wiederholt, bis das Element in der Liste eine Ganzzahl ist.
Da der Aufruf von Integer.map eine Ausnahme darstellt,
wird der Rettungsabschnitt aufgerufen , der das erste Element aus der zweiten Liste "herausspringt / verschiebt".
Regex-Lösung ... etwas länger:
Probieren Sie es mit einigen Testfällen
quelle
CJam,
43 37 3533 BytesDies ist eine direkte Umsetzung meiner JS-Antwort . Ein bisschen lang, das meiste davon wird von der Typenerkennung in Anspruch genommen.
Nimmt die beiden Input Arrays auf zwei Zeilen von STDIN wie
und Ausgänge zu STDOUT wie
Probieren Sie es hier online aus
quelle
Haskell,
113104 Byte (86 + 18 aus Datentypdeklaration)Haskell hat keinen eingebauten verschachtelten Array-Datentyp, daher musste ich meinen eigenen rollen. Aus diesem Grund enthält das Programm nur Pattern Matching und explizite Strukturrekursionen. Der letzte Testfall lautet
und bewertet zu
quelle
Mathematica, 41 Bytes
Dies ist eine unbenannte Funktion, die die Struktur als erstes Argument und die Werteliste als zweites Argument verwendet (und eine Liste zurückgibt).
Dies ist eine gelungene Version der akzeptierten Antwort auf die Frage, die diese Herausforderung inspiriert hat. Ich poste dies selbst und werde diese Antwort nicht akzeptieren (sollte es tatsächlich die kürzeste bleiben, was ich bezweifle). Auf diese Weise soll verhindert werden, dass jemand anderes die Herausforderung gewinnt, indem die Antwort im Grunde genommen kopiert wird.
Wie es funktioniert:
Listable
reine Funktion. Auflistbare Funktionen werden automatisch auf die Elemente eines Listenarguments (rekursiv) anstelle der Liste selbst angewendet. Wenn Sie alsof
die strukturierte Liste aufrufen, wird grundsätzlich eine Liste mit derselben Struktur zurückgegeben, wobei jede Ganzzahli
durch ersetzt wirdf[i]
.m
und einen Zähler imi
.f
(unabhängig vom Argument) geben wir das nächste Element von zurückm
.quelle
Rebol -
87 6660Ungolfed:
Beispiel:
quelle
C #,
225 + 13 = 239185 + 35 = 220172 + 35 = 207 BytesBenötigt dies:
Akzeptiert
object[]
s als Argumente.Ungolfed-Code:
quelle
using o=System.Object
indem Sieobject
einfach alle Instanzen von mit verwenden und ersetzeno
. msdn.microsoft.com/en-us/library/sf0df423.aspxClone
ist flach. Wenn Änderungen an den Eingaben zulässig sind, müssen Sie überhaupt nicht klonen. Wenn dies nicht zulässig ist, müssen Sie ordnungsgemäß klonen.Python 2, 64 Bytes
Ich habe gehört, Sie mögen Listen in Listen, also setze ich Funktionen in Funktionen.
Edit: Wenn ich mir jetzt die Antwort von grc ansehe, wird mir klar, dass das völlig unnötig war. Naja...
quelle
SWI-Prolog 82
Probelauf:
Das letzte
[]
Element in der Abfrage dient zum Überprüfen der nicht übereinstimmenden Anzahl von Elementen, was in dieser Frage nicht erforderlich zu sein scheint.quelle
is_list
) notwendig?Erlang,
11693 BytesVerwendet zwei unreine Funktionen
f
undg
.f
manipuliert das Prozesswörterbuch, indem esn
auf die flache Liste setzt und jedes Element der verschachtelten Liste zuordnetg(X)
.g
Setzt dannn
jedes Mal, wenn er auf einen Nicht-Listenwert stößt, auf das Ende der flachen Liste und gibt den Kopf der flachen Liste zurück.quelle
Perl 5, 49 Bytes
Das erste Argument ist die Vorlagenstruktur, das zweite sind die Werte.
Testprogramm
quelle
Powershell: 115
Das Eingabearray ist $ i, das Mapping ist $ m, die Ausgabe ist $ o
$ h ist eine Zeichenfolge, die die rekursive Funktion enthält, und Sie können Code ausführen, der in einer Zeichenfolge enthalten ist, mit. $ h ... Und es wäre 30 Byte kürzer, wenn Powershell nicht darauf bestehen würde, Einzelwert-Arrays auf Skalare und ein Array zu reduzieren mit einem einzelnen Nullwert auf Null
und ein praktischer Array-Struktur-Viewer zur Überprüfung der Ergebnisse
Bearbeiten: 149
als unflatten.ps1 speichern:
edit: 136, Inline-Ausgabe-Array-Erstellung und Schreibausgabe
Aufruf mit. \ unflatten.ps1 [Eingabe-Array] [Mapping-Array]
Die Ausgabe wird in die Pipeline geschrieben. Führen Sie dies zuerst aus:
und renne mit
quelle
C #, (40 + 123) = 163 Bytes ODER (67 + 81) = 148 Bytes
C # leidet hier unter seiner statischen Typisierung und langen Namespaces.
Array-Methode
Anweisungen verwenden:
Code:
Stack-Methode (verwendet die Stack-Struktur anstelle von Arrays)
Anweisungen verwenden:
Code:
Erste Versuche, erster Code Golf hier.
quelle