Đếm các giao điểm hình chữ nhật


8

Các thách thức

Cho một số lượng hình chữ nhật tùy ý, xuất tổng số giao điểm của những hình đó khi được vẽ trong mặt phẳng 2D.

Một giao điểm ở đây được định nghĩa là một điểm Pđược giao nhau bởi hai đường thẳng trực giao với nhau và cả hai đều không kết thúc P.

Thí dụ

Mỗi hình chữ nhật ở đây được biểu thị bằng 2 tuple với tọa độ của góc trên bên trái trước và tọa độ của góc dưới bên phải thứ hai.

[(-8,6), (- 4, -2)]
[(-4,9), (4,3)]
[(2,10), (14,4)]
[(1,7), (10, -6)]
[(7,4), (10,2)]
[(5,2), (9, -4)]
[(-6, -4), (- 2, -6)]

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

Những hình chữ nhật đó tạo ra 6 giao điểm, đó phải là đầu ra của bạn.

  • Như bạn có thể thấy trong hình trên, chạm vào hình chữ nhật sẽ không tạo giao điểm ở đây và không được tính.
  • Bạn có thể mã hóa trực tràng theo bất kỳ định dạng nào bạn muốn. Làm rõ định dạng bạn sử dụng.
  • Nếu nhiều hình chữ nhật cắt nhau tại cùng một điểm thì nó chỉ được tính là một giao điểm.
  • Các tọa độ sẽ luôn là số nguyên.
  • Sẽ không có bất kỳ hình chữ nhật trùng lặp nào trong đầu vào.
  • Bạn sẽ luôn nhận được ít nhất một hình chữ nhật làm đầu vào.
  • Bạn không thể sử dụng bất kỳ nội dung nào giải quyết vấn đề này trực tiếp. Ngoài ra, bạn không thể sử dụng nội dung giải phương trình. Tất cả các nội dung khác được cho phép.
  • Đầu ra phải là một số nguyên duy nhất cho biết số giao điểm.

Quy tắc

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

Định dạng tương tự như trong ví dụ trên. Các hình chữ nhật được bọc trong một danh sách.

[[(-8,6), (- 4, -2)], [(- 4,9), (4,3)], [(2,10), (14,4)], [(1 , 7), (10, -6)], [(7,4), (10,2)], [(5,2), (9, -4)], [(- 6, -4), (-2, -6)]] -> 6
[[(-2,2), (6, -4)]] -> 0
[[(-12,10), (- 8,6)], [(- 14,6), (- 10,2)], [(- 10,6), (- 6,2)]] - > 0
[[(-4,10), (6,2)], [(- 2,8), (4,3)], [(1,6), (8.4)], [(2,11 ), (5,5)]] -> 10
[[(8.2), (12, -2)], [(10.0), (14, -4)]] -> 2
[[(0,2), (2,0)], [(0,1), (3,0)]] -> 1
[[(-10, -2), (- 6, -6)], [(- 6, -2), (- 2, -6)], [(- 8, -4), (- 4, -8)]] -> 3

Chúc mừng mã hóa!


Bạn cần xác định những gì bạn muốn câu trả lời được tính, vì nhiều điểm trong giao điểm của hai hoặc nhiều hình chữ nhật rõ ràng bị bỏ qua, theo sơ đồ.
frageum

1
Vậy, [[(0,0),(1,2)],[(0,0),(2,1)]]sẽ có 1 ngã tư?
Neil

@Neil Chính xác. Gonna thêm trường hợp thử nghiệm này, cảm ơn!
Denker

@feersum Tôi nghĩ sơ đồ làm cho nó khá rõ ràng những gì cần đếm và những gì không. Nhưng một định nghĩa chính thức sẽ không làm tổn thương tôi cho rằng, sẽ thêm một.
Denker

1
Nếu có N cặp hình chữ nhật cắt nhau tại (x, y) thì điểm (x, y) được tính một lần hay N lần?
frageum

Câu trả lời:


2

JavaScript (ES6), 186 byte

a=>a.map(([a,b,c,d])=>h.push([b,a,c],[d,a,c])&v.push([a,b,d],[c,b,d]),h=[],v=[])|h.map(([d,a,e])=>v.map(([c,f,b])=>a<c&c<e&b<d&d<f&t.every(([a,b])=>a-c|b-d)&&t.push([c,d])),t=[])|t.length

Chia mỗi hình chữ nhật thành các dòng thành phần của nó, sau đó giao giữa các đường ngang và dọc, xây dựng một danh sách các giao điểm để tránh trùng lặp.


Bạn sử dụng định dạng đầu vào nào? Khi tôi gọi cái này bằng cái cặp, tôi luôn nhận được số không.
Denker

@DenkerAffe Xin lỗi, tôi nên nói rằng, tôi mong đợi một mảng gồm 4 phần tử, vd [[-4,10,6,2],[-2,8,4,3],[1,6,8,4],[2,11,5,5]]. Vì JavaScript không có bộ dữ liệu, nếu bạn đã cố gắng sử dụng các ví dụ của mình theo nghĩa đen, bạn đã kích hoạt toán tử dấu phẩy thay vào đó, làm mất hiệu lực đầu vào.
Neil

Được rồi, cám ơn. Tuy nhiên, điều này mang lại 4 thay vì 3 cho mẫu thử cuối cùng, vì các giao điểm của nhiều hình chữ nhật chỉ được tính là một giao điểm. Tôi đã làm rõ điều này sau khi bạn đăng câu trả lời của bạn, tôi nghĩ vậy, câu hỏi này tiếp tục với tôi. Hy vọng nó không quá khó để khắc phục điều này, xin lỗi vì sự bất tiện này.
Denker

@DenkerAffe Tôi đã cập nhật nó để hoạt động với thông số mới của bạn.
Neil

0

Toán học 138 byte

Chưa xong! Điều này hoạt động cho tất cả các trường hợp ngoại trừ[[(0,0),(1,2)],[(0,0),(2,1)]]


Length@Union[Join@@(Cases[RegionIntersection@@# &/@Subsets[Line[{{#,#2},{#3,#2},{#3,#4},{#,#4},{#,#2}}]&@@@Flatten/@#,{2}],Point@a__:> a])]

Thí dụ

Length@Union[
Join @@ (Cases[RegionIntersection @@ # & /@ Subsets[
Line[{{#, #2}, {#3, #2}, {#3, #4}, {#, #4}, {#, #2}}] & @@@ Flatten /@ #, {2}], 
Point@a__ :> a])] &@{{{-8, 6}, {-4, -2}}, {{-4, 9}, {4, 3}}, {{2, 10}, {14, 4}}, 
{{1, 7}, {10, -6}}, {{7, 4}, {10, 2}}, {{5, 2}, {9, -4}}, {{-6, -4}, {-2, -6}}}

6

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.