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 verschieben B1
. Sie können eine 1
auf die Position bekommen B1
, aber es wird das Plättchen von B9
, nicht das Plättchen von A1
. 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.