Hitung sampai berapa kubus yang bisa dipotong satu kubus

9

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

masukkan deskripsi gambar di sini Program harus mengambil integer input n( 0 <= n <= 1 000) dan mencetak semua angka kurang atau sama nsehingga 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.

Somnium
sumber
Ini memiliki potensi tetapi Anda harus menentukannya dengan lebih jelas. Sebuah kubus memang dapat dipotong menjadi 20 kubus: alih-alih memotongnya menjadi 27 kubus sisi 1/3 yang asli, potong menjadi 19 kubus sisi 1/3 yang asli dan yang 8 kali lebih besar (sisi 2/3 bagian orisinal.) Ya saya pikir gambar akan membantu
Level River St
Itu kubus yang cukup kasar yang saya gambar, jangan ragu untuk mengubahnya. Pada pandangan pertama ini tampaknya sepele tetapi saya pikir ada kisaran yang menarik di sekitar 125-216 (5 ^ 3-6 ^ 3.) Mungkin untuk jumlah yang sangat besar hampir semua divisi dimungkinkan.
Level River St
Kita akan melihat apakah semua angka setelah beberapa ambang akan dimungkinkan.
Somnium
3
Jawabannya sebenarnya ada di sini: mathworld.wolfram.com/CubeDissection.html
Level River St
1
Karena kami memiliki solusi yang cukup sepele sekarang, Anda mungkin ingin mengubah ini kembali ke golf kode atau menaruh batasan yang sangat keras pada kiriman.
Martin Ender

Jawaban:

1

Golfscript, 55 (atau 43 42)

{.:^}{.47>20{.^>^@- 7%|!|}:/~1/38/39/{}{;}if^(}while;]`

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 <}, `

):a,48,^1{:/6+,{7*/+}%|}:&~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;)

Kyle McCormick
sumber
1

Mathematica, 62 byte (atau 52)

Ini jawaban yang sulit, tidak ada yang menarik.

If[EvenQ@BitShiftRight[164015534735101,n],Print@n]~Do~{n,1000}

Yang ini panjangnya 52 byte tetapi melanggar aturan saya - ini menggunakan bilangan bulat besar (kekuatan 2) dan daftar (Kisaran).

Select[Range@1000,EvenQ@Floor[164015534735101/2^#]&]

Somnium
sumber
0

C, 72

i;main(){for(scanf("%d",&i);i;i--)0x952BD7AF7EFC>>i&1||printf("%d ",i);}

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>>isebagai 0x952BD7AF7EFC>>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 #includes.) 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!

Level River St
sumber
Ini menggunakan prinsip yang persis sama dengan jawaban saya)
Somnium
Memang, kita bahkan pada dasarnya memiliki konstanta yang sama (dengan bit nol tidak digunakan dan bit 1 mewakili angka 1). Dalam CI simpan satu byte dengan menetapkan konstanta dalam hex. Saya memiliki 0bit nol, saya bisa mengubahnya menjadi 1milik Anda untuk case i = 0. Tapi toh itu tidak pernah ditampilkan.
Level River St
@steveverrill tolong jelaskan bagaimana NUM>>iperubahan NUM>>i%64. Juga jika 64-bitangka benar bergeser lebih dari 64 kali itu harus menjadizero
manav mn
@Manav memang harus menjadi nol. Seperti yang saya katakan, kompiler memiliki bug. NUM>>imenjadi NUM>>(i%64)atau sama NUM>>(i&63)karena kompiler memotong bit paling kiri isebelum 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 kanan NUM>>(i%256). Karena penasaran saya akan mencoba Ideone ketika saya pulang kerja.
Level River St
ideone berperilaku persis seperti GCC. ideone.com/EpKTpO
Level River St