Wenn Sie jemals Kontakt mit der japanischen oder ostasiatischen Kultur hatten, werden Sie sicherlich auf das Amidakuji-Spiel gestoßen sein:
Wie Wikipedia erklärt , handelt es sich um eine Art Lotterie, die auf Papier gezeichnet und zur zufälligen Auswahl einer Permutation von N Elementen verwendet wird.
Beispielsweise kann es verwendet werden, um N Personen zufällig eine Startsequenz zuzuweisen oder N Personen N Preise zuzuweisen und so weiter.
Der Trick , um zu verstehen , warum das Spiel eine Permutation darstellt , ist zu erkennen , dass jeder horizontaler Hub (ein „Bein“ genannt) tauscht seine beiden Elemente an ihrem Platz.
Dieselbe Wikipedia-Seite erklärt auch, dass jede Permutation P von N Elementen einer unendlichen Anzahl von Amidakuji-Diagrammen entspricht. Diejenigen mit der geringsten Anzahl horizontaler Striche (Beine) werden als "Primzahlen" dieser bestimmten Permutation P bezeichnet.
Ihre Aufgabe ist es, ein Amidakuji-Diagramm mit 2 oder mehr vertikalen Linien (in diesem Beispiel 6) in diesem Format (abzüglich der Buchstaben) zu erhalten:
A B C D E F
| | | | | |
|-| |-| |-|
| |-| |-| |
| | | | |-|
| |-| |-| |
| | |-| |-|
| | |-| | |
|-| | |-| |
|-| |-| | |
| |-| | |-|
| | | | | |
B C A D F E
Und produziere eine seiner Primzahlen (wieder abzüglich der Buchstaben):
A B C D E F
| | | | | |
|-| | | |-|
| |-| | | |
| | | | | |
B C A D F E
Die erste und letzte Zeile mit den Buchstaben sind nicht Teil des Formats. Ich habe sie hier hinzugefügt, um die Permutation zu zeigen. Es ist auch nicht erforderlich , dass die ersten oder letzten Zeilen keine Beine enthalten |-|
, noch , dass die Ausgabe möglichst kompakt sein.
Dieses spezielle Eingabebeispiel ist eine der (unendlichen) ASCII-Darstellungen des Amidakuji-Diagramms oben auf der Wikipedia-Seite.
Bei diesen ASCII-Diagrammen gibt es eine nicht offensichtliche Regel: Benachbarte Beine sind verboten.
|-|-| <- NO, this does not represent a single swap!
Wikipedia erklärt ein Standardverfahren zum Erhalten einer Primzahl aus einem Diagramm namens "Bubblization", das darin besteht, die folgenden Vereinfachungen immer wieder anzuwenden:
1) Rechte Gabel zur linken Gabel:
| |-| |-| |
|-| | -> | |-|
| |-| |-| |
2) Eliminieren von Doppel:
|-| | |
|-| -> | |
Ich bin mir nicht sicher, ob diese Erklärung eindeutig ist. Ihr Code verwendet möglicherweise diese Technik oder einen anderen Algorithmus, der die erforderlichen Primzahlen erzeugt.
Der kürzeste Code gewinnt.
Es gelten Standardregeln und Standardzulagen. (Wenn die Eingabe nicht gültig ist, kann Ihr Programm Feuer fangen. Eingabe- / Ausgabeformate können stdin / stdout, Zeichenfolgenargument, Zeilenliste, Zeichenmatrix, was auch immer für Sie am besten funktioniert, usw. sein.)