Чередующиеся последовательности представляют собой произвольное слияние некоторого количества последовательностей.
Последовательность с чередованием может быть выполнена путем добавления элементов в список один за другим из некоторого числа списков, каждый раз выбирая следующий элемент из некоторого списка. Следовательно, чередующаяся последовательность будет содержать одинаковые элементы всех списков, объединенных в порядке, согласованном со всеми списками.
Единственное чередование 1 списка - это тот же список.
Вызов
Ваша задача - создать функцию / программу, которая принимает произвольное число последовательностей и выводит все возможные чередования этих последовательностей.
Примеры
Input: [1, 2], [3, 4]
Output:
[1, 2, 3, 4]
[1, 3, 2, 4]
[1, 3, 4, 2]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
Input: [1, 2, 3, 4, 5]
Output:
[1, 2, 3, 4, 5]
Input: []
Output:
[]
Input: <nothing>
Output:
[]
(also acceptable)
Input: <nothing>
Output: <nothing>
Input: [1, 2, 3], [4, 5]
Output:
[1, 2, 3, 4, 5]
[1, 2, 4, 3, 5]
[1, 2, 4, 5, 3]
[1, 4, 2, 3, 5]
[1, 4, 2, 5, 3]
[1, 4, 5, 2, 3]
[4, 1, 2, 3, 5]
[4, 1, 2, 5, 3]
[4, 1, 5, 2, 3]
[4, 5, 1, 2, 3]
Input: [1, 2], [3, 4], [5, 6]
Output:
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 5, 4, 6]
[1, 2, 3, 5, 6, 4]
[1, 2, 5, 3, 4, 6]
[1, 2, 5, 3, 6, 4]
[1, 2, 5, 6, 3, 4]
[1, 3, 2, 4, 5, 6]
[1, 3, 2, 5, 4, 6]
[1, 3, 2, 5, 6, 4]
[1, 3, 4, 2, 5, 6]
[1, 3, 4, 5, 2, 6]
[1, 3, 4, 5, 6, 2]
[1, 3, 5, 2, 4, 6]
[1, 3, 5, 2, 6, 4]
[1, 3, 5, 4, 2, 6]
[1, 3, 5, 4, 6, 2]
[1, 3, 5, 6, 2, 4]
[1, 3, 5, 6, 4, 2]
[1, 5, 2, 3, 4, 6]
[1, 5, 2, 3, 6, 4]
[1, 5, 2, 6, 3, 4]
[1, 5, 3, 2, 4, 6]
[1, 5, 3, 2, 6, 4]
[1, 5, 3, 4, 2, 6]
[1, 5, 3, 4, 6, 2]
[1, 5, 3, 6, 2, 4]
[1, 5, 3, 6, 4, 2]
[1, 5, 6, 2, 3, 4]
[1, 5, 6, 3, 2, 4]
[1, 5, 6, 3, 4, 2]
[3, 1, 2, 4, 5, 6]
[3, 1, 2, 5, 4, 6]
[3, 1, 2, 5, 6, 4]
[3, 1, 4, 2, 5, 6]
[3, 1, 4, 5, 2, 6]
[3, 1, 4, 5, 6, 2]
[3, 1, 5, 2, 4, 6]
[3, 1, 5, 2, 6, 4]
[3, 1, 5, 4, 2, 6]
[3, 1, 5, 4, 6, 2]
[3, 1, 5, 6, 2, 4]
[3, 1, 5, 6, 4, 2]
[3, 4, 1, 2, 5, 6]
[3, 4, 1, 5, 2, 6]
[3, 4, 1, 5, 6, 2]
[3, 4, 5, 1, 2, 6]
[3, 4, 5, 1, 6, 2]
[3, 4, 5, 6, 1, 2]
[3, 5, 1, 2, 4, 6]
[3, 5, 1, 2, 6, 4]
[3, 5, 1, 4, 2, 6]
[3, 5, 1, 4, 6, 2]
[3, 5, 1, 6, 2, 4]
[3, 5, 1, 6, 4, 2]
[3, 5, 4, 1, 2, 6]
[3, 5, 4, 1, 6, 2]
[3, 5, 4, 6, 1, 2]
[3, 5, 6, 1, 2, 4]
[3, 5, 6, 1, 4, 2]
[3, 5, 6, 4, 1, 2]
[5, 1, 2, 3, 4, 6]
[5, 1, 2, 3, 6, 4]
[5, 1, 2, 6, 3, 4]
[5, 1, 3, 2, 4, 6]
[5, 1, 3, 2, 6, 4]
[5, 1, 3, 4, 2, 6]
[5, 1, 3, 4, 6, 2]
[5, 1, 3, 6, 2, 4]
[5, 1, 3, 6, 4, 2]
[5, 1, 6, 2, 3, 4]
[5, 1, 6, 3, 2, 4]
[5, 1, 6, 3, 4, 2]
[5, 3, 1, 2, 4, 6]
[5, 3, 1, 2, 6, 4]
[5, 3, 1, 4, 2, 6]
[5, 3, 1, 4, 6, 2]
[5, 3, 1, 6, 2, 4]
[5, 3, 1, 6, 4, 2]
[5, 3, 4, 1, 2, 6]
[5, 3, 4, 1, 6, 2]
[5, 3, 4, 6, 1, 2]
[5, 3, 6, 1, 2, 4]
[5, 3, 6, 1, 4, 2]
[5, 3, 6, 4, 1, 2]
[5, 6, 1, 2, 3, 4]
[5, 6, 1, 3, 2, 4]
[5, 6, 1, 3, 4, 2]
[5, 6, 3, 1, 2, 4]
[5, 6, 3, 1, 4, 2]
[5, 6, 3, 4, 1, 2]
правила
- Стандартные лазейки запрещены (дух)
- Входные данные могут быть приняты в любом приемлемом формате, например, список списков, список списков vararg, списки параметров и т. Д., При условии, что это однозначно, когда списки начинаются и заканчиваются.
- Вывод может быть в любом разумном формате, при условии, что ясно, где списки начинаются и заканчиваются. Допустимые результаты включают, но не ограничиваются:
- стандартный вывод, с одним списком на строку
- Список списков
- Итератор над списками (может быть реализован с помощью генератора, если они есть в вашем языке)
- Порядок получаемых чередований не имеет значения, однако повторных чередований быть не должно.
- Чтобы упростить повторное обнаружение, вы можете предположить, что все элементы во всех входных последовательностях являются уникальными.
- Если в качестве входных данных не указаны списки, пустой список и выходные данные не являются действительными выходными данными.
- Типы элементов в последовательностях не имеют значения. (например, все они могут быть одного типа или путаницы типов, в зависимости от того, что более удобно на вашем языке)
- Ваша программа / функция должна быть гарантированно завершена за конечное время.
- Это код-гольф , поэтому выигрывает самый короткий код для каждого языка.
[[]]
вместо того,[]
когда нам не дают списки в качестве входных данных?Ответы:
Haskell ,
847776 байтовСпасибо @Lynn за 7 байтов и @ user9549915 за байт!
Попробуйте онлайн!
источник
Python 2 ,
103927978 байтПопробуйте онлайн!
Или:
Python 3 , 73 байта
Попробуйте онлайн!
-1 путем замены
[x[0]]
сx[:1]
в соответствии с XNOR-13 байт,
бесстыдно крадя,расширяясь,[b[b==x:]for b in A]
как подсказывает ответ Нейла, вместо более длительногоenumerate
подхода.Принимает список списков в
A
качестве входных данных. Если все элементыA
пустые, то список, оцениваемый в,if
будет пустым, поэтому мы достигли конца рекурсии и можемprint
. В противном случае у нас есть список из одного или несколькихNone
; и мы возвращаемся.источник
[x[0]]
этоx[:1]
Желе , 11 байт
Попробуйте онлайн!
Как это устроено
источник
Рубин, 66 байт
Если нет непустых последовательностей, вернуть пустую последовательность. В противном случае для каждой непустой последовательности выполните рекурсивный анализ с удаленным первым элементом, а затем добавьте его в начало каждого результата. В реализации используется допущение, что элементы гарантированно будут глобально уникальными, иначе
a-[b]
потенциально можно удалить более 1 последовательности из рекурсивного вызова. Хотя, если подумать, возможно, это было бы правильное поведение, чтобы избежать дублирования вывода.Пример IO:
f[[[1,2],[3,4]]] => [[1, 3, 2, 4], [1, 3, 4, 2], [1, 2, 3, 4], [3, 1, 4, 2], [3, 1, 2, 4], [3, 4, 1, 2]]
источник
Wolfram Language (Mathematica) ,
767571 байтПопробуйте онлайн!
Наивный подход: найти все перестановки, которые являются перемежениями ввода.
объяснение
Сгладьте
<input>
и найдите все его перестановки.Найти все элементы
x
такие, что ...Замените все элементы в глубине 2 из
<input>
их соответствующей позиции вx
.Проверьте, все ли списки глубины 1 упорядочены (т.е. в порядке возрастания).
Фактическая реализация чередования, 117 байт
Попробуйте онлайн!
источник
Python 2 ,
8784 байтаПопробуйте онлайн! Порт моего JavaScript ответа. Изменить: Сохранено 3 байта благодаря @ChasBrown.
источник
sum(a,[])
наany(a)
.sum(a,[])
имеет хорошее применение в некоторых ситуациях!Haskell , 45 байт
Попробуйте онлайн!
Адаптировано из Chas Brown's Python answer .
Это
max[[]]
трюк, чтобы дать базовый случай,[[]]
когда вход содержит только[]
элементы. В этом случае список используется для пустых, рекурсивных пуст иmax[[]][]
дает[[]]
.При повторении, вместо выборочного удаления первого элемента выбранного списка
h:t
, мы создаем новый список сt
фронтом иh:t
отфильтровываем.источник
JavaScript (Firefox 30-57), 92 байта
источник
Japt
-Q
, 14 байтПринимает ввод в виде массива массивов.
-Q
делает вывод сохранить запись массива.Попробуй это здесь.
источник
Scala: (не предназначен быть минимальным, более четким справочным ресурсом)
Попробуйте онлайн!
источник