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]