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.
floor