Bayangkan beberapa kubus yang bisa kita potong menjadi kubus yang lebih kecil tanpa potongan yang tersisa.
Temukan berapa kubus yang bisa dipotong kubus.
Misalnya, sebuah kubus dapat dipotong menjadi 8, 27 (jelas kekuatan ke-3 dari bilangan bulat) dan 20 (19 kubus kecil plus satu delapan kali ukuran yang lain, lihat gambar).
Lihat di sini beberapa bantuan: http://mathworld.wolfram.com/CubeDissection.html
Program harus mengambil integer input n
( 0 <= n <= 1 000
) dan mencetak semua angka kurang atau sama n
sehingga kubus dapat dipotong menjadi jumlah kubus. Misalkan kubus dapat dipotong menjadi 1 kubus dan tidak bisa menjadi 0 kubus.
Anda hanya dapat menggunakan tipe data integral (tanpa array, objek, dll.) Dengan ukuran tidak lebih dari 64-bit. Kode terpendek menang.
sumber
Jawaban:
Golfscript, 55 (atau
4342)Dapat diuji di sini (cukup ganti nomor pada baris 2) dan hanya menggunakan array (dua karakter kode terakhir) untuk mencetak bersih, bukan untuk pengumpulan atau penyelesaian masalah apa pun. Jika Anda membiarkannya, semua hasil akan digabungkan.
Metode: Iterate down from diberikan n: Jika angka saat ini lebih besar dari 47 atau dalam bentuk 1 + 7x, 20 + 7x, 38 + 7x, atau 39 + 7x di mana x = bilangan bulat non-negatif, maka simpan di tumpukan , jika tidak jatuhkan.
Jawaban singkat (43 byte):
{: / 6 +, {7 * / +}% |}: &;): a, 48, ^ 1 & 20 & 38 & 39 & {a <}, `Metode: Mirip, tetapi dengan beberapa teori ops. Ini menggunakan array sehingga secara teknis bukan jawaban yang dapat diterima. Dapat diuji di sini . Btw: tidak ada yang pernah mengatakan mereka harus dalam urutan tertentu;)
sumber
Mathematica, 62 byte (atau 52)
Ini jawaban yang sulit, tidak ada yang menarik.
Yang ini panjangnya 52 byte tetapi melanggar aturan saya - ini menggunakan bilangan bulat besar (kekuatan 2) dan daftar (Kisaran).
sumber
C, 72
Jawaban hardcode lain. Ini diperhitungkan ke bawah (tidak ada dalam aturan tentang urutan nomor harus menjadi output.) Secara teori seharusnya bekerja. Konstanta memiliki bit yang diatur ke 1 untuk semua angka di mana kubus TIDAK dapat dipotong, dan 0 untuk angka yang bisa. Secara teori, konstanta ketika hak bergeser dengan angka yang sangat besar harus nol, sehingga angka yang besar harus selalu dicetak.
Yang menarik adalah bahwa dalam praktiknya ini tidak berhasil. Kode di atas mengkompilasi dan berjalan dengan baik pada GCC hingga 65. Tetapi di atas angka itu ada bug (atau "fitur") di kompiler. itu diartikan
0x952BD7AF7EFC>>i
sebagai0x952BD7AF7EFC>>i%64
. Jadi melompati (misalnya) angka 66 hingga 71 (64 + 2 hingga 64 + 7).Untuk berjalan di Visual Studio, sedikit lebih banyak boilerplate diperlukan (itu tidak membiarkan Anda lolos dengan hal-hal seperti bilangan bulat tersirat dan
#include
s.) Setelah program ini berjalan dan berjalan, baik-baik saja hingga 257 ... Kemudian ia melompati 258 melalui 263 (256 + 2 hingga 256 + 7.) Jadi ini butuh waktui%256.
Saya dapat memperbaikinya nanti (jika saya bisa diganggu). Moral: manual kompiler biasanya tidak memberi tahu Anda batas atas pada bitshifts. Ada alasan untuk itu!
sumber
0
bit nol, saya bisa mengubahnya menjadi1
milik Anda untuk case i = 0. Tapi toh itu tidak pernah ditampilkan.NUM>>i
perubahanNUM>>i%64
. Juga jika64-bit
angka benar bergeser lebih dari 64 kali itu harus menjadizero
NUM>>i
menjadiNUM>>(i%64)
atau samaNUM>>(i&63)
karena kompiler memotong bit paling kirii
sebelum melakukan bithift. GCC hanya menganggap hanya 6 bit paling kanan. Visual Studio memiliki bug yang sama tetapi sedikit lebih baik, mengingat hanya 8 bit paling kananNUM>>(i%256)
. Karena penasaran saya akan mencoba Ideone ketika saya pulang kerja.