L'idea per questa sfida del codice è semplice: data una matrice di numeri interi, ordiniamola applicando i movimenti in stile Rubik. Ciò significa che puoi selezionare una singola riga o colonna e ruotare i suoi elementi in qualsiasi direzione:
[1, 3, 2, 4] => [3, 2, 4, 1] (rotate left for rows/up for columns)
[1, 3, 2, 4] => [4, 1, 3, 2] (rotate right for rows/down for columns)
Quindi, data una matrice di numeri interi di qualsiasi dimensione, ordina i suoi elementi applicando solo queste trasformazioni in stile Rubik. Una matrice
saranno considerati ordinati se i suoi elementi sono conformi alla seguente limitazione:
I / O
- L'input sarà una matrice di numeri interi positivi senza valori ripetuti.
- L'output saranno i movimenti necessari per ordinarlo. Poiché questa non è una sfida di golf del codice e non devi preoccuparti della sua lunghezza, il formato proposto per ogni movimento è
#[UDLR]
dove si#
trova il numero della riga o della colonna da spostare (indicizzato 0) ed[UDLR]
è un singolo carattere in quella intervallo che specifica se il movimento è Su / Giù (per le colonne) o Sinistra / Destra (per le righe). Quindi1U
significherebbe "spostare la prima colonna verso l'alto", ma1R
sarebbe "spostare la prima riga verso destra". Movimenti saranno separate da virgole, quindi una soluzione sarà espressa come segue:1R,1U,0L,2D
.
punteggio
Cercare di ordinare una matrice in questo modo può essere costoso in quanto ci sono molte possibili combinazioni di mosse e ci sono anche molti elenchi possibili di mosse che possono ordinarla, quindi l'obiettivo è quello di scrivere un codice che ordina N N matrici di seguito. Il punteggio sarà la dimensione N massima che è possibile risolvere in un ragionevole lasso di tempo 1 senza errori (maggiore è la dimensione della matrice risolta, meglio è). In caso di pareggio, il pareggio sarà il numero di movimenti nel percorso trovato (più breve è il percorso, meglio è).
Esempio: se un utente A trova una soluzione per N = 5 e B trova una soluzione per N = 6, B vince indipendentemente dalla lunghezza di entrambi i percorsi. Se entrambi trovano soluzioni per N = 6 ma la soluzione trovata da A ha 50 passi e la soluzione B ha 60 passi, A vince.
Le spiegazioni su come funziona il tuo codice sono fortemente incoraggiate e ti preghiamo di pubblicare le soluzioni trovate in modo da poterle testare . Puoi usare Pastebin o strumenti simili se le soluzioni sono troppo grandi. Inoltre, sarà apprezzata una stima del tempo impiegato dal tuo codice per trovare le tue soluzioni.
Casi test
Le seguenti matrici ( collegamento di Pastebin per una versione più incollabile) sono state create a partire da matrici già ordinate mescolandole con movimenti casuali in stile Rubik 10K:
Casi di testo in chiaro:
[[8, 5, 6], [11, 10, 1], [3, 15, 13]]
[[21, 10, 12, 16], [17, 6, 22, 14], [8, 5, 19, 26], [13, 24, 3, 1]]
[[1, 13, 8, 16, 5], [9, 40, 21, 26, 22], [11, 24, 14, 39, 28], [32, 19, 37, 3, 10], [30, 17, 36, 7, 34]]
[[34, 21, 40, 22, 35, 41], [18, 33, 31, 30, 12, 43], [19, 11, 39, 24, 28, 23], [44, 1, 36, 5, 38, 45], [14, 17, 9, 16, 13, 26], [8, 3, 47, 6, 25, 4]]
[[20, 36, 17, 1, 15, 50, 18], [72, 67, 34, 10, 32, 3, 55], [42, 43, 9, 6, 30, 61, 39], [28, 41, 54, 27, 23, 5, 70], [48, 13, 25, 12, 46, 58, 63], [52, 37, 8, 45, 33, 14, 68], [59, 65, 56, 73, 60, 64, 22]]
[[85, 56, 52, 75, 89, 44, 41, 68], [27, 15, 87, 91, 32, 37, 39, 73], [6, 7, 64, 19, 99, 78, 46, 16], [42, 21, 63, 100, 4, 1, 72, 13], [11, 97, 30, 93, 28, 40, 3, 36], [50, 70, 25, 80, 58, 9, 60, 84], [54, 96, 17, 29, 43, 34, 23, 35], [77, 61, 82, 48, 2, 94, 38, 66]]
[[56, 79, 90, 61, 71, 122, 110, 31, 55], [11, 44, 28, 4, 85, 1, 30, 6, 18], [84, 43, 38, 66, 113, 24, 96, 20, 102], [75, 68, 5, 88, 80, 98, 35, 100, 77], [13, 21, 64, 108, 10, 60, 114, 40, 23], [47, 2, 73, 106, 82, 32, 120, 26, 36], [53, 93, 69, 104, 54, 19, 111, 117, 62], [17, 27, 8, 87, 33, 49, 15, 58, 116], [95, 112, 57, 118, 91, 51, 42, 65, 45]]
Chiedi di più se li risolvi tutti. :-) E molte grazie alle persone che mi hanno aiutato a perfezionare questa sfida mentre ero nella sandbox .
1 Un ragionevole lasso di tempo: qualsiasi periodo di tempo che non mina la nostra pazienza durante il test della soluzione. Nota che TIO esegue il codice solo per 60 secondi, qualsiasi periodo di tempo oltre tale limite ci farà testare il codice nelle nostre macchine. Esempio: il mio algoritmo piuttosto inefficiente impiega alcuni millisecondi per risolvere matrici di ordine 3x3 e 4x4, ma l'ho appena testato con una matrice 5x5 e ci sono voluti 317 secondi per risolverlo (in oltre 5 milioni di movimenti, molto divertente se lo consideriamo la matrice da risolvere è stata criptata solo 10K volte). Ho provato a ridurre il numero di movimenti a meno di 10K ma mi sono arreso dopo 30 minuti eseguendo il codice.
O(input size)
allora? Per una matrice 5x5 sarebbe O(25)
? Sembra essere estremamente veloce, quindi sarei molto interessato a vedere quel tuo algoritmo o implementazione del tuo. EDIT: Ti rendi conto che inseriamo la matrice 'strapazzata' e produciamo i movimenti, giusto? Non il contrario.