Inspiriert von /puzzling/24334/to-catch-a-thief
Sie sind eine gegeben n
durch n
( n
selbst ist optional Eingang) Gitter gefüllt mit 0
s und 1
s (oder jedem anderen Zeichen Ihrer Wahl). Ihr Ziel ist es, jede Zelle gleich zu machen (entweder 0
oder 1
). Sie können eine Reihe von Zügen ausführen, wie unten definiert (beachten Sie die Unähnlichkeit mit dem Puzzling SE-Link):
- Wählen Sie eine Zelle aus.
- Jede Zelle in derselben Zeile und Spalte (mit Ausnahme der Zelle selbst) wird in das Gegenteil geändert.
0
zu1
und1
zu0
.
Geben Sie die Mindestanzahl von Zügen aus, die zum Ausführen der Aufgabe erforderlich sind. Wenn nicht lösbar, geben Sie etwas anderes als eine nicht negative Ganzzahl aus. Der kürzeste Code gewinnt.
Beispieldaten
1 0 0
0 0 0
0 0 0
-1
1 1 1
1 1 1
1 1 1
0
1 0 1
0 1 0
1 0 1
1
1 1 1 1
0 0 0 0
0 0 0 0
1 1 1 1
2
0 1 0 1
1 0 1 0
1 0 1 0
0 1 0 1
2
code-golf
grid
puzzle-solver
path-finding
Ghosts_in_the_code
quelle
quelle
1000
(als Quadrat neu angeordnet, egal wie).Antworten:
Matlab 171 Bytes
Die Eingabe sollte eine 2D-Matrix sein, also würden Sie es so nennen
c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(Semikolons beginnen eine neue Zeile). Diese Funktion erzwingt nur alle möglichen Bewegungen, sodass wir eine Laufzeit von erhaltenO(2^(n^2))
.Wie es gemacht wird
Dies geschieht durch Auswahl aller möglichen Möglichkeiten, um eine andere Matrix derselben Größe mit Einsen und Null zu füllen. Dies zählt im Grunde genommen in Binärform, wobei jeder Eintrag der Matrix eine bestimmte Potenz von 2 darstellt.
Dann führen wir die Bewegungen an den Zellen durch, die 1 sind. Dies geschieht durch die Summe (mod 2) zweier zweidimensionaler Faltungen mit einem Vektor der Größe 1xn und nx1.
Schließlich entscheiden wir, ob diese Bewegungen tatsächlich das gewünschte Ergebnis liefern, indem wir die Standardabweichung über alle Einträge berechnen. Die Standardabweichung ist nur Null, wenn alle Einträge gleich sind. Und wann immer wir tatsächlich das gewünschte Ergebnis gefunden haben, vergleichen wir es mit der Anzahl der Züge früherer Lösungen. Die Funktion wird zurückgegeben,
inf
wenn das angegebene Problem nicht lösbar ist.Mathematik?
Es ist tatsächlich erwähnenswert, dass all diese Bewegungen zusammen eine abelsche Gruppe bilden! Wenn es jemandem tatsächlich gelingt, diese Gruppen zu verkalken, lassen Sie es mich bitte wissen.
Golfversion:
Vollversion (mit der Ausgabe der tatsächlichen Züge.)
quelle
Perl 5, 498 Bytes
Dies akzeptiert 'n' und das gewünschte Ergebnis und gibt die Anzahl aus, oder 'X', wenn keine vorhanden ist.
Zum Beispiel:
gibt
2
. Es wird nur funktionieren, wenn n ^ 2 <= 64, alson <= 8
. Obwohl es selbst mit n so niedrig wie 5 ziemlich langsam ist. Es baut ein ^ 3-Bit-Array auf und sortiert vorher ein 2 ^ (n ^ 2) -Array, denn warum nicht ?Ich habe hier ein paar Zeilenvorschübe für die Lesbarkeit verschwendet :
quelle