Kręci się, przechodząc kolejno przez wpisy na liście list

9

Wyzwanie:

Biorąc pod uwagę listę niepustych list liczb całkowitych, zwróć listę krotek o następującej formie: Krotki pierwszej listy zaczynające się od każdego elementu pierwszej listy, a następnie pierwszy element każdej kolejnej listy, więc powinna być i-ta krotka [ith element of first list, first element of second list, ... , first element of last list]. Na przykład:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...

Następnie wykonaj krotki formularza [last element of first list, ith element of second list, first element of third list, ..., first element of last list], więc w naszym przykładzie byłoby to:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>  ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...

Kontynuuj z każdą pozostałą listą, aż dojdziesz do [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]]

Pełna wydajność jest następująca:

[[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]]

Niektóre płyty kotła dla dobrego pomiaru:

  • Jeśli chcesz, aby dane wejściowe były listami ciągów lub listami liczb całkowitych dodatnich, nie ma problemu. Pytanie dotyczy manipulacji listami, a nie tego, co jest na listach.
  • Dane wejściowe i wyjściowe mogą być w dowolnym akceptowalnym formacie .
  • Dozwolony jest pełny program lub funkcja.
  • Standardowe luki są domyślnie niedozwolone.
  • To pytanie dotyczy kodu golfowego, więc wygrywa najmniej bajtów.

Przykłady:

[] => [[]] (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]]

Jeśli ktoś ma lepszy tytuł, daj mi znać.

kaptur
źródło
1
Mam wrażenie, że [] => []tak powinno być, [] => [[]]ale nie mogę znaleźć słów, które mogłyby wyjaśnić, dlaczego.
ngn
1
@ngn Masz rację, powinno być tak, [[]]ponieważ istnieje jedna pusta krotka z jednym wpisem z każdej z (zerowych) list podrzędnych. Prawdopodobnie jest to zbyt denerwujące, aby wymagać od programów poprawnego wyświetlania tego, więc powiem, że nie jest to konieczne.
Hood
1
Tak [], ściśle mówiąc, jest pustą listą niepustych list, ale dane wyjściowe są niejednoznaczne pomiędzy []i [[]]jeśli jest to dozwolone wejście. („Krotki pierwszej listy zaczynające się od każdego elementu pierwszej listy ...” - nie ma pierwszej listy, więc gotowe -> [])
Jonathan Allan
1
@JonathanAllan Jestem teraz przekonany, że „poprawne” wyjście []powinno być [[]]. Na przykład liczba krotek wyjściowych jest liczbą, sum(inner list lengths) - length of outer list + 1która w pustym przypadku daje 1, która jest długością, [[]]ale nie długością []. Jest to jednak trochę pedantyczny problem ...
Hood
1
Czy możemy założyć, że wszystkie wpisy są różne? Lub, ściślej, permutacja na 1 .. jak w twoich przykładach?
xnor

Odpowiedzi:

5

JavaScript (ES6), 59 bajtów

Oczekuje listy dodatnich liczb całkowitych.

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

Wypróbuj online!

W jaki sposób?

Przy każdej iteracji:

  • Tworzymy nową listę składającą się z pierwszego elementu każdej listy.
  • Usuwamy pierwszy element z pierwszej listy zawierającej co najmniej 2 elementy i powtarzamy proces. Lub zatrzymamy rekursję, jeśli taka lista nie istnieje.
Arnauld
źródło
1
Ta a.somesztuczka jest niesamowita!
ETHprodukcje
1
@ETHproductions Teraz szukamy wyzwania, w którym używanie awe.somenie byłoby marnotrawstwem bajtów ... :)
Arnauld
2

Galaretka , 15 bajtów

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

Wypróbuj online! (stopka wyświetla rzeczywistą zwróconą listę zamiast reprezentacji galaretki)

W jaki sposób?

Indeksy do kartezjańskiego produktu list w wymaganych punktach ...

ẈṚṪ×€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 bajtów) kończy się niepowodzeniem dla danych wejściowych o (nie końcowej) długości jednej liście; ale może ṣ1T$może być zastąpiony czymś innym?

Jonathan Allan
źródło
2

K (ngn / k) , 40 21 19 18 bajtów

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

Wypróbuj online!

wykorzystuje pomysły z odpowiedzi @ H.PWiz

{ } funkcja z argumentem x

#:' długość każdego

| odwrócić

! wszystkie krotki indeksu dla tablicy o tych wymiarach jak kolumny w macierzy (lista list)

| odwrócić

+ transponować

|\ bieganie maksima

? wyjątkowy

x@'/: użyj każdej krotki po prawej jako indeksów na odpowiednich listach od x

ngn
źródło
1

Węgiel drzewny , 33 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Rzucaj liczby całkowite na łańcuchy przed niejawnym drukowaniem przy użyciu domyślnego formatu wyjściowego list, czyli każdego elementu w osobnej linii, a listy zagnieżdżone w podwójnych odstępach.

E⊕ΣEθ⊖Lι

Weź sumę długości list i odejmij długość listy list. Następnie zapętlić od 0 do tej wartości włącznie.

Eθ§λ

Mapuj listę list i indeksuj do każdej listy.

⌈⟦⁰⌊⟦⊖Lλ

Zablokuj indeks na 0 i ostatni indeks na liście. (Sugerowane są nawiasy zamykające.)

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

Po pierwszej liście odejmij zmniejszone długości wszystkich poprzednich list od indeksu najbardziej zewnętrznego. (To nie działa dla pierwszej listy, ponieważ długość list jest pusta, a suma nie jest liczbą.)

Neil
źródło
1

Python 2 , 72 bajty

f=lambda a:zip(*a)[:1]+(any(len(u)>1and u.pop(0)for u in a)and f(a)or[])

Wypróbuj online!

To jest port Pythona w doskonałym algorytmie JavaScript Arnaulda .

Chas Brown
źródło
1

APL (Dyalog Classic) , 32 30 27 bajtów

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

Wypróbuj online!

kompletny program, dane wejściowe są z klawiatury ( )

dla []wyjść wejściowych [[]](ich odpowiednikami APL są 0⍴⊂⍬i ,⊂⍬)

zakłada unikalność liczb na wejściu

ngn
źródło
1
Nie znaczy to, że ma to wpływ na wynik, ale myślę, że dane wejściowe do drugiego testu powinny być,⊂,1
H.PWiz
@ H.PWiz to prawda, poprawione, na zdrowie
ngn
1

JavaScript (ES6), 58 54 bajtów

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

Po ponad 14 próbach gry w golfa w dół (usuwając wszystkie wystąpienia pętli while pushi concat), doszedłem do iteracji algorytmicznie podobnej do odpowiedzi @ Arnauld , co nie jest zaskakujące, biorąc pod uwagę, jak zwięzła jest!

Akceptuje listę list liczb całkowitych dodatnich. Wypróbuj online!

58 bajtów

Dla 1 bajt, zastępując s = y.shift()ze y.shift(s = 1)powinien obsługiwać wszystkie liczby całkowite (prawdopodobnie, bo nie testowałem go osobiście).

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

58 bajtów

Wersja premiowa z niewielkimi zmianami:

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

Wyjaśnienie

Wczesne wersje kodu próbowały zmodyfikować klon (tablicy) pierwszych elementów każdej tablicy, ale dodatkowy krok inicjalizacji tej tablicy był kosztowny ... dopóki nie zdałem sobie sprawy, że mapowanie pierwszych elementów każdej tablicy „jedyna” operacja konieczna, jeśli zmutuję oryginalne tablice.

Używa flagi logicznej, aby sprawdzić, czy jakakolwiek tablica została już przesunięta (tj. Skrócona). Odwrócił się dalej od sprawdzania warunkowego, obserwując, że JS wymusza tablice z wartością liczbową jako jedynym elementem do tej liczby, jednocześnie zmuszając tablice z wieloma wartościami jako 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
    ]
nadmiar
źródło
1

APL (Dyalog) , 15 bajtów ( SBCS )

Dzięki ngn za wskazanie niepotrzebnego bajtu

{∪⌈\,⍉⍳≢¨⍵}⊃¨¨⊂

Wypróbuj online!

{∪⌈\,⍉⍳≢¨⍵}generuje listy do indeksowania na wejściu. na przykład(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)

≢¨⍵: długość każdej listy na wejściu

,⍉⍳tworzy wszystkie kombinacje liczb aż do wejścia. na przykład2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)

⌈\: skanowanie z maksimum. np. powyższy przykład byłby teraz(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)

: usuń duplikaty

⊃¨¨⊂ dokonuje indeksowania, pamiętając o głębokości każdego argumentu

H.PWiz
źródło
Świetna odpowiedź! Pobiłeś mnie o prawie połowę moich bajtów. wydaje się niepotrzebne .
ngn
@ngn Fajnie, nie pamiętam, co mnie skłoniło do myślenia. Dzięki!
H.PWiz
0

Python 2 , 91 bajtów

f=lambda a,p=():a and[p+(q,)+zip(*a)[0][1:]for q in a[0][p>():]]+f(a[1:],p+(a[0][-1],))or[]

Wypróbuj online!

Chas Brown
źródło