Flippin Quadrate

34

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- 9und 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- 9sollten als Anweisungen verwendet werden , um die Zeilen zu drehen, und die Buchstaben A- Isollten 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 8Mittel kippt also die zweite Reihe von unten und ein FMittel 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 2und 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, die Howard am 26.01.2014 um 23:59:59 Uhr (GMT) erhalten hat, wurde das Kopfgeld auf 200 festgelegt. Howard erhielt das 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))
Gareth
quelle
8
Ich habe gerade eine kurze Lösung geschrieben, bei der Zeilen / Spalten zufällig gewechselt wurden, bis die Sortierung abgeschlossen war. Nach 500 Millionen Iterationen war das erste Rätsel, das Sie gaben, immer noch nicht gelöst (Sie müssen nur die erste Reihe umdrehen). Zufälligkeit scheint keine brauchbare Lösung für dieses Problem zu sein!
Josh
3
@ Josh Nicht überraschend. Dieses Problem scheint dem Lösen eines Zauberwürfels sehr ähnlich zu sein. Ich denke, eine Art Breitensuche wäre die beste rohe Kraft. Abgesehen davon muss der Zufallsalgorithmus theoretisch irgendwann enden und scheint den angegebenen Regeln zu entsprechen.
Cruncher
4
Brute Force ist nicht erforderlich. Bedenken Sie, dass jedes Rasterfeld nur an einer von vier Positionen landen kann : an der richtigen Position, gespiegeltes X, gespiegeltes Y oder gespiegeltes XY. Es kann Ihnen helfen, das Raster mental so zu behandeln, als wäre (0,0) die am weitesten in der Mitte liegende Kachel. Wenn Sie die Lösung Kachel (-2, 4), die einzigen Stellen könnten die Zielzahl sein wird (-2, 4), (2, 4), (2, -4), oder (-2, -4).
Mr. Llama
2
@Cruncher: Die Verwendung ganzer Zeilen- / Spaltenflips macht dies unmöglich. Versuchen Sie beispielsweise, die oberste 1 ( A1) zu nehmen und auf zu verschieben B1. Sie können eine 1auf 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.
Mr. Llama
7
Glückwunsch, Gareth. Dies ist ein sehr gut durchdachtes Problem. Auch ziemlich herausfordernd.
DavidC

Antworten:

7

GolfScript, 300 279 268 Zeichen

n%`{\5,{.9+}%{;.2/\2%},\;''{1${.9/7+7*+}%+:z;}:?~{{.9<77*{\zip\9-}>:Z~{1$!{-1%}*\(\}@%\Z;}/}:E~{:^;{:c;.`{[\E[.^=\8^-=]{.c=\8c-=}%[^c+^8c-+8^-c+16c-^-]{9%49+}%=}+[[]]:K[[8^- 17c-][^9c+]1$]{:s;{[[]s.+.2$+]{1$+}/}%.&}/\,K+0=z?E}5,/}5,/{{+9%)}+9,%''*}9,%={z:u;}*}+1024,/u

Beachten 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:

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F
Howard
quelle
Nun, es wird ziemlich harte Arbeit sein, dies
Gareth
Scheint, als hätte ich mich geirrt ...
Gareth
@Gareth Ich wusste, dass dies eine Herausforderung ist, die mit Golfscript zB gegen Mathematica schwierig sein würde.
Howard
1
@Howard - welchen Ansatz hast du gewählt? Was ist die von Ihnen erwähnte "Testversion"?
SergeyS
24

Mathematica 582 575 503 464 282

Um mit Golfscriptern zu kämpfen, muss ich schwere Artillerie einsetzen!

i = "986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378";

a=Array;h@M_:=Join@@a[9(M〚##〛/. 9->9⌈2Random[]⌉)+Abs[{##}-5]&,n={9,9}];
For[i_~t~j_:=i{#2,10-#2}+j#-9&~a~{9,4},!ListQ[e=GroupElementToWord[
PermutationGroup[Cycles/@Join[1~t~9,9~t~1]],
h[ToCharacterCode@StringSplit@i-48]~FindPermutation~h@a[Mod[8+##,9,1]&,n]]],];
e~IntegerString~36<>""

Ausgabe:

g69g69g8g8g7g7gd96d96d8d8d7d7dh6h64a6a46d6d4g4g6b6b7h7h7c7c2a8a27b7bd8db8b7f7fg8g82c2c94a4a3a3aigfdc91

Hier PermutationGroup[...]werden mögliche Flips eingerichtet und GroupElementToWord[...]das Problem behoben (ca. 0.2sec). Das Hauptproblem besteht darin, dass es schwierig ist, die Entsprechung zwischen der Position von 9im 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:

g69g69g8g8g7g7gh89h89h7h7h6h6hf6f6g6g64f4f4h4hg7g73g3g2a8a28d8db8b83d3dg8g82c2c9a3a643a3a2g9f9d9c9ga
h89h89h7h7h6h6h6h6h6f6f6g6g6d6d3a7a37g7g7h7h3c3c2a8a27b7b8d8d2f2f8b8b3f3f2b2ba2a764a8aih9g9c9gb1i

Es gibt die Beispiele vollständig wieder:

1
i
2i

Vorherige Lösung (464)

ohne clevere eingebaute Funktionen und mit Laufzeit von 4 ms:

M=ToCharacterCode@StringSplit@i-48;
S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;
A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};
u=s/@Join@@A;
H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

Alle neuen Zeilen hier sind nicht notwendig.

Ausgabe:

3b9i9i1a1a1a1a9i9i1a1a9h9h1b1b1b1b9h9h9g9g1c1c9g9g9f9f1d1d9f9f8h8h2b2b8f8f8f8f7i7i7h7h3b3b3b3b7h7h3b3b7h7h7g7g3c3c7g7g3c3c7f7f6i6i4a4a6h6h4b4b4b4b6g6g4c4c6g6g4c4c6f6f4d4d4d4d6f6f4d4d6f6f4d4d

Weitere zwei Testgitter:

13ab9i9i1a1a9i9i9h9h1b1b1b1b9h9h9f9f8i8i8i8i8h8h2b2b2b2b8h8h8h8h8g8g8g8g8f8f2d2d2d2d8f8f2d2d7i7i3a3a3a3a7i7i7h7h3b3b7h7h3b3b7g7g3c3c3c3c7g7g3c3c7f7f3d3d3d3d7f7f7f7f6i6i4a4a6i6i6h6h4b4b4b4b6h6h4b4b6g6g4c4c4c4c6f6f4d4d4d4d6f6f4d4d6f6f
2bc9i9i1a1a9i9i9g9g1c1c9g9g1c1c9f9f1d1d1d1d8i8i8i8i8h8h2b2b2b2b8f8f2d2d7i7i7h7h3b3b3b3b7h7h3b3b7g7g3c3c7f7f3d3d3d3d7f7f3d3d6i6i4a4a4a4a6h6h4b4b6g6g6g6g6f6f4d4d

Visualisierung:

anim = Reap[Fold[Function[{m, i}, 
 If[i > 9, (Sow@Grid[#, Background -> {i - 9 -> Pink, None}] & /@ {m, #}; #) &@
   Transpose@MapAt[Reverse, Transpose@m, i - 9], (Sow@Grid[#, 
         Background -> {None, i -> Pink}] & /@ {m, #}; #) &@
   MapAt[Reverse, m, i]]], M, IntegerDigits[FromDigits[S, 36], 36]]];

ListAnimate[Join[{#, #} &@Grid@M, anim[[2, 1]], {#, #} &@Grid@anim[[1]]], 5]

Bildbeschreibung hier eingeben

Die Eingabezeichenfolge ikann zufällig von generiert werden

M = Array[Mod[8 + ##, 9, 1] &, {9, 9}];
(M[[#]] = Reverse@M[[#]]; M[[All, #2]] = Reverse@M[[All, #2]];) & @@@
   RandomInteger[{1, 9}, {10000, 2}];
i = ToString /@ # <> "\n" & /@ M <> ""

Kurze Diskussion

  • Flips können nur diese Elemente austauschen ("Vierfach"):

    Bildbeschreibung hier eingeben

  • 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!

M=ToCharacterCode@StringSplit@i-48;

Konvertieren Sie den String iin die Matrix M.

S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;

Wir werden Zeichen anhängen S. Jetzt ist es die leere Zeichenfolge. H[i,j]Fügt das Zeichen i( 1,2,3,...,9) und das Zeichen j( a,b,c,...,iin Basis 36) hinzu.

A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};

Ich konvertiere Elemente als

Bildbeschreibung hier eingeben

um die Zielmatrix in der folgenden Form zu erhalten

Bildbeschreibung hier eingeben

Dann gibt es zwei Hauptschritte in meinem Algorithmus

  1. Suchen Sie nach Flips, um die Signaturen wie in der Zielmatrix zu erhalten (z. B. die Signatur von {-7,-1,1,7}is 1und die Signatur von {-6,2,-2,6}is -1):

    u=s/@Join@@A;
    H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
    A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
    
  2. Drehe jedes "Vierfache", um die richtige Reihenfolge zu erhalten:

    MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
    If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
    

    Es ist der nicht trivialste Teil des Algorithmus. Zum Beispiel kann die Transformation 1b1bkonvertiert {-7,-1,1,7}zu {-1,1,-7,7}. Die Transformation 9h9hkonvertiert {-7,-1,1,7}zu {-7,7,-1,1}. Wir haben also zwei Karten

    {1,2,3,4} -> {2,3,1,4}
    {1,2,3,4} -> {1,4,2,3}
    

    und 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)

    repeat   
    {x, y, z, w} -> If[z < 3, {y, z, x, w}, {x, w, y, z}]
    until {1,2,3,4}
    

    Ich kann es nicht beweisen, aber es funktioniert!

Der letzte Schritt ist

M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

Es führt einfache Spiegelungen der mittleren Zeile und der mittleren Spalte durch und gibt das Ergebnis zurück.

ybeltukov
quelle
@Gareth Kann ich in der Ausgabe kleine Zeichen verwenden? Es spart mir eine Reihe von Zeichen.
Ybeltukov
Ja, ich akzeptiere Kleinbuchstaben in der Ausgabe (ich ändere die Frage, um dies zu vermerken). Ich habe kein Mathematica, kann also ein anderer Mathematica-Benutzer bestätigen, dass der Code tatsächlich die Ausgabe generiert? Ich habe die drei Testlösungen validiert und sie sind alle korrekt, also +1. Gute Arbeit!
Gareth
Nur neugierig - was ist eine Leistung Ihres Ansatzes? Haben Sie Eingaben getestet, die von Tausenden von Flip generiert wurden?
SergeyS
@SergeyS Ja, es dauert ca. 50 ms :)
ybeltukov
@Gareth Ich habe mein Programm umgeschrieben. Können Sie die Ergebnisse überprüfen? Meine Tests haben gezeigt, dass alles korrekt ist.
Ybeltukov
7

J 487 438

q=:3 :'(>:9|+/~i.9)=/&((,{;/(,.8&-)y){])g'
l=:2 :0
:
o=:o,(m+x){a.
x&(|.@{`[`]})&.v y
)
r=:49 l]
c=:97 l|:
w=:2 :'g=:4 v^:(4=(<m){g)g'
p=:_1=C.!.2@,@:I.@q
t=:2 :'for_i.>:i.3 do.g=:i v^:(p m*i)g end.'
z=:2 :0
'i j I J'=.y,8-y
g=:".'(',(,' ',.,(I.m{q y){,;._1 n),'])^:2 g'
)
d=:3 :0
g=:9 9$".,_ list,' ',.y
o=:''
0 4 w c
4 0 w r
0 1 t c
g=:0 c^:(-.(p 1 0)=p 1 2)g
1 0 t r
for_k.>,{;~i.4 do.0 z';;jcir;irjc;Irjc'k
3 z';;IrJc;JcIr;'k end.o
)

d ist ein Verb, das eine Rasterzeichenfolge im angegebenen Format verwendet und eine Lösungszeichenfolge im angegebenen Format zurückgibt.

Beispiel Verwendung:

   d '987654321',LF,'234567891',LF,'345678912',LF,'456789123',LF,'567891234',LF,'678912345',LF,'789123456',LF,'891234567',LF,'912345678'
bcda2341a1a1b1b1c1c1d1da2a2b2b2c2c2d2d2a3a3b3b3c3c3d3d3a4a4b4b4c4c4d4d4

Akzeptiert jetzt beide Zeilenumbrüche.

Lösungen zu den Testgittern:

b3a1a11b1bc9c99g9gd9d99f9fb8b8f8f87i7i7h7hc3c3g7g77f7fa6a64b4bh6h6c4c4g6g6d6d6f6f6
cd24a9a91c1c1d1d9f9fa2a2i8i88h8hc2c2g8g82d2d3b3bh7h7d3d37f7fa6a64b4bg6g64d4d6f6f
bc2a9a99i9ic1c1g9g91d1df9f9i8i8b2b2h8h82c2cd8d87i7ib3b3c7c7d3d34a4ai6i6b6b6g6g6d6d6

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 din:

if.-.+./89 90=#y do.0 return.end.if.-.*./(/:~y)=/:~(#y)$'123456789',LF do.0 return.end.g=:9 9$".,_ list,' ',.y

und die letzte Zeile dazu:

3 z';;IrJc;JcIr;'k end.if.*./,g=>:9|+/~i.9 do.o return.end.0

Ich habe mich dazu entschlossen, 0Fehler 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.

AlliedEnvy
quelle
Herzlichen Glückwunsch, Sie haben gerade die Führung übernommen. :-)
Gareth
Sieht so aus, als ob Ihre Eingabe nicht eine Zeichenfolge ist, wie es die Regeln erfordern, oder ich vermisse etwas?
SergeyS
@ SergeyS: Sie könnten verwirrt sein. Soweit ich weiß, hat J keine Möglichkeit, Fluchtungszeichen (wie Newline) in String-Literale einzufügen. Die Konstruktion 'a', LF, 'b' in J ähnelt "a" + "\ n" + "b" in Sprachen, in denen + Zeichenfolgen anfügt.
AlliedEnvy
Ok, es macht dann Sinn, danke.
SergeyS
Ich habe gerade den Abschnitt über Dateien aus dem APL-Buch von 1962 gelesen und finde, dass @AlliedEnvy richtig ist. So erscheinen die Daten für das Programm, wenn sie aus einer Datei im Format der Frage gelesen werden. Die LFs repräsentieren Partitionen der sequentiellen Datei.
Luser Droog
5

C # 540 399

Nun, 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!

string S(string _){for(i=0,e=1>0;e;){
for(h=v=j=0;j<89;)m[j/10,j%10+9]=_[j++]-49;a="";
for(j=i++;j>0;v++,j/=2)if(j%2>0)F(v);
for(;h<9&(h<4|!e);h+=j/36,j%=36)if((e=m[h,g=j++%9+9]!=(t=(h+g)%9))|m[v=8-h,g]==t){F(v);F(g);F(v);F(g);}
}return a;}void F(int z){for(f=z<9;++l<9;)m[0,l]=m[f?z:l,f?9+l:z];for(;l-->0;)m[f?z:l,f?9+l:z]=m[0,8-l];a+=(char)(z+=f?49:56);}
dynamic h,v,i,j,e,t,l=-1,g,a,m=new int[9,19],f;

Testgitter:

3B9A9A9B9B9C9C9D9D9F9F9G9G9H9H9I9I9B9B9C9C9D9D9F9F9G9G9H9H9C9C9D9D9C9C9D9D8B8B8F8F8H8H8B8B8F8F8B8B8H8H7B7B7C7C7F7F7H7H7I7I7H7H6A6A6B6B6C6C6D6D6F6F6H6H6A6A6B6B6D6D6F6F6D6D6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

13AB9A9A9B9B9F9F9H9H9A9A9B9B9H9H9I9I8B8B8D8D8F8F8G8G8H8H8I8I8B8B8G8G8H8H8I8I8H8H7A7A7B7B7C7C7D7D7F7F7G7G7I7I7A7A7D7D7F7F7I7I7F7F6A6A6B6B6C6C6D6D6F6F6G6G6H6H6I6I6A6A6C6C6F6F6I6I6A6A6A6A5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

2BC9A9A9C9C9D9D9F9F9A9A9D9D9I9I8B8B8D8D8H8H8I8I8B8B8D8D8I8I7B7B7C7C7D7D7F7F7G7G7H7H7I7I7C7C7C7C7G7G6A6A6B6B6D6D6F6F6G6G6I6I6A6A6B6B6D6D6G6G6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

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).

string S(string[]_){for(i=0;i<1<<18;){
for(j=0;j<81;)m[j/9+49,j%9+65]=_[j/9][j++%9]-49;a="";char g,h='1',v='9',b,x=h,y;
for(j=i;j>0;x=x==v?'A':++x,j/=2)if(j%2>0)F(x);j=i+1;
for(i+=1<<19;h<58;h++,v--)for(g='A',b='I';g<74;g++,b--){
t=(h+g-6)%9;e=m[h,g];q=m[v,g];i=h>52&t!=e?j:i;
if(e!=t|q==t){x=q==t?v:g;y=q==t?g:v;
if(m[h,b]==t){x=b;y=h;}
F(x);F(y);F(x);F(y);}}}return a;}
void F(char z){var f=z<65;for(l=0;l<4;l++){n=m[d=f?z:49+l,s=f?65+l:z];m[d,s]=m[o=f?z:57-l,u=f?73-l:z];m[o,u]=n;}a+=z;}
int i,j,q,e,t,l,s,d,n,u,o;int[,]m=new int[99,99];string a;

Antwort zum Beispiel 1:

15A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

Antwort zum Beispiel 2:

19AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5D
5DE5E55F5F5G5G5H5H5I5I

Antwort zum Beispiel 3:

129AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5
D5DE5E55F5F5G5G5H5H5I5I

Antworten für Testfelder:

346B9A9AH1H1C9C9D9D99F9F9G9GH9H99I9IB8B8F8F87B7B7C7C7F7FH7H77I7I6A6A6B6BC6C66D6DG6G6H6H66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

1346ABA9A9H1H19F9FH9H99I9IH2H28D8D8F8FG8G8I8I8I3I37B7B7C7CF3F37G7GI7I7H4H4D6D66F6F5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

2BCA9A99C9CF1F19F9F9I9IH2H2D8D88H8HI8I87B7BC7C77D7D7F7F7H7H7I7II4I4B6B6D6D6G6G66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I
SergeyS
quelle
Ich lade gerade Mono für meinen Mac herunter, damit ich das Programm selbst testen kann, aber ich habe bereits einen Validator, der eine bestimmte Lösung in einem bestimmten Raster ausführt und mir mitteilt, ob die Lösung für dieses Raster gültig ist - und es ist Mir zu sagen, dass die drei Beispiellösungen, die Sie mir gegeben haben, nicht gültig sind. Ich untersuche gerade warum.
Gareth
Aha! Ich habe herausgefunden, was hier passiert ist! Ihre gegebenen Antworten scheinen Antworten auf die drei Beispiele zu sein und nicht auf die drei Testgitter (die weiter unten in der Frage stehen). Sie sind in der Tat die richtigen Lösungen für diese Raster, obwohl sie viel länger sind als 1, Aund 2Idie 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.
Gareth
@ Gareth - hoppla, ich habe Antworten für Testfelder verpasst, danke, dass du darauf hingewiesen hast. Ich habe sie jetzt zu meiner Antwort hinzugefügt.
SergeyS
Exzellent, danke dafür. Sie haben alle gut validiert. Xamarin würde aus irgendeinem Grund nicht auf meinem Mac laufen, daher muss ich das Programm in ein paar Stunden bei der Arbeit testen.
Gareth
@Gareth - Eigentlich gibt es in diesem Code nichts Spezielles für C #, man kann ihn wahrscheinlich ohne großen Aufwand nach Java oder sogar C ++ konvertieren und ... ein paar Zeichen aus ihm herausgolfen :) Sie können ihn auch nach GolfScript oder etwas anderem konvertieren prägnant - dies kann zweimal oder kürzer erscheinen;)
SergeyS