Introduction:
Un cube de 3x3x3 Rubik a permutations possibles, ce qui est environ 43 quintillion . Vous avez peut-être entendu parler de ce nombre auparavant, mais comment le calcule-t-il réellement?
Un cube Rubik de 3x3x3 a six côtés, chacun avec neuf autocollants. En regardant les pièces (externes) au lieu des autocollants, nous avons six pièces centrales; huit pièces de coin; et douze morceaux de bord. Comme les centres ne peuvent pas être déplacés, nous pouvons les ignorer dans les calculs. En ce qui concerne les coins et les bords:
- Il y en a ( ) façons d'organiser les huit coins. Chaque coin a trois orientations possibles, bien que seulement sept (sur huit) puissent être orientés indépendamment; l'orientation du huitième / dernier coin dépend des sept précédents, avec possibilités ( ).
- Il y en a () façons d’organiser les douze bords. La moitié deC'est parce que les bords doivent toujours être dans unemême permutation,exactement quand les coins sont. Onze bords peuvent être basculésfaçon indépendante, avec le revers de la douzième / bord finalfonction de la précédente onze, étant donné() possibilités.
En réunissant cela, nous avons la formule suivante:
Source: Wikipedia - Permutation du cube de Rubik
Bien que cela puisse déjà sembler assez complexe, cela reste assez simple pour un cube 3x3x3. Même pour les cubes, la formule est légèrement différente. Voici la formule d'un cube 4x4x4 par exemple:
Ce qui correspond à environ 7,40 quattuordecillions sur une courte échelle .
Et pour les plus grands cubes NxNxN (c’est-à-dire le record du monde actuel 33x33x33), la formule s’allongera un peu. Pour ne pas faire cette introduction trop longtemps cependant, je mets ici ces liens, où les permutations du cube 4x4x4 et de quelques autres cubes de taille NxNxN sont expliquées avec une formule résultante:
Vous vous demandez peut-être maintenant: existe-t-il une formule générale basée sur pour tout cube x x ? Il y en a certainement. Voici trois algorithmes complètement différents, donnant tous exactement le même résultat en fonction de :
1: La formule de Chris Hardwick:
2: Formule trig de Christopher Mowla:
3: La formule des nombres premiers de Christopher Mowla:
where is .
Source: Cubers-reddit - Mathematical Counting Formulas of Number of Positions, God's Number, etc.
Challenge:
Choose and implement one of these three formulas (or your own derivative), which given an input-integer in the range , outputs the correct result.
Challenge rules:
- You are free to use another formula besides these three, but keep in mind that these three are proven to be correct. If you use another formula, please add a link of where you got it from (or if you come up with it yourself add an in-depth explanation). And I will check for all integers in the range if the output is correct. Perhaps inspiration could be found in the oeis for this sequence: A075152.
- If your language automatically outputs a scientific output (i.e. instead of the number after the 4x4x4 formula) this is allowed. But please add additional code to your answer to convert this scientific rounding to an exact output so the results can be verified, since rounding errors due to floating point precision during the execution of the formula in your code is not allowed - the actual result should be exact.
- Your program/function should be correct for at least the inputs in the range (although, since already results in a huge-ass number, any larger will probably work as well if you're able to output this one correctly).
- You are not allowed to loop over all possible permutations with a counter, since that would never output anything in a reasonable amount of time. Only the implementation of a formula (either one of the three provided, a derivative of one of those, or a completely new formula), or another method that will give the correct results in a reasonable amount of time (without hard-coding of course) is allowed. I thought about adding a restricted-time to enforce this, but I'm personally against restricted-time in combination with code-golf, so I won't. Still, please make sure your program gives the answers, and if it's too slow for TIO for some reason, add some screenshots with the output from your local machine as verification.
General rules:
- This is code-golf, so shortest answer in bytes wins.
Don't let code-golf languages discourage you from posting answers with non-codegolfing languages. Try to come up with an as short as possible answer for 'any' programming language. - Standard rules apply for your answer with default I/O rules, so you are allowed to use STDIN/STDOUT, functions/method with the proper parameters and return-type, full programs. Your call.
- Default Loopholes are forbidden.
- If possible, please add a link with a test for your code (i.e. TIO).
- Also, adding an explanation for your answer is highly recommended.
Test cases:
Here the test cases for in the range (feel free to use the WolframAlpha links above for larger test cases):
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
NOTE: Since this is a code-golf challenge, it basically boils down to: implement one of these three formulas (or a derivative / your own method that still produces the correct results) as short as possible.
la source
floor
s.Réponses:
Wolfram Language (Mathematica), 59 bytes
Try it online!
uses Herbert Kociemba's algorithm found in OEIS page
here is the recursive formula:
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 saved by @Peter Taylor
one more byte saved by @Expired Data
la source
f@1
, vous pouvez donc enregistrer 6 octets. Évidemment, vous voudriez également ajuster votre framework de test à utiliserRange[2,10]
.code machine x86, 119 octets
Hexdump:
La fonction reçoit le nombre
n
dansecx
et un pointeur sur une chaîne à rempliredx
(c.- à -d.fastcall
convention).Avant de montrer le code source, quelques explications sur la façon dont il fait la chose. Il utilise la formule récursive, que j'ai écrite de la manière suivante:
Donc tout ce que le code devrait faire est de multiplier par de petits nombres. Les nombres sont compris entre 6 et 36, ce qui est suffisamment petit pour être représenté dans un bitmap 32 bits. En fait, je ne stocke pas le bit qui représente la multiplication par 6 - cela me permet d’arranger le code dans un
do-while
boucle, en commençant par une multiplication inconditionnelle par 6.Les grands nombres sont représentés sous forme décimale - chaque octet est une valeur comprise entre 0 et 9, à partir du MSB.
La multiplication est effectuée de LSB à MSB; cela suppose que le nombre de chiffres augmentera de 2 pour chaque multiplication. Après avoir multiplié par un petit facteur comme 6, le nombre de chiffres ne peut augmenter que de 1. Ainsi, si MSB = 0, il déplace tout le résultat intermédiaire à gauche. Il peut en fait arriver que le nombre de chiffres n'augmente pas du tout et que MSB soit toujours égal à 0, mais ce problème se résoudra à mesure que le code passe à des facteurs plus importants.
Parce que le code de multiplication est grand, je ne veux pas le mettre deux fois. Je ne veux pas non plus le déplacer vers une fonction, car le code machine pour appeler une fonction est volumineux. J'ai donc réorganisé les boucles externes de telle sorte que le code de multiplication ne soit nécessaire qu'une seule fois.
Code C:
Démontage:
La durée d'exécution pour n = 100 est d'environ 4 secondes et le résultat est un nombre à 38416 chiffres:
23491019577617 (plusieurs chiffres ici) ... (beaucoup de zéros ici) 0000000000000000
la source
05AB1E , 38 octets
Tentative initiale.
Utilise la formule de Chris Hardwick .
Je vais essayer de jouer plus au golf et d’expliquer quand j’ai le temps.
Essayez-le en ligne!
la source
Julia 1.0 ,
8376 octetsEssayez-le en ligne!
Utilise la formule de Chris Hardwick. Prend l'entrée sous la forme d'un grand entier.
Merci à H.PWiz pour -7 octets
la source
~=n->factorial(big(n))
->~n=prod(big,1:n)
et(24576*~12)^(n%2)
->^(24576*~12,n%2)
~=n->
au lieu de~n=
?Python 2 , 72 octets
Essayez-le en ligne!
Sauvegardé 4 octets en copiant à
n*(n-2)/4
partir de Neil .la source
Wolfram Language (Mathematica) , 67 octets
Utilisation de la formule de Chris Hardwick.
Essayez-le en ligne!
la source
JavaScript (Node.js) , 81 octets
La formule récursive de Herbert Kociemba. Prend un BigInt en entrée.
Essayez-le en ligne!
JavaScript (Node.js) ,
102 9896 octetsLa formule de Chris Hardwick. Prend un BigInt en entrée.
Essayez-le en ligne!
la source
JavaScript (Node.js) ,
777573 octetsEssayez-le en ligne! Basé sur la formule de Christopher Mowla. Prend un BigInt en entrée. Testez le harnais volé sans vergogne à @Arnauld.
0xb88d4641131f0n
est3246670537110000n
en décimal. Explication: J'ai commencé par le dernier exposant principal et l'a simplifién*(n-2n)/4n
(c'est une division entière, je n'ai donc pas besoin de l'ajustement pour les nombres impairs). J'ai ensuite examiné les autres nombres premiers pour voir si leurs exposants étaient liés à cette valeur (que je qualifierai deo
), et j'ai constaté qu'ils agissaient d'une manière, si j'autorisais l'utilisation de la parité den
(que j'appelleraisp
). Les formules pour les exposants sont les suivantes:Les puissances peuvent ensuite être regroupées par exposant, par exemple
p
l’exposant de11*7*5**2*3**3*2**14
.la source
Raquette ,
151141 octets-7 octets grâce à fede s.!
Essayez-le en ligne!
La réponse la plus longue utilisant la formule de Chris Hardwick :)
la source
expt
appels:(λ(n[e expt])...(e ...)...)
.Python 2 , 122 octets
Essayez-le en ligne!
Utilise la méthode récursive de Herbert Kociemba.
-2 octets grâce à Herman L
la source
3**6
par 729 et2**10
par1024
TIOGelée ,
3938 octetsJ'ai l'impression d'avoir raté des golfs, mais ...
Un lien monadique implémentant la formule de Chris Hardwick.
Essayez-le en ligne! Ou consultez la suite de tests (
n=[1..33]
).la source
CJam (47 bytes)
Démo en ligne
Ceci implémente la récursion d'Herbert Kociemba d'OEIS:a ( n ) = ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪17 ! × 36a(n−1)×3×12!×213a(n−2)×(24!246)n−2×246 if n∈{0,1} if n=2 if n=3 if n>3
using CJam's memoised recursion operator
j
. I've ordered the terms in the MathJax block in the same order as in the code to make the correspondence easy to verify for those who read CJam: any further dissection is not going to shed more light.la source
Jelly, 43 bytes
Try it online!
la source
Icon,
125110 bytesTry it online!
la source
C (gcc) -lgmp, 279 bytes
Try it online!
la source
N--*--N/4
instead of(N*N-2*N)/4
and removeN-=2
and#define s mpz_init_set_str
Perl 6, 85 bytes
Try it online!
la source
Haskell,
868574 bytes-1 byte saved thanks to H.PWiz
-11 bytes saved thanks to Max Yekhlakov
Try it online!
la source
24576
is shorter than2^13*3
Python 2, 92 bytes
Try it online!
la source
Husk,
514844 bytes-4 bytes thanks to H.PWiz
Try it online!
This is Chris Hardwick's Formula. Also, this is my first husk program, so any tips would be well appreciated.
la source
÷^*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(there was a bug) 193175 bytes (with help from ceiling cat)This uses the GMP C++ wrapper (GNU multi-precision library), and the formula used by @J42161217 (https://codegolf.stackexchange.com/a/183381/55953).
Use
g++ -g rubix.cpp -lgmp -lgmpxx
to compile and linkungolfed, with test code
https://tio.run/##PZAxb4MwEIV3foWVDrETqBpARMImWZqha7t0iFQZ4xC3xrg2tJERf73UIVXfcE937zvpdEzrqGZsmu6EYrKvOKkbfbncn3dBb4WqgSsa7d6YpNZiBzR0gIYOlGhwgBUb/H0WksMyihBbFRQb3vVGAYZHB4xnFRr@Rqoo4n2SbdNN9pD7Jtk7uNCvafVEn7fvjx@LMItRbqCKYrTSME7D7OoeOpivl4Mp@eeMhFcAj//3AiJa2xlOm13QUKEgCoYAeJ1aA4XqgChiDARJUl/XazRnXrar8py1fUeIIGR57JaE@AUECLllXFUSB2Mw/bCTpLWdIjm/5ua/
la source
n=10
test case, so I can verify that it works? I guess there isn't any way to make this work on the C++ (clang) or C++ (gcc) TIO due to the used library?TI-BASIC,
6362 bytes, (noncompeting)Expression which takes input as an integer on
Ans
. Implementation of Chris Hardwick's formula. Noncompeting because the hardware it runs on will only store up to 16 decimal places, so the answer will never be 100% accurate.Explanation:
la source