Zdefiniuj sekwencję poprzedzającą-dołączającą długości, n
która będzie permutacją liczb, 1, 2, ..., n
które można wygenerować za pomocą następującej procedury:
Zacznij od numeru
1
.Dla każdej liczby od
2
don
, umieść ten numer na początku lub na końcu sekwencji (albo prepend lub dołączenia go, stąd nazwa sekwencji).
Na przykład jest to prawidłowy sposób generowania sekwencji poprzedzającej-dołączającej o długości 4:
1
21 [beginning]
213 [end]
2134 [end]
Twoim zadaniem jest zbudowanie programu lub funkcji, która pobierze liczbę n
od 3
do 30
jako dane wejściowe, i wydrukuje lub zwróci wszystkie sekwencje długości przed dodaniem-dołączeniem w kolejności n
leksykograficznej (jeśli wyprowadzasz ciągi, a nie listy, liczby powyżej 9 będą reprezentowane jako litery a-u
, aby zachować długość łańcucha). Na przykład jest to kolejność dla n = 4
:
1234 [RRR]
2134 [LRR]
3124 [RLR]
3214 [LLR]
4123 [RRL]
4213 [LRL]
4312 [RLL]
4321 [LLL]
Zasadniczo istnieją 2 n-1 permutacje-dopisywanie długości n
.
W kodzie nie można używać żadnych wbudowanych funkcji sortujących w swoim języku. Najkrótszy program do wykonania tego w dowolnym języku wygrywa.
źródło
a-u
. Czy możemy po prostu wypisywać listy liczb?Odpowiedzi:
CJam,
22 20 1917 bajtówRozszerzenie kodu :
Jak to działa :
To jest wersja debugowania kodu:
Zobaczmy, jak to działa dla danych wejściowych
3
:Wypróbuj online tutaj
źródło
Haskell, 47 bajtów
źródło
f n=[[n:x,x++[n]]|x<-f$n-1]>>=id
(przy użyciu funkcji concat dla golfistów>>=id
).f n=[x++[n]|x<-f$n-1]++[n:x|x<-f$n-1]
,f n=map(++[n])(f$n-1)++[n:x|x<-f$n-1]
,f n=map(++[n])(f$n-1)++map(n:)(f$n-1)
,f n=(++[n])#n++(n:)#n;p#i=map p$f$i-1
Python 2, 68
Wyświetla listę list liczb.
Rozwiązanie rekurencyjne. Do
n==1
wyjścia[[1]]
. W przeciwnym razie dodajn
na początku lub na końcu wszystkich(n-1)
uprawnień. Przechowywanie wstępne powoduje, że permutacja jest leksykograficznie późniejsza niż dodawanie, więc permutacje pozostają posortowane.„Boolean”
b
koduje, czy umieścić[n]
na początku, czy na końcu. W rzeczywistości resztę listy przenosimyx
w wyrażeniux*b+[n]+x*-b
. Wstawianieb
jako-1
lub1
pozwala używać odwracania przez negowanie, ponieważ lista pomnożona przez-1
jest pustą listą.źródło
Pyth, 19 lat
Wypróbuj online tutaj
Jest to pełny program, który pobiera dane wejściowe ze standardowego wejścia.
Działa to w podobny sposób jak rozwiązanie xnor, ale generuje wartości nieco nie w porządku, więc należy je zmienić. To, co dzieje się na każdym poziomie, polega na tym, że każda poprzednia lista wartości ma nową wartość dodaną na końcu i na początku, a każda z nich jest owinięta w 2-krotki, które są zawinięte razem w listę. Na przykład pierwszy krok to:
Następnie ta lista krotek jest spakowana (a następnie sumowana w celu usunięcia listy najbardziej oddalonych). W pierwszym przypadku daje to po prostu rozpakowaną wartość z góry, ponieważ na liście jest tylko jedna wartość.
Kroki pokazujące 2-> 3:
źródło
Mathematica,
575449 bajtówPrzykład:
źródło
J, 26 bajtów
1-bajtowa poprawa dzięki FUZxxl .
źródło
,.
dla,"1
jednej postaci.Pyth
34333129Zasadniczo tłumaczenie XNOR „s Python odpowiedź . Nadal nie jestem świetny w Pyth, więc sugestie ulepszeń są mile widziane.
Definiuje funkcję
y
zwracającą listę list liczb całkowitych.Aktualizacja: Zapisano 2 bajty dzięki FryAmTheEggman .
Wyjaśnienie:
źródło
-b1
może byćtb
,[1_1)
może być,1_1
(jednak możesz po prostu upuścić nawias zamykający, ponieważ musisz tylko policzyć bajty potrzebne do wykonania funkcji, nawet jeśli nie będziesz w stanie wywołać jej bez jej zamknięcia), a ty nie trzeba zawijaćb
listy, ponieważ Pyth automatycznie konwertuje na listę podczas dodawania listy do int.[1,-1]
. Mogę zapisać bajty, aby zakodować coś tak krótkiego, szczególnie gdy upraszczasz logikę. DostajęL?]]1<b2sCm,+db+bdytb
Pure Bash, 103
Dłużej niż się spodziewałem:
źródło
JavaScript (ES6) 73
80Implementacja JavaScript fajnego rozwiązania @ Optimizer.
Rekurencyjny (73):
Iteracyjny (74):
Przetestuj w konsoli Firefox / FireBug
źródło
Moje rozwiązanie Java:
źródło
false
coś podobnego5<4
.