Przeplecione sekwencje reprezentują dowolne łączenie pewnej liczby sekwencji.
Przeplecioną sekwencję można utworzyć, dodając elementy do listy jeden po drugim z pewnej liczby list, wybierając za każdym razem następny element z jakiejś listy. Dlatego sekwencja przeplatana będzie zawierać dokładnie te same elementy wszystkich list razem, w kolejności zgodnej ze wszystkimi listami.
Jedynym przeplotem 1 listy jest ta sama lista.
Wyzwanie
Wyzwanie polega na utworzeniu funkcji / programu, który pobierze dowolną liczbę sekwencji i wyświetli wszystkie możliwe przeplatania tych sekwencji.
Przykłady
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]
Zasady
- Standardowe luki zabronione (duh)
- Dane wejściowe można przyjmować w dowolnym rozsądnym formacie, np. Lista list, lista vararg list, lista parametrów itp., O ile nie jest jednoznaczne, gdzie listy zaczynają się i kończą.
- Dane wyjściowe mogą być w dowolnym rozsądnym formacie, o ile jest jasne, gdzie listy zaczynają się i kończą. Prawidłowe dane wyjściowe obejmują między innymi:
- standardowe, z jedną listą w wierszu
- Lista list
- Iterator list (może być zaimplementowany z generatorem, jeśli Twój język je posiada)
- Kolejność uzyskanych przeplotów nie ma znaczenia, jednak nie powinno być żadnych powtarzających się przeplotów.
- Aby uprościć wykrywanie powtarzania, możesz założyć, że wszystkie elementy we wszystkich sekwencjach wejściowych są unikalne.
- Jeśli jako dane wejściowe nie podano żadnych list, zarówno pusta lista, jak i brak danych wyjściowych są prawidłowymi danymi wyjściowymi.
- Rodzaje elementów w sekwencji nie mają znaczenia. (np. wszystkie mogą być jednym typem lub mieszanką typów, w zależności od tego, który z nich jest wygodniejszy w Twoim języku)
- Twój program / funkcja musi mieć zagwarantowane zakończenie w określonym czasie.
- To jest golf golfowy , więc wygrywa najkrótszy kod dla każdego języka.
[[]]
zamiast,[]
gdy nie otrzymujemy żadnych list jako danych wejściowych?Odpowiedzi:
Haskell ,
847776 bajtówDzięki @Lynn za 7 bajtów i @ user9549915 za bajt!
Wypróbuj online!
źródło
Python 2 ,
103927978 bajtówWypróbuj online!
Lub:
Python 3 , 73 bajty
Wypróbuj online!
-1 przez zastąpienie zgodnie
[x[0]]
z xnorx[:1]
-13 bajtów przez
bezwstydne kradzieżrozwijania,[b[b==x:]for b in A]
jak sugeruje odpowiedź Neila, zamiast dłuższegoenumerate
podejścia.Pobiera na
A
wejściu listę list . Jeśli wszystkie elementyA
są puste, lista oceniona wif
będzie pusta, więc doszliśmy do końca rekurencji i możemyprint
. W przeciwnym razie mamy listę jednego lub więcejNone
; i wracamy.źródło
[x[0]]
jestx[:1]
Galaretka , 11 bajtów
Wypróbuj online!
Jak to działa
źródło
Rubin, 66 bajtów
Jeśli nie ma niepustych sekwencji, zwróć pustą sekwencję. W przeciwnym razie dla każdej niepustej sekwencji powtórz z pierwszym elementem usuniętym, a następnie dodaj go na początku każdego wyniku. W implementacji przyjęto założenie, że elementy są globalnie unikalne, w przeciwnym razie
a-[b]
mogłoby potencjalnie usunąć więcej niż 1 sekwencję z wywołania rekurencyjnego. Mimo refleksji, być może byłoby to właściwe zachowanie, aby uniknąć powielania wyników.Przykład 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]]
źródło
Wolfram Language (Mathematica) ,
767571 bajtówWypróbuj online!
Naiwne podejście: znajdź wszystkie permutacje, które są przeplotem danych wejściowych.
Wyjaśnienie
Spłaszcz
<input>
i znajdź wszystkie jego permutacje.Znajdź wszystkie elementy
x
, które ...Wymień wszystkie elementy na głębokości-2
<input>
z odpowiednią pozycją wx
.Sprawdź, czy wszystkie listy głębokości-1 są uporządkowane (tzn. W porządku rosnącym).
Rzeczywista implementacja przeplatania, 117 bajtów
Wypróbuj online!
źródło
Python 2 ,
8784 bajtówWypróbuj online! Port mojej odpowiedzi JavaScript. Edycja: Zapisano 3 bajty dzięki @ChasBrown.
źródło
sum(a,[])
wany(a)
.sum(a,[])
ma jednak dobre zastosowanie w niektórych sytuacjach!Haskell , 45 bajtów
Wypróbuj online!
Na podstawie odpowiedzi Pytona Chasa Browna .
max[[]]
Trik dać bazowego przypadku[[]]
gdy wejście zawiera tylko[]
elementy. W takim przypadku lista używana do pustego, cyklicznego jest pusta imax[[]][]
daje[[]]
.Podczas rekurencji, zamiast selektywnego upuszczania pierwszego elementu wybranej listy
h:t
, tworzymy nową listę zt
przodu ih:t
odfiltrowujemy.źródło
JavaScript (Firefox 30-57), 92 bajty
źródło
Japt
-Q
, 14 bajtówPobiera dane wejściowe jako tablicę tablic.
-Q
sprawia, że dane wyjściowe zachowują notację tablicową.Wypróbuj tutaj.
źródło
Scala: (nie ma być minimalny, bardziej przejrzysty zasób referencyjny)
Wypróbuj online!
źródło