Розглянемо процес "вибору" вкладеного списку. Вибір визначається наступним чином:
- Якщо аргументом є список, візьміть елемент зі списку навмання (рівномірно) та виберіть із нього.
- Якщо аргумент не є списком, просто поверніть його.
Приклад реалізації в Python:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
Для простоти ми припускаємо, що вкладені списки містять лише цілі числа чи інші вкладені списки.
З огляду на будь-який перелік, можна створити сплющену версію, яку не відрізнити pick
, тобто вибір з неї дає ті ж результати, з однаковою ймовірністю.
Наприклад, "вирівнювання" списку
[1, 2, [3, 4, 5]]
дає список
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. Причина просто вирівнювання недійсна в тому, що елементи підсписів мають меншу ймовірність вибору, наприклад, у списку [1, [2, 3]]
1 є 2/4 = 1/2 шанс бути обраним, тоді як 3 і 4 мають 1/4 шанс кожен.
Також зауважте, що вибір зі списку однотонних еквівалентний вибору з його елемента, а вибір із порожнього списку не має жодного значення.
Змагання
Враховуючи вкладений список невід’ємних цілих чисел, поверніть сплющений перелік негативних цілих чисел, з яких добір дає ті ж результати з однаковою ймовірністю.
Це кодовий гольф , тому найкоротша відповідна відповідь (вимірюється в байтах) виграє.
Технічні умови
- Вхідні дані
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
і[2, [3, 3], [[4]]]
еквівалентні (тобто вони повинні дати рівноцінні результати). - Виходи
[2, 2, 2, 2, 3, 3, 3, 3]
і[2, 3]
еквівалентні (тобто або один може бути виведений). - Ви можете припустити, що в списках будуть присутні лише числа в межах 1-100.
- Ви можете припустити, що вхід верхнього рівня буде списком, тобто
2
не є коректним вводом. - Ви можете використовувати будь-який розумний уявлення вкладених списків, наприклад:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
і т.д. - Замість списку можна вивести мультисети або відображення, або, оскільки дозволені лише числа в діапазоні 1-100, список цілих чисел, що представляють величини.
Випробування
Зауважте, що перелічені виходи мають лише одну дійсну можливість; див. технічні характеристики того, що являє собою дійсний вхід або вихід.
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]