Подсчитайте, на сколько кубиков можно нарезать один куб


9

Представьте себе какой-нибудь куб, который мы можем разрезать на более мелкие кубики без оставшихся кусочков.

Найдите, на сколько кубов можно нарезать куб.

Например, куб можно разрезать на 8, 27 (очевидно, 3-й степени целых чисел) и 20 (19 маленьких кубиков плюс один в восемь раз больше остальных, см. Изображение).
Смотрите здесь некоторую помощь: http://mathworld.wolfram.com/CubeDissection.html

введите описание изображения здесь Программа должна принимать в качестве входных данных целое число n( 0 <= n <= 1 000) и печатать все числа, меньшие или равные nтак, чтобы куб можно было разрезать на это количество кубов. Предположим, что куб можно разрезать на 1 куб, а не на 0 кубов.

Вы можете использовать только целые типы данных (без массивов, объектов и т. Д.) Размером не более 64 бит. Самый короткий код выигрывает.


Это имеет потенциал, но вам нужно указать это более четко. Куб действительно можно разрезать на 20 кубов: вместо того, чтобы разрезать его на 27 кубов со стороны 1/3 оригинала, нарежьте его на 19 кубов со стороны 1/3 оригинала и один, который в 8 раз больше (сторона 2/3 оригинал.) Да, я думаю, что картина будет полезна
Level River St

Это довольно грубый куб, который я нарисовал, смело меняйте его. На первый взгляд это кажется тривиальным, но я думаю, что есть интересный диапазон около 125-216 (5 ^ 3-6 ^ 3.) Вероятно, что для очень больших чисел возможны почти все деления.
Уровень Река Сент

Посмотрим, будут ли возможны все числа после некоторого порога.
Сомниум

3
Ответ на самом деле здесь: mathworld.wolfram.com/CubeDissection.html
Уровень Река St

1
Поскольку сейчас у нас есть довольно тривиальное решение, вы можете изменить это обратно на code golf или наложить действительно жесткие ограничения на заявки.
Мартин Эндер

Ответы:


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 * /} +% |}: &;): а, 48, 1 ^ & 20 & 38 & 39 & {а <}, `

):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

С, 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.

Я могу исправить это позже (если я могу быть обеспокоен.) Мораль: руководства компилятора обычно не сообщают вам верхний предел битовых сдвигов. Для этого есть причина!


Это использует тот же принцип, что и мой ответ)
Сомниум

Действительно, у нас даже есть в основном одна и та же константа (с нулевым битом и битом 1, представляющим число 1.) В CI сохраните один байт, указав константу в шестнадцатеричном виде. У меня есть 0для нулевого бита, я мог бы изменить его на 1аналогичный вашему для случая i = 0. Но это никогда не отображается в любом случае.
Уровень Река 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). Из любопытства попробую Ideone, когда приду домой с работы.
Уровень Ривер Сент-

Ideone ведет себя так же, как GCC. ideone.com/EpKTpO
Уровень Ривер-Стрит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.