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
Antworten:
GolfScript, 34/21 Zeichen
(Danke @PeterTaylor für das Abschneiden von 4 Zeichen)
Online-Test
Eine kürzere Version mit 21 Zeichen funktioniert nur für Listen mit eindeutigen Elementen
Online-Test
Beide Versionen führen zu suboptimalen Lösungen.
Erklärung für die kürzere Lösung:
Dabei wird ein anderer Algorithmus verwendet als bei den meisten anderen Veröffentlichungen. Grundsätzlich wird das kleinste Element der Liste erfasst und mit zwei Umblättern nach vorne verschoben, wobei die Reihenfolge der anderen Elemente beibehalten wird.
So verschieben Sie das n-te Element nach vorne:
Dieser Vorgang wird für jedes Element in der angegebenen Reihenfolge wiederholt. Am Ende wird eine Liste mit umgekehrten Sortierungen angezeigt. Anschließend wird die gesamte Liste umgedreht, um sie vollständig sortiert zu lassen.
Tatsächlich ist der Algorithmus eine Variation einer Python-Lösung mit 90 Zeichen (meine eigene natürlich):
quelle
&
nirgendwo etwas, daher sollten Sie in der Lage sein,s
währenddessen&
das Leerzeichen zu ersetzen und zu entfernen.^
die Fibonacci-Herausforderung als Variable verwenden kannst ;) Danke für den Tipp!3 2 1
bekomme ich131211
was nicht richtig.2 1 1
nicht mehr sortiert werden.Python,
9190 ZeichenLege den größten Pfannkuchen nach oben und drehe dann den ganzen Stapel um. Den größten Pfannkuchen vom Boden nehmen und wiederholen.
i
ist der Index des größten Pfannkuchens.L=L[:i:-1]+L[:i]
drehti+1
Pfannkuchen um, drehtlen(L)
Pfannkuchen um und lässt dann den letzten Pfannkuchen fallen.quelle
print
macht die Ausgabe nicht unlesbar (1 Byte gespeichert :)Ruby 1.9 -
1098879 ZeichenViel kompaktere Version basierend auf Keiths großartiger Python-Lösung:
Originalfassung:
Wenn Sie sich nicht für falsche Operationen interessieren (Stapel der Größe 1 umkehren oder denselben Stapel zweimal hintereinander umkehren), können Sie ihn etwas kürzer machen (96 Zeichen):
Übernimmt die unsortierte Liste als Befehlszeilenargument. Anwendungsbeispiel:
quelle
GolfScript,
3129 ZeichenEine weitere GolfScript-Lösung kann auch online getestet werden .
Vorherige Version:
So funktioniert es: Es kippt den größten Eintrag nach oben und dann an die letzte Stelle in der Liste. Da es sich nun an der richtigen Position befindet, können wir es aus der Liste entfernen.
quelle
Perl,
103100 ZeichenErwartet Eingaben in der Befehlszeile.
Die gedruckten Lösungen sind ausgesprochen suboptimal. (Ich hatte vor ungefähr 24 Zeichen ein Programm mit viel schönerer Ausgabe ....)
Die Logik ist irgendwie interessant. Zunächst wird der Index jedes Elements in sortierter Reihenfolge katalogisiert. Anschließend wird dieser Katalog von rechts nach links durchlaufen. Das Anwenden eines Flip beinhaltet also das Anpassen von Indizes unterhalb des Cutoff-Werts, anstatt die Werte tatsächlich zu verschieben. Nach einigem Hin und Her konnte ich auch ein paar Zeichen speichern, indem ich beide Flips pro Iteration gleichzeitig ausführte.
quelle
Python 2 (254)
Einfache BFS-Suche, einige Sachen sind eingebettet, könnten wahrscheinlich mehr komprimiert werden, ohne den Suchstil zu ändern. Hoffentlich zeigt dies vielleicht, wie man ein bisschen Golf spielt (zu viel, um es in einem einfachen Kommentar zu beschreiben).
Verwenden:
(2 Leerzeichen = Tab)
quelle
sys.exit()
mit1/0
(in codegolf Sie nie egal , was in stderr gedruckt wird ...).print s[::-1];1/0
ein paar Zeichen rasieren.4 2 3 1
gibt2 3 2 4
, was eigentlich ungültig ist.4 2 3 1
->2 4 3 1
->3 4 2 1
->4 3 2 1
->1 2 3 4
Python2: 120
Es ist nicht effizient: Es findet nicht die beste Sortierfolge und die angegebene Sequenz kann sogar No-Ops enthalten (dh nur das erste Element spiegeln), trotzdem ist die Ausgabe gültig.
Die Ausgabe erfolgt in der Form:
Welche sollte als Folge von Flips gelesen werden:
n_1 n_2 n_3 n_4 n_5 n_6 ...
. Wenn Sie eine Ausgabe erhalten möchten, wie:n_1 n_2 n_3 n_4 n_5 n_6 ...
Fügen Sie einfach ein Komma in die
print
Anweisung ein.quelle
[:i][::-1]
->[i-1::-1]
,[:u][::-1]
->[u-1::-1]
, spart 2 ZeichenL[:i]=L[i-1::-1];L[:u]=[u-1::-1]
speichert weitere 3 ZeichenPython - 282 Zeichen
Mein allererster Code Golf; Ich bin keine Illusionen unter werde ich gewinnen , aber ich hatte viel Spaß. Es ist erschreckend zu lesen, wenn man alle Ein-Zeichen-Namen sicher angibt. Lassen Sie es mich Ihnen sagen! Dies wird über die Befehlszeile ausgeführt (Beispielimplementierung unten):
Es gibt nichts Besonderes oder Erfinderisches an der Art und Weise, wie ich das gemacht habe, aber in den FAQ wird vorgeschlagen, eine nicht-golfende Version für interessierte Leser zu veröffentlichen.
Der grundlegende Algorithmus, den ich verwendet habe, ist derjenige, der in dem Wiki-Artikel erwähnt wird, der in der Frage verlinkt ist :
quelle
t=p[:x]
t=t[::-1]
(16 + Einrückung) kann auft=p[:x][::-1]
(13) oder sogart=p[x-1::-1]
(12) reduziert werden . Inline alles, was Sie können:p=p[x-1::-1]+p[x:]
len(a)-n
wird-n
;p=p[-n-1::-1]+p[-n:]
. Weiteres Golfen mit den richtigen Operationen:p=p[~n::-1]+p[-n:]
map(int,sys.argv[1:])
das, was Ihre 6 ersten Zeilen jetzt tun .i=x=g=0
funktioniert, aber Sie sollten die Anzahl der Variablen trotzdem verringern. Ich werde Ihnen eine Sache geben aber: Das ist die eine Python - Eintrag , von dem ich am wenigsten verstehen: DC # -
264 259 252237 ZeichenVerwendet den einfachsten Algorithmus und erzeugt eine korrekte Ausgabe ohne redundante Umkehrungen. Könnte 7 Zeichen weniger bedeuten, wenn ich zulasse, dass Einsen (Nicht-Flips) in die Ausgabe einbezogen werden, aber das ist hässlich.
Ich habe mich
goto
für maximales Golfen entschieden. Außerdem wurden einige Zeichen gespeichert, indem es Nicht-Flips ausführte (aber nicht druckte).Letzte Verbesserung: Belassen Sie das Eingabe-Array als Zeichenfolge, anstatt es in Ints umzuwandeln.
Ungolfed:
Hier ist meine anfängliche Lösung, ungolfed (264 Zeichen Golf):
quelle
Haskell ,
7271 BytesProbieren Sie es online! Findet das Maximum, dreht es nach hinten und sortiert die verbleibende Liste rekursiv.
Edit: -1 Byte dank BMO
quelle
Perl 5.10 (oder höher), 66 Byte
Beinhaltet
+3
für-n
Dasuse 5.10.0
Bringen der Sprache auf Level 5.10 gilt als kostenlosMit der Eingabe als eine Zeile auf STDIN ausführen:
Sortiert die Liste, indem wiederholt eine Umkehrung gefunden wird, diese nach vorne gekippt wird, dann die Umkehrung gekippt wird und alles zurück in seine alte Position gekippt wird. Und das ist gleichbedeutend mit dem Vertauschen der Inversion, damit ich nicht umkehren muss (was bei Strings umständlich ist, da es die Ziffern der Werte umkehren würde, die z. B.
12
in konvertieren21
).quelle
C # - 229
lesbare Version
quelle