W sortowaniu naleśników jedyną dozwoloną operacją jest odwrócenie elementów jakiegoś prefiksu sekwencji. Albo pomyśl o stosie naleśników: wsuwamy gdzieś w stos szpatułkę i przewracamy wszystkie naleśniki nad szpachelką.
Na przykład sekwencję 6 5 4 1 2 3
można posortować, najpierw odwracając pierwsze 6
elementy (całą sekwencję), uzyskując wynik pośredni 3 2 1 4 5 6
, a następnie odwracając pierwsze 3
elementy, dochodząc do 1 2 3 4 5 6
.
Ponieważ jest tylko jedna operacja, cały proces sortowania można opisać za pomocą sekwencji liczb całkowitych, gdzie każda liczba całkowita jest liczbą elementów / naleśników, które należy uwzględnić w odwróceniu. W powyższym przykładzie sekwencja sortowania będzie 6 3
.
Kolejny przykład: 4 2 3 1
można sortować za pomocą 4 2 3 2
. Oto wyniki pośrednie:
4 2 3 1
flip 4: 1 3 2 4
flip 2: 3 1 2 4
flip 3: 2 1 3 4
flip 2: 1 2 3 4
Zadanie:
Napisz program, który pobiera listę liczb całkowitych i drukuje prawidłową sekwencję sortowania naleśników.
Lista do sortowania może być listą oddzieloną spacjami od standardowego wejścia lub argumentami wiersza poleceń. Wydrukuj listę, jednak jest to wygodne, o ile jest w pewnym stopniu czytelne.
To jest codegolf!
Edytować:
Jak powiedziałem w komentarzach, nie musisz optymalizować wyjścia (znalezienie najkrótszej sekwencji jest trudne NP ). Jednak właśnie zdałem sobie sprawę, że tanim rozwiązaniem byłoby wyrzucanie liczb losowych, dopóki nie uzyskasz pożądanego rezultatu ([nowego?] Typu bogosortu). Żadna z dotychczasowych odpowiedzi tego nie uczyniła, więc teraz deklaruję, że twój algorytm nie powinien polegać na żadnej (pseudo) losowości .
Podczas gdy wszyscy się kopacie, oto wariant bogopancakesort w Ruby 2.0 (60 znaków), aby go wcierać:
a=$*.map &:to_i
a=a[0,p(v=rand(a.size)+1)].reverse+a[v..-1]while a!=a.sort
4 3 2 1
zamiast4 2 3 1