İşte sizin için aldatıcı zorlu bir geometri bulmacası!
Bir çevre göz önüne alındığında A
, ve n
diğer çevreleri B[n]
içinde, içerdiği toplam alanı bulmak A
olduğunu değil herhangi daire içinde B
.
Kodunuz mümkün olduğunca kısa olmalıdır.
Giriş
Girişinizde aşağıdaki bilgiler bulunmalıdır:
- Dairenin yarıçapını temsil eden kayan nokta sayısı
A
. - İçindeki dairelerin yarıçaplarını temsil eden kayan nokta sayılarının listesi
B
. - İçindeki çevrelerin merkezlerinin listesi
B
. Programınız merkezlerin kutupsal veya Kartezyen koordinatlarda olmasını bekleyebilir. - İsteğe bağlı olarak,
n
B'deki daire sayısını alabilirsiniz . Bu giriş gerekli değildir.
Dairenin merkezinin A
başlangıç noktası, yani nokta olduğu varsayılacaktır (0, 0)
.
İki dairenin B
aynı olmadığı garanti edilir , ancak aşağıdakilerin garanti edilmez : B
kesişen tüm daireler A
, tüm merkezler B
dışarıdadır A
veyaB
birbiriyle kesişen . Çözümünüzün çeşitli kenar durumlarını ele alabileceğinden emin olun.
Girişi herhangi bir sırada ve metin girişi (stdin veya dilinizin eşdeğeri aracılığıyla), işlev parametreleri veya komut satırı bağımsız değişkenleri şeklinde alabilirsiniz.
Metin girişi almayı seçerseniz, giriş parçaları arasında bir veya iki karakterlik yazdırılabilir ASCII sınırlayıcılar olmalıdır.
Çıktı
Programınız veya işleviniz A
,B
. Yanıtlarınız tüm test senaryoları için en az üç anlamlı rakama doğru olmalıdır.
Genel kod golf kuralları geçerlidir.
Çözümünüz, bir alan belirlemek için dairelerdeki örnekleme noktalarına güvenmemelidir.
Çevrelerin kesişimlerini otomatik olarak bulan, çevrelerin kesişim noktalarındaki alanları bulan veya bu sorunu hemen çözen yerleşiklere izin verilmez.
Test Durumları
Her görüntüde, daire A
mavi ile, daireler B
yeşil ile işaretlenmiş ve siyahla doldurulmuştur. Döndürülmesi gereken alan kırmızı ile doldurulur.
( Çözümlerimi kontrol ettiği için Rainer P.'ye özel teşekkürler )
Test örneği 1:
A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}
Result: 0.00
Test örneği 2:
A = {x: 0, y: 0, rad: 100.000000}
B[0] = {x: 100.000000, y: 0.000000, rad: 50.000000}
B[1] = {x: 30.901699, y: -95.105652, rad: 50.000000}
B[2] = {x: -80.901699, y: -58.778525, rad: 50.000000}
B[3] = {x: -80.901699, y: 58.778525, rad: 50.000000}
B[4] = {x: 30.901699, y: 95.105652, rad: 50.000000}
Result: 1.3878e+04
Test örneği 3:
A = {x: 0, y: 0, rad: 138}
B[0] = {x: 100, y: 0, rad: 100}
B[1] = {x: -50, y: -86, rad: 100}
B[2] = {x: -93, y: 135, rad: 50}
Result: 1.8969e+04
Test durumu 4:
A = {x: 0, y: 0, rad: 121.593585}
B[0] = {x: 81.000000, y: 107.000000, rad: 59.841457}
B[1] = {x: -152.000000, y: -147.000000, rad: 50.000000}
B[2] = {x: 43.000000, y: -127.000000, rad: 105.118980}
B[3] = {x: 0.000000, y: -72.000000, rad: 57.870545}
B[4] = {x: -97.000000, y: -81.000000, rad: 98.488578}
B[5] = {x: -72.000000, y: 116.000000, rad: 66.468037}
B[6] = {x: 2.000000, y: 51.000000, rad: 50.000000}
Result: 1.1264e+04
Test durumu 5:
A = {x: 0, y: 0, rad: 121.605921}
B[0] = {x: 0.000000, y: -293.000000, rad: 250.000000}
B[1] = {x: 0.000000, y: -56.000000, rad: 78.230429}
B[2] = {x: 0.000000, y: -102.000000, rad: 100.000000}
Result: 2.6742e+04
Önerilen Okuma:
Fewell, MP "Üç Çemberin Ortak Çakışma Alanı." Ekim 2006. Web.http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf .
B
diğerini içerdiği bir test durumunuz yok gibi görünüyor . Bunu eklemeye değer olabilir.
1.8970e+04
.
B[0] - A intersection: 20653.659515
, B[1] - A intersection: 20757.824115
, B[1] - B[0] intersection: 1841.847766
, B[2] - A intersection: 1289.164541
, getirir ve burada 18969.69009
cevap olarak.