2D 공간의 꼭짓점 목록으로 정의 된 잠재적으로 자체 교차하는 다각형을 고려하십시오. 예 :
{{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
( 다른 정의 나 영역이 아니 24
거나 그렇지 33
않을 수 있음)입니다.
이 정의에서 다각형의 영역은 권선 순서와 무관합니다.
도전
다각형을 정의하는 정수 좌표가있는 정점 목록이 주어지면 짝수 홀수 규칙 아래에서 해당 영역을 결정하십시오.
STDIN 또는 가장 가까운 대안, 명령 행 인수 또는 함수 인수를 통해 입력을 받아 함수 또는 프로그램을 작성하고 결과를 리턴하거나 STDOUT 또는 가장 가까운 대안으로 인쇄 할 수 있습니다.
사전 처리되지 않은 편리한 목록 또는 문자열 형식으로 입력 할 수 있습니다.
결과는 부동 소수점 숫자, 6 자리 유효 (10 진) 자릿수 또는 부동 소수점 표현이 6 자리 유효 자릿수 인 정확한 결과 여야합니다. (합리적인 결과를 생성하면 결과가 정확할 수 있지만 참조 할 정확한 결과가 없으므로이를 요구할 수 없습니다.)
합리적인 데스크톱 컴퓨터에서 10 초 이내에 아래의 각 테스트 사례를 해결할 수 있어야합니다. (이 규칙에는 약간의 여유가 있으므로 최선의 판단을 사용하십시오. 랩탑에서 20 초가 걸리면 의심의 혜택을 줄 것입니다. 1 분이면 안됩니다.) 매우 관대해야하지만 다각형을 충분히 미세한 격자로 이산화하고 몬테카를로와 같은 확률 론적 접근법을 사용하는 접근법은 배제해야합니다. 좋은 스포츠맨이 되시고 어쨌든 시간 제한을 충족시킬 수 있도록 이러한 접근 방식을 최적화하지 마십시오. ;)
다각형과 직접 관련된 기존 기능을 사용해서는 안됩니다.
이것은 코드 골프이므로 가장 짧은 제출 (바이트)이 이깁니다.
가정
- 모든 좌표는 범위의 정수
0 ≤ x ≤ 100
,0 ≤ y ≤ 100
. - 적어도이있을 것입니다
3
대부분에서50
정점. - 반복되는 정점이 없습니다. 꼭지점이 다른 가장자리에 있지 않습니다. ( 목록에 공선 점이 있을 수 있습니다.)
테스트 사례
{{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
및 lineto
소리를 사용 합니다. 즉, 좌표 목록이 아닌 실제 다각형을 사용하고 있습니다.
CrossingPolygon
.
upath
연산자로 구문 분석 할 수 있습니다 . (실제로 seperator 사이의 매우 간단한 1 : 1 변환입니다.}, {
그냥lineto
이고 x와 y 사이의 쉼표가 제거되고 여는 중괄호는 정적 머리글과 바닥