Introdução:
Um cubo de Rubik de 3x3x3 possui permutações possíveis, o que equivale a aproximadamente 43 quintilhões . Você já deve ter ouvido falar sobre esse número antes, mas como ele é realmente calculado?
Um cubo de Rubik 3x3x3 tem seis lados, cada um com nove adesivos. Observando as peças (externas) em vez de adesivos, porém, temos seis peças centrais; peças de oito cantos; e doze peças de borda. Como os centros não podem ser movidos, podemos ignorá-los nos cálculos. Quanto aos cantos e arestas:
- Existem( ) maneiras de organizar os oito cantos. Cada canto tem três orientações possíveis, embora apenas sete (dos oito) possam ser orientados independentemente; a orientação do oitavo / canto final depende dos sete anteriores, dadas ( ) possibilidades.
- Existem ( ) maneiras de organizar as doze arestas. A metade deé porque as arestas devem estar sempre em uma permutação uniforme exatamente quando os cantos estão. Onze arestas podem ser invertidas independentemente, com o giro da décima segunda / aresta final, dependendo das onze anteriores, com ( ) possibilidades.
Juntando isso, temos a seguinte fórmula:
Fonte: Wikipedia - Permutações do cubo de Rubik
Embora isso possa parecer bastante complexo, ainda é bastante simples para um cubo 3x3x3. Para cubos pares, a fórmula é um pouco diferente; esta é a fórmula para um cubo 4x4x4, por exemplo:
Que é aproximadamente 7,40 quattuordecilhões em pequena escala .
E para cubos NxNxN maiores (ou seja, o atual recorde mundial de 33x33x33), a fórmula será estendida um pouco. Para não tornar essa introdução muito longa, coloquei esses links aqui, onde as permutações do cubo 4x4x4 e alguns cubos NxNxN de outros tamanhos são explicados com uma fórmula resultante:
Você já deve estar se perguntando: existe uma fórmula geral baseada em para qualquer cubo x x ? Certamente existe. Aqui estão três algoritmos completamente diferentes, todos dando exatamente os mesmos resultados com base em :
1: Fórmula de Chris Hardwick:
2: Fórmula trigonométrica de Christopher Mowla:
3: Primos de Christopher Mowla Fórmula:
onde é .
Fonte: Cubers-reddit - Fórmulas matemáticas de contagem de número de posições, número de Deus, etc.
Desafio:
Escolha e implemente uma dessas três fórmulas (ou sua própria derivada), que fornece um número inteiro de entrada no intervalo , produz o resultado correto.
Regras do desafio:
- Você é livre para usar outra fórmula além dessas três, mas lembre-se de que essas três estão corretas. Se você usar outra fórmula, adicione um link de onde a obteve (ou, se você a criar, adicione uma explicação detalhada). E vou verificar todos os números inteiros no intervalo, se a saída estiver correta. Talvez a inspiração possa ser encontrada nos oeis para esta sequência: A075152 .
- Se o seu idioma gerar automaticamente uma saída científica (ou seja, vez do número após a fórmula 4x4x4), isso é permitido. Mas adicione código adicional à sua resposta para converter esse arredondamento científico em uma saída exata para que os resultados possam ser verificados, pois não são permitidos erros de arredondamento devido à precisão do ponto flutuante durante a execução da fórmula em seu código - o resultado real deve ser exato.
- Seu programa / função deve estar correto para pelo menos as entradas no intervalo (embora, como já resulte em um número imenso, qualquer maior provavelmente funcionará tão bem se você conseguir produzir isso um corretamente).
- Você não tem permissão para repetir todas as permutações possíveis com um contador, pois isso nunca produziria nada em um período de tempo razoável. Somente a implementação de uma fórmula (uma das três fornecidas, um derivado de uma delas ou uma fórmula completamente nova) ou outro método que fornecerá os resultados corretos em um período de tempo razoável (sem codificação embutida, é claro) ) é permitido. Pensei em adicionar um tempo restrito para impor isso, mas pessoalmente sou contra o tempo restrito em combinação com o código-golfe , então não o farei. Ainda assim, verifique se o seu programa fornece as respostas e, se for muito lento para o TIO, por algum motivo, adicione algumas capturas de tela com a saída da máquina local como verificação.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
- Além disso, é altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste:
Aqui estão os casos de teste para no intervalo (fique à vontade para usar os links WolframAlpha acima para casos de teste maiores):
n=2
3674160
n=3
43252003274489856000
n=4
7401196841564901869874093974498574336000000000
n=5
282870942277741856536180333107150328293127731985672134721536000000000000000
n=6
157152858401024063281013959519483771508510790313968742344694684829502629887168573442107637760000000000000000000000000
n=7
19500551183731307835329126754019748794904992692043434567152132912323232706135469180065278712755853360682328551719137311299993600000000000000000000000000000000000
n=8
35173780923109452777509592367006557398539936328978098352427605879843998663990903628634874024098344287402504043608416113016679717941937308041012307368528117622006727311360000000000000000000000000000000000000000000000000
n=9
14170392390542612915246393916889970752732946384514830589276833655387444667609821068034079045039617216635075219765012566330942990302517903971787699783519265329288048603083134861573075573092224082416866010882486829056000000000000000000000000000000000000000000000000000000000000000
n=10
82983598512782362708769381780036344745129162094677382883567691311764021348095163778336143207042993152056079271030423741110902768732457008486832096777758106509177169197894747758859723340177608764906985646389382047319811227549112086753524742719830990076805422479380054016000000000000000000000000000000000000000000000000000000000000000000000000000000000
NOTA: Como esse é um desafio do código-golfe , basicamente se resume a: implementar uma dessas três fórmulas (ou um derivado / seu próprio método que ainda produz os resultados corretos) o mais curto possível.
fonte
floor
Respostas:
Wolfram Language (Mathematica) , 59 bytes
Experimente online!
usa o algoritmo de Herbert Kociemba encontrado na página OEIS
aqui está a fórmula recursiva:
a(1)=1; a(2)=7!*3^6; a(3)=8!*3^7*12!*2^10; a(n)=a(n-2)*24^6*(24!/24^6)^(n-2)
6 bytes salvos por @Peter Taylor
mais um byte salvo por @Expired Data
fonte
f@1
, portanto, você pode salvar 6 bytes. Obviamente, você também gostaria de ajustar sua estrutura de teste para usarRange[2,10]
.código de máquina x86, 119 bytes
Hexdump:
A função recebe o número
n
emecx
, e um ponteiro para uma cadeia de enchimento emedx
(ou seja,fastcall
convenção).Antes de mostrar o código fonte, algumas explicações sobre como ele funciona. Ele usa a fórmula recursiva, que escrevi da seguinte maneira:
Então, todo o código deve fazer é multiplicar por números pequenos. Os números estão no intervalo de 6 a 36, que é pequeno o suficiente para ser representado em um bitmap de 32 bits. Na verdade, não armazeno o bit que representa a multiplicação por 6 - isso permite organizar o código em um
do-while
loop, começando com a multiplicação incondicional por 6.Os grandes números são representados usando a forma decimal - cada byte é um valor no intervalo de 0 a 9, começando no MSB.
A multiplicação é realizada de LSB para MSB; assume que o número de dígitos aumentará 2 para cada multiplicação. Depois de fazer a multiplicação por um fator pequeno como 6, o número de dígitos pode aumentar em apenas 1. Portanto, se MSB = 0, move todo o resultado intermediário para a esquerda. Na verdade, pode acontecer que o número de dígitos não aumente e, em seguida, o MSB ainda será 0, mas esse problema será corrigido conforme o código avança para fatores maiores.
Como o código de multiplicação é grande, não quero colocá-lo duas vezes. Também não quero movê-lo para uma função, porque o código da máquina para chamar uma função é grande. Então, reorganizei os loops externos de forma que o código multiplicador seja necessário apenas uma vez.
Código C:
Desmontagem:
O tempo de execução para n = 100 é de cerca de 4 segundos e o resultado é um número com 38416 dígitos:
23491019577617 (muitos dígitos aqui) ... (muitos zeros aqui) 0000000000000000
fonte
05AB1E , 38 bytes
Tentativa inicial.
Usa a fórmula de Chris Hardwick .
Vou tentar jogar mais e explicar quando tiver tempo.
Experimente online!
fonte
Julia 1.0 ,
8376 bytesExperimente online!
Usa a fórmula de Chris Hardwick. Recebe entrada como Big inteiro.
Graças a H.PWiz por -7 bytes
fonte
~=n->factorial(big(n))
->~n=prod(big,1:n)
e(24576*~12)^(n%2)
->^(24576*~12,n%2)
~=n->
vez de~n=
?Python 2 , 72 bytes
Experimente online!
Salva 4 bytes copiando
n*(n-2)/4
do Neil .fonte
Wolfram Language (Mathematica) , 67 bytes
Usando a fórmula de Chris Hardwick.
Experimente online!
fonte
JavaScript (Node.js) , 81 bytes
A fórmula recursiva de Herbert Kociemba. Toma um BigInt como entrada.
Experimente online!
JavaScript (Node.js) ,
102 9896 bytesA fórmula de Chris Hardwick. Toma um BigInt como entrada.
Experimente online!
fonte
JavaScript (Node.js) ,
777573 bytesExperimente online! Baseado na fórmula de Christopher Mowla. Toma um BigInt como entrada. Arnês de teste roubado descaradamente do @Arnauld.
0xb88d4641131f0n
está3246670537110000n
em decimal. Explicação: Comecei com o último expoente primo e simplifiquei paran*(n-2n)/4n
(esta é a divisão inteira, portanto, não preciso do ajuste para números ímpares). Em seguida, examinei os outros números primos para ver se seus expoentes estavam relacionados a esse valor (ao qual chamarei deo
) e descobri que eles estavam de certa forma, se permitisse o uso da paridade den
(ao qual me referirei comop
) As fórmulas para os expoentes são as seguintes:Os poderes podem então ser agrupados por expoente, por exemplo,
p
o expoente de11*7*5**2*3**3*2**14
.fonte
Raquete ,
151141 bytes-7 bytes graças a fede s.!
Experimente online!
A resposta mais longa usando a Fórmula de Chris Hardwick :)
fonte
expt
chamadas:(λ(n[e expt])...(e ...)...)
.Python 2 , 122 bytes
Experimente online!
Usa o método recursivo de Herbert Kociemba.
-2 bytes graças a Herman L
fonte
3**6
por 729 e2**10
por1024
TIOGeléia ,
3938 bytesSinto que perdi alguns tacos, mas ...
Um link monádico implementando a fórmula de Chris Hardwick.
Experimente online! Ou veja a suíte de testes (
n=[1..33]
).fonte
CJam (47 bytes)
Demonstração online
j
fonte
Gelatina , 43 bytes
Experimente online!
fonte
Ícone ,
125110 bytesExperimente online!
fonte
C (gcc) -lgmp, 279 bytes
Experimente online!
fonte
N--*--N/4
vez de(N*N-2*N)/4
removerN-=2
e#define s mpz_init_set_str
Perl 6 , 85 bytes
Experimente online!
fonte
Haskell ,
868574 bytes-1 bytes salvos graças a H.PWiz
-11 bytes salvos graças a Max Yekhlakov
Experimente online!
fonte
24576
é mais curto que2^13*3
Python 2 , 92 bytes
Experimente online!
fonte
Casco ,
514844 bytes-4 bytes graças a H.PWiz
Experimente online!
Esta é a fórmula de Chris Hardwick. Além disso, este é o meu primeiro programa de cascas, então qualquer dica seria bem-vinda.
fonte
÷^*6÷4□-2⁰Π4*^÷4-D⁰□⁰Π24*729*Π7^%2⁰*24*1024Π12
÷^*6÷4□-2⁰Π4*^÷4-D⁰□⁰Π24*729*Π7^%2⁰*24576Π12
C ++,
187 185 180 176 195 (houve um erro) 193175 bytes (com ajuda do teto cat)Ele usa o wrapper GMP C ++ (biblioteca de precisão múltipla GNU) e a fórmula usada por @ J42161217 ( https://codegolf.stackexchange.com/a/183381/55953 ).
Use
g++ -g rubix.cpp -lgmp -lgmpxx
para compilar e vincularungolfed, com código de teste
https://tio.run/##PZAxb4MwEIV3foWVDrETqBpARMImWZqha7t0iFQZ4xC3xrg2tJERf73UIVXfcE937zvpdEzrqGZsmu6EYrKvOKkbfbncn3dBb4WqgSsa7d6YpNZiBzR0gIYOlGhwgBUb/H0WksMyihBbFRQb3vVGAYZHB4xnFRr@Rqoo4n2SbdNN9pD7Jtk7uNCvafVEn7fvjx@LMItRbqCKYrTSME7D7OoeOpivl4Mp@eeMhFcAj//3AiJa2xlOm13QUKEgCoYAeJ1aA4XqgChiDARJUl/XazRnXrar8py1fUeIIGR57JaE@AUECLllXFUSB2Mw/bCTpLWdIjm/5ua/
fonte
n=10
caso de teste para que eu possa verificar se ele funciona? Eu acho que não há nenhuma maneira de fazer isso funcionar no CIO (clang) ou C ++ (gcc) TIO devido à biblioteca usada?TI-BASIC,
6362 bytes , (não competitivo)Expressão que recebe a entrada como um número inteiro
Ans
. Implementação da fórmula de Chris Hardwick. Não-concorrente porque o hardware em que ele roda armazena apenas até 16 casas decimais, portanto a resposta nunca será 100% precisa.Explicação:
fonte