2B uzayda bir köşe listesiyle tanımlanan potansiyel olarak kendinden kesişen bir çokgen düşünün. Örneğin
{{0, 0}, {5, 0}, {5, 4}, {1, 4}, {1, 2}, {3, 2}, {3, 3}, {2, 3}, {2, 1}, {4, 1}, {4, 5}, {0, 5}}
Böyle bir poligonun alanını tanımlamanın birkaç yolu vardır, ancak en ilginç olanı tek kuraldır. Düzlemdeki herhangi bir noktayı alarak, noktadan sonsuza kadar (herhangi bir yönde) bir çizgi çizin. Bu çizgi çokgeni çok sayıda geçerse, nokta çokgenin alanının bir parçasıdır, çokgeni eşit sayıda geçerse, nokta çokgenin bir parçası değildir. Yukarıdaki örnek poligon için, burada hem anahat hem de tek alan vardır.
Poligon genel olarak ortogonal olmayacaktır. Alanı saymayı kolaylaştırmak için sadece bu kadar basit bir örnek seçtim.
Bu örneğin bir alandır 17
(değil 24
veya 33
diğer tanımlar ya da alan verim olabilir gibi).
Bu tanım uyarınca çokgenin alanının sarma düzeninden bağımsız olduğunu unutmayın.
Meydan okuma
Bir çokgeni tanımlayan tamsayı koordinatlarına sahip bir köşe listesi göz önüne alındığında, alanını tek kural uyarınca belirleyin.
STDIN veya en yakın alternatif, komut satırı argümanı veya işlev argümanı yoluyla giriş alarak bir işlev veya program yazabilir ve sonucu döndürür veya STDOUT veya en yakın alternatife yazdırabilirsiniz.
Ön işleme alınmadığı sürece herhangi bir uygun liste veya dize biçiminde girdi alabilirsiniz.
Sonuç, kayan nokta sayısı, 6 anlamlı (ondalık) basamağa kadar doğru ya da kayan nokta gösterimi 6 önemli basamak için doğru olan rasyonel bir sonuç olmalıdır. (Eğer rasyonel sonuçlar verirseniz, büyük olasılıkla kesin olacaklardır, ancak referans için kesin sonuçlara sahip olmadığım için buna ihtiyacım yok.)
Makul bir masaüstü makinesinde, aşağıdaki test durumlarının her birini 10 saniye içinde çözebilmelisiniz. (Bu kuralda bazı boşluklar vardır, bu yüzden en iyi kararınızı kullanın. Dizüstü bilgisayarımda 20 saniye sürerse, size şüphenin avantajını vereceğim, eğer bir dakika sürerse, olmaz.) Çok cömert olmalı, ancak poligonu yeterince ince bir ızgara üzerinde saygısızlaştırdığınız ve saydığınız ya da Monte Carlo gibi olasılıklı yaklaşımları kullandığınız yaklaşımları dışlamak gerekiyor. İyi bir sporcu olun ve bu yaklaşımları optimize etmeye çalışmayın ki zaten zaman sınırını karşılayabilirsiniz. ;)
Doğrudan çokgenlerle ilgili var olan işlevleri kullanmamalısınız.
Bu kod golf, yani en kısa gönderme (bayt cinsinden) kazanır.
Varsayımlar
- Tüm koordinatlar aralıktaki tamsayılardır
0 ≤ x ≤ 100
,0 ≤ y ≤ 100
. - En az
3
ve en fazla50
köşeler olacak. - Tekrarlanan herhangi bir köşe olmayacak. Her iki köşe de başka bir kenarda yer almaz. (Yine de listede ortak noktalar olabilir .)
Test Kılıfları
{{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
ve lineto
aslında girişini önişleme konum gibi sesler. Yani, koordinatların listesini değil, gerçek bir poligonu alıyorsunuz.
CrossingPolygon
.
upath
. (Aslında, ayırıcılar arasındaki son derece basit bir 1: 1 dönüşümdür.}, {
Yeni olurlineto
ve x ile y arasındaki virgül silinir ve açılış ve kapanış parantezleri statik bir başlık ve altbilgiyle değiştirilir ...)