Представьте себе какой-нибудь куб, который мы можем разрезать на более мелкие кубики без оставшихся кусочков.
Найдите, на сколько кубов можно нарезать куб.
Например, куб можно разрезать на 8, 27 (очевидно, 3-й степени целых чисел) и 20 (19 маленьких кубиков плюс один в восемь раз больше остальных, см. Изображение).
Смотрите здесь некоторую помощь: http://mathworld.wolfram.com/CubeDissection.html
Программа должна принимать в качестве входных данных целое число n
( 0 <= n <= 1 000
) и печатать все числа, меньшие или равные n
так, чтобы куб можно было разрезать на это количество кубов. Предположим, что куб можно разрезать на 1 куб, а не на 0 кубов.
Вы можете использовать только целые типы данных (без массивов, объектов и т. Д.) Размером не более 64 бит. Самый короткий код выигрывает.
источник
Ответы:
Golfscript, 55 (или
4342)Может быть проверено здесь (просто измените число в строке 2) и использует только массив (последние два символа кода) для чистой печати, а не для какой-либо коллекции или решения проблем. Если вы не включите его, все результаты будут объединены.
Метод: итерация вниз от заданного значения n: если текущее число больше 47 или имеет вид 1 + 7x, 20 + 7x, 38 + 7x или 39 + 7x, где x = любое неотрицательное целое число, сохраните его в стеке иначе брось.
Краткий ответ (43 байта):
{: / 6 +, {7 * /} +% |}: &;): а, 48, 1 ^ & 20 & 38 & 39 & {а <}, `Метод: аналогичный, но с несколькими опциями теории множеств. При этом используются массивы, поэтому это технически неприемлемый ответ. Можно проверить здесь . Кстати: никто никогда не говорил, что они должны быть в каком-то определенном порядке;)
источник
Mathematica, 62 байта (или 52)
Это жесткий ответ, ничего интересного.
Длина этого файла составляет 52 байта, но он нарушает мои правила - он использует большие целые числа (степени 2) и списки (Range).
источник
С, 72
Еще один жестко заданный ответ. Это считается вниз (в правилах нет ничего о порядке вывода чисел.) Теоретически это должно работать. Константа имеет бит, установленный в 1 для всех чисел, в которые куб НЕ может быть разрезан, и в 0 для чисел, которые могут. Теоретически, постоянная, когда вправо смещено на очень большое число, должна быть равна нулю, поэтому большое число всегда должно быть напечатано.
Интересно то, что на практике это не работает. Приведенный выше код компилируется и прекрасно работает на GCC до 65. Но выше этого числа есть ошибка (или «особенность») в компиляторе. это интерпретируется
0x952BD7AF7EFC>>i
как0x952BD7AF7EFC>>i%64
. Таким образом, он пропускает (например) числа от 66 до 71 (от 64 + 2 до 64 + 7).Для запуска в Visual Studio требуется немного больше шаблонного кода (он не позволяет вам обходиться без таких вещей, как подразумеваемые целые числа и
#include
s). Как только программа запущена и работает, все нормально до 257 ... Затем она пропускает 258 через 263 (от 256 + 2 до 256 + 7).i%256.
Я могу исправить это позже (если я могу быть обеспокоен.) Мораль: руководства компилятора обычно не сообщают вам верхний предел битовых сдвигов. Для этого есть причина!
источник
0
для нулевого бита, я мог бы изменить его на1
аналогичный вашему для случая i = 0. Но это никогда не отображается в любом случае.NUM>>i
меняетсяNUM>>i%64
. Также, если64-bit
число смещено вправо более чем в 64 раза, оно должно статьzero
NUM>>i
становитсяNUM>>(i%64)
или эквивалентно,NUM>>(i&63)
потому что компиляторi
усекает самые левые биты перед выполнением сдвига битов. GCC рассматривает только самые правые 6 бит. Visual Studio имеет ту же ошибку, но немного лучше, учитывая только самые правые 8 битNUM>>(i%256)
. Из любопытства попробую Ideone, когда приду домой с работы.