Erstellen Sie ein Programm oder eine Funktion, um ein Quadrat aus Ziffern zu lösen, indem Sie nur Zeilen und Spalten umdrehen.
Eingang
Die Eingabe erfolgt über ein 9x9-Ziffernraster in Form einer 9-zeiligen Zeichenfolge wie folgt:
986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378
Dieses Eingabeformat ist nicht verhandelbar. Alle Lösungen, die mit dem Eingabeformat "kreativ" sind, werden als ungültig betrachtet.
Ausgabe
Die Ausgabe sollte eine Liste von Flip-Moves sein, die, wenn sie in der angegebenen Reihenfolge auf die Eingabe angewendet werden, das Zielraster neu erstellen sollten.
Eine Beispielausgabe (keine Lösung für das vorherige Eingabebeispiel):
28IF5D3EAB9G3
Dieses Ausgabeformat ist ebenfalls nicht verhandelbar. Die Ausgabe sollte keine Zeilenumbrüche oder Leerzeichen enthalten, sondern nur die Zeichen 1
- 9
und A
- I
(Kleinbuchstaben sind anstelle von Großbuchstaben zulässig, wenn Sie dies vorziehen).
Das Zielraster (der Status, den Sie neu erstellen müssen) lautet wie folgt:
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Die Zahlen 1
- 9
sollten als Anweisungen verwendet werden , um die Zeilen zu drehen, und die Buchstaben A
- I
sollten für die Spalten verwendet werden. Dies wird unten mit dem Gitter in seinem wiederhergestellten Zustand gezeigt.
ABCDEFGHI
|||||||||
vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678
Ein 8
Mittel kippt also die zweite Reihe von unten und ein F
Mittel die sechste Spalte.
Falls keine Lösung möglich ist, sollte das Programm enden, ohne etwas auszugeben.
Beispiele
Eingang:
987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Ausgabe:
1
In diesem Fall muss nur die oberste Reihe umgedreht werden, um in den Zielzustand zurückzukehren.
Eingang:
123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Ausgabe:
I
In diesem Fall muss nur die letzte Spalte (Spalte I
) gespiegelt werden, um den Zielstatus wiederherzustellen.
Eingang:
123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Ausgabe:
2I
In diesem Fall müssen wir die Zeile 2
und dann die Spalte spiegeln I
, um zum Zielzustand zurückzukehren.
Anmerkungen:
- Bitte fügen Sie Ihrer Antwort ein Anwendungsbeispiel bei.
- Die angegebene Ausgabe muss nicht die kürzeste Sequenz sein, die den Zielstatus zurückgibt - jede Sequenz, die den Zielstatus zurückgibt, funktioniert so lange, wie sie funktioniert (dh solange ich sie testen kann).
- Ich werde mich bemühen, jede Antwort zu testen und all die zu bewerten, die funktionieren und offensichtlich einen Versuch gehabt haben, Golf zu spielen.
- Dies ist ein offener Wettbewerb - ich werde die kürzeste Antwort nächste Woche akzeptieren, aber wenn eine neuere gültige Antwort kommt, die zu irgendeinem Zeitpunkt in der Zukunft kürzer ist, werde ich die akzeptierte Antwort ändern, um dies widerzuspiegeln .
Für die kürzeste Antwort, dieHowardam 26.01.2014um23:59:59 Uhr (GMT) erhalten hat, wurdedas Kopfgeldauf 200 festgelegt.Howarderhieltdas Kopfgeld für seine GolfScript-Lösung mit 268 Zeichen .
Testen
Bitte geben Sie die Ausgabe Ihres Programms für die folgenden drei Testraster mit Ihrer Antwort an:
986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378
927354389
194762537
319673942
351982676
567891234
523719844
755128486
268534198
812546671
813654789
738762162
344871987
341989324
567891234
576217856
619623552
194435598
926543271
Ich habe ein kleines Python-Programm erstellt, um gültige Raster zu Testzwecken zu generieren:
import random
def output(array):
print '\n'.join([''.join(row) for row in array])
def fliprow(rownum, array):
return [row[::1-2*(rownum==idx)] for idx,row in enumerate(array)]
def flipcol(colnum, array):
return zip(*fliprow(colnum, zip(*array)))
def randomflip(array):
op=random.randint(0,1)
row=random.randint(0,9)
if(op==1):
return fliprow(row, array)
else:
return flipcol(row, array)
def jumble(array):
arraycopy=array
for i in range(10, 1000):
arraycopy=randomflip(arraycopy)
return arraycopy
startarray=[
['1','2','3','4','5','6','7','8','9'],
['2','3','4','5','6','7','8','9','1'],
['3','4','5','6','7','8','9','1','2'],
['4','5','6','7','8','9','1','2','3'],
['5','6','7','8','9','1','2','3','4'],
['6','7','8','9','1','2','3','4','5'],
['7','8','9','1','2','3','4','5','6'],
['8','9','1','2','3','4','5','6','7'],
['9','1','2','3','4','5','6','7','8']]
print output(jumble(startarray))
(-2, 4)
,(2, 4)
,(2, -4)
, oder(-2, -4)
.A1
) zu nehmen und auf zu verschiebenB1
. Sie können eine1
auf die Position bekommenB1
, aber es wird das Plättchen vonB9
, nicht das Plättchen vonA1
. Da wir nur ganze Zeilen / Spalten spiegeln dürfen, befindet sich die oberste 1 immer nur in einer der vier äußersten Ecken. Wenn ich die Regeln falsch verstanden habe, lass es mich bitte wissen.Antworten:
GolfScript,
300279268 ZeichenBeachten Sie, dass dieser Code extrem langsam ist (auch aufgrund schwerer Code-Block-Manipulationen) und möglicherweise mehrere Minuten ausgeführt wird. Der Code ist sehr unlogisch mit vielen Variablen und expliziten Schleifen.
Ich hatte eine analytischere Lösung geschrieben, die weniger als eine Sekunde lief. Ich habe diesen beim Golfen komplett kaputt gemacht. Leider konnte ich den Code in den letzten zwei Tagen nicht zurückverfolgen oder reparieren. Deshalb habe ich diese ohnehin kürzere Try-and-Check-Version produziert.
Die Antworten für die oben genannten Rätsel:
quelle
Mathematica
582575503464282Um mit Golfscriptern zu kämpfen, muss ich schwere Artillerie einsetzen!
Ausgabe:
Hier
PermutationGroup[...]
werden mögliche Flips eingerichtet undGroupElementToWord[...]
das Problem behoben (ca.0.2
sec). Das Hauptproblem besteht darin, dass es schwierig ist, die Entsprechung zwischen der Position von9
im anfänglichen und im endgültigen Raster zu identifizieren . Zum Golfen mache ich es zufällig (es dauert einige Sekunden). Es gibt einige Warnungen, aber man kann sie ignorieren.Andere zum Testen von Gittern:
Es gibt die Beispiele vollständig wieder:
Vorherige Lösung (464)
ohne clevere eingebaute Funktionen und mit Laufzeit von 4 ms:
Alle neuen Zeilen hier sind nicht notwendig.
Ausgabe:
Weitere zwei Testgitter:
Visualisierung:
Die Eingabezeichenfolge
i
kann zufällig von generiert werdenKurze Diskussion
Flips können nur diese Elemente austauschen ("Vierfach"):
Es ist nur dann möglich, diese Elemente getrennt von anderen Elementen auszutauschen, wenn die erste und die letzte Bestellung dieselbe Signatur haben.
Flips dieser vier Elemente bilden die alternierende Gruppe vom Grad 4 (= Rotationsgruppe des Tetraeders). Jedes Element dieser Gruppe setzt sich aus 2 erzeugenden Elementen zusammen. Wenn wir also die Anfangs- und Endposition kennen, können wir die entsprechende Transformation als Kombination aus einfachen Flips zerlegen.
Einzelheiten
Aus sportlichen Gründen poste ich Details vor dem Ende des Kopfgeldes!
Konvertieren Sie den String
i
in die MatrixM
.Wir werden Zeichen anhängen
S
. Jetzt ist es die leere Zeichenfolge.H[i,j]
Fügt das Zeicheni
(1,2,3,...,9
) und das Zeichenj
(a,b,c,...,i
in Basis 36) hinzu.Ich konvertiere Elemente als
um die Zielmatrix in der folgenden Form zu erhalten
Dann gibt es zwei Hauptschritte in meinem Algorithmus
Suchen Sie nach Flips, um die Signaturen wie in der Zielmatrix zu erhalten (z. B. die Signatur von
{-7,-1,1,7}
is1
und die Signatur von{-6,2,-2,6}
is-1
):Drehe jedes "Vierfache", um die richtige Reihenfolge zu erhalten:
Es ist der nicht trivialste Teil des Algorithmus. Zum Beispiel kann die Transformation
1b1b
konvertiert{-7,-1,1,7}
zu{-1,1,-7,7}
. Die Transformation9h9h
konvertiert{-7,-1,1,7}
zu{-7,7,-1,1}
. Wir haben also zwei Kartenund wir wollen eine willkürliche Ordnung konvertieren
{x,y,z,w}
zu{1,2,3,4}
. Die einfache Methode ist (mit Ausnahme einer zufälligen Suche)Ich kann es nicht beweisen, aber es funktioniert!
Der letzte Schritt ist
Es führt einfache Spiegelungen der mittleren Zeile und der mittleren Spalte durch und gibt das Ergebnis zurück.
quelle
J
487438d
ist ein Verb, das eine Rasterzeichenfolge im angegebenen Format verwendet und eine Lösungszeichenfolge im angegebenen Format zurückgibt.Beispiel Verwendung:
Akzeptiert jetzt beide Zeilenumbrüche.
Lösungen zu den Testgittern:
Ich bin ziemlich neu in J; Dies könnte wahrscheinlich noch weiter golfen werden.
Bei der Prüfung auf ungültige / unlösbare Gitter wird eine Strafe von 123 Zeichen verhängt. Ich glaube nicht, dass die anderen bisherigen Antworten eine solche Fehlerprüfung haben.
Ändern Sie dazu die erste Zeile von
d
in:und die letzte Zeile dazu:
Ich habe mich dazu entschlossen,
0
Fehler wie das Zurückgeben einer leeren Zeichenfolge zu melden, die nicht von der korrekten Lösung eines vollständig gelösten Gitters zu unterscheiden sind. Beachten Sie, dass dies (wieder) UNIX-Zeilenumbrüche voraussetzt.quelle
LF
s repräsentieren Partitionen der sequentiellen Datei.C #
540399Nun, geopferte Leistung (jetzt dauert es bis zu 30 Sekunden), eingeführte dynamische Variablen, leicht veränderte Lösungslogik. Und ja, jetzt erwartet es eine Eingabe als eine Zeichenfolge mit Zeilenumbrüchen (wie in Regeln erforderlich).
Natürlich hat C # keine vordefinierten mathematischen Funktionen, daher wäre es schwierig, mit Mathematica-Leuten zu kämpfen. Trotzdem war dies dank des Autors eine große Herausforderung!
Testgitter:
Alte Lösung (540)
Funktioniert bei jeder Eingabe in weniger als einer Sekunde (getestet auf Tausenden zufällig generierten Gittern). Die maximale Länge der Ausgangssaite beträgt 165 (ursprünglich wurde jedes Gitter in nicht mehr als 82 Flips gelöst, aber beim Golfen habe ich dies geopfert).
Antwort zum Beispiel 1:
Antwort zum Beispiel 2:
Antwort zum Beispiel 3:
Antworten für Testfelder:
quelle
1
,A
und2I
die einfachsten Lösungen - aber das spielt eigentlich keine Rolle, da ich nicht nach der Länge der Rasterlösung urteile :-) Wenn Sie sie bearbeiten könnten und gebe die Antworten für die 3 Testraster (Ich werde sehen, ob ich das jetzt auf meinem Mac zum Laufen bringen kann) Ich kann dir deine +1 geben.