Кортежі, послідовно перебираючи записи в списку списків


9

Виклик:

Подаючи список непорожніх списків цілих чисел, поверніть перелік кортежів такої форми: Перші списки кортезів, починаючи з кожного елемента першого списку, а потім першого елемента кожного наступного списку, таким чином, має бути й кортеж [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]]

Якщо хтось має кращу назву, дайте мені знати.


1
У мене таке відчуття, що [] => []насправді повинно бути, [] => [[]]але не можу знайти слова, щоб пояснити, чому.
ngn

1
@ngn Ви маєте рацію, так має бути, [[]]тому що є один порожній кортеж з одним записом з кожного (нульового) списку. Напевно, це занадто прикро, щоб вимагати, щоб програми правильно виводили це, тому я скажу, що це не потрібно.
Гуд

1
Так [], строго кажучи, порожній список не порожніх списків, але вихід неоднозначний між тим, []і [[]]якщо це дозволений ввід. ("Кортежі першого списку, починаючи з кожного елемента першого списку ..." - першого списку немає, тому ми закінчили -> [])
Джонатан Аллан

1
@JonathanAllan Я зараз переконаний, що "правильний" вихід []повинен бути [[]]. Наприклад, кількість вихідних кортежів - це те, sum(inner list lengths) - length of outer list + 1що в порожньому випадку дає 1, яке є довжиною, [[]]але не довжиною []. Це трохи педантичне питання, хоча ...
Гуд

1
Чи можна вважати, що всі записи є різними? Або, ще сильніше, перестановка на 1..n, як у ваших прикладах?
xnor

Відповіді:


5

JavaScript (ES6), 59 байт

Очікує список списків натуральних чисел.

f=a=>[a.map(a=>a[0]),...a.some(a=>a[1]&&a.shift())?f(a):[]]

Спробуйте в Інтернеті!

Як?

На кожній ітерації:

  • Виводимо новий список, що складається з першого елемента кожного списку.
  • Видаляємо перший елемент першого списку, що містить щонайменше 2 елементи, і повторюємо процес. Або ми припиняємо рекурсію, якщо такого списку не існує.

1
Ця a.someхитрість приголомшлива!
ETHproductions

1
@ETHproductions Зараз шукаю виклик, коли використання awe.someне буде марною кількість байтів ... :)
Arnauld

2

Python 2 , 62 байти

lambda M:[zip(*M)[l.pop(0)*0]for l in M+[[1,1]]for _ in l[1:]]

Спробуйте в Інтернеті!

Використання поп-ідеї Часа Брауна, натхненного поданням Арнальда JS .


Python 2 , 68 байт

M=input()
for l in[[0,0]]+M:
 for x in l[1:]:l[0]=x;print zip(*M)[0]

Спробуйте в Інтернеті!

Змінює перші елементи списків, щоб утримувати потрібні значення. Це [[0,0]]+некрасивий хак для друку початкових перших значень.


2

Желе , 15 байт

ẈṚṪ×€PƊƤFQṚCịŒp

Спробуйте в Інтернеті! (підніжжя відображає фактично повернений список, а не представлення Jelly)

Як?

Індексує декартовий добуток списків у потрібних точках ...

ẈṚṪ×€PƊƤFQṚCịŒp - Link: list of lists  e.g. [[6,8,4,9],[7,1,5],[3,2]]
Ẉ               - length of each            [4,3,2]
 Ṛ              - reverse                   [2,3,4]
       Ƥ        - for each prefix:             [2]      [2,3]      [2,3,4]
      Ɗ         -   last 3 links as a monad:
  Ṫ             -     tail (pop rightmost)     2        3          4
     P          -     product (of remaining)   1        2          6
    €           -     for €ach (range tail)    [1,2]    [1,2,3]    [1,2,3,4]   
   ×            -       multiply               [1,2]    [2,4,6]    [6,12,18,24]
        F       - flatten                   [1,2,2,4,6,6,12,18,24]
         Q      - de-duplicate              [1,2,4,6,12,18,24]
          Ṛ     - reverse                   [24,18,12,6,4,2,1]
           C    - complement (1-x)          [-23,-17,-11,-5,-3,-1,0]
             Œp - Cartesian product (of the input)
                -         -> [[6,7,3],[6,7,2],[6,1,3],[6,1,2],[6,5,3],[6,5,2],[8,7,3],[8,7,2],[8,1,3],[8,1,2],[8,5,3],[8,5,2],[4,7,3],[4,7,2],[4,1,3],[4,1,2],[4,5,3],[4,5,2],[9,7,3],[9,7,2],[9,1,3],[9,1,2],[9,5,3],[9,5,2]]
            ị   - index into (1-based & modular)
                -   indexes:      -23,                                            -17,                                            -11,                                             -5,             -3,             -1,     0
                -    values: [[6,7,3],                                        [8,7,3],                                        [4,7,3],                                        [9,7,3],        [9,1,3],        [9,5,3],[9,5,2]]
                -         -> [[6,7,3],[8,7,3],[4,7,3],[9,7,3],[9,1,3],[9,5,3],[9,5,2]]

ẈṚ’ṣ1T$¦ƬUṚị"€(14 байт) не вдається для входів з (не трейлінг) довжиною одного списку; але, може, ṣ1T$можна замінити чимось іншим?


2

К (нг / к) , 40 21 19 18 байт

{x@'/:?|\+|!|#:'x}

Спробуйте в Інтернеті!

використовує ідеї з відповіді @ H.PWiz

{ } функція з аргументом x

#:' довжина кожного

| зворотний

! всі кортежі індексу для масиву з тими розмірами, як стовпці в матриці (список списків)

| зворотний

+ переносити

|\ бігові максимуми

? унікальний

x@'/: використовувати кожен кортеж праворуч як індекси у відповідних списках з x


1

Вугілля деревне , 33 байти

IE⊕ΣEθ⊖LιEθ§λ⌈⟦⁰⌊⟦⊖Lλ⁻ι∧μΣE…θμ⊖Lν

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Закиньте цілі числа до рядків перед неявним друком, використовуючи стандартний вихідний формат для списків, який є кожним елементом у власному рядку, та вкладені списки, подвійні між собою.

E⊕ΣEθ⊖Lι

Візьміть суму довжин списків і відніміть довжину списку списків. Тоді цикл від 0 до цього значення включно.

Eθ§λ

Позначайте карту над списками та індексуйте їх до кожного списку.

⌈⟦⁰⌊⟦⊖Lλ

Затисніть індекс на 0 та останній індекс у списку. (Замикаючі дужки маються на увазі.)

⁻ι∧μΣE…θμ⊖Lν

Після першого списку віднімайте зменшені довжини всіх попередніх списків від самого зовнішнього індексу. (Це не працює для першого списку, оскільки довжина списків порожня, а сума - не число.)



1

APL (Dyalog Classic) , 32 30 27 байт

1↓¨∪⊃{(⍵,¨⊃⍺),⍺,¨⍨⊢/⍵}/⌽0,⎕

Спробуйте в Інтернеті!

повна програма, введення з клавіатури ( )

для вхідних []виходів [[]](їх еквіваленти APL є 0⍴⊂⍬і ,⊂⍬)

передбачає унікальність чисел на вході


1
Не те, що це має значення для результатів, але я думаю, що вхід для другого тесту повинен бути,⊂,1
H.PWiz

@ H.PWiz це правильно, фіксовано, ура
ngn

1

JavaScript (ES6), 58 54 байти

h=(x,s)=>[x.map(y=>s|y?y[0]:s=y.shift()),...s?h(x):[]]

Після 14 і більше спроб знизити свій код (видаливши всі випадки циклів, pushі concat), я дійшов до ітерації, алгоритмічно подібної до відповіді @ Арнаульда , не дивно, враховуючи, наскільки це стислий!

Приймає список списків натуральних чисел. Спробуйте в Інтернеті!

58 байт

Ще 1 байт заміною s = y.shift()на y.shift(s = 1)має обробляти всі цілі числа (мабуть, так як я особисто не перевіряв це).

h=(x,s)=>[x.map(y=>!s/y[1]?s=y.shift():y[0]),...s?h(x):[]]

58 байт

Бонусна версія, з незначною перестановкою:

h=x=>[x.map(y=>s&&y[1]?y.shift(s=0):y[0],s=[]),...s||h(x)]

Пояснення

Ранні версії коду намагалися модифікувати клон (масив) перших елементів кожного масиву, але додатковий крок ініціалізації цього масиву був дорогим, поки я не зрозумів, що відображення перших елементів кожного масиву було приблизно операція "єдиний", необхідна, якщо я мутую вихідні масиви.

Використовує булевий прапор, щоб перевірити, чи будь-який масив зміщений (тобто скорочений). Подальша умовна перевірка далі, спостерігаючи, що JS примушує масиви зі значенням числа як єдиним елементом у це число, при цьому примусовуючи масиви з декількома значеннями як NaN.

var
h = (x, s) => 
    [
        x.map(y =>                 // map to first element of each array
            s|y                    // if s == 1 (i.e. an array has been shortened)
                                   // or the current array y has length == 1
                ? y[0]
                : s = y.shift()    // remove first element of y and set s to truthy
        ),
        ...s ? h(x) : []           // only concatenate a recurrence of the function if an array has had a value removed
    ]

1

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)

: видалити дублікати

⊃¨¨⊂ робить індексацію, пам’ятаючи про глибину будь-якого аргументу


Чудова відповідь! Ти бив мене майже на половину моїх байтів. здається непотрібним .
ngn


@ngn Ніцца, я не можу пригадати, що змусило мене подумати, що це було. Дякую!
H.PWiz

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.