Betrachten Sie ein Raster aus N
x N
eindeutigen Elementen. Jedes Element hat einen Buchstaben (von A bis N
einschließlich th) und eine Zahl (von 1 bis N
einschließlich). Daher befindet sich jedes Zahlen- / Buchstabenpaar genau einmal im Raster.
Ihre Aufgabe ist es, ein Raster so anzuordnen, dass:
Jede Zeile, Spalte und Diagonale (einschließlich Umbruch) enthält jeden Buchstaben und jede Zahl genau einmal.
Mit Wickeln meine ich das
* * * # *
* * # * *
* # * * *
# * * * *
* * * * #
ist eine Diagonale, zusammen mit allen ähnlichen Diagonalen, die die Kanten treffen.
Ein Beispielraster 5x5
ist:
A1 B2 C3 D4 E5
C4 D5 E1 A2 B3
E2 A3 B4 C5 D1
B5 C1 D2 E3 A4
D3 E4 A5 B1 C2
Ihre Aufgabe ist es, ein Programm zu schreiben, das eine Zahl akzeptiert N
, und ein N
x- N
Raster wie oben beschrieben zu drucken . Ihr Programm sollte für jeden funktionieren 0 < N <= 26
. Wenn ein bestimmtes Raster nicht möglich ist, sollten Sie drucken Impossible
.
Das Hardcodieren der Antwort für eine N
ist nicht erlaubt. Ein Programm ist fest codiert, wenn es das Raster auf unterschiedliche Weise (wie von mir beurteilt) für eines N > 26
berechnet (oder wenn es nicht berechnet werden kann). (Dies soll eine Vorberechnung verhindern, einschließlich vorberechneter ungültiger Gitter oder Offsets für bestimmte Gitter).
Dies ist ein Problem mit dem schnellsten Code, und Ihre Punktzahl ist die Summe der Zeiten, die benötigt wurden, um Ihr Programm auf allen möglichen N
Computern auf meinem Computer auszuführen . Bitte lassen Sie in Ihrer Antwort Ihr Programm über alle laufen N
(ich muss es also nur einmal zeitlich festlegen). Wenn kein Programm es in weniger als 60 Sekunden berechnen kann, ist der Gewinner die Antwort, die das Raster mit dem größten N
in 60 Sekunden berechnen kann . Wenn mehrere Programme das gleiche Maximum haben N
, ist der Tiebreaker die schnellste Lösung.
(Ich habe einen Windows 8-Computer mit anständiger Stromversorgung, und alle erforderlichen Compiler oder Interpreter müssen dafür frei verfügbar sein.)
quelle
Antworten:
Python 3
Wie es funktioniert?
Die naive Implementierung würde darin bestehen, alle möglichen Anordnungen von Buchstaben und Zahlen in einem NxN-Raster zu durchsuchen und nach einem zu suchen, das auch ein orthogonal-diagonales lateinisches Quadrat (ODLS) ist (und daher müsste es für einige nur alle durchlaufen Konfigurationen und Rückgabe unmöglich). Ein solcher Algorithmus würde dieser Herausforderung aufgrund der absurden Zeitkomplexität nicht gerecht. Es gibt also drei wesentliche Vereinfachungen und Begründungen (teilweise Beweise und Einsichten, warum es funktioniert) für ODLS-Konstruktionen, die in meiner Implementierung verwendet werden:
Die erste ist die Vorstellung, dass wir nur ein gültiges diagonales lateinisches Quadrat (ein NxN-Gitter, so dass jede Zeile, Spalte, umschlossene Diagonale jedes Element einer Menge von N verschiedenen Elementen genau einmal enthält) der ersten N Buchstaben der Alphabet. Wenn wir ein solches diagonales lateinisches Quadrat (DLS) konstruieren können, kann ein ODLS unter Verwendung des DLS mit geeignetem Austausch von Elementen und Umdrehen konstruiert werden. Rechtfertigung:
Die zweite Vereinfachung ist die Vorstellung, dass, wenn wir eine geeignete Konfiguration (SC) eines Elements gefunden hätten (ein NxN-Gitter, so dass jede Zeile, Spalte, umschlossene Diagonale dieses Element genau einmal enthält), ein DLS durch Ersetzen des Elements konstruiert werden könnte und Verschieben des SC. Rechtfertigung:
Die letzte Vereinfachung lautet wie folgt: Alle DLS der Primzahl N mit Ausnahme von N = 2 oder N = 3 können konstruiert werden, und wenn N in zwei Zahlen zerlegt werden kann, deren geeignete DLS konstruiert werden kann, kann eine DLS dieser N konstruiert werden gebaut werden. Ich vermute, dass das Gegenteil auch gilt. (Mit anderen Worten, wir können nur einen DLS für N konstruieren, der nicht durch 2 oder 3 teilbar ist.)
Ein Bild von dem, was ich mit dem kleineren - größeren DLS gemeint habe
quelle