1つの立方体をいくつの立方体にカットできるかを計算します


9

残りの部分なしで、より小さな立方体にカットできる立方体を想像してみてください。

立方体をいくつの立方体に切り取ることができるかを調べます。

たとえば、立方体は8、27(明らかに整数の3乗)および20(19の小さい立方体に他の立方体の8倍のサイズを加えたもの、画像を参照)に切り分けることができます。
ここでいくつかのヘルプを参照してください:http : //mathworld.wolfram.com/CubeDissection.html

ここに画像の説明を入力してください プログラムは、整数n0 <= n <= 1 000)を入力として受け取りn、キューブをその数のキューブにカットできるように、以下のすべての数値を出力する必要があります。立方体を1つの立方体にカットでき、0の立方体にカットできないとします。

使用できるのは、64ビット以下のサイズの(配列、オブジェクトなどではなく)整数データ型のみです。最短のコードが勝ちます。


これには可能性がありますが、より明確に指定する必要があります。立方体は確かに20の立方体にカットすることができます。元の1/3の27立方体にカットする代わりに、元の1/3と8倍大きい(2/3オリジナル)はい、写真が役立つと思います
Level River St

これは私が描いたかなりラフな立方体です。自由に変更してください。一見これは些細なことのように見えますが、125〜216(5 ^ 3-6 ^ 3)の興味深い範囲があると思います。非常に大きな数の場合、ほぼすべての除算が可能であると考えられます。
Level River St

いくつかのしきい値の後のすべての数値が可能かどうかを確認します。
ソムニウム2014

3
答えは実際にここにあります:mathworld.wolfram.com/CubeDissection.html
Level River St

1
現在、かなり簡単な解決策があるので、これをコードゴルフに戻すか、提出物に本当に厳しい制限を課したいと思うかもしれません。
マーティンエンダー2014

回答:


1

Golfscript、55(または43 42)

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

ここでテストでき(2行目の数値を変更するだけ)、配列(コードの最後の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の累乗)とリスト(範囲)を使用しています。

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>>iとして解釈され0x952BD7AF7EFC>>i%64ます。したがって、(たとえば)66から71(64 + 2から64 + 7)までの数字はスキップされます。

Visual Studioで実行するには、もう少しボイラープレートが必要です(暗黙の整数や#includes などの問題を回避することはできません)。プログラムが起動して実行されると、最大257です。その後、258までスキップします。 263(256 + 2から256 + 7まで)。i%256.

私は後でそれを修正するかもしれません(私が気になる可能性がある場合)。それには理由があります!


これは私の答えとまったく同じ原理を使用しています)
Somnium

実際、基本的には同じ定数(ビット0は未使用、ビット1は数値1を表す)さえあります。CIでは、定数を16進数で指定して1バイトを保存します。私は0forビットゼロを持っています、私は1あなたのようなもののためにそれをi = 0の場合のために変更することができます。しかし、とにかく表示されることはありません。
Level River St

@steveverrillがどのようにNUM>>i変更されるかを説明してくださいNUM>>i%64。また、64-bit数値が64回を超えて右にシフトされた場合、次のようになりますzero
manav mn

@Manav確かにゼロになるはずです。私が言うように、コンパイラにはバグがあります。NUM>>iなるNUM>>(i%64)又は同等NUM>>(i&63)コンパイラは左端のビットを切り捨てるされているため、iビットシフトを実行する前に。GCCは、右端の6ビットのみを考慮します。Visual Studioにも同じバグがありますが、右端の8ビットのみを考慮すると少し優れていますNUM>>(i%256)。好奇心から仕事帰りにイデオーネをやってみます。
Level River St

ideoneはGCCとまったく同じように動作します。ideone.com/EpKTpO
Level River St
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.