计算一个立方体可以切成多少个立方体


9

想象一些立方体,我们可以将其切成较小的立方体,而没有剩余的碎片。

查找一个立方体可以切割多少个立方体。

例如,一个立方体可以切成8个,27个(显然是整数的3阶次幂)和20个(19个小立方体加一个其他立方体大小的八分之一,见图)。
在这里看到一些帮助:http : //mathworld.wolfram.com/CubeDissection.html

在此处输入图片说明 程序应将整数n0 <= n <= 1 000)作为输入,并打印所有小于或等于的数字,n以便可以将一个立方体切成该数目的立方体。假设可以将多维数据集切成1个多维数据集,而不能切成0个多维数据集。

您只能使用大小不超过64位的整数数据类型(无数组,对象等)。最短的代码胜出。


这有潜力,但是您需要更清楚地指定它。确实可以将一个立方体切成20个立方体:与其将其切成27个立方体(原边1/3的一面),不如将它切成19个立方体(原边1/3的一面),再切成原本的1/3边的8倍(在2/3边是的,我认为照片会有所帮助
Level River St'St

这是我绘制的一个非常粗糙的立方体,可以随时对其进行更改。乍一看,这似乎微不足道,但我认为在125-216(5 ^ 3-6 ^ 3)左右有一个有趣的范围。很可能对于非常大的数目几乎所有的划分都是可能的。
级圣河

我们将查看在某个阈值之后的所有数字是否可能。
2014年


1
由于我们现在有了一个相当简单的解决方案,因此您可能需要将此更改回编码高尔夫,或者对提交内容施加一些非常严格的限制。
马丁·恩德

Answers:


1

Golfscript,55岁(或43 42岁)

{.:^}{.47>20{.^>^@- 7%|!|}:/~1/38/39/{}{;}if^(}while;]`

可以在此处进行测试(只需更改第2行上的数字)即可,并且仅将数组(代码的最后两个字符)用于干净的打印,而不用于任何收集或问题解决。如果不选择它,则将所有结果串联在一起。

方法:从给定的n向下迭代:如果当前数大于47或形式为1 + 7x,20 + 7x,38 + 7x或39 + 7x,其中x =任何非负整数,则将其保留在堆栈中,否则请将其删除。

简短答案(43个字节):

{:/ 6 +,{7 * / +}%|}:&;):a,48,^ 1&20&38&39&{a <},`

):a,48,^1{:/6+,{7*/+}%|}:&~20&38&39&{a<},`

方法:类似,但有一些理论操作。这使用数组,因此从技术上讲这不是可接受的答案。可以在这里测试。顺便说一句:没有人说过他们必须处于任何特定的顺序;)


1

Mathematica,62个字节(或52个字节)

这是硬编码的答案,没什么有趣的。

If[EvenQ@BitShiftRight[164015534735101,n],Print@n]~Do~{n,1000}

这个长度为52个字节,但违反了我的规则-它使用大整数(2的幂)和列表(Range)。

Select[Range@1000,EvenQ@Floor[164015534735101/2^#]&]


0

C,72

i;main(){for(scanf("%d",&i);i;i--)0x952BD7AF7EFC>>i&1||printf("%d ",i);}

另一个硬编码的答案。这是向下计数的(规则中没有数字输出的顺序。)理论上它应该起作用。对于不能切成立方体的所有数字,该常数的位设置为1,对于不能切割的数字,其常数设置为0。从理论上讲,当右移一个非常大的数字时,该常数应为零,因此应始终打印该大数。

有趣的是,实际上这是行不通的。上面的代码可以在GCC上编译并在65以下的版本上正常运行。但是,在此数量以上,编译器中存在错误(或“功能”)。它解释0x952BD7AF7EFC>>i0x952BD7AF7EFC>>i%64。因此,它跳过(例如)数字66到71(64 + 2到64 + 7)。

要在Visual Studio中运行,还需要一些样板代码(它不能让您摆脱隐含的整数和#includes之类的东西。)一旦程序启动并运行,就可以达到257。然后跳过258。 263(256 + 2到256 + 7。)i%256.

我可能稍后再解决(如果可以打扰的话)。道德:编译器手册通常不会告诉您移位的上限。这是有原因的!


这使用与我的答案完全相同的原则)

实际上,我们甚至具有基本相同的常数(未使用的位0和位1表示数字1)。在CI中,通过以十六进制指定常数来保存单个字节。我有一个0零位,1在i = 0的情况下,我可以将其更改为像您一样的零位。但是无论如何它永远不会显示。
级圣河

@steveverrill请说明如何NUM>>i更改NUM>>i%64。同样,如果一个64-bit数字右移超过64次,它应该变成zero
manav mn 2014年

@Manav确实应该为零。正如我所说,编译器有一个错误。之所以NUM>>i成为NUM>>(i%64)或等效,NUM>>(i&63)是因为编译器i在执行位移之前会截断的最左位。GCC仅考虑最右边的6位。Visual Studio具有相同的错误,但考虑到最右边的8位,效果略好NUM>>(i%256)。出于好奇,我下班回家时会尝试Ideone。
级圣河

ideone的行为与GCC完全相同。ideone.com/EpKTpO
Level River St
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.