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