Ốp lát vuông đơn vị


8

Lý lịch

Bằng cách mở rộng và hủy các điều khoản, thật dễ dàng để hiển thị danh tính sau:

nhập mô tả hình ảnh ở đây

Tuy nhiên, vấn đề mở là liệu tất cả các hình chữ nhật 1 / n-by-1 / (n + 1) có thể xếp hình vuông đơn vị hay không.

Nhiệm vụ

Chương trình của bạn nên lấy số nguyên dương N làm đầu vào theo bất kỳ cách thuận tiện nào và đóng gói tất cả các hình chữ nhật mở 1 / n-by-1 / (n + 1) với n nằm giữa 1 và N được bao gồm trong hình vuông đơn vị, sao cho không có hai phần trùng nhau .

Đối với mỗi hình chữ nhật, bạn phải tạo các số nguyên sau theo thứ tự:

  • 1 nếu các cạnh ngang dài hơn các cạnh dọc, khác 0
  • Tử số và mẫu số của tọa độ x của góc dưới bên trái
  • Tử số và mẫu số của tọa độ y của góc dưới bên trái

Lưu ý rằng chúng ta lấy hình vuông đơn vị là (0, 1) x (0, 1), với các giá trị x chạy từ trái sang phải và các giá trị y chạy từ dưới lên trên.

Đầu ra dự kiến ​​cuối cùng là nối các số nguyên này cho mỗi hình chữ nhật theo thứ tự tăng n, ở bất kỳ định dạng thuận tiện nào (ví dụ được in ra thiết bị xuất chuẩn hoặc dưới dạng danh sách được trả về từ hàm).

Ví dụ đầu vào và đầu ra

Đầu vào:

3

Đầu ra:

0 0 1 0 1 1 1 2 0 1 1 1 2 1 3

Phân tích này như sau:

0 (0/1, 0/1)  1 (1/2, 0/1)  1 (1/2, 1/3)

Chấm điểm

Đây là một thử thách chơi gôn, vì vậy câu trả lời có ít byte nhất sẽ thắng. Tuy nhiên, thuật toán của bạn cũng phải có hiệu quả hợp lý; nó sẽ có thể chạy cho tất cả N<=100trong khoảng 10 phút.

Giải pháp của bạn phải đưa ra các giải pháp hợp lệ cho tất cả N<=100, nhưng các thuật toán hoàn chỉnh có thể chứng minh cũng được hoan nghênh ngay cả khi chúng không phải là ngắn nhất.


Xem như đây là một vấn đề mở, có giới hạn về giá trị lớn nhất của $ N $ mà thuật toán của chúng tôi phải được đảm bảo để hoạt động không?
Greg Martin

@GregMartin bạn nên chạy thành công chương trình của mình cho N từ 1 đến 20. Điểm Brownie nếu thuật toán của bạn có thể được chứng minh là thành công hoặc từ chối phỏng đoán.
user1502040

Đối với N≤20, đầu ra chỉ có thể được mã hóa cứng ... đó có phải là ý định của bạn để cho phép điều đó không? Có một thuật toán được xuất bản đơn giản cho phép ít nhất N = 1.000.000.000 ....
Greg Martin

OK, tôi đã thay đổi ngưỡng từ 20 thành 100.
user1502040

Ôi, Chúa ơi. Tôi chưa học tổng đến vô cùng, vì vậy tôi hoàn toàn không hiểu điều này.
Matthew Roh

Câu trả lời:


2

Haskell, 263 262 byte

import Data.Ratio;f m=let{(#)n z|n>m=[[]]|True=[a:y|(a,j)<-[((o,x,y),[c|c<-(u&w,h-v,x,g):(w-u,h&v,a,y):z,c/=b])|b@(w,h,x,y)<-z,(o,u,v)<-[(o,1%(n+1-o),1%(n+o))|o<-[0,1]],(a,g)<-[(x+u,y+v)|u<=w,v<=h],let(&)p q|w>h=p|True=q],y<-(n+1)#j]}in(1#[(1%1,1%1,0%1,0%1)])!!0

Điều này tuân theo thuật toán được mô tả trong Paulhus 1997, Thuật toán cho hình vuông đóng gói , doi: 10.1006 / jcta.1997.2836 . Quan sát chính trong bài báo, theo kinh nghiệm nếu không được xác minh về mặt lý thuyết, là khu vực còn sót lại sau khi đặt một hình chữ nhật trong một hộp có thể được chia thành hai hộp phụ mà sau đó việc điền vào có thể được coi là độc lập.

Thay vì tìm hộp phụ có chiều rộng nhỏ nhất để vừa với hình chữ nhật tiếp theo, mã thực hiện tìm kiếm trên tất cả các hộp phụ có thể; trong thực tế, điều này không làm giảm tốc độ đáng kể cho n <100.

Đầu ra ở dạng một danh sách các mục dưới dạng các bộ dữ liệu với dấu phân số %vẫn được bao gồm. Các số nguyên trong đầu ra được định dạng theo thứ tự mong muốn, nhưng nói đúng ra một số xử lý hậu kỳ sẽ được yêu cầu để tạo danh sách các số nguyên một mình.

Chạy mẫu:

*Main> f 5 (0,0 % 1,0 % 1),(0,1 % 2,0 % 1),(0,1 % 2,1 % 2),(0,3 % 4,1 % 2),(1,1 % 2,5 % 6)

Chỉnh sửa: xóa một khoảng trống sau khi a let.

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.