พื้นที่จุดตัดวงกลม


14

คำอธิบาย:

ให้xและyตำแหน่งของวงกลมสองวงพร้อมกับพวกradiiมันออกพื้นที่จุดตัดของวงกลมทั้งสอง


อินพุต:

คุณจะได้รับข้อมูลต่อไปนี้:

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

วิธีการป้อนข้อมูล:

([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

ผลผลิต:

  • จำนวนเต็มไม่เป็นลบ (ไม่มีทศนิยม) เท่ากับพื้นที่ของจุดตัดของวงกลมสองวง

  • สตริงเท่ากับจำนวนเต็มที่กล่าวถึงข้างต้น

บันทึก :

  • เอาต์พุตจะต้อง> = 0 เนื่องจากพื้นที่ไม่สามารถเป็นลบได้
  • ในกรณีที่ทศนิยมปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุด

ตัวอย่าง :

([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

เกณฑ์การชนะ:

นี่คือสั้นที่สุดในหน่วยไบต์สำหรับแต่ละภาษาที่ชนะ


คำแนะนำ:

  • ระบุลิงก์ TIO เพื่อให้สามารถทดสอบได้
  • ให้คำอธิบายเพื่อให้ผู้อื่นสามารถเข้าใจรหัสของคุณได้

เหล่านี้เป็นเพียงคำแนะนำและไม่จำเป็น


4
Ravioli, ราวีโอลี่ ...
FrownyFrog

2
@FrownyFrog: ขอโทษมั้ย ฉันไม่ทราบว่าคุณกำลังพูดถึงอะไร? ตรวจสอบ nvm บนอินเทอร์เน็ตและฉันขอโทษที่รายงานว่าเป็นส่วนหนึ่งของปัญหา ดูแท็กที่ระบุว่าคณิตศาสตร์และเรขาคณิต มันเป็นข้อแก้ตัวที่ดีในการแปรงคณิตศาสตร์ของคุณ คุณคิดอย่างไร. แต่ถ้าคุณไม่เห็นด้วยฉันคิดว่าฉันจะอัปเดตคำถามและเพิ่มสูตร
มูฮัมหมัดซาลมาน

@MuhammadSalman เปลี่ยนanswer must be positiveเป็นanswer must be >= 0- หากวงกลมไม่ตัดกัน (ดังในตัวอย่างที่ 4, 7, 10) คำตอบที่ถูกต้องคือ 0 ซึ่งสุดท้ายที่ฉันตรวจสอบไม่ได้เป็นค่าบวก
manassehkatz-Moving 2 Codidact

@manassehkatz: ตกลงแน่นอน เสร็จสิ้น
Muhammad Salman

คำตอบ:


3

เยลลี่ ,  27 25 24  22 ไบต์

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

โปรแกรมเต็มรูปแบบยอมรับรายการของทั้งสองศูนย์เป็นพิกัดที่ซับซ้อนและรัศมีที่พิมพ์ผลลัพธ์ (เป็นลิงค์ dyadic มันส่งกลับรายการความยาว 1)

ลองออนไลน์!

หากต้องการใช้พิกัดทั้งสองเป็นคู่เพิ่มUḅıในลิงก์หลักเช่นนี้เช่นนี้

อย่างไร?

×,²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

ตัวเลขเท่านั้น. และอะไรคือ [-7 + 13j, -25 + -5j] ฉันไม่มีตัวอย่างนั้น คุณอาจต้องอธิบายสิ่งที่คุณทำ?
มูฮัมหมัดซาลมาน

ฉันอธิบายไว้ในคำตอบแล้ว ... พวกเขาประสานงานบนระนาบเชิงซ้อน ... ฉันสามารถทำได้[[x1,y1],[x2,y2]]แทน แต่มันมีราคา 3 ไบต์ (ยังทราบว่า-7+13j เป็นจำนวน :)) - The [-7+13j,-25+-5j]สอดคล้องกับตัวอย่างที่ผลตอบแทน132,[-7, 13], [-25, -5], 17
โจนาธานอัลลัน

ฉันไม่รู้ Jelly ดังนั้นฉันจึงแพ้สิ่งนั้น ฉันก็ส่งข้อความก่อนคำอธิบาย แต่ใช่แน่ใจว่าใช้งานได้ (ฉันเดาได้ไหม)
มูฮัมหมัดซาลมาน

มันไม่เกี่ยวอะไรกับ Jelly per-se มันเป็นแค่คณิตศาสตร์ จุดใน 2 พื้นที่คือเช่นเดียวกับจำนวนที่ซับซ้อน
Jonathan Allan

ไม่ใช่สิ่งที่ฉันหมายถึง ภาษาปกติฉันจะสามารถอ่านและบอกสิ่งที่เกิดขึ้นได้ เยลลี่และภาษาอื่น ๆ เป็นสิ่งที่เจ็บปวดในการอ่าน
มูฮัมหมัดซาลมาน

3

JavaScript (ES6), 72 ไบต์

สูตรทางเลือกที่แนะนำโดย @ceilingcat

จะเข้าเป็น 5 พารามิเตอร์ที่แตกต่างกัน(x0, y0, x1, y1, 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

ลองออนไลน์!


JavaScript (ES7), 81 80 77 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ @Neil

จะเข้าเป็น 5 พารามิเตอร์ที่แตกต่างกัน(x0, y0, x1, y1, 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

ลองออนไลน์!

อย่างไร?

สิ่งนี้ขึ้นอยู่กับสูตรทั่วไปจาก MathWorldสำหรับแวดวงที่ไม่สอดคล้องกัน:

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

โดยที่dคือระยะห่างระหว่างจุดศูนย์กลางสองจุดกับrและRคือรัศมี

ด้วยR = rสิ่งนี้จะทำให้ง่ายต่อการ:

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

และด้วยr '= 2r :

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

หมายเหตุ : หากdมีค่ามากกว่า2r , Math.acos()จะกลับมาNaNซึ่งจะบังคับให้0เมื่อกะขวาถูกนำไปใช้ นี่คือผลลัพธ์ที่คาดหวังเนื่องจากd> 2rหมายความว่าไม่มีการตัดกันเลย


d*(r*r-d*d)**.5บันทึก 3 ไบต์
Neil

@ceilingcat ขอบคุณ! การใช้with(Math)และย้ายคำจำกัดความของdบันทึกอีก 2 ไบต์
Arnauld

3

Mathematica 66 57 51 ไบต์

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

Disk[{x,y},r]หมายถึงภูมิภาค circumscribed โดยวงกลมศูนย์กลางที่มีรัศมีของ{x,y}r

RegionIntersection[a,b]ส่งคืนจุดตัดของภูมิภาคa, b. Areaใช้พื้นที่ IntegerPartปัดเศษลงเป็นจำนวนเต็มที่ใกล้ที่สุด


สำหรับบันทึกฉันไม่เห็นการยอมจำนนของ alephalpha ในขณะที่ฉันกำลังทำของตัวเอง เขาเป็นรายการที่สั้นกว่า (ดังนั้นจึงประสบความสำเร็จมากกว่า) แต่ฉันทิ้งระเบิดไว้แล้ว
DavidC

คุณสามารถแทนที่ด้วยIntegerPart Floor
matrix89

@ ท่อขอบคุณ หากฉันใช้วงเล็บพื้นเฉพาะคุณรู้วิธีที่ฉันจะนับไบต์?
DavidC

@DavidC แต่ละอันมีค่า 3 ไบต์ดังนั้นการทดแทนจึงเป็นกลางในกรณีนี้สำหรับจำนวนไบต์ พวกเขากำลังมีประโยชน์ถ้าการแสดงออกจะต้องมิฉะนั้น parenthesizing แม้ว่า (-1 ไบต์เมื่อเทียบกับFloor[ ])
attinat




1

JavaScript (Node.js) , 69 ไบต์

with(Math)f=(a,b,c,d,r)=>(-sin(x=2*acos(hypot(a-c,b-d)/2/r))+x)*r*r|0

ลองออนไลน์!

สั้น ๆ ไม่แน่ใจว่ามันจะสามารถตีกอล์ฟได้อีก ข้อเสนอแนะใด ๆ ยินดีต้อนรับ



0

Excel, 119 ไบต์

=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))

อินพุตนำมาเป็น 5 ตัวแปรแยกกัน:

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

0

Python 2 , 109 ไบต์

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)

ลองออนไลน์!

ค่อนข้างตรงไปตรงมา รับระยะห่างระหว่างวงกลมและใช้R=2rเป็นองค์ประกอบย่อยในสมการ d<R andเพื่อลัดวงจรหากวงกลมไม่ทับซ้อนกัน



0

T-SQL, 122 ไบต์

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

(ตัวแบ่งบรรทัดสำหรับการอ่านเท่านั้น)

ใช้การสนับสนุน MS SQL ของรูปทรงเรขาคณิตเชิงพื้นที่

ตามมาตรฐาน IO ของเรา , SQL สามารถใช้ข้อมูลจากตารางที่มีอยู่ก่อนทีมีintข้อมูลRและvarcharเขต และBที่มีพิกัดในรูปแบบ(x y)ที่มีพิกัดในรูปแบบ

คำสั่งของฉันแยกวิเคราะห์พิกัดเป็นPOINTวัตถุเรขาคณิตที่ขยายโดยรัศมีโดยใช้ฟังก์ชั่นSTBuffer()แล้วSTIntersection()ตามด้วยSTArea()ตาม

หากฉันได้รับอนุญาตให้ป้อนวัตถุรูปทรงเรขาคณิตที่เกิดขึ้นจริงในตารางแทนรหัสของฉันจะกลายเป็นเรื่องเล็กน้อย (48 ไบต์):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.