Xem xét một đa giác có khả năng tự giao nhau, được xác định bởi một danh sách các đỉnh trong không gian 2D. Ví dụ
{{0, 0}, {5, 0}, {5, 4}, {1, 4}, {1, 2}, {3, 2}, {3, 3}, {2, 3}, {2, 1}, {4, 1}, {4, 5}, {0, 5}}
Có một số cách để xác định diện tích của một đa giác như vậy, nhưng cách thú vị nhất là quy tắc chẵn. Lấy bất kỳ điểm nào trong mặt phẳng, vẽ một đường thẳng từ điểm ra đến vô cực (theo bất kỳ hướng nào). Nếu đường thẳng đó vượt qua đa giác một số lần lẻ, thì điểm đó là một phần của khu vực của đa giác, nếu nó vượt qua đa giác một số lần chẵn thì điểm đó không phải là một phần của đa giác. Đối với đa giác ví dụ ở trên, đây là cả phác thảo cũng như khu vực chẵn của nó:
Đa giác sẽ không nói chung là trực giao. Tôi chỉ chọn một ví dụ đơn giản như vậy để dễ đếm khu vực hơn.
Khu vực của ví dụ này là 17
(không 24
hoặc 33
như các định nghĩa hoặc khu vực khác có thể mang lại).
Lưu ý rằng theo định nghĩa này, diện tích của đa giác không phụ thuộc vào thứ tự quanh co của nó.
Các thách thức
Đưa ra một danh sách các đỉnh có tọa độ nguyên xác định một đa giác, xác định diện tích của nó theo quy tắc chẵn.
Bạn có thể viết một hàm hoặc chương trình, lấy đầu vào qua STDIN hoặc thay thế gần nhất, đối số dòng lệnh hoặc đối số hàm và trả về kết quả hoặc in nó sang STDOUT hoặc thay thế gần nhất.
Bạn có thể lấy đầu vào ở bất kỳ định dạng danh sách hoặc chuỗi tiện lợi nào, miễn là nó chưa được xử lý trước.
Kết quả phải là số dấu phẩy động, chính xác đến 6 chữ số có nghĩa (thập phân) hoặc kết quả hợp lý có biểu diễn dấu phẩy động chính xác đến 6 chữ số có nghĩa. (Nếu bạn tạo ra kết quả hợp lý, họ có thể sẽ chính xác, nhưng tôi không thể yêu cầu điều này, vì tôi không có kết quả chính xác để tham khảo.)
Bạn phải có thể giải quyết từng trường hợp thử nghiệm bên dưới trong vòng 10 giây trên máy tính để bàn hợp lý. (Có một chút chậm trễ trong quy tắc này, vì vậy hãy sử dụng phán đoán tốt nhất của bạn. Nếu mất 20 giây trên máy tính xách tay của tôi, tôi sẽ cho bạn lợi ích của sự nghi ngờ, nếu mất một phút, tôi sẽ không.) Tôi nghĩ giới hạn này nên rất hào phóng nhưng nên loại trừ các cách tiếp cận trong đó bạn chỉ cần loại bỏ đa giác trên một lưới và số đếm đủ tốt, hoặc sử dụng các phương pháp xác suất như Monte Carlo. Hãy là một người chơi thể thao giỏi và đừng cố gắng tối ưu hóa các phương pháp này để bạn có thể đáp ứng giới hạn thời gian. ;)
Bạn không được sử dụng bất kỳ chức năng hiện có liên quan trực tiếp đến đa giác.
Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.
Giả định
- Tất cả các tọa độ là số nguyên trong phạm vi
0 ≤ x ≤ 100
,0 ≤ y ≤ 100
. - Sẽ có ít nhất
3
và nhiều nhất là50
các đỉnh. - Sẽ không có bất kỳ đỉnh lặp đi lặp lại. Không có bất kỳ đỉnh sẽ nằm trên một cạnh khác. (Tuy nhiên, có thể có các điểm cộng tuyến trong danh sách.)
Các trường hợp thử nghiệm
{{0, 0}, {5, 0}, {5, 4}, {1, 4}, {1, 2}, {3, 2}, {3, 3}, {2, 3}, {2, 1}, {4, 1}, {4, 5}, {0, 5}}
17.0000
{{22, 87}, {6, 3}, {98, 77}, {20, 56}, {96, 52}, {79, 34}, {46, 78}, {52, 73}, {81, 85}, {90, 43}}
2788.39
{{90, 43}, {81, 85}, {52, 73}, {46, 78}, {79, 34}, {96, 52}, {20, 56}, {98, 77}, {6, 3}, {22, 87}}
2788.39
{{70, 33}, {53, 89}, {76, 35}, {14, 56}, {14, 47}, {59, 49}, {12, 32}, {22, 66}, {85, 2}, {2, 81},
{61, 39}, {1, 49}, {91, 62}, {67, 7}, {19, 55}, {47, 44}, {8, 24}, {46, 18}, {63, 64}, {23, 30}}
2037.98
{{42, 65}, {14, 59}, {97, 10}, {13, 1}, {2, 8}, {88, 80}, {24, 36}, {95, 94}, {18, 9}, {66, 64},
{91, 5}, {99, 25}, {6, 66}, {48, 55}, {83, 54}, {15, 65}, {10, 60}, {35, 86}, {44, 19}, {48, 43},
{47, 86}, {29, 5}, {15, 45}, {75, 41}, {9, 9}, {23, 100}, {22, 82}, {34, 21}, {7, 34}, {54, 83}}
3382.46
{{68, 35}, {43, 63}, {66, 98}, {60, 56}, {57, 44}, {90, 52}, {36, 26}, {23, 55}, {66, 1}, {25, 6},
{84, 65}, {38, 16}, {47, 31}, {44, 90}, {2, 30}, {87, 40}, {19, 51}, {75, 5}, {31, 94}, {85, 56},
{95, 81}, {79, 80}, {82, 45}, {95, 10}, {27, 15}, {18, 70}, {24, 6}, {12, 73}, {10, 31}, {4, 29},
{79, 93}, {45, 85}, {12, 10}, {89, 70}, {46, 5}, {56, 67}, {58, 59}, {92, 19}, {83, 49}, {22,77}}
3337.62
{{15, 22}, {71, 65}, {12, 35}, {30, 92}, {12, 92}, {97, 31}, {4, 32}, {39, 43}, {11, 40},
{20, 15}, {71, 100}, {84, 76}, {51, 98}, {35, 94}, {46, 54}, {89, 49}, {28, 35}, {65, 42},
{31, 41}, {48, 34}, {57, 46}, {14, 20}, {45, 28}, {82, 65}, {88, 78}, {55, 30}, {30, 27},
{26, 47}, {51, 93}, {9, 95}, {56, 82}, {86, 56}, {46, 28}, {62, 70}, {98, 10}, {3, 39},
{11, 34}, {17, 64}, {36, 42}, {52, 100}, {38, 11}, {83, 14}, {5, 17}, {72, 70}, {3, 97},
{8, 94}, {64, 60}, {47, 25}, {99, 26}, {99, 69}}
3514.46
upath
và lineto
âm thanh như bạn thực sự đang xử lý đầu vào. Tức là bạn không lấy danh sách tọa độ mà là đa giác thực tế.
CrossingPolygon
.
upath
toán tử. (Đây thực sự là một chuyển đổi 1: 1 cực kỳ đơn giản giữa các bộ tách biệt.}, {
Chỉ cần trở thànhlineto
và dấu phẩy giữa x và y được loại bỏ và dấu ngoặc mở và đóng được thay thế bằng một tiêu đề và chân trang tĩnh ...)