Вызов:
Получив список непустых списков целых чисел, верните список кортежей следующего вида: кортежи первого списка, начинающиеся с каждого элемента первого списка, за которым следует первый элемент каждого последующего списка, так что i-й кортеж должен быть [ith element of first list, first element of second list, ... , first element of last list]
. Например:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...
Затем выполните кортежи формы [last element of first list, ith element of second list, first element of third list, ..., first element of last list]
, поэтому в нашем примере это будет:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...
Продолжайте с каждым оставшимся списком, пока не доберетесь до [last element of first list, ..., last element of second to last list, ith element of last list]
:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 6, 7], [3, 6, 8], [3, 6, 9]]
Полный вывод выглядит следующим образом:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>
[[1, 4, 7], [2, 4, 7], [3, 4, 7], [3, 5, 7], [3, 6, 7], [3, 6, 8], [3, 6, 9]]
Несколько шаблонов для хорошей меры:
- Если вы хотите, чтобы входные данные были списками строк или списками натуральных чисел, это нормально. Речь идет о манипулировании списками, а не о том, что в списках.
- Ввод и вывод могут быть в любом приемлемом формате .
- Допускается либо полная программа, либо функция.
- Стандартные лазейки по умолчанию запрещены.
- Этот вопрос относится к коду гольфа, поэтому побеждает меньшее количество байт.
Примеры:
[] => [[]] (or an error, thanks to ngn for correcting the output in this case)
[[1]] => [[1]]
[[1, 2], [3, 4], [5]] => [[1, 3, 5], [2, 3, 5], [2, 4, 5]]
[[1], [2], [5, 6], [3], [4]] => [[1, 2, 5, 3, 4], [1, 2, 6, 3, 4]]
[[1, 2, 3], [4, 5]] => [[1, 4], [2, 4], [3, 4], [3, 5]]
[[1, 2, 3], []] => unspecified behavior (can be an error)
[[3, 13, 6], [9, 2, 4], [5, 10, 8], [12, 1, 11], [7, 14]] =>
[[3, 9, 5, 12, 7], [13, 9, 5, 12, 7], [6, 9, 5, 12, 7], [6, 2, 5, 12, 7],
[6, 4, 5, 12, 7], [6, 4, 10, 12, 7], [6, 4, 8, 12, 7], [6, 4, 8, 1, 7],
[6, 4, 8, 11, 7], [6, 4, 8, 11, 14]]
[[16, 8, 4, 14, 6, 7, 10, 15], [11, 1, 12, 2, 19, 18, 9, 3], [13, 5, 17]] =>
[[16, 11, 13], [8, 11, 13], [4, 11, 13], [14, 11, 13], [6, 11, 13],
[7, 11, 13], [10, 11, 13], [15, 11, 13], [15, 1, 13], [15, 12, 13], [15, 2, 13],
[15, 19, 13], [15, 18, 13], [15, 9, 13], [15, 3, 13], [15, 3, 5], [15, 3, 17]]
Если у кого-то есть лучшее название, дайте мне знать.
[] => []
действительно должно быть,[] => [[]]
но я не могу найти слов, чтобы объяснить, почему.[[]]
потому, что существует один пустой кортеж с одной записью из каждого (нулевого) подсписка. Возможно, это слишком раздражает, чтобы программы правильно выводили это, поэтому я скажу, что в этом нет необходимости.[]
Строго говоря, Да - это пустой список непустых списков, но выходные данные неоднозначны между[]
и[[]]
если это разрешенный ввод. («Кортежи первого списка, начинающиеся с каждого элемента первого списка ...» - первого списка нет, так что мы закончили ->[]
)[]
должен быть[[]]
. Например, количество выходных кортежей - это то,sum(inner list lengths) - length of outer list + 1
что в пустом случае дает1
длина,[[]]
а не длина[]
. Это немного педантичный вопрос, хотя ...Ответы:
JavaScript (ES6), 59 байт
Ожидается список списков натуральных чисел.
Попробуйте онлайн!
Как?
На каждой итерации:
источник
a.some
трюк потрясающий!awe.some
не будет пустой тратой байтов ... :)Python 2 , 62 байта
Попробуйте онлайн!
Использование поп-идеи Часа Брауна, вдохновленной представлением Арнаулда в JS .
Python 2 , 68 байт
Попробуйте онлайн!
Изменяет первые элементы списков, чтобы сохранить нужные значения. Это
[[0,0]]+
ужасный хак для печати начальных первых значений.источник
Желе , 15 байт
Попробуйте онлайн! (нижний колонтитул отображает фактический возвращенный список, а не представление Jelly)
Как?
Указатели в декартово произведение списков в необходимых точках ...
ẈṚ’ṣ1T$¦ƬUṚị"€
(14 байт) не выполняется для входных данных с (не завершающей) длиной один список; а может бытьṣ1T$
можно заменить чем-то другим?источник
K (нгн / к) ,
40211918 байтПопробуйте онлайн!
использует идеи из ответа @ H.PWiz
{
}
функция с аргументомx
#:'
длина каждого|
обеспечить регресс!
все индексные кортежи для массива с такими измерениями как столбцы в матрице (список списков)|
обеспечить регресс+
транспонирования|\
бегущие максимумы?
уникальныйx@'/:
использовать каждый кортеж справа в качестве индексов в соответствующих списках изx
источник
Древесный уголь , 33 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Приведите целые числа к строкам перед неявной печатью, используя формат вывода по умолчанию для списков, каждый элемент которого находится на отдельной строке, а вложенные списки с двойным интервалом.
Возьмите сумму длин списков и вычтите длину списка списков. Затем цикл от 0 до этого значения включительно.
Карта по списку списков и индекс в каждом списке.
Зафиксируйте индекс до 0 и последний индекс в списке. (Закрывающие скобки подразумеваются.)
После первого списка вычтите уменьшенные длины всех предыдущих списков из крайнего индекса. (Это не работает для первого списка, потому что длина списков пуста, а сумма не является числом.)
источник
Python 2 , 72 байта
Попробуйте онлайн!
Это порт Python из Арно превосходного алгоритма Javascript «s.
источник
APL (Dyalog Classic) ,
323027 байтовПопробуйте онлайн!
полная программа, ввод с клавиатуры (
⎕
)для входных
[]
выходов[[]]
(их APL эквиваленты0⍴⊂⍬
и,⊂⍬
)предполагает уникальность чисел на входе
источник
,⊂,1
JavaScript (ES6),
5854 байтаПосле 14+ попыток проиграть мой код (удалив все экземпляры циклов while
push
иconcat
), я пришел к итерации, алгоритмически подобной ответу @ Arnauld , что неудивительно, учитывая, насколько он лаконичен!Принимает список списков натуральных чисел. Попробуйте онлайн!
58 байт
Для еще 1 байта замена
s = y.shift()
наy.shift(s = 1)
должна обрабатывать все целые числа (предположительно, поскольку я лично не проверял это).58 байт
Бонусная версия, с небольшой перестановкой:
объяснение
Ранние версии кода пытались изменить клон (массив) первых элементов каждого массива, но дополнительный шаг инициализации этого массива был дорогим ... пока я не понял, что отображение первых элементов каждого массива было примерно операция "only" необходима, если я изменяю исходные массивы.
Использует логический флаг, чтобы проверить, был ли какой-либо массив еще смещен (т.е. укорочен). В дальнейшем проверили условную проверку, наблюдая, что JS приводит массивы с числовым значением в качестве единственного элемента к этому числу, одновременно приводя массивы с несколькими значениями, такими как NaN.
источник
APL (Dyalog) , 15 байт ( SBCS )
Спасибо ngn за указание на ненужный байт
Попробуйте онлайн!
{∪⌈\,⍉⍳≢¨⍵}
генерирует списки для индексации на входе. например(1 2 3) (4 5 6) (7 8 9) -> (0 0 0) (1 0 0) (2 0 0) (2 1 0) (2 2 0) (2 2 1) (2 2 2)
≢¨⍵
: длина каждого списка во входных данных,⍉⍳
создает все комбинации чисел вплоть до его ввода. например2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)
⌈\
: сканирование с максимумом. например, приведенный выше пример будет(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)
∪
: удалить дубликаты⊃¨¨⊂
выполняет индексацию, помня о глубине любого аргументаисточник
⊆
кажется ненужным .Python 2 , 91 байт
Попробуйте онлайн!
источник