Sie müssen ein Programm oder eine Funktion schreiben, die eine verschachtelte Liste sortiert. Hier sind die Regeln zum Sortieren einer verschachtelten Liste:
Nehmen wir diese Liste als Beispiel:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Jedes Element in dieser Liste hat eine "Priorität". Ein Element zählt als Zahl oder als Unterliste. Holen Sie sich zunächst die Priorität jedes Elements in der gleichen Tiefe. Wenn ein Element nur eine Zahl ist, entspricht seine Priorität der Zahl selbst. Wenn ein Element eine Unterliste ist, ist seine Priorität die Summe aller darin enthaltenen Zahlen , ohne Unterlisten.
Die Prioritäten aller Elemente von Tiefe 1 lauten also:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Sortieren Sie jedes Element nach Priorität. Bei Stimmengleichheit müssen Sie die Reihenfolge der ursprünglichen Liste beibehalten.
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
Wiederholen Sie dies für jede Unterliste. Also auf dieser Unterliste
(2, 1, (3, 4))
Unsere Prioritäten sehen so aus:
2 1 ( 7 )
(2, 1, (3, 4))
So sortiert sieht es aus:
(1, 2, (3, 4))
(3, 4)
ist schon sortiert, also sind wir fertig. Wiederholen Sie für (5, 2)
welche Ergebnisse (2, 5)
und wir sind fertig! Unsere endgültige Liste ist:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
Regeln:
Sehr zweifelhaft, aber für den Fall, dass Mathematica etwas dafür hat, sind keine eingebauten Sortierfunktionen für verschachtelte Listen zulässig. Reguläre Sortierfunktionen sind erlaubt.
I / O kann in jedem vernünftigen Format vorliegen.
Jede Unterliste enthält mindestens eine Nummer oder Liste. Unterlisten können auch mehrere Ebenen tief verschachtelt werden. Zum Beispiel in
(1, 2, (((3))))
der(((3)))
hat eine Priorität von 0, da es nur Teil - Listen in ihm hat.Ungültige Listen (nicht übereinstimmende Klammern, Nicht-Zahlen, falsche Klammertypen, negative Zahlen usw.) führen zu undefiniertem Verhalten.
Test I / O:
(1, 2, 3) ---> (1, 2, 3)
(1, 2, 6, 3, 9, 8) ---> (1, 2, 3, 6, 8, 9)
(4, 3, (2), (1)) ---> ((1), (2), 3, 4)
(4, 3, (2), ((1))) ---> (((1)), (2), 3, 4)
(5, (1, 2, (9, 8))) ---> ((1, 2, (8, 9)), 5)
(3, (1, 2), (2, 1)) ---> (3, (1, 2), (1, 2))
(3, (1, 2, (99)), (2, 1, (34))) ---> (3, (1, 2, (99)), (1, 2, (34)))
(7, 2, (1, (9, 12)), (4, 3, 2, (1, 2))) ---> ((1, (9, 12)), 2, 7, (2, 3, (1, 2), 4))
Kürzeste Antwort in Bytes gewinnt.
quelle
Antworten:
Jelly, 13 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
Wenn Sie (
<
) eine Zahl mit sich selbst vergleichen, erhalten Sie 0 (falsch), aber wenn Sie eine nicht leere Liste mit sich selbst vergleichen, erhalten Sie eine Liste mit 0 (wahr). Sie<
können also verwendet werden, um Zahlen von Listen zu unterscheiden.quelle
Python 2,
114101787362 BytesIch wusste, dass es eine bessere Möglichkeit gibt, Listen herauszufiltern.
Sortiert eine Python-Liste (und ihre Unterlisten) an Ort und Stelle.
https://eval.in/540457 danke @tac für die Benachrichtigung, dass In-Place-Lösungen akzeptabel sind, und @xnor + @feersum für weitere Optimierungen!
quelle
k=lambda t:t*(t<[])or sum(z for z in t if[t.sort(key=k)]>z)
.z
aus dieser heraus. 5. Dann sortieren wir in der Bedingung die Liste, über die wir iterieren (!). Dies führt zu einer Summe von 10. Wir sortieren dann die äußere Liste mit diesen Schlüsseln und erhalten [6, [1, 5]], was falsch ist als "Wenn es einen Gleichstand gibt, müssen Sie die gleiche Reihenfolge wie die ursprüngliche Liste beibehalten. " Das Interessante ist, dass wirsort
beide Listen zweimal aufrufen. Dies geschieht also nur bei gleichen Schlüsseln: Wenn die Unterliste kleiner wäre, würde sie zurücksortieren.None
Ausgabe zu bleibent.sort(key=k)
, aber ich sehe es nicht.False
0 für die Zwecke+
und durch die Erweiterung,sum
. Kann mir aber nicht vorstellen, wie das Bytes spart.list.sort
kehrt zurückNone
, nichtFalse
.Lua, 172 Bytes
Die Funktion
s
sortiert eine Lua-Tabelle (eine Datenstruktur, die unter anderem in Lua als Liste dient) nach den Regeln.quelle
type(a)
ein String zurückkommtMathematica, 50 Bytes
Einfache rekursive Methode, die verwendet
SortBy
. Ignoriere die Nachrichten.quelle
Haskell,
160151135 BytesDas erste Problem sind verschachtelte Listen. Haskell setzt voraus, dass alle Elemente einer Liste denselben Typ haben. Insbesondere sind eine Ganzzahl und eine Liste von Ganzzahlen nicht vom selben Typ. Mit anderen Worten, eine Liste mit verschachtelten Variablen ist keine Liste, sondern ein Rosenbaum!
Also müssen wir zuerst einen Datentyp für Rosenbäume definieren:
(Streng genommen
deriving Show
ist nur erforderlich , wenn Sie wollen sehen , die Ergebnisse. Aber das ist eine Form .) Mit dieser Definition vorhanden ist , können wir eine Liste schreiben, wie(1, 2, (3, 4))
alsdas ist deutlich weniger lesbar. Aber was auch immer; Es ist eine triviale, maschinelle Übersetzung. Stellen Sie jeder Zahl
N
und jedem Teilbaum Folgendes voranT
.Jetzt müssen wir Prioritäten berechnen. Dies wäre einfach, wenn die Priorität eines Teilbaums einfach die Summe aller darin enthaltenen Elemente wäre. Das wäre eine triviale rekursive Schleife. Da dies jedoch nicht der Fall ist, müssen wir zwei Funktionen definieren : eine, die rekursiv ist, und eine, die nicht rekursiv ist.
Wenn wir alle Unterelemente summieren
q
würden , müssten wir nicht existieren und eine große Anzahl von Zeichen speichern. Naja!Edit: Eigentlich mehrere commentors weisen darauf hin , dass Sie vermeiden können ,
q
eine Liste Verständnis mit:[ x | N x <- t]
. Guter Anruf, Leute!(Eigentlich
p
müsste es auch nicht existieren. Der Compiler könnteOrd
in wenigen Zeichen automatisch eine Instanz für uns generieren , und diese Standardimplementierung würde der Spezifikation entsprechen.)Schließlich müssen wir über alle Unterbäume rekursiv arbeiten und sie sortieren:
Das heißt,
f
sortiert ein Baum rekursiv sich auf alle Elemente anwenden (map f
) und dann den Aufruf dersortBy
Funktion der obersten Ebene zu sortieren. Die erste Zeile besagt, dass das Sortieren einer Zahl nichts bewirkt und notwendig ist, um die Rekursion zu beenden.quelle
sortBy (\ x y -> compare (p x) (p y))
ist einfachsortOn p
. Verwenden Sie die Infix - Version der Karte inp
:sum$q<$>t
.sortOn
definiert? Ich wollte schon immer wissen ...p(T t)=sum[x|N x<-t]
unddata T=N Int|T[T]deriving Show
. :)$
insum$[x|N x<-t]
. Also 135-5-1 = 129. :)CLISP, 380 Bytes
Rufen Sie die Funktion q mit einer Liste auf.
Ich bin ein Idiot, bitte töte mich nicht ^^
quelle
Pyth, 15 Bytes
Testsuite
Eine rekursive Funktion, die wie folgt funktioniert:
quelle
Java, 219 Bytes
Mit Zeilenumbrüchen:
Es wird viel gewirkt, was die Anzahl der Bytes wirklich erhöht. : P
Ganzzahlige Werte werden in einen Komparator eingespeist, und verschachtelte Listen werden zuerst sortiert, bevor dem Komparator nur die Summe der ganzzahligen Werte übergeben wird. Mit diesen Werten bestimmt der Komparator beim Sortieren seine Position in der Liste.
Probieren Sie es hier aus .
quelle
int f(List l){l.sort(Comparator.comparing(o->o instanceof Integer?(int)o:f((List)o)));return l.stream().mapToInt(o->o instanceof Integer?(int)o:0).sum();}
Object
zu ,int
dass wie, und die Herausforderung scheint zu verlangen , dass eine Liste ausgegeben.JavaScript (ES6), 86 Byte
All das Array überprüfen :-(
quelle
map.map.map.map.map.map.map.map.map