Вступ:
У кубі Рубіка 3x3x3 є можливих перестановок, що становить приблизно 43 квінтільйона . Ви, можливо, чули про це число раніше, але як воно насправді обчислюється?
Кубик Рубіка розміром 3x3x3 має шість сторін, на кожній - дев'ять наклейок. Дивлячись на (зовнішні) частини замість наклейок, маємо шість центральних частин; вісім куточків штук; і дванадцять крайових штук. Оскільки центри неможливо перемістити, ми можемо ігнорувати їх у розрахунках. Що стосується кутів та країв:
- Є( ) способів розташування восьми кутів. Кожен кут має три можливі орієнтації, хоча лише сім (з восьми) можна орієнтувати незалежно; орієнтація восьмого / заключного кута залежить від попередніх семи, заданих ( ) можливостей.3 7 2 , 187
- Є ( ) способів розташування дванадцяти ребер. Половина зце тому, що краї завжди повинні бути в рівній перестановці саме тоді, коли кути. Одинадцять ребер можна перевернути незалежно, з переворотом дванадцятого / остаточного краю залежно від попередніх одинадцяти, задавши ( ) можливостей.
Збираючи це разом, ми маємо таку формулу:
Джерело: Вікіпедія - Перестановки в кубі Рубіка
Хоча це вже може виглядати досить складно, для куба 3x3x3 все ще досить прямо. Для рівних кубів формула трохи інша; це формула для куба 4x4x4, наприклад:
Що за короткою шкалою становить приблизно 7,40 квартуорделіона .
А для більших кубів NxNxN (тобто поточний рекорд 33x33x33) формула буде досить розширена. Щоб зробити це введення не надто довгим, я замість цього ставлю ці посилання, де перестановки куба 4x4x4 та деяких інших розмірів кубів NxNxN пояснюються отриманою формулою:
Напевно, вам може бути цікаво: чи існує загальна формула, заснована на для будь-якого x xкуба N ? Звичайно, є. Ось три абсолютно різні алгоритми, які дають абсолютно однакові результати на основі :
1: Формула Кріса Хардвіка:
2: Тригельна формула Крістофера Моули:
3: Формули Крістофера Моули:
де є .
Джерело: Cubers-reddit - Формули математичного підрахунку кількості позицій, Божого числа тощо.
Виклик:
Виберіть та реалізуйте одну з цих трьох формул (або власну похідну), яка задала ціле число у діапазоні , виводить правильний результат.
Правила виклику:
- Ви можете використовувати іншу формулу, окрім цих трьох, але майте на увазі, що ці три довели, що вони є правильними. Якщо ви використовуєте іншу формулу, будь ласка, додайте посилання про те, звідки ви її отримали (або якщо ви її самі придумали, додайте поглиблене пояснення). І я перевірю всі цілі числа в діапазоні, якщо вихід правильний. Можливо, натхнення можна було б знайти в ої для цієї послідовності: A075152 .
- Якщо ваша мова автоматично видає науковий результат (тобто замість числа після формули 4x4x4), це дозволено. Але, будь ласка, додайте до своєї відповіді додатковий код, щоб перетворити це наукове округлення в точний вихід, щоб результати можна було перевірити, оскільки помилки округлення через точність плаваючої точки під час виконання формули у вашому коді не допускаються - фактичний результат повинен бути точний.
- Ваша програма / функція повинна бути правильною щонайменше для входів у діапазоні (хоча, оскільки вже призводить до величезного числа осел, будь-який більший , ймовірно, спрацює, якщо ви зможете виведіть це правильно).
- Вам не дозволяється перебирати всі можливі перестановки лічильником, оскільки це ніколи не виводить нічого за розумну кількість часу. Тільки реалізація формули (будь-якої із трьох наданих, похідної однієї з них, або абсолютно нової формули), або іншого методу, який дасть правильні результати за розумну кількість часу (без жорсткого кодування курсу) ) дозволено. Я думав над тим, щоб додати обмежений час для виконання цього, але я особисто проти обмеженого часу в поєднанні з кодом-гольф , тому не буду. Проте переконайтеся, що ваша програма дає відповіді, і якщо TIO чомусь занадто повільний, додайте кілька знімків екрана з результатами з вашої локальної машини як перевірку.
Загальні правила:
- Це код-гольф , тому найкоротша відповідь у байтах виграє.
Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування. - Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
- Лазівки за замовчуванням заборонені.
- Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
- Також настійно рекомендується додавати пояснення до своєї відповіді.
Тестові приклади:
Ось тестові випадки для у діапазоні (сміливо використовуйте вищевказані посилання WolframAlpha для великих тестових випадків):
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
ПРИМІТКА. Оскільки це завдання з кодовим гольфом , воно, як правило, зводиться до: реалізувати одну з цих трьох формул (або похідний / власний метод, який все ще дає правильні результати) якомога коротше.
floor