Рассмотрим процесс «выбора» вложенного списка. Комплектация определяется следующим образом:
- Если аргумент является списком, возьмите элемент из списка случайным образом (равномерно) и выберите его.
- Если аргумент не является списком, просто верните его.
Пример реализации в 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, список целых чисел длиной 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]