Berechnen Sie, auf wie viele Würfel ein Würfel geschnitten werden kann

9

Stellen Sie sich einen Würfel vor, den wir ohne Reststücke in kleinere Würfel schneiden können.

Finden Sie heraus, wie viele Würfel ein Würfel schneiden kann.

Zum Beispiel kann ein Würfel in 8, 27 (offensichtlich 3. Potenzen von ganzen Zahlen) und 20 (19 kleine Würfel plus einen achtmal so großen wie die anderen, siehe Bild) geschnitten werden.
Hier finden Sie einige Hilfen: http://mathworld.wolfram.com/CubeDissection.html

Geben Sie hier die Bildbeschreibung ein Das Programm sollte als Eingabe Integer n( 0 <= n <= 1 000) verwenden und alle Zahlen kleiner oder gleich drucken, ndamit ein Würfel in diese Anzahl von Würfeln geschnitten werden kann. Angenommen, der Würfel kann in 1 Würfel und nicht in 0 Würfel geschnitten werden.

Sie können nur integrale Datentypen (keine Arrays, Objekte usw.) mit einer Größe von nicht mehr als 64 Bit verwenden. Der kürzeste Code gewinnt.

Somnium
quelle
Dies hat Potenzial, aber Sie müssen es klarer spezifizieren. Ein Würfel kann in der Tat in 20 Würfel geschnitten werden: Anstatt ihn in 27 Würfel von Seite 1/3 des Originals zu schneiden, schneiden Sie ihn in 19 Würfel von Seite 1/3 des Originals und einen, der 8-mal größer ist (Seite 2/3 des Originals) Original.) Ja, ich denke, ein Bild wäre hilfreich
Level River St
Das ist ein ziemlich grober Würfel, den ich gezeichnet habe. Sie können ihn jederzeit ändern. Auf den ersten Blick scheint dies trivial zu sein, aber ich denke, es gibt einen interessanten Bereich um 125-216 (5 ^ 3-6 ^ 3.) Es ist wahrscheinlich, dass für sehr große Zahlen fast alle Unterteilungen möglich sind.
Level River St
Wir werden sehen, ob alle Zahlen nach einem bestimmten Schwellenwert möglich sind.
Somnium
3
Die Antwort ist tatsächlich hier: mathworld.wolfram.com/CubeDissection.html
Level River St
1
Da wir jetzt eine ziemlich triviale Lösung haben, möchten Sie diese möglicherweise wieder in Code Golf ändern oder die Einsendungen wirklich stark einschränken.
Martin Ender

Antworten:

1

Golfscript, 55 (oder 43 42)

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

Kann hier getestet werden (ändern Sie einfach die Nummer in Zeile 2) und verwendet das Array (die letzten beiden Zeichen des Codes) nur zum sauberen Drucken, nicht zum Sammeln oder Lösen von Problemen. Wenn Sie es weglassen, werden alle Ergebnisse verkettet.

Methode: Von gegebenem n nach unten iterieren: Wenn die aktuelle Zahl größer als 47 ist oder die Form 1 + 7x, 20 + 7x, 38 + 7x oder 39 + 7x hat, wobei x = eine nicht negative ganze Zahl ist, behalten Sie sie auf dem Stapel , sonst lass es fallen.

Kurze Antwort (43 Bytes):

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

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

Methode: Ähnlich, aber mit ein paar Mengenangaben. Dies verwendet Arrays, so dass dies technisch keine akzeptable Antwort ist. Kann hier getestet werden . Übrigens: Niemand hat jemals gesagt, dass sie in einer bestimmten Reihenfolge sein müssen;)

Kyle McCormick
quelle
1

Mathematica, 62 Bytes (oder 52)

Es ist eine fest codierte Antwort, nichts Interessantes.

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

Dieser ist 52 Byte lang, verstößt aber gegen meine Regeln - er verwendet große Ganzzahlen (Zweierpotenzen) und Listen (Bereich).

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

Somnium
quelle
0

C, 72

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

Eine weitere fest codierte Antwort. Dies zählt nach unten (es gibt nichts in den Regeln über die Reihenfolge, in der die Zahlen ausgegeben werden müssen). Theoretisch sollte es funktionieren. Die Konstante hat ein Bit auf 1 für alle Zahlen, in die ein Würfel NICHT geschnitten werden kann, und eine 0 für die Zahlen, die es können. Theoretisch sollte die Konstante, wenn sie um eine sehr große Zahl nach rechts verschoben wird, Null sein, daher sollte die große Zahl immer gedruckt werden.

Interessant ist, dass dies in der Praxis nicht funktioniert. Der obige Code wird kompiliert und läuft auf GCC bis zu 65 einwandfrei. Über dieser Zahl befindet sich jedoch ein Fehler (oder eine "Funktion") im Compiler. es interpretiert 0x952BD7AF7EFC>>ials 0x952BD7AF7EFC>>i%64. So werden (zum Beispiel) die Zahlen 66 bis 71 (64 + 2 bis 64 + 7) übersprungen.

Um in Visual Studio ausgeführt zu werden, ist etwas mehr Boilerplate erforderlich (Sie können nicht mit impliziten Ganzzahlen und #includes davonkommen ). Sobald das Programm betriebsbereit ist, ist es in Ordnung, bis zu 257 ... Dann wird 258 übersprungen 263 (256 + 2 bis 256 + 7.) Also dauert esi%256.

Ich kann es später beheben (wenn ich gestört werden kann). Moral: Compiler-Handbücher geben normalerweise nicht die Obergrenze für Bitverschiebungen an. Dafür gibt es einen Grund!

Level River St.
quelle
Dies verwendet genau das gleiche Prinzip wie meine Antwort)
Somnium
In der Tat haben wir sogar im Grunde die gleiche Konstante (wobei Bit Null nicht verwendet wird und Bit 1 die Zahl 1 darstellt). Speichern Sie in CI ein einzelnes Byte, indem Sie die Konstante in hex angeben. Ich habe ein 0für Bit Null, ich könnte es für ein 1wie deins für den Fall i = 0 ändern . Aber es wird sowieso nie angezeigt.
Level River St
@steveverrill bitte erklären, wie sich NUM>>iändert NUM>>i%64. Auch wenn eine 64-bitZahl mehr als 64 Mal nach rechts verschoben wird, sollte es werdenzero
manav mn
@ Manav in der Tat sollte es Null werden. Wie gesagt, der Compiler hat einen Fehler. NUM>>iwird NUM>>(i%64)oder gleichwertig, NUM>>(i&63)weil der Compiler die am weitesten links liegenden Bits iabschneidet, bevor er die Bitverschiebung durchführt. GCC berücksichtigt nur die 6 Bits ganz rechts. Visual Studio hat den gleichen Fehler, ist jedoch etwas besser, wenn man nur die 8 Bits ganz rechts berücksichtigt NUM>>(i%256). Aus Neugier werde ich Ideone ausprobieren, wenn ich von der Arbeit nach Hause komme.
Level River St
ideone verhält sich genau wie GCC. ideone.com/EpKTpO
Level River St