Введение:
Кубик Рубика 3x3x3 имеет возможных перестановок, что составляет приблизительно 43 квинтиллиона . Возможно, вы слышали об этом числе раньше, но как оно на самом деле рассчитывается?
Кубик Рубика 3х3х3 имеет шесть граней, каждая из которых имеет девять стикеров. Глядя на (внешние) части вместо наклеек, у нас есть шесть центральных частей; восемь угловых частей; и двенадцать краев. Поскольку центры не могут быть перемещены, мы можем игнорировать их в расчетах. Что касается углов и краев:
- Есть( ) способов расставить восемь углов. Каждый угол имеет три возможных ориентации, хотя только семь (из восьми) могут быть ориентированы независимо; ориентация восьмого / последнего угла зависит от предыдущих семи, учитывая ( 2 , 187 ) возможностей.
- Есть () способов расставить двенадцать ребер. Половина изэто потому, что ребра всегда должны быть вчетной перестановкеименно тогда, когда углы. Одиннадцать ребер могут быть перевернуты независимо друг от друга, при этом переворот двенадцатого / последнего ребра зависит от предыдущих одиннадцати, учитывая() возможностей.
Собирая это вместе, мы имеем следующую формулу:
Источник: Википедия - Перестановки кубиков Рубика
Хотя это уже может показаться довольно сложным, но для куба 3x3x3 все еще довольно просто. Для четных кубиков формула немного отличается; это формула для куба 4x4x4, например:
Что составляет примерно 7,40 кватурдесиллионов по короткой шкале .
А для больших кубов NxNxN (то есть текущего мирового рекорда 33x33x33) формула будет расширена совсем немного. Однако, чтобы не делать это введение слишком длинным, я поместил эти ссылки здесь вместо этого, где перестановки куба 4x4x4 и некоторых кубов NxNxN другого размера объясняются полученной формулой:
Вы можете задаться вопросом: есть ли общая формула, основанная на для любого куба x x ? Там, безусловно, есть. Вот три совершенно разных алгоритма, каждый из которых дает одинаковые результаты на основе :
1: Формула Криса Хардвика:
Попробуйте это на WolframAlpha.
2: Формула триггера Кристофера Моула:
Попробуйте это на WolframAlpha.
3: простые числа Кристофера Моула:
где является .
Попробуйте это на WolframAlpha.
Источник: Cubers-reddit - математические формулы подсчета количества позиций, числа Бога и т. Д.
Вызов:
Выберите и реализуйте одну из этих трех формул (или свою собственную производную), которая, учитывая входное целое число в диапазоне , выводит правильный результат.
Правила соревнований:
- Вы можете использовать другую формулу помимо этих трех, но имейте в виду, что эти три оказались правильными. Если вы используете другую формулу, пожалуйста, добавьте ссылку, откуда вы ее взяли (или, если вы придумали ее самостоятельно, добавьте подробное объяснение). И я проверю все целые числа в диапазоне, если вывод правильный. Возможно, в oeis можно найти вдохновение для этой последовательности: A075152 .
- Если ваш язык автоматически выводит научный вывод (т.е. вместо числа после формулы 4x4x4), это разрешается. Но, пожалуйста, добавьте дополнительный код в ваш ответ, чтобы преобразовать это научное округление в точный вывод, чтобы результаты могли быть проверены, поскольку ошибки округления из-за точности с плавающей запятой при выполнении формулы в вашем коде не допускаются - фактический результат должен быть точный.
- Ваша программа / функция должна быть правильной, по крайней мере, для входов в диапазоне (хотя, поскольку уже приводит к большому количеству заданий, любой больший , вероятно, будет работать так же хорошо, если вы сможете выведите это правильно).
- Вы не можете циклически перебирать все возможные перестановки со счетчиком, так как это никогда не выдаст ничего за разумное время. Только реализация формулы (либо одна из трех представленных, производная от одной из них, либо совершенно новая формула), либо другой метод, который даст правильные результаты за разумное время (без жесткого кодирования, конечно ) разрешено. Я думал о добавлении ограниченного времени для обеспечения этого, но я лично против ограниченного времени в сочетании с code-golf , поэтому я не буду. Тем не менее, пожалуйста, убедитесь, что ваша программа дает ответы, и, если по какой-то причине она слишком медленная для 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