Podczas rysowania liczbami znalazłem interesującą permutację, którą można wygenerować z listy liczb. Jeśli powtórzysz tę samą permutację wystarczająco dużo razy, zawsze znajdziesz się w oryginalnej tablicy. Skorzystajmy z poniższej listy:
[1, 2, 3, 4, 5]
jako przykład
Odwróć tablicę. Teraz nasza tablica jest
[5, 4, 3, 2, 1]
Zmień kolejność (zamień) każdej pary. Nasza lista zawiera 2 pary:
[5, 4]
i[3, 2]
. Niestety nie możemy pogrupować1
pary w parę, więc zostawimy ją samą. Po zamianie każdej pary nowa tablica jest:[4, 5, 2, 3, 1]
Powtarzaj kroki 1 i 2, aż wrócimy do oryginalnej tablicy. Oto kolejne 4 kroki:
Step 2: Start: [4, 5, 2, 3, 1] Reversed: [1, 3, 2, 5, 4] Pairs Swapped: [3, 1, 5, 2, 4] Step 3: Start: [3, 1, 5, 2, 4] Reversed: [4, 2, 5, 1, 3] Pairs Swapped: [2, 4, 1, 5, 3] Step 4: Start: [2, 4, 1, 5, 3] Reversed: [3, 5, 1, 4, 2] Pairs Swapped: [5, 3, 4, 1, 2] Step 5: Start: [5, 3, 4, 1, 2] Reversed: [2, 1, 4, 3, 5] Pairs Swapped: [1, 2, 3, 4, 5] # No more steps needed because we are back to the original array
Jeśli długość listy, n jest nieparzysta, zawsze zajmie dokładnie n kroków, aby powrócić do oryginalnej tablicy. Jeśli n jest parzyste, zawsze zajmie 2 kroki, aby powrócić do pierwotnej tablicy, chyba że n wynosi 2, w takim przypadku zajmie 1 krok (ponieważ odwracanie i zamiana to to samo).
Twoim zadaniem na dziś (jeśli zdecydujesz się go zaakceptować) jest wizualizacja tego zestawu kroków dla list o dowolnej długości. Musisz napisać program lub funkcję, która przyjmuje jedną dodatnią liczbę całkowitą n jako dane wejściowe i wykonuje ten zestaw kroków dla listy [1, n]
. Musisz wydrukować każdy pośredni krok po drodze, niezależnie od tego, czy oznacza to wydrukowanie każdego kroku, czy zwrócenie ich wszystkich jako listy kroków. Nie jestem zbyt wybredna, jeśli chodzi o format wyjściowy, o ile jasne jest, że generujesz każdy krok. Oznacza to (na przykład) dowolny z tych:
Wyprowadzanie każdego kroku jako listy do STDOUT
Zwracanie listy list
Zwracanie listy reprezentacji ciągów każdego kroku
Zwracanie / wysyłanie macierzy
byłby do przyjęcia.
Musisz także wypisać oryginalną tablicę, niezależnie od tego, czy będzie to na końcu, czy na początku, tylko od Ciebie. (technicznie oba są poprawne)
Będziesz musiał poradzić sobie z przypadkiem krawędzi 2, biorąc 1 krok zamiast 2 , więc upewnij się, że twoje rozwiązanie działa z wejściem 2 (a 1 to kolejny potencjalny przypadek krawędzi).
Jak zwykle jest to gra w golfa , więc obowiązują standardowe luki i staraj się, aby twoje rozwiązanie było krótsze niż inne w wybranym języku (lub nawet spróbuj pokonać inny język, który jest zwykle krótszy niż twój, jeśli czujesz się lepiej na wyzwanie).
Przetestuj IO
1:
[1]
2:
[1, 2]
3:
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
4:
[3, 4, 1, 2]
[1, 2, 3, 4]
5:
[4, 5, 2, 3, 1]
[3, 1, 5, 2, 4]
[2, 4, 1, 5, 3]
[5, 3, 4, 1, 2]
[1, 2, 3, 4, 5]
7:
[6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 6]
[4, 6, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 7, 5]
[7, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7]
9:
[8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 8]
[6, 8, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 9, 7]
[9, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Na wszelki wypadek oto jeden gigantyczny przypadek testowy:
27:
[26, 27, 24, 25, 22, 23, 20, 21, 18, 19, 16, 17, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 11, 8, 13, 10, 15, 12, 17, 14, 19, 16, 21, 18, 23, 20, 25, 22, 27, 24, 26]
[24, 26, 22, 27, 20, 25, 18, 23, 16, 21, 14, 19, 12, 17, 10, 15, 8, 13, 6, 11, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 11, 4, 13, 6, 15, 8, 17, 10, 19, 12, 21, 14, 23, 16, 25, 18, 27, 20, 26, 22, 24]
[22, 24, 20, 26, 18, 27, 16, 25, 14, 23, 12, 21, 10, 19, 8, 17, 6, 15, 4, 13, 2, 11, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 11, 1, 13, 2, 15, 4, 17, 6, 19, 8, 21, 10, 23, 12, 25, 14, 27, 16, 26, 18, 24, 20, 22]
[20, 22, 18, 24, 16, 26, 14, 27, 12, 25, 10, 23, 8, 21, 6, 19, 4, 17, 2, 15, 1, 13, 3, 11, 5, 9, 7]
[9, 7, 11, 5, 13, 3, 15, 1, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 26, 14, 24, 16, 22, 18, 20]
[18, 20, 16, 22, 14, 24, 12, 26, 10, 27, 8, 25, 6, 23, 4, 21, 2, 19, 1, 17, 3, 15, 5, 13, 7, 11, 9]
[11, 9, 13, 7, 15, 5, 17, 3, 19, 1, 21, 2, 23, 4, 25, 6, 27, 8, 26, 10, 24, 12, 22, 14, 20, 16, 18]
[16, 18, 14, 20, 12, 22, 10, 24, 8, 26, 6, 27, 4, 25, 2, 23, 1, 21, 3, 19, 5, 17, 7, 15, 9, 13, 11]
[13, 11, 15, 9, 17, 7, 19, 5, 21, 3, 23, 1, 25, 2, 27, 4, 26, 6, 24, 8, 22, 10, 20, 12, 18, 14, 16]
[14, 16, 12, 18, 10, 20, 8, 22, 6, 24, 4, 26, 2, 27, 1, 25, 3, 23, 5, 21, 7, 19, 9, 17, 11, 15, 13]
[15, 13, 17, 11, 19, 9, 21, 7, 23, 5, 25, 3, 27, 1, 26, 2, 24, 4, 22, 6, 20, 8, 18, 10, 16, 12, 14]
[12, 14, 10, 16, 8, 18, 6, 20, 4, 22, 2, 24, 1, 26, 3, 27, 5, 25, 7, 23, 9, 21, 11, 19, 13, 17, 15]
[17, 15, 19, 13, 21, 11, 23, 9, 25, 7, 27, 5, 26, 3, 24, 1, 22, 2, 20, 4, 18, 6, 16, 8, 14, 10, 12]
[10, 12, 8, 14, 6, 16, 4, 18, 2, 20, 1, 22, 3, 24, 5, 26, 7, 27, 9, 25, 11, 23, 13, 21, 15, 19, 17]
[19, 17, 21, 15, 23, 13, 25, 11, 27, 9, 26, 7, 24, 5, 22, 3, 20, 1, 18, 2, 16, 4, 14, 6, 12, 8, 10]
[8, 10, 6, 12, 4, 14, 2, 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 27, 13, 25, 15, 23, 17, 21, 19]
[21, 19, 23, 17, 25, 15, 27, 13, 26, 11, 24, 9, 22, 7, 20, 5, 18, 3, 16, 1, 14, 2, 12, 4, 10, 6, 8]
[6, 8, 4, 10, 2, 12, 1, 14, 3, 16, 5, 18, 7, 20, 9, 22, 11, 24, 13, 26, 15, 27, 17, 25, 19, 23, 21]
[23, 21, 25, 19, 27, 17, 26, 15, 24, 13, 22, 11, 20, 9, 18, 7, 16, 5, 14, 3, 12, 1, 10, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 10, 3, 12, 5, 14, 7, 16, 9, 18, 11, 20, 13, 22, 15, 24, 17, 26, 19, 27, 21, 25, 23]
[25, 23, 27, 21, 26, 19, 24, 17, 22, 15, 20, 13, 18, 11, 16, 9, 14, 7, 12, 5, 10, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 18, 15, 20, 17, 22, 19, 24, 21, 26, 23, 27, 25]
[27, 25, 26, 23, 24, 21, 22, 19, 20, 17, 18, 15, 16, 13, 14, 11, 12, 9, 10, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
Miłej zabawy w golfa!
źródło
1 2 3 4 5
, nie1 2 4 3 5
.array[0]
na początku i na końcu procesu będzie tylko 1n = 999
. Patrząc na wzór, wydaje się, że dla każdego nieparzystego n pierwszy element idzie w1, n-1, 3, n - 3, 5, n - 5, 7...
górę don - 2, 3, n, 1
, co zawsze wykona n kroków. Nie widzę powodu, dla którego ten wzór zmieniłby się z większym n .1, n, 2, n-2, 4, n-4, 6, n-6, 8, n-8, ...
i łatwo jest wykazać przez indukcję, że element w parzystej pozycji x przesuwa się do nx po jednym kroku , a element w nieparzystej pozycji x przesuwa się do n-x + 2 . Więc jeśli n = 2k + 1 , to po 2k -tym kroku 1 będzie na 2k , a na następnym kroku na n-2k = 1 .Odpowiedzi:
TI-Basic (seria 83),
585754 bajtów (104 znaki)Wyjaśnienie
Pobiera dane wejściowe
Ans
(np. Napisz,5:prgmNAME
aby użyć list o rozmiarze pięciu).Tworzy trzy listy pomocnicze o danym rozmiarze (które są odtwarzane
ᶫB
na każdym etapie):ᶫB = ᶫC = {1,2,3,4,5,...}
iᶫD = {-1,-1,-2,-2,-3,...}
. Na każdym kroku sortujeᶫC
iᶫD
malejąco, stosując tę samą permutację doᶫA
. W przypadkuᶫC
odwraca toᶫA
, aw przypadkuᶫD
zamiany sąsiednich par, ponieważ TI-Basic używa naprawdę głupiej implementacji sortowania selekcji, dlaSortD(
której zmienia kolejność tylu identycznych elementów, jak to możliwe. Kiedy znówᶫA
jest równyᶫB
, zatrzymujemy się.Nie, poważnie, ich wbudowany algorytm sortowania jest moją drugą co do wielkości skargą na interpreter TI-Basic. (Moją największą skargą jest to, jak wiele zagnieżdżonych pętli spowalnia interpreter, ponieważ dane pętli są przechowywane w stosie, ale stos jest wyrastany z niewłaściwego końca, więc kalkulator musi przesuwać cały stos za każdym razem, gdy element jest popychany lub wyskoczył.) Ale tym razem jest to wygodne.
-1 bajt:
Pause
przechowuje wartość, doAns
której drukuje , która jest krótsza do odniesienia niżᶫA
.-3 bajty: weź dane wejściowe
Ans
źródło
Galaretka , 10 bajtów
Wypróbuj online!
Wyjaśnienie
Uwaga
Jeśli pierwotny zakres musi znajdować się na końcu, dołącz
ṙ1
do kodu 12 bajtów.źródło
05AB1E ,
1311 bajtówWypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6),
8985Edytuj 4 bajty zapisane thx @JustinMariner
Wykorzystując fakt, że gdy dowolny element znajduje się we właściwym miejscu, wszystkie elementy są.
Mniej golfa
Test
źródło
for(l=[];n;l[n-1]=n--);
: Wypróbuj online! .Mathematica, 142 bajty
źródło
JavaScript (ES6), 79 bajtów
Wyświetla listę dla każdego kroku.
Pamiętaj, że nie musimy inicjować tablicy, aby piłka się toczyła. Jeśli niezainicjowany (
x
jest niezdefiniowany), możemy użyć indeksów (parametrui
) tablicy, aby wykonać pierwszy krok:Przypadki testowe:
Pokaż fragment kodu
źródło
R
1099594797462 bajtyJeśli fakt, że kod rzuca ostrzeżenia na rzeczywiste rozwiązanie (brak ostrzeżeń, jeśli
n
wynosi 1, 3 ostrzeżenia, jeślin
są parzyste in
ostrzeżenia, jeślin
są nieparzyste), nie stanowi problemu, to następujące działanie działa podobnie do poprzedniego rozwiązania, dzięki wektorowi recykling:Wypróbuj online!
Jeszcze raz dziękuję @Giuseppe za dodatkowe 12 bajtów!
Poprzednie rozwiązanie bez ostrzeżeń o rozmiarze 94 bajtów:
Wypróbuj online!
Oryginalne rozwiązanie o wielkości 109 bajtów :
Wypróbuj online!
źródło
print
zwraca argument, dzięki czemu możemy go wykorzystać tutaj. Nie sądzę, żebym kiedykolwiek widziałencode
; to fajny sposób indeksowania!2
naembed
zmin(n,2)
?n
zamiast{}
pętli while, ponieważn
nic nie robi. :)0:n+2*1:0
jest taki sam jak1+0:n+c(1,-1)
dla -4 bajtów.any(print(...) != s)
jest równoważneany(print(...)-s)
-1 bajtowi. I jeśli możemy udowodnić, żem[1]==1
dopiero na końcu algorytmu, możemy upuścićany
, więc otrzymamywhile(print(...)-1)
i możemy usunąćs
, więc otrzymamy 62 bajty,n=scan();m=1:n;w=0:n+2*1:0;while(print(m<-rev(m)[w[w<=n]])-1)n
Japt ,
20181512 bajtówWypróbuj (
-R
flaga tylko do celów wizualizacji)1 bajt zaoszczędzony dzięki produktom ETH.
źródło
w ò mw
może byćò2n)w
Łuska , 9 bajtów
Wypróbuj online!
źródło
Rubin ,
64 57 5250 bajtówWypróbuj online!
Jak to działa:
Najpierw utwórz zakres, a następnie powtórz permutację x razy: użyj ujemnego indeksu, ale odwróć ostatni bit, więc otrzymamy sekwencję -2, -1, -4, -3 ... jeśli x jest parzysty, to się skończy cóż, jeśli nie, dodamy pozostały element na końcu. Ostatni krok: odfiltruj powtarzające się tablice (więc uwzględniamy wszystkie przypadki: x = 1, x = 2, liczby nieparzyste i parzyste)
źródło
Haskell,
7574 bajtówWypróbuj online!
g
wykonuje zamiany parami,h
jeden krok (wstecz + zmiana kolejności),!
stosuje się wielokrotnieh
(i zbiera wyniki pośrednie) aż do przywrócenia kolejności. Uwaga:!
pobiera dodatkowy, ale nieużywany parametr dodatkowy,0
aby stał się operatorem infix. Główna funkcjap
uruchamia go.Edycja: Dzięki @Angs za bajt.
źródło
0!x
zamiastf x
oszczędzać bajt - Wypróbuj online!Java 8,
215214 bajtówPróbowałem grać w golfa przy użyciu rzeczywistych tablic zamiast listy, ale zarówno odwracanie, jak i zamiana zajmują zbyt wiele bajtów. Może może być połączone w jedną pętlę (zamiast pierwszego cofania, a następnie zamiany), ale jeszcze nie rozgryź to.
Można to jednak zdecydowanie pograć w golfa.
Wyjaśnienie:
Wypróbuj tutaj.
źródło
Java (OpenJDK 8) ,
257245243226206205 bajtówWypróbuj online!
źródło
n->{java.util.Arrays x=null;int i=0,k,f,a[]=new int[n],t[]=new int[n];for(;i<n;a[i]=t[i]=++i);do{for(f=0;f<n/2;k=t[f],t[f]=t[n+~f],t[n+~f++]=k);for(k=1;k<n;t[k]=t[--k],t[k]=f,k+=3)f=t[k];System.out.println(x.toString(t));}while(!x.equals(a,t));}
( 245 bajtów ) Podsumowanie zmianjava.util.Arrays x=null;
:;n-f-1
don+~f
; usunięte wsporniki pętli; Zmieniono 2xk-1
na--k
(a także zmieniono,k+=2
abyk+=3
to zneutralizować.,f
i ponownie wykorzystująci
.for(i=0;i<n/2;k=t[i],t[i]=t[n+~i],t[n+~i++]=k);
for(i=0;i<n/2;t[i]=t[n+~i],t[n+~i++]=k)k=t[i];
MATL , 17 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Stax , 17 bajtów
Uruchom i debuguj
Wyjaśnienie
Zaskakujące, że działa tak szybko, jak działa, przetestowane do 399, zanim nie chciałem już temperować mojej przeglądarki.
źródło
JavaScript (ES6), 122 bajty
r.push(a)
można użyć zamiastr.push(b)
umieszczenia oryginalnej permutacji z przodu.źródło
Haskell , 97 bajtów
To wydaje się trochę długie :(
Wypróbuj online!
Wyjaśnienie / Niegolfowany
źródło
Ułożone , 42 bajty
Wypróbuj online!
Wykonuje podaną transformację za pomocą
periodsteps
wbudowanego. Jednak to wbudowane zwraca wszystkie elementy, które obejmują zakres danych wejściowych jako pierwszy i ostatni element. Dlatego ścinamy listę, zwracając wszystko oprócz pierwszego elementu.źródło
AWK , 123 bajty
Niezbyt ciasno, ale to najlepsze, co mogłem wymyślić.
Wypróbuj online!
źródło
Python 2 ,
16515913881 bajtówWypróbuj online!
-20 bajtów dzięki @ChasBrown . (Westchnienie, podjąłem całe wyzwanie dotyczące rozszerzonej składni krojenia)
Zaraz! GolfStorm (-57 bajtów)! Dzięki Ian Gödel, tsh i Jonathan Frech.
źródło
list(reversed(a))
próbowaća[::-1]
.' '*[2-(x<3),x][x%2]
[b,0][b==a]
->b*(a!=b)
.JavaScript, 136 bajtów
źródło