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
Das Programm sollte als Eingabe Integer n
( 0 <= n <= 1 000
) verwenden und alle Zahlen kleiner oder gleich drucken, n
damit 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.
quelle
Antworten:
Golfscript, 55 (oder
4342)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 <}, `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;)
quelle
Mathematica, 62 Bytes (oder 52)
Es ist eine fest codierte Antwort, nichts Interessantes.
Dieser ist 52 Byte lang, verstößt aber gegen meine Regeln - er verwendet große Ganzzahlen (Zweierpotenzen) und Listen (Bereich).
quelle
C, 72
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>>i
als0x952BD7AF7EFC>>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
#include
s 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!
quelle
0
für Bit Null, ich könnte es für ein1
wie deins für den Fall i = 0 ändern . Aber es wird sowieso nie angezeigt.NUM>>i
ändertNUM>>i%64
. Auch wenn eine64-bit
Zahl mehr als 64 Mal nach rechts verschoben wird, sollte es werdenzero
NUM>>i
wirdNUM>>(i%64)
oder gleichwertig,NUM>>(i&63)
weil der Compiler die am weitesten links liegenden Bitsi
abschneidet, 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ücksichtigtNUM>>(i%256)
. Aus Neugier werde ich Ideone ausprobieren, wenn ich von der Arbeit nach Hause komme.