Sua tarefa é criar uma sequência aleatória de movimentos, que pode ser usada para embaralhar um cubo de Rubik. Essa disputa é composta de exatamente 25 movimentos. Cada movimento consiste nas letras UDRLFB
seguidas opcionalmente por um dos sufixos '2
.
Essa notação é chamada de notação Singmaster. UDRLFB
representa uma das 6 faces e o sufixo opcional '2
representa o ângulo de viragem. Esta informação não é necessária para resolver a tarefa.
Para garantir que as disputas sejam de 'boa qualidade', as duas regras a seguir devem ser aplicadas:
Dois movimentos consecutivos não devem ter a mesma letra. Esta proíbe os lances consecutivos
UU
,DD
,RR
,LL
,FF
eBB
e todas as suas combinações usando os sufixos opcionais comoU2U
ouU'U'
.Esses pares de movimentos são banidos porque podem ser facilmente reduzidos a 1 ou 0 movimentos.
U2U
tem o mesmo efeito queU'
,R'R
o mesmo efeito que.
Três jogadas consecutivas não devem ser do mesmo grupo de letras. Os grupos de letras são
UD
,RL
eFB
. Esta regra também proíbe os lances consecutivosUDU
,DUD
,RLR
,LRL
,FBF
,BFB
e todas as suas combinações usando os sufixos opcionais comoU2DU
,RL'R
ouB2FB'
.Os grupos classificam as faces pelo seu eixo de movimento.
U
eD
estão no mesmo grupo, porque ambos giram em torno do mesmo eixo. Portanto, umU
movimento não influencia os pedaços doD
rosto, e umD
movimento não influencia os pedaços doU
rosto. Portanto, os dois movimentos podem ser trocados,UDU
têm o mesmo efeito queUUD
, e isso pode ser reduzido paraU2D
.
Desafio
Escreva um script ou uma função que gere uma disputa aleatória. Não há entrada. O script / função deve imprimir os 25 movimentos sem separação ou separados por um espaço ou retornar a sequência correspondente.
Seu programa deve ser capaz de criar todos os embaralhamento, o que satisfaz as regras acima. Obviamente, assumindo que o gerador de números aleatórios é verdadeiro aleatório, e não pseudo-aleatório.
Isso é código-golfe. O código mais curto (contado em bytes ) vence.
Exemplos de saídas:
Chamar o script / função 3 vezes deve imprimir / retornar algo como:
R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D
Se você separar os movimentos por um espaço cada:
R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'
Observe que todas essas saídas consistem em 25 movimentos, mas têm comprimentos diferentes, devido aos sufixos opcionais. Não é permitido imprimir um espaço, quando um 2
ou '
é usado como sufixo. Você tem que imprimir L2UR2F'R'U2
ou L2 U R2 F' R' U2
. L2U R2F'R'U2
não é permitido.
L2U R2F'R'U2
. U
não possui sufixo opcional e, portanto, não deve ter espaço. Um espaço não deve substituir o sufixo opcional.
U F2 L D2 R'...
, por exemplo? Nesse caso, não há um espaço extra , que eu acho que deveria ficar bem de acordo com sua regra.
UR 2
não é permitido?U R2
deve ser permitido, acho, já que os espaços entre os movimentos fazem sentido.