Bei der Pfannkuchensortierung ist es nur zulässig, die Elemente eines Präfixes der Sequenz umzukehren. Oder stellen Sie sich einen Stapel Pfannkuchen vor: Wir legen irgendwo einen Spatel in den Stapel und drehen alle Pfannkuchen über dem Spatel um.
Zum Beispiel kann die Sequenz 6 5 4 1 2 3
sortiert werden, indem zuerst die ersten 6
Elemente (die gesamte Sequenz) umgedreht werden, um das Zwischenergebnis zu erhalten 3 2 1 4 5 6
, und dann die ersten 3
Elemente umgedreht werden, um zu gelangen 1 2 3 4 5 6
.
Da es nur eine Operation gibt, kann der gesamte Sortierprozess durch eine Folge von Ganzzahlen beschrieben werden, wobei jede Ganzzahl die Anzahl der Elemente / Pfannkuchen ist, die einen Pr-Flip enthalten sollen. Für das obige Beispiel wäre die Sortierreihenfolge6 3
.
Ein weiteres Beispiel: 4 2 3 1
Kann mit sortiert werden 4 2 3 2
. Hier sind die Zwischenergebnisse:
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
Die Aufgabe:
Schreiben Sie ein Programm, das eine Liste mit ganzen Zahlen erstellt und eine gültige Pfannkuchensortierfolge ausgibt.
Die zu sortierende Liste kann entweder eine durch Leerzeichen von stdin getrennte Liste oder Befehlszeilenargumente sein. Drucken Sie die Liste aus, aber es ist praktisch, solange sie etwas lesbar ist.
Das ist Codegolf!
Bearbeiten:
Wie ich in den Kommentaren sagte, müssen Sie die Ausgabe nicht optimieren (die kürzeste Sequenz zu finden ist NP-schwer ). Aber ich nur klar , dass eine billige Lösung wäre, Zufallszahlen zu werfen , bis Sie das gewünschte Ergebnis erhalten (a [neu?] Art von Bogosort). Keine der Antworten hat dies bisher getan, daher erkläre ich jetzt, dass Ihr Algorithmus sich nicht auf eine (Pseudo-) Zufälligkeit stützen sollte .
Hier ist eine bogopancakesort-Variante in Ruby 2.0 (60 Zeichen), um es einzureiben:
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
statt4 2 3 1