Обчисліть, на скільки кубів можна вирізати один куб


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 оригінал.) Так, я думаю, що картина буде корисною
рівень Рівер Сент,

Це досить грубий кубик, який я намалював, сміливо міняйте його. На перший погляд це здається тривіальним, але я думаю, що є цікавий діапазон приблизно 125-216 (5 ^ 3-6 ^ 3). Цілком ймовірно, що для дуже великої кількості можливі майже всі поділи.
Річка рівня Св.

Ми побачимо, чи будуть можливі всі числа після деякого порогу.
Somnium

3
Відповідь насправді є тут: mathworld.wolfram.com/CubeDissection.html
Level River St

1
Оскільки зараз у нас є досить тривіальне рішення, ви можете змінити цю ситуацію назад на код гольфу або покласти справді жорсткі обмеження.
Мартін Ендер

Відповіді:


1

Гольфскрипт, 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 * / +}% |}: &;): a, 48, ^ 1 & 20 & 38 & 39 & {a <}, `

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

Метод: подібний, але з кількома опціями теорії множин. Тут використовуються масиви, тому технічно це не прийнятна відповідь. Можна протестувати тут . Btw: ніхто ніколи не говорив, що вони повинні бути в якомусь конкретному порядку;)


1

Математика, 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

Дійсно, у нас навіть є однакова константа (з бітним нулем невикористаним і бітом 1, що представляє число 1.) В CI збережіть один байт, вказавши константу в шістнадцятковій. У мене є 0біт нуля, я міг би змінити його на 1аналогічний вашому для випадку i = 0. Але він ніколи не відображається.
Річка рівня Св.

@steveverrill, будь ласка, поясніть, як NUM>>iзмінюється NUM>>i%64. Крім того, якщо 64-bitчисло зміщено праворуч більше 64 разів, воно повинно статиzero
манав

@Manav дійсно це повинно стати нулем. Як я кажу, у компілятора є помилка. NUM>>iстає NUM>>(i%64)або рівнозначно NUM>>(i&63)тому, що компілятор обрізає крайні ліві біти iперед виконанням бітсифта. GCC розглядає лише найправіші 6 біт. Visual Studio має таку ж помилку, але трохи краще, враховуючи лише найправіші 8 біт NUM>>(i%256). З цікавості я спробую Ideone, коли повернуся з роботи додому.
Рівень річки Св.

Ідеон поводиться точно як GCC. ideone.com/EpKTpO
Level River St
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.