43 quintilhões de permutações

16

Podemos representar um cubo de Rubik como uma rede da seguinte maneira (quando resolvido):

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

Cada letra representa a cor correspondente ( Wé branca, Gverde etc.)

Foi demonstrado que existem exatamente 43,252,003,274,489,856,000 (~ 43 quintilhões) permutações diferentes nas quais um cubo de Rubik pode estar.

Sua tarefa é pegar um número inteiro entre 1 e 43,252,003,274,489,856,000 e gerar a permutação correspondente, da maneira mostrada acima. Você pode escolher como as permutações são ordenadas, mas o algoritmo usado deve ser mostrado para gerar uma permutação exclusiva e correta para cada entrada possível.

Regras de permutação inválidas

Retirado desta página

Para começar, o centro de cada face 3x3 deve permanecer o mesmo, pois o quadrado central no cubo de Rubik não pode ser girado. O cubo inteiro pode ser girado, mudando onde uma face parece estar, mas isso não afeta a rede do cubo.

Se dissermos que cada permutação tem paridade, com base na paridade do número de swaps para atingir essa permutação, podemos dizer

  • Cada peça de canto tem três orientações possíveis. Pode ser orientado corretamente (0), no sentido horário (1) ou no sentido anti-horário (2). A soma das orientações dos cantos sempre permanece divisível por 3

  • Cada rotação legal no Cubo de Rubik sempre vira um número par de arestas, portanto não pode haver apenas uma peça orientada incorretamente.

  • Considerando a permutação de todos os cantos e arestas, a paridade geral deve ser uniforme, o que significa que cada movimento legal sempre executa o equivalente a um número par de trocas (ignorando a orientação)

Por exemplo, as três redes a seguir são saídas inválidas:

   WWW
   WWW
   WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

(Too many whites/not enough reds)

   WRW
   WRW
   WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
   YYY
   GGY
   YYY

(There are two red/green center squares and no white/yellow center squares.
 In all valid permutations, the center squares are all different colours)

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
   YYY
   YYY
   YYB

(The yellow/orange/blue corner is rotated into an impossible permutation)

Regras

  • Você deve provar, da maneira que desejar, que o algoritmo é válido. Você não precisa enumerar todas as permutações, desde que prove a validade do seu algoritmo.
  • 143,252,003,274,489,856,000
    • 253-1253-1
    • 27,946,105,037,114,827,095
  • Você deve incluir algum tipo de prova de validade em sua resposta. Essa prova pode provar a validade de qualquer método de prova aceito, exceto para enumerar todas as possibilidades.
  • Você pode optar por usar um método de entrada alternativo, se desejar, desde que:
    • A entrada é limitada
    • Cada entrada corresponde a uma saída única
    • Você explica claramente o formato de entrada e como ele corresponde a cada saída
  • Você pode alterar os caracteres usados ​​para usar 6 caracteres ASCII diferentes, entre 33 ( !) e 126 ( ~), em vez deWGRBOY
  • Você pode produzir da maneira que desejar, contanto que forme uma representação clara de um cubo onde todas as 6 faces possam ser exibidas, incluindo qualquer rede de cubos válida, uma única linha alinhada ou uma renderização em 3D. Se você não tiver certeza sobre um formato específico, não hesite em perguntar nos comentários.

Este é um portanto o código mais curto, em bytes, em cada idioma vence.

Exemplo de saídas válidas

   YYY
   YYY
   YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   WWW
   WWW
   WWW

(The `W` and `Y` faces have been swapped)

   ZZZ
   +++
   +}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
   7bb
   [7Z
   [7Z

(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
 Then, the moves L, R, U and F' have been applied, in that order.
 Notice that each centre square is different, and corresponds to the same colour as in the mapping)
caird coinheringaahing
fonte
No terceiro exemplo inválido é não só que o canto está numa configuração inválido, o r / y / o canto é um canto impossível devido a r e o sendo em frente um do outro
fənɛtɪk
Corrigido o terceiro exemplo inválido (CC @ fəˈnɛtɪk)
Jonathan Allan
O mesmo problema também estava no segundo exemplo inválido, mas eu não havia notado. Importa menos lá porque as cores são desarrumada qualquer maneira
fənɛtɪk
(uma1,uma2,uma3,uma4)uma18!uma237uma312!/2uma4211
1
@Shaggy Sim, uma string de linha única é boa
caird coinheringaahing

Respostas:

13

Carvão , 334 297 bytes

Nθ≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θF⪪”B"↷:μêKO″KW#})”³«J⌕α§ι⁰I§ι¹§ι²»≔⁰ω≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δF²«Fδ«≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυFLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»≧÷Lκε»≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ≔θζ≔ηε

Experimente online! Link é a versão detalhada do código. Explicação:

Nθ

Entrada o número inteiro na variável q.

≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ

Divida qpor 3⁷, colocando o restante e. Então, considerando ecomo um número na base 3, coloque um dígito no sufixo para eque seus dígitos (na base 3) totalizem um múltiplo de 3. Isso permite edefinir as rotações dos cantos.

≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ

Divida qpor 8 !, colocando o restante z. (8! É armazenado temporariamente dpara salvar um byte.) Isso permite zdefinir as posições dos cantos.

≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θ

Divida qpor 2¹¹, colocando o restante h. Então, considerando hcomo um número na base 2, coloque um dígito no sufixo para hque seus dígitos (na base 2) totalizem um múltiplo de 2. Isso permite hdefinir as inversões das arestas.

F⪪”B"↷:μêKO″KW#})”³

Faça um loop sobre uma representação em cadeia dos centros.

«J⌕α§ι⁰I§ι¹§ι²»

Pule para a posição de cada centro e imprima-a.

≔⁰ω

Acompanhe a paridade das posições dos cantos na variável w.

≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ

Crie uma matriz de posições de canto.

≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δ

Crie uma matriz de cores de canto.

F²«

Faça um loop duas vezes, uma vez para cantos, uma vez para bordas, a seguir denominados "cubos".

Fδ«

Faça um loop sobre a matriz de cores do cubo.

≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυ

Extraia a próxima posição do cubo z, atualizando a paridade emw . Use essa paridade para a última mas uma aresta. Isso garante que a soma da paridade das arestas e cantos seja uniforme.

FLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»

Imprima o cubo nessa posição, ajustado para a próxima rotação ou gire conforme apropriado.

≧÷Lκε»

Remova a rotação ou inverta e.

≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ

Crie uma matriz de posições da aresta. Isso será usado pela segunda vez no loop.

≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ

Crie uma matriz de cores de borda.

≔θζ≔ηε

Substituir as variáveis de canto ze ecom as variáveis bordo correspondente qe hde modo que as bordas são permutadas e invertidas durante a segunda passagem do loop.

Neil
fonte
Aconselhe para mim mesmo: Se algo jogado no carvão vegetal for de 330 bytes, não tente em PHP!
night2
@ Night2 Infelizmente 334 agora, devido a uma correção de bug (cálculo de paridade incorreto).
Neil
8

Ruby , 570 408 bytes

->g,h{z=[]
c=a="\x19)!$'%\x177\x1F495.)@7g~yp"
20.times{|i|z<<a[k=g%r=12+i/12*8-i];a[k]="";g/=r}
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18,2])
h+=h+("%b"%(h%2048)).sum%2
j=0
b="023451"
20.times{|i|b<<("%0*o"%[r=2+i/12,z[i].ord-20]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s["<QTWZo;MP[ngD@RS^k=GVUpaJ8XYdsAFE?CN7LK9IHl_`jh]reftbc"[i].ord-55]=b[i]}
s}

Experimente online!

Versão original, com matrizes de números mágicos em vez de cordas mágicas

->g,h{z=[]
a=[05,025,015,020,023,021,03,043,013,040,045,041,   032,025,054,043,0123,0152,0145,0134]
#PERMUTE
20.times{|i|r=12+i/12*8-i;z<<a.delete_at(g%r);g/=r}
c=1
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18],z[19])
#ROTATE
h+=h+(h%2048).to_s(2).sum%2
j=0
b="023451"
20.times{|i|r=2+i/12;b<<("%0*o"%[r,z[i]]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
#DISPLAY
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s[
[5,26,29,32,35,56,
4,22,25,36,55,48, 
13,9,27,28,39,52,
6,16,31,30,57,42,
19,1,33,34,45,60,
10,15,14,8,12,23,0,21,20,2,18,17,
53,40,41,51,49,38,59,46,47,61,43,44][i]]=b[i]}
s}

Experimente online!

Uma função anônima que, na sua forma atual, recebe uma entrada de dois números inteiros, o que parece ser permitido: "você pode escolher um método de entrada alternativo". O primeiro é a permutação no intervalo de 0 a 12!*8!/2 - 1e o segundo é a orientação das peças no intervalo de 0 a 2**11 * 3*7 - 1. A saída no estado resolvido é a seguinte sequência:

000
000
000
222333444555
222333444555
222333444555
111
111
111

Golfe adicional

Existem aproximadamente 10 caracteres a serem salvos ajustando o formato de saída para a seguinte forma. Mas isso reduziria a legibilidade, então não o farei no momento

      #########
      #########
      #########
#########
#########
#########

Explicação

Permutação

Internamente, o estado resolvido é representado pela série de números octais na matriz a. A entrada gé dividida pelos números 12..1com o módulo sendo usado para selecionar e remover uma aresta ae inseri-la z. Uma vez feito isso, apenas os cantos permanecem a, então gé dividido pelos números 8..1com o módulo sendo usado para remover um canto ae colocá-lo emz .

Como não há informações suficientes para determinar a ordem dos dois últimos cantos, o valor de gserá dividido em zero no momento em que os atingir, para que eles sempre sejam adicionados à zordem original. Uma verificação é feita para determinar se a permutação geral é par ou ímpar e, se necessário, os dois últimos cantos são trocados para tornar a permutação uniforme.

Orientação

Existem várias maneiras diferentes de decidir se um canto ou aresta está na orientação correta, se não estiver em seu local resolvido. Para os fins desta resposta, um canto é considerado em sua orientação correta se aparecer 0ou 1na face superior ou inferior. Portanto, girar a face superior ou inferior não altera a orientação do canto. Girar as outras faces altera a orientação, mas de maneira que a soma da paridade geral permaneça inalterada. As arestas são consideradas na orientação correta se mostrarem a 2ou 4para a frente / trás ou a 3ou 5para a esquerda / direita. Isso significa que a rotação da parte superior ou inferior em um quarto de volta vira as quatro arestas, mas a rotação das outras faces mantém o status de inversão inalterado.

A entrada contém informações explícitas para todos, exceto a primeira aresta e o último canto. Os 11 bits menos significativos h%2048são somados e o módulo usado para determinar a orientação da primeira aresta. hé multiplicado por 2 adicionando-o a si mesmo e o valor para a orientação da primeira aresta é adicionado como o bit menos significativo. A orientação do último canto é encontrada subtraindo progressivamente a orientação dos outros cantos de j. Para o último canto (onde i/19= 1) o valor de j%3é adicionado a h(que será reduzido a zero) e isso determina a orientação do último canto.

A sequência bé pré-inicializada com o texto para os centros das faces. hé dividido por 2doze vezes e depois por 3oito, com os módulos utilizados para determinar a orientação das peças. Em cada caso, o número in zé convertido em uma sequência com o número apropriado de dígitos (2 ou 3) e a sequência é duplicada. Isso permite que a rotação correta dos dígitos, conforme encontrada pelo módulo, seja extraída da string por indexação e anexada ab

Exibição

Por fim, os adesivos brutos são copiados bpara um formato legível por humanos, susando os números mágicos na tabela de índice.

Level River St
fonte