Problem mit erweiterbarem Zugtausch

8

Extended Train Swapping Problem

Teil 1: Normales Problem beim Zugwechsel

Beim CCC (Canadian Computing Competition) von 1996 war das erste Problem der Stufe 2 ein Problem beim Tauschen von Zügen. Sie können den Link hier besuchen . Im Wesentlichen haben Sie eine Reihe von nummerierten Zügen, und Sie möchten herausfinden, wie viele Zugwechsel Sie benötigen, um sie in Ordnung zu bringen. Mit jedem Zugwechsel können Sie zwei benachbarte Züge tauschen. Da Zugwagen in beide Richtungen fahren können, kümmert sich niemand darum, dass die Zugwagen beim Austausch in die andere Richtung weisen. Das ist ziemlich einfach; Alles was Sie tun müssen ist:

Finden Sie die Anzahl der Schritte zum Blasensortieren. Dies ist der effizienteste Sortieralgorithmus, wenn Sie nur benachbarte Elemente austauschen können

Also habe ich es mir schwerer gemacht.

Teil 2: Wie diese Herausforderung funktioniert

Im Wesentlichen können Sie jetzt mehr als nur benachbarte Züge tauschen. Mit einer längeren rotierenden Plattform können Sie die Position mehrerer Züge tauschen. Zum Beispiel mit einer rotierenden Plattform mit einer Länge von 4, kann man sowohl die inneren und äußeren Paare zugleich vertauschen, so 1 2 3 4wird 4 3 2 1. Hier einige Beispiele für verschiedene rotierende Plattformgrößen:

Length 2:
1 2 3 4 5
  ---
1 3 2 4 5

Length 3:
1 2 3 4 5
  -----
1 4 3 2 5

Length 4:
1 2 3 4 5
-------
4 3 2 1 5

Im Wesentlichen kehren Sie nur eine Unterliste des gesamten Zuges um. Zur Verdeutlichung können Sie bei jeder Bewegung nur genau die N Züge tauschen .

Teil 3: Technische Daten

Eingang

Ihre Eingabe muss zwei Dinge berücksichtigen: die Länge der rotierenden Plattform und die Reihenfolge der Zugwagen. Wenn Sie möchten, können Sie auch die Anzahl der Waggons benötigen. Die Reihenfolge der Zugwagen wird durch eine geordnete Liste von Nummern angegeben (wobei jede Nummer einen Zugwagen darstellt), sodass Sie die Eingabe als durch Leerzeichen getrennte Ganzzahlen, durch Zeilenumbrüche getrennte Ganzzahlen, als Array usw. lesen können.

Ausgabe

Sie müssen die optimale (minimale) Anzahl von Swaps ausgeben, die erforderlich sind, um alle Wagen in die Reihenfolge zu bringen 1 2 3 ... N. Wenn es keine Lösung gibt, geben Sie aus -1,No solution oder eine andere einheitliche Botschaft. Sie dürfen nicht an stderr ausgeben.

Wertung

Dies ist ein Herausforderung, daher erfolgt die Bewertung in Bytes. Die Lösung mit der niedrigsten Anzahl von Bytes zum 1. September 2016 wird akzeptiert.

Beispiele

Problem 1 Eingabe

4
2
1 3 2 4

Ausgabe

1

Erklärung
Das ist ziemlich trivial; Mit einer rotierenden Plattform der Länge 2 entspricht dies dem normalen Problem des Zugwechsels. Tauschen Sie die 2und die 3.

Problem 2 Eingabe

4
3
1 3 2 4

Ausgabe

No solution (or an equivalent consistent message).

Problem 3 Eingabe

9
3
1 4 5 6 3 8 7 2 9

Ausgabe

4

Erläuterung

1 4 5 6 3 8 7 2 9
          -----
1 4 5 6 3 2 7 8 9
      -----
1 4 5 2 3 6 7 8 9
    -----
1 4 3 2 5 6 7 8 9
  -----
1 2 3 4 5 6 7 8 9

Es gelten Standardlücken

Viel Glück!

BEARBEITEN 1 : Das Eingabeformat wurde flexibler. Danke an @Mego!
EDIT 2 : Es wurde klargestellt, dass eine rotierende Plattform der Länge 4 sowohl das innere als auch das äußere Paar austauscht. Danke an @TimmyD!
EDIT 3 : Es wurde klargestellt, dass Sie Permutationen der Länge Ngenau und höchstens machen müssen. Danke an @Zgarb!

HyperNeutrino
quelle
5
Ein so strenges Eingabeformat ist keine gute Idee. Jedes Eingabeformat sollte akzeptabel sein, solange nur die Liste der Zugwaggons (und optional die Länge dieser Liste) und die Länge des Bahnsteigs übertragen werden.
Mego
@ Mego Okay, ich werde die Änderung vornehmen.
HyperNeutrino
1
Kippt eine Plattform mit einer Länge von N genau N Züge oder höchstens N Züge?
Zgarb
1
Eine Frage kann nur 5 Tags haben. Ich habe die Array-Manipulation entfernt, weil sie so allgemein ist, dass sie praktisch nutzlos ist, und ich denke, die Frage wird durch die spezifischeren Tags, die ich hinzugefügt habe, besser beantwortet.
Peter Taylor

Antworten:

1

Perl, 120 Bytes

Beinhaltet +6 für -Xapi( -und Leerzeichen werden ebenfalls gezählt, da sowohl das -ials auch das $'im Code es unmöglich machen, die Optionen mit zu kombinieren -e)

Führen Sie die Eingabe auf STDIN und die Plattformlänge nach der -iOption aus, z

perl -Xapi3 trains.pl <<< "1 4 5 6 3 8 7 2 9"

Druckt, -2wenn keine Lösung vorhanden ist

trains.pl::

1until$_=$n++*$z{pack"W*",@F}||-!grep!$z{$_}++&&/.{$^I}(??{!\$z{$`.reverse($&).$'}})$/s,keys%z,pack"W*",1..@F;$_--

Wenn N <= 9dann können Sie 5 weitere Bytes gewinnen:

1until$_=$n++*$z{join"",@F}||-!grep!$z{$_}++&&/.{$^I}(??{!\$z{$`.reverse($&).$'}})$/,keys%z,join"",1..@F;$_--
Ton Hospel
quelle
Gut gemacht; Soweit ich getestet habe, funktioniert das! +1 & akzeptieren
HyperNeutrino