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
- 9
y 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
, 9
deben usarse como instrucciones para voltear las filas, y las letras A
, I
deben 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 8
medio voltea la segunda fila desde abajo y un F
medio 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 2
y luego voltear la columna I
para 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/2014La 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))
(-2, 4)
,(2, 4)
,(2, -4)
, o(-2, -4)
.A1
) y moverlo aB1
. Puedes llegar1
a la posiciónB1
, pero será el mosaico deB9
, no el mosaico deA1
. 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.Respuestas:
GolfScript,
300279268 caracteresTenga 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:
fuente
Mathematica
582575503464282¡Para pelear con golfscripters tengo que usar artillería pesada!
Salida:
Aquí
PermutationGroup[...]
configura posibles volteretas yGroupElementToWord[...]
resuelve el problema (aproximadamente0.2
segundos). El principal problema es que es difícil identificar la correspondencia entre la posición de9
la 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:
Reproduce completamente los ejemplos:
Solución anterior (464)
sin funciones integradas inteligentes y con tiempo de ejecución de 4 ms:
Todas las líneas nuevas aquí no son necesarias.
Salida:
Otras dos cuadrículas de prueba:
Visualización:
La cadena de entrada
i
se puede generar aleatoriamente porBreve discusión
Los flips pueden intercambiar solo estos elementos ("cuádruple"):
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!
Convierta la cadena
i
a la matrizM
.Añadiremos caracteres a
S
. Ahora es la cadena vacía.H[i,j]
agregará el carácteri
(1,2,3,...,9
) y el carácterj
(a,b,c,...,i
en base-36).Convierto elementos como
para obtener la matriz objetivo en la siguiente forma
Luego hay dos pasos principales en mi algoritmo
Encuentre volteos para obtener las firmas como en la matriz objetivo (por ejemplo, la firma de
{-7,-1,1,7}
is1
y la firma de{-6,2,-2,6}
is-1
):Gire cada "cuádruple" para obtener el orden correcto:
Es la parte más no trivial del algoritmo. Por ejemplo, la transformación
1b1b
se convertirá{-7,-1,1,7}
a{-1,1,-7,7}
. La transformación9h9h
se convertirá{-7,-1,1,7}
a{-7,7,-1,1}
. Entonces tenemos dos mapasy 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)No puedo probarlo, ¡pero funciona!
El ultimo paso es
Realiza volteos triviales de la fila central y la columna central y devuelve el resultado.
fuente
J
487438d
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:
Ahora acepta cualquier tipo de nueva línea.
Soluciones a las cuadrículas de prueba:
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
d
a esto:y la última línea para esto:
Elegí regresar
0
en 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).fuente
LF
s representan particiones del archivo secuencial.DO#
540399Bueno, 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!
Rejillas de prueba:
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).
Responda por ejemplo 1:
Responda por ejemplo 2:
Responda por ejemplo 3:
Respuestas para los cuadrados de prueba:
fuente
1
,A
y2I
cuá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.