Flippin 'Squares

34

Cree un programa o función para desglosar un cuadrado de dígitos volteando (invirtiendo alrededor del punto central) solo filas y columnas.

Entrada

La entrada será una cuadrícula de dígitos 9x9 en forma de una cadena de 9 líneas como la siguiente:

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

Este formato de entrada no es negociable: cualquier solución que sea "creativa" con el formato de entrada se considerará inválida.

Salida

La salida debe ser una lista de movimientos de volteo que, cuando se aplica a la entrada en el orden dado, debe recrear la cuadrícula de destino.

Un resultado de ejemplo (no es una solución para el ejemplo de entrada anterior):

28IF5D3EAB9G3

Este formato de salida tampoco es negociable. No debería haber nuevas líneas o espacios en la salida, solo los caracteres 1- 9y A- I(los caracteres en minúscula son aceptables en lugar de los caracteres en mayúscula si lo prefiere).

La cuadrícula de destino (el estado que necesita recrear) es la siguiente:

123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

Los números 1, 9deben usarse como instrucciones para voltear las filas, y las letras A, Ideben usarse para las columnas. Esto se muestra a continuación con la cuadrícula en su estado restaurado.

     ABCDEFGHI
     |||||||||
     vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678

Entonces, un 8medio voltea la segunda fila desde abajo y un Fmedio voltea la sexta columna.

En el caso de que no sea posible una solución, el programa debería finalizar sin generar nada.

Ejemplos

Entrada:

987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

Salida:

1

En este caso, solo la fila superior necesita voltearse para volver al estado objetivo.

Entrada:

123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679

Salida:

I

En este caso, solo la última columna (columna I) necesita voltearse para recrear el estado del objetivo.

Entrada:

123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679

Salida:

2I

En este caso, debemos voltear la fila 2y luego voltear la columna Ipara volver al estado objetivo.

Notas:

  • Incluya un ejemplo de uso en su respuesta.
  • La salida dada no tiene que ser la secuencia más corta que devolverá el estado del objetivo; cualquier secuencia que devuelva el estado del objetivo funcionará mientras funcione (es decir, siempre que pueda probarlo)
  • Me esforzaré por evaluar cada respuesta y votar a todos aquellos que trabajan y obviamente han tenido un intento de jugar al golf.
  • Esta es una competencia abierta: aceptaré la respuesta más corta en algún momento de la próxima semana, pero si aparece una respuesta válida más nueva que sea más corta en cualquier momento en el futuro, cambiaré la respuesta aceptada para reflejar eso .
  • La recompensa se estableció en 200 reputación por la respuesta más corta recibida antes de las 23:59:59 (GMT) del 26/01/2014 La recompensa fue otorgada a Howard por su solución GolfScript de 268 caracteres .

Pruebas

Proporcione la salida de su programa para las siguientes tres cuadrículas de prueba con su respuesta:

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

He creado un pequeño programa Python para generar cuadrículas válidas para fines de prueba:

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
fuente
8
Acabo de escribir una solución corta que volteó aleatoriamente filas / columnas hasta que se completó la clasificación. Después de 500 millones de iteraciones, todavía no había resuelto el primer rompecabezas que le diste (donde solo necesitas voltear la fila 1). ¡La aleatoriedad no parece ser una solución útil para este problema!
Josh
3
@ Josh No es sorprendente. Este problema parece ser muy similar a resolver un cubo de rubik. Creo que algún tipo de búsqueda de amplitud sería la mejor fuerza bruta. Dicho esto, el algoritmo aleatorio teóricamente tiene que terminar eventualmente y parece ajustarse a las reglas especificadas.
Cruncher
44
La fuerza bruta no es necesaria. Considere el hecho de que cada mosaico de cuadrícula solo puede terminar en una de cuatro posiciones: su ubicación correcta, volteado X, volteado Y o XY volteado. Puede ayudarlo a tratar mentalmente que la cuadrícula tenga (0,0) como el mosaico más central. Si va a resolver la baldosa (-2, 4), los únicos lugares el número de destino podría ser es (-2, 4), (2, 4), (2, -4), o (-2, -4).
Sr. Llama
2
@Cruncher: el uso de volteos de fila / columna completa lo hace imposible. Por ejemplo, intente tomar el extremo superior izquierdo 1 ( A1) y moverlo a B1. Puedes llegar 1a la posición B1, pero será el mosaico de B9, no el mosaico de A1. Debido a que solo se permiten volteos completos de fila / columna, el 1 superior a la izquierda solo estará en una de las cuatro esquinas más externas. Si he confundido las reglas, avíseme.
Sr. Llama
77
Enhorabuena, Gareth. Este es un problema muy bien diseñado. Además, bastante desafiante.
DavidC

Respuestas:

7

GolfScript, 300 279 268 caracteres

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

Tenga en cuenta que este código es extremadamente lento (también debido a la gran manipulación del bloque de código) y puede durar varios minutos. El código es muy poco golfista con muchas variables y bucles explícitos.

Había escrito una solución más analítica que funcionó por menos de un segundo. Lo rompí por completo durante el golf. Desafortunadamente, no pude retroceder o reparar el código en los últimos dos días. Por lo tanto, produje esta versión de prueba y verificación que es más corta de todos modos.

Las respuestas para los acertijos dados arriba:

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F
Howard
fuente
Bueno, va a ser un trabajo bastante duro superar esto ...
Gareth
Parece que estaba equivocado ...
Gareth
@Gareth Sabía que este es un desafío que sería difícil con golfscript contra, por ejemplo, Mathica.
Howard
1
@Howard: ¿qué enfoque usaste? ¿Qué es la "versión de prueba" que mencionaste?
SergeyS
24

Mathematica 582 575 503 464 282

¡Para pelear con golfscripters tengo que usar artillería pesada!

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<>""

Salida:

g69g69g8g8g7g7gd96d96d8d8d7d7dh6h64a6a46d6d4g4g6b6b7h7h7c7c2a8a27b7bd8db8b7f7fg8g82c2c94a4a3a3aigfdc91

Aquí PermutationGroup[...]configura posibles volteretas y GroupElementToWord[...]resuelve el problema (aproximadamente 0.2segundos). El principal problema es que es difícil identificar la correspondencia entre la posición de 9la cuadrícula inicial y la final. Para jugar al golf lo hago al azar (lleva varios segundos). Hay algunas advertencias pero se pueden ignorar.

Otro para probar rejillas:

g69g69g8g8g7g7gh89h89h7h7h6h6hf6f6g6g64f4f4h4hg7g73g3g2a8a28d8db8b83d3dg8g82c2c9a3a643a3a2g9f9d9c9ga
h89h89h7h7h6h6h6h6h6f6f6g6g6d6d3a7a37g7g7h7h3c3c2a8a27b7b8d8d2f2f8b8b3f3f2b2ba2a764a8aih9g9c9gb1i

Reproduce completamente los ejemplos:

1
i
2i

Solución anterior (464)

sin funciones integradas inteligentes y con tiempo de ejecución de 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

Todas las líneas nuevas aquí no son necesarias.

Salida:

3b9i9i1a1a1a1a9i9i1a1a9h9h1b1b1b1b9h9h9g9g1c1c9g9g9f9f1d1d9f9f8h8h2b2b8f8f8f8f7i7i7h7h3b3b3b3b7h7h3b3b7h7h7g7g3c3c7g7g3c3c7f7f6i6i4a4a6h6h4b4b4b4b6g6g4c4c6g6g4c4c6f6f4d4d4d4d6f6f4d4d6f6f4d4d

Otras dos cuadrículas de prueba:

13ab9i9i1a1a9i9i9h9h1b1b1b1b9h9h9f9f8i8i8i8i8h8h2b2b2b2b8h8h8h8h8g8g8g8g8f8f2d2d2d2d8f8f2d2d7i7i3a3a3a3a7i7i7h7h3b3b7h7h3b3b7g7g3c3c3c3c7g7g3c3c7f7f3d3d3d3d7f7f7f7f6i6i4a4a6i6i6h6h4b4b4b4b6h6h4b4b6g6g4c4c4c4c6f6f4d4d4d4d6f6f4d4d6f6f
2bc9i9i1a1a9i9i9g9g1c1c9g9g1c1c9f9f1d1d1d1d8i8i8i8i8h8h2b2b2b2b8f8f2d2d7i7i7h7h3b3b3b3b7h7h3b3b7g7g3c3c7f7f3d3d3d3d7f7f3d3d6i6i4a4a4a4a6h6h4b4b6g6g6g6g6f6f4d4d

Visualización:

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]

ingrese la descripción de la imagen aquí

La cadena de entrada ise puede generar aleatoriamente por

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 <> ""

Breve discusión

  • Los flips pueden intercambiar solo estos elementos ("cuádruple"):

    ingrese la descripción de la imagen aquí

  • Es posible intercambiar estos elementos por separado de otros elementos solo si el orden inicial y el final tienen la misma firma.

  • Los volteos de estos cuatro elementos forman el grupo alterno de grado 4 (= grupo de rotaciones del tetraédrico). Cada elemento de este grupo es una composición de 2 elementos generadores. Entonces, si conocemos la posición inicial y final, podemos descomponer la transformación correspondiente como una combinación de volteretas simples.

Detalles

¡Para deportividad publico detalles antes del final de la recompensa!

M=ToCharacterCode@StringSplit@i-48;

Convierta la cadena ia la matriz M.

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

Añadiremos caracteres a S. Ahora es la cadena vacía. H[i,j]agregará el carácter i( 1,2,3,...,9) y el carácter j( a,b,c,...,ien base-36).

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

Convierto elementos como

ingrese la descripción de la imagen aquí

para obtener la matriz objetivo en la siguiente forma

ingrese la descripción de la imagen aquí

Luego hay dos pasos principales en mi algoritmo

  1. Encuentre volteos para obtener las firmas como en la matriz objetivo (por ejemplo, la firma de {-7,-1,1,7}is 1y la firma de {-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. Gire cada "cuádruple" para obtener el orden correcto:

    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 la parte más no trivial del algoritmo. Por ejemplo, la transformación 1b1bse convertirá {-7,-1,1,7}a {-1,1,-7,7}. La transformación 9h9hse convertirá {-7,-1,1,7}a {-7,7,-1,1}. Entonces tenemos dos mapas

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

    y queremos convertir una ordenación arbitraria {x,y,z,w}a {1,2,3,4}. El método simple es (excepto una búsqueda aleatoria)

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

    No puedo probarlo, ¡pero funciona!

El ultimo paso es

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

Realiza volteos triviales de la fila central y la columna central y devuelve el resultado.

ybeltukov
fuente
@Gareth ¿Puedo usar caracteres pequeños en la salida? Me ahorra varios personajes.
ybeltukov
Sí, aceptaré caracteres en minúscula en la salida (cambiaré la pregunta para tener esto en cuenta). No tengo Mathematica, ¿podría algún otro usuario de Mathematica confirmar que el código realmente genera la salida? He validado las tres soluciones de prueba y todas son correctas, entonces +1. ¡Buen trabajo!
Gareth
Simplemente curioso: ¿cuál es el rendimiento de su enfoque? ¿Probaste en entradas generadas por miles de flips?
SergeyS
@SergeyS Sí, se tarda unos 50 ms :)
ybeltukov
@Gareth Reescribo mi programa, ¿podría verificar los resultados? Mis pruebas han demostrado que todo es correcto.
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 es un verbo que toma una cadena de cuadrícula en el formato especificado y devuelve una cadena de solución en el formato especificado.

Ejemplo de uso:

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

Ahora acepta cualquier tipo de nueva línea.

Soluciones a las cuadrículas de prueba:

b3a1a11b1bc9c99g9gd9d99f9fb8b8f8f87i7i7h7hc3c3g7g77f7fa6a64b4bh6h6c4c4g6g6d6d6f6f6
cd24a9a91c1c1d1d9f9fa2a2i8i88h8hc2c2g8g82d2d3b3bh7h7d3d37f7fa6a64b4bg6g64d4d6f6f
bc2a9a99i9ic1c1g9g91d1df9f9i8i8b2b2h8h82c2cd8d87i7ib3b3c7c7d3d34a4ai6i6b6b6g6g6d6d6

Soy bastante nuevo en J; esto probablemente podría jugarse aún más.


La comprobación de cuadrículas no válidas / insolubles conlleva una penalización de 123 caracteres. No creo que las otras respuestas hasta la fecha tengan tal verificación de errores.

Para hacerlo, cambie la primera línea de da esto:

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

y la última línea para esto:

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

Elegí regresar 0en tales errores como devolver una cadena vacía sería indistinguible de resolver correctamente una cuadrícula completamente resuelta. Tenga en cuenta que esto supone nuevas líneas UNIX (nuevamente).

AlliedEnvy
fuente
Enhorabuena, acabas de ir a la cabeza. :-)
Gareth
¿Parece que su entrada no es una cadena como lo requieren las reglas, o me falta algo?
SergeyS
@SergeyS: Puede estar confundido. Hasta donde sé, J no tiene forma de colocar escapes (como nueva línea) en literales de cadena. La construcción 'a', LF, 'b' en J es similar a "a" + "\ n" + "b" en los idiomas donde + trabaja para agregar cadenas.
AlliedEnvy
Ok, tiene sentido que, gracias.
SergeyS
Estaba leyendo la sección sobre archivos del libro APL de 1962, y creo que @AlliedEnvy es correcta. Así es como los datos aparecerán para el programa si se leen desde un archivo en el formato de la pregunta. Los LFs representan particiones del archivo secuencial.
luser droog
5

DO# 540 399

Bueno, sacrificó el rendimiento (ahora toma hasta 30 segundos), introdujo variables dinámicas, cambió ligeramente la lógica de la solución. Y sí, ahora espera una entrada como una cadena con saltos de línea (como se requiere en las reglas).

Por supuesto, C # no tiene funciones matemáticas predefinidas, por lo que sería difícil pelear con chicos de Mathematica. Sin embargo, este fue un gran desafío, ¡gracias al autor!

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;

Rejillas de prueba:

3B9A9A9B9B9C9C9D9D9F9F9G9G9H9H9I9I9B9B9C9C9D9D9F9F9G9G9H9H9C9C9D9D9C9C9D9D8B8B8F8F8H8H8B8B8F8F8B8B8H8H7B7B7C7C7F7F7H7H7I7I7H7H6A6A6B6B6C6C6D6D6F6F6H6H6A6A6B6B6D6D6F6F6D6D6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

13AB9A9A9B9B9F9F9H9H9A9A9B9B9H9H9I9I8B8B8D8D8F8F8G8G8H8H8I8I8B8B8G8G8H8H8I8I8H8H7A7A7B7B7C7C7D7D7F7F7G7G7I7I7A7A7D7D7F7F7I7I7F7F6A6A6B6B6C6C6D6D6F6F6G6G6H6H6I6I6A6A6C6C6F6F6I6I6A6A6A6A5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

2BC9A9A9C9C9D9D9F9F9A9A9D9D9I9I8B8B8D8D8H8H8I8I8B8B8D8D8I8I7B7B7C7C7D7D7F7F7G7G7H7H7I7I7C7C7C7C7G7G6A6A6B6B6D6D6F6F6G6G6I6I6A6A6B6B6D6D6G6G6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

Solución anterior (540)

Funciona en menos de un segundo en cualquier entrada (probado en miles de cuadrículas generadas aleatoriamente). La longitud máxima de la cadena de salida es 165 (inicialmente, cualquier cuadrícula se resolvió en no más de 82 vueltas, pero durante el golf sacrifiqué esto).

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;

Responda por ejemplo 1:

15A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

Responda por ejemplo 2:

19AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5D
5DE5E55F5F5G5G5H5H5I5I

Responda por ejemplo 3:

129AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5
D5DE5E55F5F5G5G5H5H5I5I

Respuestas para los cuadrados de prueba:

346B9A9AH1H1C9C9D9D99F9F9G9GH9H99I9IB8B8F8F87B7B7C7C7F7FH7H77I7I6A6A6B6BC6C66D6DG6G6H6H66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

1346ABA9A9H1H19F9FH9H99I9IH2H28D8D8F8FG8G8I8I8I3I37B7B7C7CF3F37G7GI7I7H4H4D6D66F6F5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

2BCA9A99C9CF1F19F9F9I9IH2H2D8D88H8HI8I87B7BC7C77D7D7F7F7H7H7I7II4I4B6B6D6D6G6G66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I
SergeyS
fuente
Ahora estoy descargando Mono para mi Mac para poder probar el programa en sí, pero ya tengo un validador que ejecuta una solución dada en una cuadrícula determinada y me dice si la solución es una solución válida para esa cuadrícula, y es diciéndome que las tres soluciones de ejemplo que me has dado no son válidas. Solo estoy investigando por qué ahora.
Gareth el
¡Ajá! ¡He descubierto lo que pasó aquí! Sus respuestas dadas parecen ser respuestas a los 3 ejemplos y no a las tres cuadrículas de prueba (que están más abajo en la pregunta). De hecho, son soluciones correctas para esas cuadrículas, aunque son bastante más largas que 1, Ay 2Icuáles son las soluciones más simples, pero eso en realidad no importa ya que no estoy juzgando la longitud de la solución de cuadrícula :-) Si pudiera editar y dar las respuestas para las 3 cuadrículas de prueba (voy a ver si puedo ejecutar esto en mi Mac ahora) puedo darte tu +1.
Gareth el
@Gareth: ¡Vaya! Me faltaron respuestas para los cuadros de prueba, gracias por señalarlo. Los he agregado ahora a mi respuesta.
SergeyS
Excelente, gracias por eso. Todos han validado bien. Xamarin no funcionaría en mi Mac por alguna razón, por lo que tendré que probar el programa en el trabajo en un par de horas.
Gareth el
@Gareth: en realidad no hay nada específico para C # en ese código, uno probablemente puede convertirlo a Java o incluso C ++ sin mucho dolor y ... golf algunos caracteres fuera de él :) También siéntase libre de convertirlo a GolfScript o algo más conciso - esto puede parecer dos veces o más corto;)
SergeyS