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.
fonte
UR 2
não é permitido?U R2
deve ser permitido, acho, já que os espaços entre os movimentos fazem sentido.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.Respostas:
CJam,
4745 bytesEsta solução usa uma abordagem diferente de qualquer outra postada até agora. Ele tira proveito das operações de lista concisa do CJam para gerar a lista de movimentação disponível e selecionar uma aleatoriamente a cada iteração. Modificadores são simplesmente gerados de forma independente.
Experimente online.
Explicação
fonte
C, 129
O loop interno gera um valor
m
dentro da faixa1..5
que, quando adicionados
e obtido no módulo 6, garante que não haja dois movimentos consecutivos no mesmo lado do cubo. O valor antigo dem
é armazenadon
e o testem*n==9
garante que o valorm
= 3 nunca seja gerado duas vezes em uma linha (portanto, faces opostas não podem ser selecionadas duas vezes em uma linha; observe a ordem das faces na sequência).A parte significativa de menos
r
é utilizado para decidir que sufixo ('
,2
ou nulo) para utilização, aproveitando o carácter nulo no final da"'2"
.O loop externo é executado 26 vezes. A primeira vez,
U
nunca pode ser selecionada,printf
sendo suprimida na primeira iteração.Código não jogado no programa de teste
O código não golfado coloca um espaço entre cada movimentação para maior clareza (o código golfado não salva, a fim de salvar um byte.) Além disso, o código golfado economiza um ponto-e-vírgula realocando o
printf
dentro dofor
colchete.Saída típica
fonte
Pyth,
6566.Eu nunca realmente joguei golfe em Pyth, talvez tenha escrito um ou dois programas. Esta é basicamente a solução do @ steveverrill traduzida para Pyth. Sugestões de melhoria são bem-vindas.
Atualização: adicionado 1 byte para começar a embaralhar
U
. Talvez a solução C esteja confiando em um comportamento indefinido para fazê-lo funcionar ...Acredito que isso deva ser feito com menos atribuições, mas isso exigiria que eu modificasse bastante o algoritmo. (Bem, pode tentar.)
Aqui está uma explicação baseada no código C:
fonte
Y
eZ
.Z
é pré-inicializado com 0, para salvar os 3 primeiros caracteres.n = m
(3ª linha explicação), o que deve significarn = 0
a primeira vez, que por sua vez exigiriaY
a ser 0.Y
é pré-inicializado com uma lista vazia[]
. E eu não acho que o valorn
importa na primeira iteração.U
.JavaScript (ES6) 175
178204Edite 3 bytes a menos, 1 alterando o código e 2 alterando a maneira como os bytes são contados (sem contar
F=
)O código para evitar repetições é retirado de @stevemiller. Sua maneira de gerenciar os grupos de cartas é ainda melhor, mas não vou roubá-la.
Bônus: você pode opcionalmente especificar o número de movimentos.
Menos golfe
Teste
fonte
Javascript - 112
fonte
Java 8,
189183 bytesPorta da resposta C de @LevelRiverSt . Eu tentei algumas coisas sozinho, mas isso foi mais curto do que o que eu tinha ..
Experimente online.
fonte
Ruby ,
116 107 10595 bytesExperimente online!
fonte
Clojure, 223 bytes
Isso depende muito do padrão "sequência -> partição por -> filtro -> concat"; é usado para filtrar sequências "ilegais" de faces. Esse seq é então mapeado para string junto com um postfix aleatório (incluindo a string vazia).
Ponto de partida não destruído:
fonte