Kiểm tra xem hình chữ nhật có lấp đầy không gian hình chữ nhật không có khoảng trống hoặc chồng chéo không


8

Thử thách này dựa trên một thử thách tương tự khác. Bởi vì việc tìm cách đóng gói hình chữ nhật hiệu quả nhất là NP-hard (nghĩa là giải pháp của nó rất dễ kiểm tra nhưng khó tìm), thử thách này dễ hơn rất nhiều so với thử thách này ở đây

Thử thách này

Đưa ra một loạt các hình chữ nhật, tìm hiểu xem chúng có lấp đầy một không gian hình chữ nhật không có khoảng trống hoặc chồng chéo hay không.

Đầu vào

Đầu vào có thể ở hai dạng, một trong số đó mang hình phạt ghi bàn.

Đầu tiên: nó chứa một danh sách các danh sách con, mỗi danh sách có độ dài 4. Danh sách này chứa 4 số nguyên là tọa độ của các đỉnh đối diện. Vì tất cả các hình chữ nhật sẽ nằm ngang / dọc, không có sự mơ hồ về vị trí của hình chữ nhật. Mỗi danh sách con sẽ chứa bốn số nguyên, theo thứ tự là tọa độ x của đỉnh thứ nhất, tọa độ y của đỉnh thứ nhất, tọa độ x của đỉnh thứ hai và tọa độ y của đỉnh thứ hai.

Thứ hai: nó chứa bốn danh sách các số nguyên có cùng độ dài. Bốn danh sách đại diện cho các tọa độ khác nhau. Nếu bạn tưởng tượng tùy chọn đầu vào 1 là một ma trận, thì đầu vào ở đây chỉ là chuyển vị của ma trận. Đầu vào này mang một +20%hình phạt byte.

Đầu ra

Đơn giản đầu ra trung thực / giả.

Thông số kỹ thuật

Nếu có một hình chữ nhật có diện tích 0 (nghĩa là x1 == x2 || y1 == y2), hãy bỏ qua hình chữ nhật này (như vậy [0 0 1 1], [2 2 3 2]là hợp lệ). Đặc điểm kỹ thuật này được đưa ra để làm cho mọi người khó khăn hơn khi chỉ cần lấy các giá trị min / max x / y.

x1 <= x2y1 <= y2không phải lúc nào cũng đúng Nếu x1 > x2 || y1 > y2, hình chữ nhật không phải là hình chữ nhật có diện tích bằng không; đúng hơn, nó chiếm không gian hình chữ nhật giữa (x1, y1)(x2, y2).
Các tọa độ có thể âm, trong trường hợp chúng vẫn chiếm khoảng trống giữa các tọa độ.
Hình chữ nhật trên cùng bên trái không phải lúc nào cũng ở (0, 0); do đó, không gian hình chữ nhật được lấp đầy không nhất thiết phải có góc trên cùng bên trái tại (0, 0).
(Cảm ơn @xnor đã chỉ ra những điều mơ hồ này)

Vui lòng xác định cách bạn muốn đầu vào của bạn và cách đầu ra của bạn sẽ được thể hiện.

Chấm điểm

Điểm là kích thước của mã tính theo byte, cộng với hình phạt byte nếu có. Điểm thấp nhất tính đến ngày 15 tháng 12 chiến thắng.

Các trường hợp thử nghiệm

0 0 1 2
1 0 3 1 ==> true
1 1 3 2

0 0 2 2
0 0 1 1 ==> false
0 0 0 0

0 0 1 1
2 2 2 2 ==> true
0 1 2 1

Chúc may mắn, chơi golf vui vẻ!


Hình chữ nhật phải có một góc tại (0,0)? Các tọa độ có thể là âm?
xnor

Chúng tôi có đảm bảo rằng mỗi hình chữ nhật có x1 <= x2y1 <= y2? Là một khu vực 0 hình chữ nhật với x1 == x2y1 <= y2có thể?
xnor

@xnor Đây là tất cả những điều nhỏ nhặt mà tôi không xem xét. Cảm ơn đã chỉ ra chúng, tôi sẽ làm rõ trong một chỉnh sửa. Câu trả lời của tôi cho những câu hỏi là không, có, không, có.
HyperNeutrino

Tôi muốn giới thiệu Sandbox cho các chi tiết như thế này là trước. Các trường hợp thử nghiệm của bạn nên bao gồm càng nhiều các trường hợp góc này càng tốt. Tôi vẫn chưa rõ mặc dù trên "Do đó, danh sách sẽ trông giống như [x1, y1, x2, y2], trong đó (x1, y1) và (x2, y2) đại diện cho các đỉnh trên cùng bên trái và dưới cùng bên phải". Nếu x1 > x2y1 > y2, đây có phải là hình chữ nhật có diện tích không vì tọa độ được chuyển đổi?
xnor

2
Ai đó đã xem numberphile?
orlp

Câu trả lời:


0

JavaScript (ES6), 249 byte

with(Math)a=>!(a=a.map(([l,t,r,b])=>[l<r?l:r,t<b?t:b,l>r?l:r,t>b?t:b]).filter(g=([l,t,r,b])=>(r-l)*(b-t))).reduce((s,b)=>s-g(b),g([min,min,max,max].map((f,i)=>f(...a.map(a=>a[i])))))>a.some(([l,t,r,b],i)=>a.some(([m,u,s,c],j)=>i!=j&l<s&m<r&t<c&u<b))

Lưu ý: Để sử dụng điều này, hãy đánh giá nó dưới dạng một chuỗi và gán kết quả cho một biến hoặc chèn phép gán sau with(Math). Giải trình:

with(Math)a=>!(Mang minmaxvào phạm vi.
a=a.map(([l,t,r,b])=>[l<r?l:r,t<b?t:b,l>r?l:r,t>b?t:b])Bình thường hóa tọa độ
.filter(g=([l,t,r,b])=>(r-l)*(b-t)))Xóa hình chữ nhật trống, đồng thời xác định hàm để tính diện tích
.reduce((s,b)=>s-g(b),Trừ các diện tích của tất cả các hình chữ nhật
g([min,min,max,max].map((f,i)=>f(...a.map(a=>a[i])))))khỏi khu vực của khung giới hạn
>a.some(([l,t,r,b],i)=>a.some(([m,u,s,c],j)=>i!=j&l<s&m<r&t<c&u<b))và kiểm tra xem không có hình chữ nhật nào trùng nhau.


Tôi đang gặp sự cố khi kiểm tra điều này. Bạn có thể làm rõ những gì bạn có nghĩa là "chèn bài tập"? (Tôi không có kinh nghiệm ES6 nào). Hoặc nếu có thể, bạn có thể cung cấp một liên kết đến một số trường hợp thử nghiệm? Cảm ơn.
HyperNeutrino

@AlexL. Ý tôi là bạn cần phải viết, with(Math)f=a=>v.v. - đặt f=ngay từ đầu sẽ không hiệu quả.
Neil

Được chứ. Tôi hiểu ý của bạn, nhưng các trình biên dịch trực tuyến tôi đã thử đều cho tôi nhiều lỗi khác nhau. Bạn có thể cung cấp một trình biên dịch thực sự hoạt động (các trình biên dịch khác đang bị kỳ lạ)?
HyperNeutrino

@AlexL. Ah, tôi nghĩ rằng tôi đã đánh máy một trong những chỉnh sửa của mình; Tôi đã kiểm tra lại và bạn sẽ ổn ngay bây giờ.
Neil

Tôi đang đánh dấu điều này là chấp nhận ngay bây giờ. Tôi sẽ tin tưởng bạn với kết quả kiểm tra và tôi sẽ tiếp tục cố gắng xác minh nó.
HyperNeutrino

0

Toán học, 194 byte

(r=Select[#,(#-#3)(#2-#4)&@@#>0&];m={#~Min~#3,#2~Min~#4,#~Max~#3,#2~Max~#4}&@@Transpose@r;b=Boole[(x-#)(x-#3)<0&&(y-#2)(y-#4)<0]&;Integrate[(Plus@@(b@@@r)-b@@m)^2,{x,#,#3}&@@m,{y,#2,#4}&@@m]<1)&

Một phiên bản vô văn hóa:

1  (r = Select[#1, (#1 - #3) (#2 - #4) & @@ #1 > 0 &]; 
2   m = {Min[#1, #3], Min[#2, #4], Max[#1, #3], Max[#2, #4]} & @@ Transpose[r]; 
3   b = Boole[(x - #1) (x - #3) < 0 && (y - #2) (y - #4) < 0] &;
4   Integrate[
5     (Plus @@ (b @@@ r) - b @@ m)^2 ,
6     {x, #1, #3} & @@ m ,
7     {y, #2, #4} & @@ m
8   ] < 1
9  ) &

Dòng 1 định nghĩa rlà tập hợp các hình chữ nhật không cần thiết từ đầu vào đã cho. (Có rất nhiều điều & @@đang diễn ra trong mã này; đó chỉ là để chúng ta có thể sử dụng #1,#2,#3,#4cho bốn yếu tố của danh sách thay vì #[[1]],#[[2]],#[[3]],#[[4]].) Sau đó, dòng 2 định nghĩa mlà tọa độ của hình chữ nhật nhỏ nhất bao quanh tất cả các yếu tố được liệt kê trong r; Vì vậy, nếu hình chữ nhật đầu vào xếp một hình chữ nhật lớn, hình chữ nhật lớn đó phải là m.

Dòng 3 định nghĩa hàm b, khi được áp dụng cho một bộ tứ đại diện cho một hình chữ nhật, tạo ra một hàm gồm hai biến xybằng 1 nếu điểm (x,y)nằm trong hình chữ nhật và 0 nếu không. Dòng 5 tạo ra nhiều hàm trong số này, một hàm cho mỗi hình chữ nhật trong r(tất cả được cộng lại với nhau) và một hàm cuối cùng cho hình chữ nhật lớn m(bị trừ); hàm hai biến phức tạp đó được bình phương.

Điểm mấu chốt ở thời điểm này là hàm hai biến có dạng 0 nếu hình chữ nhật nhỏ xếp hình chữ nhật lớn, nhưng nó sẽ có một số giá trị dương nếu hai hình chữ nhật nhỏ trùng nhau hoặc một số giá trị âm (trước khi bình phương) của hình chữ nhật lớn không được bảo hiểm. Chúng tôi phát hiện điều này bằng cách tích hợp (!) Hàm hai biến trên hình chữ nhật lớn (giới hạn tích hợp được đưa ra trong các dòng 6-7): nếu chúng tôi có 0, thì ốp lát là hoàn hảo và nếu chúng tôi có được giá trị dương , sau đó có một vấn đề ở đâu đó. Vì mọi thứ trong tầm nhìn là một số nguyên, chúng tôi lưu một byte cuối cùng bằng cách sử dụng < 1thay vì == 0trong dòng 8.

(Tôi nghĩ thật thú vị khi chúng ta có thể khai thác khả năng tính toán của Mathistica để giải bài toán tổ hợp này.)

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.