介绍:
3x3x3魔方具有可能的排列,大约为43 亿个。您可能之前已经听说过这个数字,但是实际上是如何计算的呢?
3x3x3魔方有六个面,每个面有九个贴纸。看(外部)件而不是贴纸,我们有六个中心件。八个角块;和十二个边缘碎片。由于中心不能移动,因此我们可以在计算中忽略它们。至于拐角和边缘:
- 有()排列八个角的方法。每个角都有三个可能的方向,尽管(八个中的)只有七个可以独立地定向。在给定()可能性的情况下,第八个/最后一个角的方向取决于前面的七个。
- 有()种方式来排列十二条边。从减半这是因为恰好在拐角处时,边缘必须始终保持均匀的排列。在给定()的可能性的情况下,第十二个/最终边缘的翻转取决于前面的十一个,因此可以独立翻转十一个边缘。2112,048
综上所述,我们有以下公式:
尽管这看起来可能已经很复杂了,但对于3x3x3多维数据集来说仍然相当简单。对于偶数立方体,公式略有不同。例如,这是4x4x4多维数据集的公式:
在短期内大约为7.40 quattudecillion。
对于较大的NxNxN多维数据集(即当前的世界记录33x33x33),该公式将扩展很多。但是,为了避免太长的介绍时间,我将这些链接放在此处,其中使用结果公式解释了4x4x4多维数据集和某些其他大小的NxNxN多维数据集的排列:
您可能现在想知道:对于任何 x x多维数据集,是否都有基于的通用公式?当然有。这是三种完全不同的算法,所有算法都基于给出完全相同的结果:
1:克里斯·哈德威克的公式:
2:克里斯托弗·莫拉(Christopher Mowla)的触发公式:
3:Christopher Mowla的素数公式:
其中是。
资料来源:Cubers-reddit-职位数量,上帝的人数等的数学计算公式
挑战:
选择并实现这三个公式之一(或您自己的导数),给定输入整数在,它们将输出正确的结果。
挑战规则:
- 您可以随意使用这三个公式之外的其他公式,但请记住,这三个公式被证明是正确的。如果您使用其他公式,请添加一个从何处获得的链接(或者,如果您自己提出该公式,请添加深入的说明)。如果输出正确,我将检查范围内的所有整数。也许可以在oeis中找到有关此序列的灵感:A075152。
- 如果您的语言自动输出科学输出(即而不是4x4x4公式后面的数字),则允许这样做。但是,请在您的答案中添加其他代码,以将此科学的舍入转换为精确的输出,以便可以验证结果,因为不允许在代码中执行公式期间由于浮点精度而导致舍入错误-应该是实际结果精确。
- 您的程序/函数至少对于范围内的输入应该是正确的(尽管由于已经产生了一个巨大的资产号,所以如果您能够输出该数字,那么更大的也可能会起作用。一个正确)。
- 不允许您使用计数器循环所有可能的排列,因为这绝不会在合理的时间内输出任何内容。仅执行公式(提供的三个公式之一,其中一个公式的衍生物或全新公式),或仅在合理的时间内给出正确结果的另一种方法(当然无需硬编码) ) 被允许。我曾考虑过要添加一个限时来强制执行此操作,但是我个人反对将 CodeGolf与限时结合使用,所以我不会。不过,请确保您的程序给出了答案,并且如果由于某种原因对于TIO而言太慢,请添加一些屏幕快照,并将本地计算机的输出作为验证。
一般规则:
- 这是代码高尔夫球,因此最短答案以字节为单位。
不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。 - 标准规则适用于具有默认I / O规则的答案,因此允许您使用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