Tính xem có thể cắt được bao nhiêu khối


9

Hãy tưởng tượng một số khối mà chúng ta có thể cắt thành các khối nhỏ hơn mà không cần các mảnh còn lại.

Tìm xem có bao nhiêu hình khối có thể được cắt.

Ví dụ, một khối có thể được cắt thành 8, 27 (rõ ràng là lũy thừa thứ 3 của số nguyên) và 20 (19 khối nhỏ cộng với một tám lần kích thước của các khối khác, xem hình ảnh).
Xem ở đây một số trợ giúp: http://mathworld.wolfram.com/CubeDissection.html

nhập mô tả hình ảnh ở đây Chương trình nên lấy số nguyên đầu vào n( 0 <= n <= 1 000) và in tất cả các số nhỏ hơn hoặc bằng để ncó thể cắt một khối lập phương thành số khối đó. Giả sử rằng khối có thể được cắt thành 1 khối và không thể thành 0 khối.

Bạn chỉ có thể sử dụng các kiểu dữ liệu tích hợp (không có mảng, đối tượng, v.v.) có kích thước không lớn hơn 64 bit. Mã ngắn nhất sẽ thắng.


Điều này có tiềm năng nhưng bạn cần xác định rõ hơn. Một khối lập phương thực sự có thể được cắt thành 20 khối: thay vì cắt nó thành 27 khối bên 1/3 gốc, cắt nó thành 19 khối bên 1/3 gốc và một khối lớn hơn 8 lần (cạnh 2/3 nguyên bản.) Có Tôi nghĩ rằng một bức ảnh sẽ hữu ích
Level River St

Đó là một khối khá thô tôi đã vẽ, hãy thoải mái thay đổi nó. Thoạt nhìn điều này có vẻ tầm thường nhưng tôi nghĩ có một phạm vi thú vị trong khoảng 125-216 (5 ^ 3-6 ^ 3.) Có thể có một số lượng rất lớn gần như tất cả các bộ phận đều có thể.
Cấp sông St

Chúng tôi sẽ xem liệu tất cả các số sau một số ngưỡng sẽ có thể.
Somnium

3
Câu trả lời thực sự có ở đây: mathworld.wolfram.com/CubeDissection.html
Level River St

1
Vì hiện tại chúng tôi có một giải pháp khá nhỏ, bạn có thể muốn thay đổi lại mã này thành mã golf hoặc đặt một số hạn chế thực sự khó khăn cho bài nộp.
Martin Ender

Câu trả lời:


1

Golf, 55 (hoặc 43 42)

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

Có thể được kiểm tra tại đây (chỉ cần thay đổi số trên dòng 2) và chỉ sử dụng mảng (hai ký tự mã cuối cùng) để in sạch, không phải cho bất kỳ bộ sưu tập hoặc giải quyết vấn đề nào. Nếu bạn bỏ nó đi, tất cả các kết quả sẽ được nối lại.

Phương pháp: Lặp lại từ n đã cho: Nếu số hiện tại lớn hơn 47 hoặc có dạng 1 + 7x, 20 + 7x, 38 + 7x hoặc 39 + 7x trong đó x = bất kỳ số nguyên không âm nào, thì hãy giữ nó trên ngăn xếp , nếu không thả nó.

Câu trả lời ngắn (43 byte):

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

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

Phương pháp: Tương tự, nhưng với một vài lý thuyết tập hợp ops. Điều này sử dụng mảng vì vậy về mặt kỹ thuật nó không phải là một câu trả lời chấp nhận được. Có thể được thử nghiệm ở đây . Btw: không ai từng nói họ phải theo thứ tự cụ thể nào cả;)


1

Toán học, 62 byte (hoặc 52)

Đó là câu trả lời được mã hóa cứng, không có gì thú vị.

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

Cái này dài 52 byte nhưng vi phạm quy tắc của tôi - nó sử dụng số nguyên lớn (lũy thừa 2) và danh sách (Phạm vi).

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


0

C, 72

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

Một câu trả lời mã hóa cứng. Điều này đếm ngược xuống (không có gì trong các quy tắc về thứ tự các số phải được xuất ra.) Về lý thuyết, nó sẽ hoạt động. Hằng số có một bit được đặt thành 1 cho tất cả các số mà khối lập phương KHÔNG thể cắt và 0 cho các số có thể. Về lý thuyết, hằng số khi phải dịch chuyển bởi một số rất lớn phải bằng 0, do đó, số lớn phải luôn được in.

Điều thú vị là trong thực tế điều này không hoạt động. Đoạn mã trên biên dịch và chạy tốt trên GCC lên tới 65. Nhưng trên con số đó có một lỗi (hoặc "tính năng") trong trình biên dịch. nó diễn giải 0x952BD7AF7EFC>>inhư 0x952BD7AF7EFC>>i%64. Vì vậy, nó bỏ qua (ví dụ) các số 66 đến 71 (64 + 2 đến 64 + 7).

Để chạy trong Visual Studio, cần có thêm một bản tóm tắt (nó không cho phép bạn thoát khỏi những thứ như số nguyên ngụ ý và #includes.) Sau khi chương trình khởi động và chạy, nó sẽ ổn đến 256 ... Sau đó, nó bỏ qua 258 263 (256 + 2 đến 256 + 7.) Vì vậy, nó đang dùngi%256.

Tôi có thể sửa nó sau (nếu tôi có thể bị làm phiền.) Về mặt đạo đức: hướng dẫn sử dụng trình biên dịch thường không cho bạn biết giới hạn trên của bithifts. Có một lý do cho điều đó!


Điều này sử dụng chính xác nguyên tắc giống như câu trả lời của tôi)
Somnium

Thật vậy, về cơ bản chúng ta có cùng một hằng số (với bit 0 không được sử dụng và bit 1 đại diện cho số 1.) Trong CI lưu một byte đơn bằng cách chỉ định hằng số trong hex. Tôi có một 0bit 0, tôi có thể thay đổi nó 1giống như của bạn cho trường hợp i = 0. Nhưng dù sao nó cũng không bao giờ được hiển thị.
Cấp sông St

@steveverrill vui lòng giải thích cách NUM>>ithay đổi NUM>>i%64. Ngoài ra, nếu một 64-bitsố được dịch chuyển đúng hơn 64 lần thì nó sẽ trở thànhzero
manav mn

@Manav thực sự nó sẽ trở thành số không. Như tôi nói, trình biên dịch có một lỗi. NUM>>itrở thành NUM>>(i%64)hoặc tương đương NUM>>(i&63)vì trình biên dịch đang cắt các bit ngoài cùng bên trái itrước khi thực hiện quá trình bẻ khóa. GCC chỉ xem xét 6 bit ngoài cùng bên phải. Visual Studio có cùng một lỗi nhưng tốt hơn một chút, chỉ xem xét 8 bit ngoài cùng bên phải NUM>>(i%256). Vì tò mò tôi sẽ thử Ideone khi tôi đi làm về.
Cấp sông St

ideone cư xử chính xác như GCC. ideone.com/EpKTpO
Level River St
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.