Crea un programma o una funzione per sbloccare un quadrato di cifre capovolgendo (invertendo il punto centrale) solo righe e colonne.
Ingresso
L'input sarà una griglia di 9x9 cifre sotto forma di una stringa di 9 righe come la seguente:
986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378
Questo formato di input non è negoziabile: qualsiasi soluzione "creativa" con il formato di input verrà considerata non valida.
Produzione
L'output dovrebbe essere un elenco di movimenti di inversione che, quando applicati all'input nell'ordine dato, dovrebbero ricreare la griglia di destinazione.
Un esempio di output (non una soluzione al precedente esempio di input):
28IF5D3EAB9G3
Anche questo formato di output non è negoziabile. Non dovrebbero esserci nuove righe o spazi nell'output, ma solo i caratteri 1- 9e A- I(i caratteri minuscoli sono accettabili al posto dei caratteri maiuscoli se si preferisce).
La griglia di destinazione (lo stato che è necessario ricreare) è la seguente:
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
I numeri 1- 9dovrebbero essere usati come istruzioni per capovolgere le righe e le lettere A- Idovrebbero essere usati per le colonne. Questo è mostrato di seguito con la griglia nel suo stato ripristinato.
ABCDEFGHI
|||||||||
vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678
Quindi un 8mezzo capovolge la seconda fila dal basso e un Fmezzo capovolge la sesta colonna.
Nel caso in cui non sia possibile alcuna soluzione, il programma dovrebbe terminare senza generare nulla.
Esempi
Ingresso:
987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Produzione:
1
In questo caso, solo la riga superiore deve essere capovolta per tornare allo stato obiettivo.
Ingresso:
123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Produzione:
I
In questo caso, solo la colonna finale (colonna I) deve essere ruotata per ricreare lo stato dell'obiettivo.
Ingresso:
123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Produzione:
2I
In questo caso è necessario capovolgere la riga 2e poi capovolgere la colonna Iper tornare allo stato obiettivo.
Gli appunti:
- Includi un esempio di utilizzo nella tua risposta.
- L'output fornito non deve essere la sequenza più breve che restituirà lo stato dell'obiettivo - qualsiasi sequenza che restituisce lo stato dell'obiettivo farà tutto il tempo in cui funziona (cioè fino a quando posso provarlo)
- Mi impegnerò a testare ogni risposta e voterò a favore di tutti quelli che funzionano e che hanno ovviamente tentato di giocare a golf.
- Questa è una competizione a tempo indeterminato: accetterò la risposta più breve la prossima settimana, ma se arriva una risposta valida più recente, che sarà più corta in qualsiasi momento in futuro, cambierò la risposta accettata per riflettere quella .
La taglia è stata fissata a 200 reputazione per la risposta più breve ricevuta da 23:59:59 (GMT) il 26/01/2014.La taglia è stata assegnata a Howard per la sua soluzione GolfScript da 268 caratteri .
analisi
Fornisci l'output del tuo programma per le seguenti tre griglie di test con la tua risposta:
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
Ho creato un piccolo programma Python per generare griglie valide a scopo di test:
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) e spostala su B1. Puoi ottenere un 1dalla posizione B1, ma sarà la tessera da B9, non la tessera da A1. Poiché sono consentiti solo capovolgimenti di riga / colonna, il primo più in alto 1 sarà sempre e solo in uno dei quattro angoli più esterni. Se ho sbagliato le regole, per favore fatemi sapere.



