Betrachten Sie den Vorgang des Auswählens einer verschachtelten Liste. Die Kommissionierung ist wie folgt definiert:
- Wenn es sich bei dem Argument um eine Liste handelt, nehmen Sie ein Element (gleichmäßig) zufällig aus der Liste und wählen Sie es aus.
- Wenn das Argument keine Liste ist, geben Sie es einfach zurück.
Eine Beispielimplementierung in Python:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
Der Einfachheit halber nehmen wir an, dass verschachtelte Listen nur Ganzzahlen oder weitere verschachtelte Listen enthalten.
Ausgehend von einer Liste ist es möglich, eine reduzierte Version zu erstellen, die nicht zu unterscheiden ist pick
, dh bei Auswahl derselben werden mit derselben Wahrscheinlichkeit dieselben Ergebnisse erzielt.
Zum Beispiel, "Abflachen" der Liste
[1, 2, [3, 4, 5]]
ergibt die Liste
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. Der Grund ist einfach Abflachen ungültig ist , weil Elemente der Unterlisten eine geringere Wahrscheinlichkeit wird ausgewählt haben, zB in der Liste [1, [2, 3]]
der 1 eine gewählten 2/4 = 1/2 Chance, während 3 und 4 beide ein 1/4 haben Chance für jeden.
Beachten Sie auch, dass das Auswählen aus einer Singleton-Liste dem Auswählen aus einem Element entspricht und dass das Auswählen aus einer leeren Liste keine Bedeutung hat.
Die Herausforderung
Bei einer verschachtelten Liste nichtnegativer Ganzzahlen geben Sie eine abgeflachte Liste nichtnegativer Ganzzahlen zurück, aus der Sie mit der gleichen Wahrscheinlichkeit dieselben Ergebnisse erzielen.
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort (gemessen in Bytes).
Spezifikationen
- Die Eingaben
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
und[2, [3, 3], [[4]]]
sind äquivalent (dh sie sollten äquivalente Ergebnisse liefern). - Die Ausgänge
[2, 2, 2, 2, 3, 3, 3, 3]
und[2, 3]
sind äquivalent (dh es könnte einer ausgegeben werden). - Sie können davon ausgehen, dass in den Listen nur Zahlen im Bereich von 1 bis 100 enthalten sind.
- Sie können davon ausgehen, dass die Eingabe der obersten Ebene eine Liste ist, dh
2
keine gültige Eingabe. - Sie können jede vernünftige Darstellung von verschachtelten Listen verwenden, zum Beispiel:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
etc. - Anstelle einer Liste können Sie ein Multiset oder eine Zuordnung ausgeben oder, da nur Zahlen im Bereich von 1 bis 100 zulässig sind, eine Liste mit Ganzzahlen der Länge 100, die Mengen darstellen.
Testfälle
Beachten Sie, dass die aufgelisteten Ausgaben nur eine gültige Möglichkeit sind. In den Spezifikationen ist angegeben, was eine gültige Eingabe oder Ausgabe darstellt.
format:
input -> output
[3] -> [3]
[1, [1, 1]] -> [1]
[1, [2, 3]] -> [1, 1, 2, 3]
[2, 3, [4, [5, 5, 6], 6, 7]] -> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7]
[[1, 1, 2], [2, 3, 3]] -> [1, 2, 3]
[[1, 1, 2], [2, 3, 3, 3]] -> [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]
quelle
Antworten:
Wolfram Language (Mathematica) ,
4120 BytesProbieren Sie es online! Ignorieren Sie die vielen Warnungen, am Ende klappt alles.
Wie es funktioniert
Eine Liste der Tiefe 2 , wie beispielsweise
{{1,2},{3},{4,5,6}}
,Tuples
wird die Liste generieren ,{{1,3,4},{1,3,5},{1,3,6},{2,3,4},{2,3,5},{2,3,6}}
um alle Möglichkeiten entsprechen , die von einem Element zu holen{1,2}
und ein Element aus holen{3}
und ein Element aus zu holen{4,5,6}
.Wenn wir
Flatten
dies, dann bekommen wir alle die Elemente mit den richtigen Frequenzen, da ein Element von der Kommissionierung eines von{1,2}
,{3}
oder{4,5,6}
entspricht ein Element aus allen von ihnen zu sammeln, dann die Wahl , die man zu halten.Wir
//@
wenden dies auf alle Ebenen der Eingabe an. Dabei beklagt sich Mathematica sehr, weil es Atome wie17
in verwandeltTuples[17]
, was eigentlich keine Sache sein soll. Diese vereinfachen aber später das richtige Ergebnis (Tuples
wird gerneTuples[17]
als Liste der Länge 1 behandelt, auch wenn sie einen anderen Kopf als hatList
), sodass die Beschwerde irrelevant ist.quelle
Python 2 ,
10510299 BytesProbieren Sie es online!
quelle
Gelee ,
98 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Gelee , 10 Bytes
Probieren Sie es online!
quelle
Python 2 , 128 Bytes
Probieren Sie es online!
Port meiner Gelee Antwort.
-12 danke an Jonathan Frech .
quelle
type(i)==int
kann seini*0<[]
.0<[]
... undtype(i)==list
kann seini*0>0
;)C (gcc) ,
234223 BytesProbieren Sie es online!
Erläuterung:
quelle
Python 2 ,
144139 BytesProbieren Sie es online!
quelle
JavaScript (ES6),
132131 BytesCode-Snippet anzeigen
quelle