Рассмотрим процесс «выбора» вложенного списка. Комплектация определяется следующим образом:
- Если аргумент является списком, возьмите элемент из списка случайным образом (равномерно) и выберите его.
- Если аргумент не является списком, просто верните его.
Пример реализации в 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]
источник
Ответы:
Wolfram Language (Mathematica) ,
4120 байтовПопробуйте онлайн! Не обращайте внимания на множество предупреждений, в итоге все получится.
Как это устроено
Для получения списка глубины 2 , такие как
{{1,2},{3},{4,5,6}}
,Tuples
будет генерировать список ,{{1,3,4},{1,3,5},{1,3,6},{2,3,4},{2,3,5},{2,3,6}}
соответствующие всем способы выбора элемента из{1,2}
и выбора элемента из{3}
и выбора элемента из{4,5,6}
.Если
Flatten
это, то мы получаем все элементы с правильными частотами, так как собирание элемента из одного из{1,2}
,{3}
или{4,5,6}
эквивалентно собирания элемента из всех из них, а затем выбрать один , который держать.Мы используем,
//@
чтобы применить это на всех уровнях ввода. При этом Mathematica много жалуется, потому что превращает атомы, такие как17
вTuples[17]
, что на самом деле не должно быть вещью. Но это упрощает до правильного результата позже (Tuples
его можно рассматриватьTuples[17]
как список длины 1, даже если у него есть голова, отличная отList
), поэтому жалоба не имеет значения.источник
Python 2 ,
10510299 байтПопробуйте онлайн!
источник
Желе ,
98 байтПопробуйте онлайн!
Как это устроено
источник
Желе , 10 байт
Попробуйте онлайн!
источник
Python 2 , 128 байт
Попробуйте онлайн!
Порт моего желе ответа.
-12 спасибо Джонатану Фреху .
источник
type(i)==int
может бытьi*0<[]
.0<[]
... иtype(i)==list
может бытьi*0>0
;)C (gcc) ,
234223 байтаПопробуйте онлайн!
Объяснение:
источник
Python 2 ,
144139 байтПопробуйте онлайн!
источник
JavaScript (ES6),
132131 байтПоказать фрагмент кода
источник