In dieser Herausforderung besteht Ihre Aufgabe darin, ein Programm zu erstellen, das ein verschachteltes Array aufnimmt und ein eindimensionales abgeflachtes Array zurückgibt. Zum Beispiel [10,20,[30,[40]],50]
sollte ausgeben [10,20,30,40,50]
.
Eingang
Die Eingabe ist ein verschachteltes Array (z. B. [10,20,[[[10]]]]
). Es enthält nur Ganzzahlen (sowohl negative als auch positive), Strings und Arrays. Sie können die Eingabe als Funktionsargument nehmen, STDIN oder was auch immer zu Ihrer Sprache passt. Sie können davon ausgehen, dass das Eingabearray kein leeres Array enthält.
Ausgabe
Die Ausgabe ist ein abgeflachtes eindimensionales Array mit den gleichen Elementen des gleichen Typs wie im verschachtelten Array und in der gleichen Reihenfolge.
Testfälle
[10,20,30] -> [10,20,30]
[[10]] -> [10]
[["Hi"],[[10]]] -> ["Hi",10]
[[[20],["Hi"],"Hi",20]] -> [20,"Hi","Hi",20]
[[["[]"],"[]"]] -> ["[]","[]"]
Fühlen Sie sich frei, um Klarstellung durch die Verwendung von Kommentaren zu bitten. Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
Hinweis: Wenn Ihre Sprache eine integrierte Funktion enthält, dürfen Sie diese NICHT verwenden.
Bearbeiten
Bitte fügen Sie auch einen Link zu einer Website hinzu, auf der Ihr Code ausgeführt werden kann.
unflatten
Frage, aber keineflatten
Frage zu PPCG gab.["[",[["[",],'[',"['['"]]
als Testfall hinzufügen .'
und"
als Begrenzer unterstützen. (Aber ich stimme zu, dass ein Testfall beteiligt[
,]
,"
und\
in einem String wäre nützlich.)Antworten:
K, 3 Bytes
Dies ist eine ziemlich verbreitete Redewendung. "Join over converge".
versuche es hier mit oK .
Wie es funktioniert:
Join (
,
) verschmilzt Atome oder Listen zu einer Liste. Over (/
) nimmt ein Verb (in diesem Fall join) und wendet es von links nach rechts zwischen den einzelnen Elementen einer Liste an. Auf diese Weise wird die Verbindung,/
alle Elemente der obersten Ebene der Liste verflachen. Das Symbol hat/
tatsächlich unterschiedliche Bedeutungen, abhängig von der Valenz (Anzahl der Argumente) des Verbs, mit dem es zusammengesetzt ist. Wenn wir,/
als Verb angeben, fungiert das Finale/
als "Konvergenz" - es wird wiederholt,/
auf die Eingabe angewendet, bis die Änderung aufhört. Einige andere Sprachen bezeichnen eine solche Funktion als "Festkomma-Kombinator". Durch wiederholtes Zusammenführen von Listen der untersten Ebene gelangen Sie schließlich zu einer einzelnen flachen Liste, und keine der Operationen stört die Reihenfolge der Elemente. Dies scheint das Problem zu lösen.quelle
JavaScript (ES6), 35 Byte
Inspiriert von @ user81655s Antwort :
quelle
Mathematica,
1614 BytesEine unbenannte Funktion, die eine Liste aufnimmt und zurückgibt, zB:
Erläuterung
Syntaktische Zuckerparty!
Um zu verstehen , wie dies funktioniert, beachten Sie, dass jeder Ausdruck in Mathematica ist entweder ein Atom (zB Zahlen, Strings, Symbole) oder eine Verbindung , Ausdruck der Form
f[a, b, c, ...]
, in derf
,a
,b
,c
sind sie beliebige Ausdrücke. Hierf
wird der Kopf des Ausdrucks genannt. Alles andere ist nur syntaktischer Zucker. ZB{a, b, c}
ist geradeList[a, b, c]
.Wir beginnen damit,
//@
welche Maps und Funktionen über alle Ebenen einer Liste hinweg funktionieren . Zum Beispiel:Beachten Sie, dass dies sowohl
f
Atome als auch zusammengesetzte Ausdrücke abbildet . Was wir jetzt suchen, ist eine Möglichkeit, die Listenköpfe loszuwerden und alles andere zu behalten.Die
Apply
Funktion wird normalerweise verwendet, um die Elemente einer Liste als separate Argumente an eine Funktion weiterzuleiten. Die eigentliche Definition ist jedoch allgemeiner und ersetzt einfach den Kopf eines Ausdrucks. ZBApply[g, f[a, b]]
gibtg[a, b]
.Jetzt gibt es einen speziellen "Kopf"
Sequence
, der einfach verschwindet. ZB{a, Sequence[b, c], d}
nur auswertet{a, b, c, d}
. Die Idee zum Reduzieren der Liste besteht darin, die Köpfe aller inneren Listen durch zu ersetzenSequence
, damit sie in ihre umgebende Liste aufgeteilt werden. Also, was wir wollen, istApply
den KopfSequence
zu den Listen. Wenn wirApply
etwas zu einem Atom machen, lässt es das Atom einfach unverändert, so dass wir überhaupt nicht zwischen Arten von Ausdrücken unterscheiden müssen.Schließlich gibt es noch ein kleines Problem:
f
Wird auch auf die äußerste Ebene angewendet, sodass auch die äußerste Ebene entfernt wirdList
, die wir nicht möchten. Der kürzeste Weg, dem entgegenzuwirken, besteht darin, das Ergebnis erneut in eine Liste zu schreiben, sodass die UmgebungSequence
sicher verschwinden kann.Beachte, dass es weder im Code
Apply
nochSequence
im Code gibt.@@
ist eine Betreiberform vonApply
und##&
ein Standard-Golftrick, um den langgezogenen Namen zu verkürzenSequence
. Wenn wir also alles ein bisschen ungolfing, bekommen wir so etwas wie:Weitere Einzelheiten dazu, wie und warum das
##&
funktioniert, finden Sie im Abschnitt "Folgen von Argumenten" in meiner Antwort auf die Mathematica-Tipps .quelle
//@
. Sehr nützlich zu wissen!//@
erfasst ein ordentliches Muster. Erinnert mich ein wenig an einige der rekursiven Kombinatoren in Joy. Haben Sie einen Link zu einer guten Referenz zu verwandten Funktionen in Mathematica? Ich bin sehr daran interessiert, explizite Rekursionen von Programmen zu berücksichtigen.Map
,MapAt
,Apply
sowieReplace
und verwandte Funktionen. Im Allgemeinen gibt es jedoch viele Funktionen, die einen optionalen levelspec- Parameter benötigen (siehe meine ursprüngliche 16-Byte-Lösung), mit dem Sie die Funktion auf mehrere / alle Ebenen gleichzeitig anwenden können.Python 2, 43 Bytes
Rekursiert in einer Liste die Elemente und verkettet die Ergebnisse. Umschließt einen String oder eine Zahl mit einer Singleton-Liste.
Leider werden in Python 2
int < list < string
Sandwicheslist
zwischen den anderen Typen bestellt , was zwei Ungleichungen zur Überprüfung erfordert. Also wird stattdessenl*0
gegen die leere Liste geprüft[]
, sonst gibst0
oder""
.quelle
Ruby,
434234 BytesRekursive Lösung. Jetzt mit Ausnahmebehandlung! (Könnte auch @akostadinov dafür danken, dass er die Veränderung inspiriert hat)
IDEOne Link
quelle
rescue
sotry
Block hat. Sie verwenden ihnbegin
stattdessen, um die Teile zu unterscheiden, nach denen Sie fangen möchten, und die Teile, nach denen Sie nicht suchen . Da Sie also den gesamten Rest des Blocks davor fangen, brauchen Sie ihn technisch nicht? Der Rest wird nur durch Leerzeichen ersetzt, da Ruby die Zeile als...inject(:+) rescue [a]
a = raise("haha") rescue 1
würde zuweisen1
zua
. It 'rescue
, wie es eine Inline gibtif
undwhile
.JavaScript (ES6), 41 Byte
quelle
Perl 6 , 24 Bytes
Erläuterung:
Prüfung:
quelle
Haskell, 43 Bytes
Haskell hat weder verschachtelte Listen mit unterschiedlichen Tiefen der Unterlisten noch gemischte Typen für die Listenelemente. Zum Verschachteln definiere ich einen benutzerdefinierten Datentyp,
D
der entweder ein Blatt istL
, das ein Element enthält, oder einen Knoten,N
der eine Liste vonD
s ist. Für die gemischten Elemente verwende ich den vordefinierten DatentypEither
, der hier zwei Typen zu einem kombiniertEither String Integer
. Der neue TypD
und die Abflachungsfunktionf
sind in der Art der Blattelemente vollständig polymorph, so dass ich mich um nichts mehr kümmern mussEither
.Anwendungsbeispiel:
f (N[N[L(Right 20)], N[L(Left "Hi")], L(Left "Hi") , L(Right 20)])
->[Right 20,Left "Hi",Left "Hi",Right 20]
.quelle
Pyth,
765 BytesProbieren Sie es online aus: Demo oder Test Suite
Natürlich gibt es auch eine eingebaute Funktion, die die Aufgabe in nur 2 Bytes erledigt:
.n
( Test Suite )quelle
G
Ich habe vergessen, dass Pyth implizit das letzte Zeichen anfügt , wenn ich es nicht schreibe.JavaScript (Firefox 30-57), 43 Byte
Nur weil ich es vermeiden konnte
concat
.quelle
[for(of)]
ist nur in Firefox 30+ verfügbar. Es wurde für ES7 vorgeschlagen, aber später fallengelassen.for(__ in __)
Perl,
3429 BytesFunktionen.
Wenn abgeflacht werden muss, um aufzulisten, wie
my @a = f(@a)
29 Bytes:Teste es auf Ideone
Wenn das Array abgeflacht werden soll
my $a = f($a)
, sind es 34 Bytes:Teste es auf Ideone .
Perl 5.22.0+, 27 Byte
Vielen Dank an Hobbs .
Wenn abgeflacht werden muss, um aufzulisten, wie
my @a = f(@a)
27 Bytes:Teste es auf JDoodle
Wenn das Array abgeflacht werden soll
my $a = f($a)
, werden 32 Bytes benötigt:Teste es auf JDoodle .
quelle
?@{f@$_}:
sollte funktionieren, anstatt?@{f(@$_)}:
zwei Bytes zu sparen.f
ist eine Funktion, weilf
noch nicht deklariert.sub f{}sub f{... f@$_ ...}
Arbeiten.ref
braucht keine parens, um zu arbeiten und spart 2 Bytes. 2. Soweit ich sehen kann,sub f{map{ref?f(@$_):$_}@_}
ist innerhalb der Regeln und 5. speichert ein anderesf
Array (nonref) als Liste, damit es dasselbe zurückgeben kann.ref
geht der Compiler davon aus, dass?
die?PATTERN?
Operation wie folgt gestartet wirdref(?PATTERN?)
. Der Compiler sucht also als Zweiter?
und löst einen Fehler aus.?PATTERN?
wurde in 5.22.0 entfernt (m?PATTERN?
funktioniert noch) und ich teste auf einer aktuellen Version. Sie können diese zwei Bytes also gewinnen, indem Sie 5.22+ angeben.Julia, 29 Bytes
Dies ist eine rekursive Aufteilung in eine Verkettungsfunktion, bis ein Fixpunkt erreicht ist. Beispiel
quelle
Netzhaut , 30 Bytes
Probieren Sie es online!(In der ersten Zeile werden nur mehrere Testfälle gleichzeitig ausgeführt.)
Retina kennt keine Arrays, Stringliterale oder Zahlen. Deshalb habe ich mich für ein "allgemeines" Eingabeformat von
[...,...]
Style-Arrays und"
-begrenzten Strings entschieden, bei denen\
innerhalb der Strings Zeichen (insbesondere"
und\
selbst) ausgeblendet werden können .Das Programm selbst vergleicht einfach entweder eine vollständige Zeichenfolge oder eine eckige Klammer und ersetzt diese, wobei
$1
Zeichenfolgen beibehalten und eckige Klammern entfernt werden. Das Limit1>
überspringt das erste Match, damit wir das Leading nicht entfernen[
. Dadurch wird jedoch das Trailing entfernt]
, sodass wir es in einer separaten Phase wieder hinzufügen.quelle
Pyke, 11 Bytes
Probieren Sie es hier aus!
Erläuterung:
Oder 7 Bytes nach einem Bugfix
Probieren Sie es hier aus!
Erläuterung:
Oder sogar 2 Bytes, wenn das Drucken nach stdout erlaubt ist (Dies könnte unter Built-Ins fallen)
Probieren Sie es hier aus!
Dies wendet die
print_newline
Funktion zutiefst auf alle nicht sequenziellen Elemente in der Eingabe an und rekursiert für sequenzielle Elemente.quelle
Java (v8)
390276 BytesNur der Vollständigkeit halber und so weiter. :) Kann nicht sagen, Java ist Code-effizient.
quelle
oaf
zuo
und ändern Sieflatten
zuf
.final
s nicht, das Ganze kann ein Lambda sein, Sie brauchen nichtpublic static
...false
mit1>2
und zusätzliche 2 Bytes können Sie erhalten , wenn Sie erklären , n , aber nicht definieren (Compiler automatisch als 0 definiert)Python, 57 Bytes
Probieren Sie es online aus: Python 2 , Python 3
Danke an Kevin Lau für den
list==type(x)
Trick.quelle
type(x)==list
ist kürzer alsisinstance(x,list)
.[`x`>'['and...
? (Das funktioniert nur in Python 2.)Rubin
Es gibt eine eingebaute
flatten
Methode.Sie können hier ausführen: http://www.tutorialspoint.com/execute_ruby_online.php
Eine 43 Bytes, aber gedacht zu teilen:
Eine 45-Byte-Antwort ist effizienter als die vorherige und die andere Ruby-Antwort:
hier ist Benchmark:
Ergebnis:
quelle
Note: If your language contains a built-in for this, then you must NOT use it
.rescue
rescue
sieht übrigens ziemlich langsam aus, wietry/catch
in javaPerl,
3934 + 1 (-p
Flag) 35 BytesEinzeiler. Inspiriert von Martin Büttner .
Teste es auf Ideone .
quelle
Clojure, 68 Bytes
mapcat
Wendet zuerst die Funktion auf jedes Element an und setzt dann die Ergebnisse zusammen. Jedes Mal, wenn es sich um eine Verschachtelungsebene handelt, geht dies verloren. Concat arbeitet nicht mit Nicht-Sequenzen, daher müssen Elemente in Vektor eingeschlossen werden, wenn sie nicht Vektor sind.Sie können es hier ausprobieren: http://www.tryclj.com
quelle
ANSI C, 193 Bytes
:-/, irgendwelche Vorschläge? Übrigens habe ich versucht, eine Online-Quelle zu finden, um dies zu kompilieren, aber die WL ist streng, damit dieser Code kompiliert werden kann. Ansonsten funktioniert es für VS und gcc.
quelle
JavaScript 20 Bytes
Das Array + Array ist gleich array.toString
quelle
a
ein Argument der Funktion. Ich werde versuchen, die Funktion jetzt zu bearbeiten.a=>
am Anfang Ihres Codes einfügen.C #, 48 Bytes
Dachte, ich würde es auch posten, da noch niemand eine C # -Lösung angegeben hat. Vorschläge willkommen!
quelle
i
initialisiert? und sind Sie sicher, dass es am[["[]"],"[]"]
Beispiel funktioniert ?i=>$"{i.Replace("[","").Replace("]","")}"
?Schläger, 63 Bytes
quelle
Java 8 165 Zeichen
Ungolfed in eine Klasse:
Diese Antwort basiert auf Jeremy Hartons Ansatz . Ich habe es an einigen Stellen geändert und eine Golf-ähnliche Version erstellt.
quelle
JavaScript, 17 Bytes
Schließlich können die Typkonvertierungen von JavaScript sinnvoll eingesetzt werden! Beachten Sie, dass dies tatsächlich ein Array ausgibt, bei der Konvertierung von Zeichenfolgen (in HTML) wird es jedoch zu einer durch Kommas getrennten Liste.
Wenn durch Kommas getrennte Listen als Ausgabe zulässig sind, gilt Folgendes:
7 Bytes
HINWEIS: Das Snippet ist aus irgendeinem Grund defekt
quelle
["["]
ich in der Konsole für Eingaben(a=>eval(
))(["["])
SyntaxError
oninput
Ereignis nur mit einembutton
Klick ändern .PHP, 73 Bytes
quelle
Attache , 14 Bytes
Probieren Sie es online!
Glücklicherweise hat Attache einen "Vektorisierungs" -Operator, der eine Funktion auf die Atome einer Liste anwendet. In diesem Fall müssen wir nur einen Schnitter mit
Reap
undSow
alle Atome des Eingangs_
mit einrichten@>
. Ich finde es ziemlich elegant.Alternativen
15 Bytes:
Fixpoint{`'^^_}
16 Bytes:
Fixpoint!&Concat
17 Bytes:
{q:=[]q&Push@>_q}
17 Bytes:
Fixpoint[&Concat]
quelle
Elixier , 74 Bytes
Erste Elixier-Antwort, damit kann wohl ein bisschen golfen werden.
Probieren Sie es online aus.
Erläuterung:
Wenn Builtins erlaubt wären, könnten dies natürlich stattdessen 25 Bytes sein :
Probieren Sie es online aus.
quelle
Gelee , 4 Bytes
Probieren Sie es online!
Erläuterung
Eingebaut
F
wäre ein Byte, wenn erlaubt.quelle
Wolfram Language (Mathematica) , 13 Byte
Probieren Sie es online!
Nicht golfen:
F[x_] := Level[x, {-1}]
wählt die Elemente der Struktur auf der letzten Ebene ihrer Baumform aus . Ich bin nicht sicher, ob dies als "Vermeiden des eingebauten" (was wäre
Flatten
) gilt.quelle