Daire kesişme alanı


14

Açıklama :

Verilen xve yiki dairenin konumları ile birlikte radii, iki dairenin kesişim alanını çıkarır.


Giriş:

Size aşağıdaki girdiler verilecektir:

array 1 = x and y positions of circle a
array 2 = x and y positions of circle b
radius  = radii of the two congruent circles

Giriş metodu :

([12 , 20] , [20 , 18] , 12)     ---> two array and number
([12 , 20 , 20 , 18] , 12)       ---> array and a number
(12 , 20 , 20 , 18 , 12)         ---> all five numbers
('12 20' , '20 18' , 12)         ---> 2 strings and a number
('12 20 20 18' , 12)             ---> string and a number
('12 20 20 18 12')               ---> one string

Çıktı :

  • İki dairenin kesişim alanına eşit, negatif olmayan bir tam sayı (ondalık yok).

  • Yukarıda belirtilen tam sayıya eşit bir dize.

Not :

  • Alan negatif olamaz çünkü çıktı> = 0 olmalıdır.
  • Ondalık basamağa en yakın tam sayıya inme durumunda

Örnekler:

([0, 0], [7, 0], 5)                   ---> 14

([0, 0], [0, 10], 10)                 ---> 122

([5, 6], [5, 6], 3)                   ---> 28

([-5, 0], [5, 0], 3)                  ---> 0

([10, 20], [-5, -15], 20)             ---> 15

([-7, 13], [-25, -5], 17)             ---> 132

([-12, 20], [43, -49], 23)            ---> 0

Kazanma kriterleri:

Bu her dil için bayt olarak en kısa kod kazanır.


Öneriler :

  • Test edilebilmesi için bir TIO bağlantısı sağlayın.
  • Başkalarının kodunuzu anlayabilmesi için bir açıklama yapın

Bunlar sadece önerilerdir ve zorunlu değildir.


4
Mantı, mantı ...
FrownyFrog

2
@FrownyFrog: Affedersiniz? Ne hakkında konuştuğunu bilmiyorum? nvm internet üzerinden kontrol ve sorunun bir parçası olduğunu bildirmek için üzgünüm. matematik ve geometri yazan etikete bakın. Matematiğinizi fırçalamak iyi bir bahane. Ne düşünüyorsun. Ancak katılmıyorsanız, soruyu güncelleyeceğim ve formül ekleyeceğim.
Muhammed Salman

@MuhammadSalman Değişim answer must be positiveiçin answer must be >= 0- çevreler son ben olumlu değil kontrol daha sonra doğru cevap 0'dır (örnekler 4, 7, 10 gibi) kesiştiği yoksa.
manassehkatz-Moving 2 Codidact

@manassehkatz: Tamam, tabi. Bitti
Muhammad Salman

Yanıtlar:


3

Jöle ,  27 25 24  22 bayt

×,²I½
÷ÆAײ}_çHḞ
ạ/çḤ}

İki merkezin bir listesini karmaşık koordinatlar ve sonucu basan yarıçap olarak kabul eden tam bir program (ikili bir bağlantı olarak uzunluk 1 listesini döndürür).

Çevrimiçi deneyin!

İki koordinatı çift olarak almak Uḅıana bağlantıya eklenir , bunun gibi .

Nasıl?

×,²I½ - Link 1, get [√(s²d² - s⁴)]: separation of centres, s; diameter, d
 ,    - pair = [s, d]
×     - multiply (vectorises) = [s², sd]
  ²   - square (vectorises) = [s⁴, s²d²]
   I  - incremental differences = [s²d² - s⁴]
    ½ - square root (vectorises) = [√(s²d² - s⁴)]

÷ÆAײ}_çHḞ - Link 2, get intersection area: separation of centres, s; diameter, d
÷          - divide = s/d
 ÆA        - arccos = acos(s/d)
    ²}     - square right = d²
   ×       - multiply = acos(s/d)d²
       ç   - call last Link (1) as a dyad (f(s,d)) = [√(s²d² - s⁴)]
      _    - subtract (vectorises) = [acos(s/d)d² - √(s²d² - s⁴)]
        H  - halve (vectorises) = [(acos(s/d)d² - √(s²d² - s⁴))/2]
         Ḟ - floor = [⌊(acos(s/d)d² - √(s²d² - s⁴))/2⌋]
           -  ...Note: Jelly's Ḟ takes the real part of a complex input so when
           -           the circles are non-overlapping the result is 0 as required

ạ/çḤ} - Main link: centres, a pair of complex numbers, c; radius, r
 /    - reduce c by:
ạ     -   absolute difference = separation of centres, s
      -   ...Note: Jelly's ạ finds the Euclidean distance when inputs are complex
      -            i.e. the norm of the difference
   Ḥ} - double right = 2r = diameter, d
  ç   - call last Link (2) as a dyad (f(s,d))
      - implicit print

sadece sayılar. Ve bu nedir [-7 + 13j, -25 + -5j]? O örneğim yok. Ne yaptığınızı açıklamak zorunda kalabilirsiniz?
Muhammed Salman

Zaten cevabında açıkladım ... karmaşık düzlemde koordinatlar ... Bunun [[x1,y1],[x2,y2]]yerine yapabilirim ama 3 bayt maliyeti. (Not Ayrıca -7+13j olan bir sayı :)) - [-7+13j,-25+-5j]örneğe karşılık gelir yani döner 132,[-7, 13], [-25, -5], 17
Jonathan Allan

Jelly'i tanımıyorum, bu yüzden kayboldum. Ayrıca açıklamadan önce mesajı gönderdim. Ama evet, bunun işe yaradığından eminim (sanırım?)
Muhammed Salman

Jelly per-se ile ilgisi yok, sadece matematik. 2 uzayda bir nokta, karmaşık bir sayı ile aynıdır .
Jonathan Allan

Demek istediğim gibi değil. Normal diller Neler olduğunu okuyabilir ve söyleyebilirim. Jöle ve diğer diller okumak için bir acıdır.
Muhammed Salman

3

JavaScript (ES6), 72 bayt

@Ceilingcat tarafından önerilen alternatif formül

Girişi 5 ayrı parametre (x0, y0, x1, y1, r) olarak alır .

with(Math)f=(x,y,X,Y,r)=>-(sin(d=2*acos(hypot(x-X,y-Y)/r/2))-d)*r*r*2>>1

Çevrimiçi deneyin!


JavaScript (ES7), 81 80 77 bayt

@Neil sayesinde 3 bayt kaydedildi

Girişi 5 ayrı parametre (x0, y0, x1, y1, r) olarak alır .

(x,y,X,Y,r,d=Math.hypot(x-X,y-Y))=>(r*=2)*r*Math.acos(d/r)-d*(r*r-d*d)**.5>>1

Çevrimiçi deneyin!

Nasıl?

Bu, uyumlu olmayan çevreler için MathWorld'ün genel formülünü temel alır :

A = r².arccos((d² + r² - R²) / 2dr) +
    R².arccos((d² + R² - r²) / 2dR) -
    sqrt((-d + r + R)(d + r - R)(d -r + R)(d + r + R)) / 2

burada d , iki merkez arasındaki mesafedir ve r ve R yarıçaplardır.

İle R = r , bu için basitleştirilmiştir:

A = 2r².arccos(d / 2r) + d.sqrt((2r - d) * (2r + d)) / 2

Ve r '= 2r ile :

A = (r'².arccos(d / r') + d.sqrt(r'² - d²)) / 2

Not : Eğer D daha büyüktür 2r , Math.acos()döner NaNzorlanır olan, 0 sağa kaydırma uygulandığı zaman. Beklenen sonuç budur, çünkü d> 2r hiçbir kavşak olmadığı anlamına gelir.


d*(r*r-d*d)**.53 bayt kaydeder.
Neil

@ ceilingcat Teşekkürler! with(Math)Tanımı kullanmak ve taşımak d2 bayt daha kaydeder.
Arnauld

3

Mathematica 66 57 51 bayt

Floor@Area@RegionIntersection[#~Disk~#3,#2~Disk~#3]&

A Disk[{x,y},r], {x,y}yarıçapı ile merkezlenmiş dairenin çevrelediği bölgeyi ifade eder r.

RegionIntersection[a,b]bölgelerin kesişim döndürür a, b. Areaalanı alır. IntegerParten yakın tamsayıya yuvarlar.


Kayıt için, alephalpha'nın kendi kendimi yaptığım gibi davrandığını görmedim. Onun daha kısa (dolayısıyla daha başarılı) bir girişi, ama yine de benimkini bıraktım.
DavidC

Sen yerini alabilir IntegerPartile Floor.
matrix89

@mathe, teşekkürler. Tahsis edilmiş Kat braketlerini kullanırsam, baytları nasıl sayacağımı biliyor musunuz?
DavidC

@DavidC her biri 3 bayttır, bu nedenle bayt sayımı için ikame nötrdür. İfadenin başka şekilde parantez içinde olması gerekiyorsa yararlıdır (buna karşılık -1 bayt Floor[ ]).
attinat






0

Excel, 119 bayt

=INT(IFERROR(2*E1^2*ACOS(((C1-A1)^2+(D1-B1)^2)^.5/2/E1)-((4*E1^2-((C1-A1)^2+(D1-B1)^2))*((C1-A1)^2+(D1-B1)^2))^.5/2,0))

Girdi 5 ayrı değişken olarak alınmıştır:

x-coordinate    y-coordinate    x-coordinate    y-coordinate    radius
     A1              B1             C1                D1          E1

0

Python 2 , 109 bayt

from math import*
a,b,x,y,r=input()
d,R=hypot(x-a,y-b),2*r
print int(d<R and R*r*acos(d/R)-d*sqrt(R*R-d*d)/2)

Çevrimiçi deneyin!

Oldukça basit. Daireler arasındaki mesafeyi alın ve R=2rdenklemde yedek olarak kullanın . d<R anddaireler çakışmazsa kısa devre yapmak için.


0

Pyth , 63 bayt

J@+^-hhQh@Q1 2^-ehQe@Q1 2 2K*2eQs&<JK-**KeQ.tcJK4c*J@-*KK*JJ2 2

Test odası

Girdiyi iki kat ve bir sayıdan oluşan üçlü olarak alır.


0

T-SQL, 122 bayt

SELECT FLOOR(Geometry::Parse('POINT'+a).STBuffer(r).STIntersection(
             Geometry::Parse('POINT'+b).STBuffer(r)).STArea())FROM t

(yalnızca okunabilirlik için satır sonu).

MS SQL'in mekansal geometri desteğini kullanır .

Bizim IO standartlarına Başına SQL önceden varolan tablo giriş alabilir t ile intsaha r ve varcharalanlar bir ve b biçiminde koordinatlarını içeren (x y).

İfadem POINTişlevi kullanarak yarıçap tarafından genişletilen geometri nesneleri olarak koordinatları ayrıştırır STBuffer()ve STIntersection()ardından STArea().

Bunun yerine tablodaki gerçek geometri nesnelerini girmeme izin verilirse , kodum neredeyse önemsiz hale gelir (48 bayt):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.