Problem
Sie erhalten eine Folge von farbigen Kugeln (rot R
und grün G
). Eine solche mögliche Sequenz ist:
RGGGRRGGRGRRRGGGRGRRRG
In so wenigen Zügen wie möglich müssen Sie es so machen, dass jeder Ball eine andere Farbe als seine Nachbarn hat (dh die Reihenfolge wechselt).
RGRGRGRGRGRGRGRGRGRGRG
Sie sollten ein Programm schreiben, das eine ungeordnete Sequenz (in diesem Fall eine Zeichenfolge) mit der gleichen Anzahl von "R" und "G" in eine Sequenz konvertieren kann, in der sich die Elemente abwechseln. Im Folgenden finden Sie eine Beispielsitzung für einen naiven Algorithmus ( <
wird in das Programm eingegeben, >
wird ausgegeben. Es ist nicht erforderlich, die Carets in die Eingabe oder Ausgabe aufzunehmen.)
< RGGGRRGGRGRRRGGGRGRRRG
> RGGRGRGGRGRRRGGGRGRRRG
> RGRGGRGGRGRRRGGGRGRRRG
> RGRGRGGGRGRRRGGGRGRRRG
> RGRGRGGRGGRRRGGGRGRRRG
> RGRGRGGRGRGRRGGGRGRRRG
> RGRGRGGRGRGRGRGRGGRRRG
> RGRGRGGRGRGRGRGRGRGRRG
> RGRGRGGRGRGRGRGRGRGRGR
> RGRGRGRGGRGRGRGRGRGRGR
> RGRGRGRGRGGRGRGRGRGRGR
> RGRGRGRGRGRGGRGRGRGRGR
> RGRGRGRGRGRGRGGRGRGRGR
> RGRGRGRGRGRGRGRGGRGRGR
> RGRGRGRGRGRGRGRGRGGRGR
> RGRGRGRGRGRGRGRGRGRGGR
> RGRGRGRGRGRGRGRGRGRGRG (15 moves)
Eine andere Möglichkeit ist die Ausgabe von "5,7", um beispielsweise das Vertauschen der Positionen 5 und 7 anzuzeigen.
Sie können zuerst entweder Rot oder Grün positionieren und müssen nicht konsistent sein. Jede Sequenz hat die gleiche Länge wie jede andere Sequenz.
Sie dürfen in jedem Zug nur zwei beliebige Buchstaben tauschen (sie müssen nicht nebeneinander liegen.)
Gewinnkriterien
Das Programm muss jeden Schritt des Sortiervorgangs anzeigen. Das Programm, das für alle unten aufgeführten Zeichenfolgen die wenigsten Gesamtbewegungen ausführt, gewinnt. Bei einem Unentschieden gewinnt der kürzeste Code.
Eingabezeichenfolgen
Die folgenden Zeichenfolgen werden zum Testen der Programme verwendet:
GGGGGGGGGGRRRRRRRRRR
GGRRGGRRGGRRGGRRGGRR
RRGGGGRRRRGGGGRRRRGG
GRRGRGGGGRRRGGGGRRRR
GRGGGRRRRGGGRGRRGGRR
RGRGRGRGRGRGRGRGRGRG
Die letzte Sequenz sollte zu Nullbewegungen führen.
quelle
Antworten:
Python,
140122119115quelle
s
. Es würde dir noch ein paar Charaktere ersparen.APL 46
Das Ausführen der angegebenen Testfälle ergibt:
Die obige Lösung verwendet den Indexursprung 1 mit den in den Spalten der Ergebnismatrix angegebenen Swaps. Zwei Zeichen können gespeichert werden, wenn der Eingabevektor i vor der Ausführung mit der Eingabezeichenfolge initialisiert wird, anstatt zum Zeitpunkt der Ausführung eingegeben zu werden.
quelle
GolfScript (47 Zeichen)
ZB (unter Verwendung eines Testfalls, der viel einfacher auf Richtigkeit zu überprüfen ist als jeder der vorgeschlagenen, auf den alle viele richtige Antworten haben):
Die Ausgabe ist eine Liste von Paaren mit Nullindex, die ausgetauscht werden sollen.
quelle
Python, 213 Zeichen
M
findet die Bewegungen umwandeln erforderlichS
zuT
. Dies geschieht, indem wiederholt eineR
und eineG
Position außerhalb der Position gefunden und ausgetauscht wird. Wir finden dann die kürzere Bewegungssequenz, um entwederRGRG...RG
oder zu gelangenGRGR...GR
.Sollte für jede Eingabe eine optimale Abfolge von Bewegungen finden.
quelle
Mathematica 238
Code
NB:
\[Transpose]
ist ein einzelnes Zeichen, ein hochgestelltes "t" in Mathematica ]Beispiele
quelle
Mathematica 134 oder 124
Abhängig davon, wie Sie "Transponieren []" zählen, was in Mathematica nur ein Zeichen ist (hier keine Darstellung). Zur Verdeutlichung hinzugefügte Leerzeichen
Stichprobe:
Ausgabe
quelle
PadLeft[{}, 20, {y}], #, 1]
kann ein bisschen mehr komprimiert werdenJavascript - 173 Zeichen
Eine große Herausforderung, die mich einige Zeit beschäftigt hat.
Hier die Codeergebnisse für die Testfälle:
quelle
PHP - 34 Züge - 193 Zeichen
Könnte immer noch versuchen, dies zu verbessern ...
quelle
$argv[0]
stattdessen 2 Bytes pro Stück zu sparen. Und wird gültiger sein, da$argv
häufig für die Eingabe über CMD