Una sequenza di mosse è una sequenza di mosse (svolte) su un cubo di Rubik (per la notazione guarda in basso). Oltre alla sequenza di mosse vuota, ci sono molte altre sequenze di mosse che non hanno alcun effetto sul cubo. Chiamiamo queste sequenze di mosse sequenze di identità.
Alcune di queste sequenze di identità sono ovvie da determinare, come U2 R R' U2
o U D2 U' D2
. Nel primo, vengono eseguite due mosse casuali U2 R
e successivamente annullate immediatamente R' U2
. Il secondo è simile. Le prime due mosse casuali U D2
e successivamente vengono annullate, ma in ordine inverso U' D2
. Funziona solo perché la mossa ha U
effetto solo sui pezzi del livello superiore e la mossa ha D2
effetto solo sui pezzi del livello inferiore. Puoi vedere una visualizzazione di queste due sequenze di mosse.
Altre sequenze di identità potrebbero non essere affatto ovvie. Ad esempio la sequenza R' U' R' F' U F U' R' F R F' U' R U2 R
. È piuttosto lungo, ma non ha alcun effetto sul cubo.
Sposta notazione
Una mossa descrive il giro di uno strato di una delle sei facce del cubo. Una mossa consiste in una lettera che rappresenta la faccia seguita da un suffisso opzionale che rappresenta l'angolo di virata.
Le lettere e le facce corrispondenti sono U (Su - il lato rivolto verso l'alto), D (Giù - il lato rivolto verso il basso), R (Destra - il lato rivolto verso destra), L (Sinistra - il lato rivolto verso sinistra) , F (anteriore: il lato rivolto verso di te) e B (posteriore: il lato rivolto verso di te).
Se non c'è suffisso, la faccia viene ruotata di 90 gradi in senso orario, il suffisso '
significa, la faccia viene ruotata di 90 gradi in senso antiorario e il suffisso 2
significa che la faccia viene ruotata di 180 gradi in senso orario.
In caso di problemi con la notazione, basta usare http://alg.cubing.net , dove è possibile visualizzare tali sequenze di mosse.
La sfida
Il tuo compito è scrivere un programma, che determina se una sequenza di mosse è un'identità o meno.
È possibile scrivere un programma completo o una funzione. Dovrebbe ricevere una stringa contenente una sequenza di spostamenti (gli spostamenti sono separati da spazi) come input (tramite STDIN, argomento della riga di comando, argomento prompt o funzione) e output (tramite valore di ritorno o STDOUT) un valore booleano o un intero corrispondente ( True - 1 - sequenza identità / False - 0 - non sequenza identità).
Se il suffisso '
crea problemi nel linguaggio di programmazione, è possibile utilizzare un simbolo diverso, ma non a cifre. R F2 U3
non è permesso.
Questo è codegolf, quindi vince il codice più breve (in byte).
Casi test
"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False
U3
, potresti semplicemente lanciare il suffisso in una cifra.
R2 D2
.
That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
R F2 U3
?