Khu vực ngã tư đường tròn


14

Sự miêu tả :

Cho xyvị trí của hai vòng tròn cùng với chúng radii, xuất ra diện tích giao nhau của hai vòng tròn.


Đầu vào :

Bạn sẽ được cung cấp đầu vào sau:

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

Phương pháp nhập :

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

Đầu ra:

  • Một số nguyên không âm (không có số thập phân) bằng diện tích giao của hai vòng tròn.

  • Một chuỗi bằng số nguyên đã đề cập ở trên.

Ghi chú :

  • Đầu ra phải> = 0, vì diện tích không thể âm.
  • Trong trường hợp làm tròn số thập phân xuống số nguyên gần nhất

Ví dụ:

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

Tiêu chí chiến thắng:

Đây là để mã ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng.


Gợi ý:

  • Cung cấp một liên kết TIO để nó có thể được kiểm tra.
  • Cung cấp một lời giải thích để người khác có thể hiểu mã của bạn

Đây chỉ là những gợi ý và không bắt buộc.


4
Ravioli, ravioli ...
FrownyFrog

2
@FrownyFrog: Xin lỗi? Tôi không nhận thức được những gì bạn đang nói về? nvm kiểm tra trên internet và tôi rất tiếc phải báo cáo đó là một phần của vấn đề. xem thẻ nói toán học và hình học. Đó là một cái cớ tốt để theo dõi toán học của bạn. Bạn nghĩ sao. Nhưng nếu bạn không đồng ý tôi nghĩ tôi sẽ cập nhật câu hỏi và thêm công thức.
Muhammad Salman

@MuhammadSalman Thay đổi answer must be positivethành answer must be >= 0- Nếu các vòng tròn không giao nhau (như trong ví dụ 4, 7, 10) thì câu trả lời đúng là 0, lần cuối tôi kiểm tra là không tích cực.
manassehkatz-Phục hồi Monica

@manassehkatz: Ok, chắc chắn rồi. Xong
Muhammad Salman

Câu trả lời:


3

Thạch ,  27 25 24  22 byte

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

Một chương trình đầy đủ chấp nhận danh sách hai trung tâm là tọa độ phức tạp và bán kính in kết quả (dưới dạng liên kết dyadic, nó trả về danh sách có độ dài 1).

Hãy thử trực tuyến!

Để lấy hai tọa độ làm cặp thêm Uḅıvào liên kết chính, như thế này .

Làm sao?

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

số chỉ. Và đó là gì [-7 + 13j, -25 + -5j]? Tôi không có ví dụ đó. Bạn có thể phải giải thích những gì bạn đã làm?
Muhammad Salman

Tôi đã giải thích nó trong câu trả lời rồi ... chúng là tọa độ trên mặt phẳng phức ... Tôi có thể làm [[x1,y1],[x2,y2]]thay thế nhưng nó tốn 3 byte. (Cũng lưu ý đó -7+13j một số :)) - [-7+13j,-25+-5j]tương ứng với ví dụ trả về 132,[-7, 13], [-25, -5], 17
Jonathan Allan

Tôi không biết Jelly vì vậy tôi bị mất điều đó. Ngoài ra tôi đã gửi tin nhắn trước khi giải thích. Nhưng vâng, chắc chắn điều này hoạt động (tôi đoán vậy?)
Muhammad Salman

Không liên quan gì đến Jelly per-se, đó chỉ là toán học. Một điểm trong 2 không gian giống như một số phức .
Jonathan Allan

Không phải ý tôi. Ngôn ngữ bình thường tôi sẽ có thể đọc và nói những gì đang xảy ra. Jelly và các ngôn ngữ khác là một nỗi đau để đọc.
Muhammad Salman

3

JavaScript (ES6), 72 byte

Công thức thay thế được đề xuất bởi @ceilingcat

Lấy đầu vào là 5 tham số riêng biệt (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

Hãy thử trực tuyến!


JavaScript (ES7), 81 80 77 byte

Đã lưu 3 byte nhờ @Neil

Lấy đầu vào là 5 tham số riêng biệt (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

Hãy thử trực tuyến!

Làm sao?

Điều này dựa trên một công thức chung từ MathWorld cho các vòng kết nối không đồng dạng:

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

Trong đó d là khoảng cách giữa hai tâm và rR là bán kính.

Với R = r , điều này được đơn giản hóa thành:

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

Và với r '= 2r :

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

Lưu ý : Nếu d lớn hơn 2r , Math.acos()sẽ trả về NaN, được ép thành 0 khi áp dụng dịch chuyển phải. Đây là kết quả mong đợi, bởi vì d> 2r có nghĩa là không có giao điểm nào cả.


d*(r*r-d*d)**.5tiết kiệm 3 byte.
Neil

@ceilingcat Cảm ơn! Sử dụng with(Math)và di chuyển định nghĩa dtiết kiệm thêm 2 byte.
Arnauld

3

Toán học 66 57 51 byte

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

A Disk[{x,y},r]đề cập đến khu vực được bao quanh bởi vòng tròn có tâm {x,y}là bán kính r.

RegionIntersection[a,b]trả về giao điểm của các vùng a, b. Arealấy diện tích. IntegerPartlàm tròn xuống số nguyên gần nhất.


Đối với hồ sơ, tôi đã không thấy đệ trình của alephalpha khi tôi đang làm việc của riêng mình. Đây là một mục ngắn hơn (do đó thành công hơn), nhưng dù sao tôi cũng để lại cho tôi.
DavidC

Bạn có thể thay thế IntegerPartbằng Floor.
ma trận89

@ tiện, Cảm ơn. Nếu tôi sử dụng dấu ngoặc sàn dành riêng, bạn có biết tôi đang đếm byte như thế nào không?
DavidC

@DavidC mỗi cái là 3 byte, vì vậy sự thay thế là trung tính trong trường hợp này cho số byte. Tuy nhiên, chúng rất hữu ích nếu biểu thức cần có dấu ngoặc đơn (-1 byte so với Floor[ ]).
attinat




1

JavaScript (Node.js) , 69 byte

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

Hãy thử trực tuyến!

Ngắn không chắc chắn nếu nó có thể được chơi golf thêm nữa. Mọi góp ý đều được chào đón



0

Excel, 119 byte

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

Đầu vào được lấy làm 5 biến riêng biệt:

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

0

Python 2 , 109 byte

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)

Hãy thử trực tuyến!

Khá đơn giản. Lấy khoảng cách giữa các vòng tròn và sử dụng R=2rnhư một nhóm thế trong phương trình. d<R andbị đoản mạch nếu các vòng tròn không trùng nhau.



0

T-SQL, 122 byte

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

(ngắt dòng chỉ để đọc).

Sử dụng sự hỗ trợ của MS SQL về hình học không gian .

Theo các tiêu chuẩn IO của chúng tôi , SQL có thể lấy đầu vào từ một bảng t có sẵn với inttrường rvarcharcác trường ab chứa tọa độ theo định dạng(x y) .

Câu lệnh của tôi phân tích tọa độ dưới POINTdạng các đối tượng hình học được mở rộng bằng bán kính bằng cách sử dụng hàm STBuffer(), sau đó lấy STIntersection()theo sau bởi STArea().

Nếu tôi được phép nhập các đối tượng hình học thực tế trong bảng thay vào đó, thì mã của tôi trở nên gần như không đáng kể (48 byte):

SELECT FLOOR(a.STIntersection(b).STArea())FROM t
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.