Wprowadzenie:
Kostka Rubika 3x3x3 ma możliwych , co stanowi około 43 kwintillionów . Być może słyszałeś już o tej liczbie, ale jak to się faktycznie liczy?
Kostka Rubika 3x3x3 ma sześć stron, każda z dziewięcioma naklejkami. Jednak patrząc na (zewnętrzne) elementy zamiast naklejek, mamy sześć elementów środkowych; osiem narożników; i dwanaście kawałków krawędzi. Ponieważ centrów nie można przenieść, możemy zignorować je w obliczeniach. Jeśli chodzi o rogi i krawędzie:
- Jest(40 ) sposobów na ustawienie ośmiu rogów. Każdy narożnik ma trzy możliwe orientacje, chociaż tylko siedem (z ośmiu) można ustawić niezależnie; orientacja ósmego / końcowego rogu zależy od poprzednich siedmiu, biorąc pod uwagę ( ) możliwości.
- Istnieją ( ) sposobów na ułożenie dwunastu krawędzi. Połówka zponieważ krawędzie muszą zawsze znajdować się w równej permutacji dokładnie wtedy, gdy są narożniki. Jedenaście krawędzi można odwracać niezależnie, z odwróceniem krawędzi dwunastej / końcowej w zależności od poprzedzającej jedenastki, biorąc pod uwagę ( ) możliwości.
Podsumowując, mamy następującą formułę:
Źródło: Wikipedia - Permutacje kostki Rubika
Chociaż może to już wyglądać dość skomplikowane, wciąż jest dość proste jak na kostkę 3x3x3. W przypadku nawet kostek formuła jest nieco inna; oto wzór na kostkę 4x4x4 na przykład:
To jest około 7,40 quattuordecillion w krótkiej skali .
A w przypadku większych kostek NxNxN (tj. Aktualny rekord świata 33x33x33) formuła zostanie nieco rozszerzona. Aby jednak nie wprowadzać tego wprowadzenia zbyt długo, umieściłem tutaj te linki, gdzie wyjaśniono permutacje kostki 4x4x4 i innych kostek NxNxN o innych rozmiarach z uzyskaną formułą:
Być może już się zastanawiasz: czy istnieje ogólna formuła oparta na dla dowolnej kostki x x ? Z pewnością jest. Oto trzy zupełnie różne algorytmy, z których wszystkie dają dokładnie takie same wyniki w oparciu o :
1: Formuła Chrisa Hardwicka:
2: Formuła trig Christophera Mowli:
3: Liczby pierwsze Christophera Mowli Wzór:
gdzie to .
Źródło: Cubers-reddit - Matematyczne formuły liczenia liczby pozycji, liczby Boga itp.
Wyzwanie:
Wybierz i zaimplementuj jedną z tych trzech formuł (lub własną pochodną), która podając liczbę całkowitą wejściową w zakresie , daje prawidłowy wynik.
Zasady konkursu:
- Możesz użyć innej formuły oprócz tych trzech, ale pamiętaj, że te trzy okazały się poprawne. Jeśli używasz innej formuły, dodaj link, skąd ją masz (lub jeśli sam ją wymyślisz, dodaj dogłębne wyjaśnienie). I sprawdzę, czy wszystkie liczby całkowite w zakresie są prawidłowe. Być może inspirację można znaleźć w Oeis dla tej sekwencji: A075152 .
- Jeśli twój język automatycznie generuje wyniki naukowe (tj. zamiast liczby po formule 4x4x4), jest to dozwolone. Ale proszę dodać dodatkowy kod do swojej odpowiedzi, aby przekonwertować to zaokrąglenie naukowe na dokładny wynik, aby można było zweryfikować wyniki, ponieważ błędy zaokrąglania wynikające z precyzji zmiennoprzecinkowej podczas wykonywania formuły w kodzie są niedozwolone - rzeczywisty wynik powinien być dokładny.
- Twój program / funkcja powinna być poprawna co najmniej dla danych wejściowych z zakresu (chociaż, ponieważ już daje ogromną liczbę, każdy większy prawdopodobnie będzie również działał, jeśli będziesz w stanie to wyprowadzić jeden poprawnie).
- Nie można zapętlać wszystkich możliwych kombinacji z licznikiem, ponieważ nigdy nie dałoby to niczego w rozsądnym czasie. Tylko wdrożenie formuły (jednej z trzech podanych, pochodnej jednej z nich lub zupełnie nowej formuły) lub innej metody, która da prawidłowe wyniki w rozsądnym czasie (oczywiście bez twardego kodowania) ) jest dozwolone. Myślałem o dodaniu ograniczonego czasu, aby to wymusić, ale osobiście jestem przeciwny ograniczonemu czasowi w połączeniu z golfem , więc nie zrobię tego. Mimo to upewnij się, że Twój program udziela odpowiedzi, a jeśli z jakiegoś powodu jest zbyt wolny dla TIO, dodaj kilka zrzutów ekranu z danymi wyjściowymi z komputera lokalnego w celu weryfikacji.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
- Zalecane jest również dodanie wyjaśnienia do odpowiedzi.
Przypadki testowe:
Oto przypadki testowe dla w zakresie (możesz użyć powyższych linków WolframAlpha dla większych przypadków testowych):
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
UWAGA: Ponieważ jest to wyzwanie dla golfa , sprowadza się ono do: wdrożenia jednej z tych trzech formuł (lub pochodnej / własnej metody, która nadal daje prawidłowe wyniki) tak krótko, jak to możliwe.
źródło
floor
Odpowiedzi:
Wolfram Language (Mathematica) , 59 bajtów
Wypróbuj online!
wykorzystuje algorytm Herberta Kociemby znaleziony na stronie OEIS
oto rekurencyjna formuła:
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 bajtów zapisanych przez @Peter Taylor
jeszcze jeden bajt zapisany przez @Expired Data
źródło
f@1
, więc możesz zapisać 6 bajtów. Oczywiście chciałbyś również dostosować swoją strukturę testową do użyciaRange[2,10]
.kod maszynowy x86, 119 bajtów
Hexdump:
Funkcja otrzymuje numer
n
wecx
oraz wskaźnik do łańcucha znaków do wypełnieniaedx
(czylifastcall
konwencja).Zanim pokażę kod źródłowy, kilka wyjaśnień, jak to działa. Wykorzystuje formułę rekurencyjną, którą napisałem w następujący sposób:
Więc wszystko, co powinien zrobić kod, to pomnożenie przez małe liczby. Liczby mieszczą się w zakresie 6 ... 36, który jest wystarczająco mały, aby można go było przedstawić w 32-bitowej mapie bitowej. Właściwie nie przechowuję bitu reprezentującego mnożenie przez 6 - pozwala mi to ułożyć kod w
do-while
pętli, zaczynając od bezwarunkowego pomnożenia przez 6.Duże liczby są reprezentowane przy użyciu postaci dziesiętnej - każdy bajt jest wartością z zakresu 0 ... 9, zaczynając od MSB.
Mnożenie odbywa się z LSB do MSB; zakłada, że liczba cyfr wzrośnie o 2 dla każdego pomnożenia. Po pomnożeniu przez mały współczynnik, taki jak 6, liczba cyfr może wzrosnąć tylko o 1. Więc jeśli MSB = 0, przesuwa cały wynik pośredni w lewo. Może się zdarzyć, że liczba cyfr w ogóle się nie zwiększy, a wtedy MSB będzie nadal wynosić 0, ale ten problem sam się rozwiąże, gdy kod przejdzie na większe czynniki.
Ponieważ kod mnożenia jest duży, nie chcę go umieszczać dwa razy. Nie chcę też przenosić go do funkcji, ponieważ kod maszynowy do wywoływania funkcji jest duży. Przestawiłem więc zewnętrzne pętle w taki sposób, że kod mnożenia jest potrzebny tylko raz.
Kod C:
Demontaż:
Czas działania dla n = 100 wynosi około 4 sekund, a wynikiem jest liczba z 38416 cyframi:
23491019577617 (wiele cyfr tutaj) ... (wiele zer tutaj) 0000000000000000
źródło
05AB1E , 38 bajtów
Pierwsza próba.
Wykorzystuje formułę Chrisa Hardwicka .
Spróbuję dalej grać w golfa i wyjaśnię, kiedy będę miał czas.
Wypróbuj online!
źródło
Julia 1.0 ,
8376 bajtówWypróbuj online!
Wykorzystuje formułę Chrisa Hardwicka. Pobiera dane wejściowe jako Big integer.
Dzięki H.PWiz za -7 bajtów
źródło
~=n->factorial(big(n))
->~n=prod(big,1:n)
i(24576*~12)^(n%2)
->^(24576*~12,n%2)
~=n->
zamiast~n=
?Python 2 , 72 bajty
Wypróbuj online!
Zapisano 4 bajty, kopiując
n*(n-2)/4
z Neila .źródło
Wolfram Language (Mathematica) , 67 bajtów
Korzystanie z formuły Chrisa Hardwicka.
Wypróbuj online!
źródło
JavaScript (Node.js) , 81 bajtów
Recursywna formuła Herberta Kociemby. Pobiera BigInt jako wejście.
Wypróbuj online!
JavaScript (Node.js) ,
102 9896 bajtówWzór Chrisa Hardwicka. Pobiera BigInt jako wejście.
Wypróbuj online!
źródło
JavaScript (Node.js) ,
777573 bajtówWypróbuj online! Na podstawie formuły Christophera Mowli. Pobiera BigInt jako wejście. Uprząż testowa bezwstydnie skradziona z @Arnauld.
0xb88d4641131f0n
jest3246670537110000n
w systemie dziesiętnym. Objaśnienie: Zacząłem od ostatniego wykładnika głównego i uprościłem gon*(n-2n)/4n
(jest to podział na liczby całkowite, więc nie potrzebuję korekty liczb nieparzystych). Następnie zbadałem pozostałe liczby pierwsze, aby sprawdzić, czy ich wykładniki są powiązane z tą wartością (którą będę określał jakoo
), i stwierdziłem, że były one modne, jeśli pozwolę na użycie parzystościn
(którą będę określał jakop
). Formuły wykładników są następujące:Moce mogą być następnie pogrupowane według wykładnika, więc na przykład
p
jest wykładnikiem wykładnika11*7*5**2*3**3*2**14
.źródło
Rakieta ,
151141 bajtów-7 bajtów dzięki Fede S.
Wypróbuj online!
Najdłuższa odpowiedź przy użyciu Formuły Chrisa Hardwicka :)
źródło
expt
połączeń:(λ(n[e expt])...(e ...)...)
.Python 2 , 122 bajty
Wypróbuj online!
Wykorzystuje metodę rekurencyjną Herberta Kociemby.
-2 bajty dzięki Hermanowi L.
źródło
3**6
z 729 i2**10
z1024
TIOGalaretka ,
3938 bajtówCzuję, że przegapiłem kilka golfów, ale ...
Monadyczny link implementujący Formułę Chrisa Hardwicka.
Wypróbuj online! Lub zobacz test-suite (
n=[1..33]
).źródło
CJam (47 bajtów)
Demo online
j
źródło
Galaretka , 43 bajty
Wypróbuj online!
źródło
Ikona ,
125110 bajtówWypróbuj online!
źródło
C (gcc) -lgmp, 279 bajtów
Wypróbuj online!
źródło
N--*--N/4
zamiast(N*N-2*N)/4
i usuńN-=2
i#define s mpz_init_set_str
Perl 6 , 85 bajtów
Wypróbuj online!
źródło
Haskell ,
868574 bajtów-1 bajt zapisany dzięki H.PWiz
-11 bajtów zapisany dzięki Max Yekhlakov
Wypróbuj online!
źródło
24576
jest krótszy niż2^13*3
Python 2 , 92 bajty
Wypróbuj online!
źródło
Łuska ,
514844 bajtów-4 bajty dzięki H.PWiz
Wypróbuj online!
To Formuła Chrisa Hardwicka. To także mój pierwszy program łuskowy, więc wszelkie wskazówki byłyby mile widziane.
źródło
÷^*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 (wystąpił błąd) 193175 bajtów (z pomocą kota na suficie)Wykorzystuje to opakowanie GMP C ++ (biblioteka wieloprecyzyjna GNU) oraz formułę używaną przez @ J42161217 ( https://codegolf.stackexchange.com/a/183381/55953 ).
Służy
g++ -g rubix.cpp -lgmp -lgmpxx
do kompilowania i łączeniabez golfa, z kodem testowym
https://tio.run/##PZAxb4MwEIV3foWVDrETqBpARMImWZqha7t0iFQZ4xC3xrg2tJERf73UIVXfcE937zvpdEzrqGZsmu6EYrKvOKkbfbncn3dBb4WqgSsa7d6YpNZiBzR0gIYOlGhwgBUb/H0WksMyihBbFRQb3vVGAYZHB4xnFRr@Rqoo4n2SbdNN9pD7Jtk7uNCvafVEn7fvjx@LMItRbqCKYrTSME7D7OoeOpivl4Mp@eeMhFcAj//3AiJa2xlOm13QUKEgCoYAeJ1aA4XqgChiDARJUl/XazRnXrar8py1fUeIIGR57JaE@AUECLllXFUSB2Mw/bCTpLWdIjm/5ua/
źródło
n=10
przypadku testowego, aby sprawdzić, czy działa? Wydaje mi się, że nie ma sposobu, aby to działało na CIO (clang) lub C ++ (gcc) TIO z powodu używanej biblioteki?TI-BASIC,
6362 bajtów , (niekonkurencyjny)Wyrażenie, które przyjmuje dane wejściowe jako liczbę całkowitą
Ans
. Wdrożenie formuły Chrisa Hardwicka. Niekonkurencyjny, ponieważ sprzęt, na którym działa, zapisze tylko 16 miejsc po przecinku, więc odpowiedź nigdy nie będzie w 100% dokładna.Wyjaśnienie:
źródło