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



