서클 교차 영역


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

출력 :

  • 두 원의 교차 영역에 해당하는 음이 아닌 정수 (10 진수 아님).

  • 위에서 언급 한 정수와 동일한 문자열

노트 :

  • 면적은 음수 일 수 없으므로 출력은> = 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
라비올리, 라비올리 ...
FrownyFrog

2
@FrownyFrog : 실례합니다. 당신이 무슨 말을하는지 모르겠어요? 인터넷에서 nvm 확인을하여 문제의 일부인 것으로보고되어 죄송합니다. 수학과 기하학이라는 태그를 참조하십시오. 수학을 마무리 짓는 것은 좋은 변명입니다. 어떻게 생각해. 그러나 당신이 동의하지 않으면 나는 질문을 업데이트하고 공식을 추가 할 것이라고 생각합니다.
Muhammad Salman

@MuhammadSalman 변경 answer must be positiveanswer must be >= 0- 원이 마지막으로 나는 긍정적되지 않습니다 확인 후 정답은 0, (예 4, 7, 10과) 교차하지 않는 경우.
manassehkatz-Moving 2 Codidact

@manassehkatz : 알았어. 완료
Muhammad Salman

답변:


3

젤리 ,  27 25 24  22 바이트

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

두 센터의 목록을 복잡한 좌표로 받아들이고 결과를 인쇄하는 반지름을 허용하는 전체 프로그램.

온라인으로 사용해보십시오!

두 개의 좌표를 쌍으로 가져 가려면 다음 과 같이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]는 무엇입니까? 나는 그 예가 없습니다. 당신이 한 일을 설명해야 할 수도 있습니까?
Muhammad Salman

나는 이미 대답에서 그것을 설명했다 ... 그들은 복잡한 비행기의 좌표입니다 ... [[x1,y1],[x2,y2]]대신 할 수는 있지만 3 바이트의 비용이 듭니다. (참고도 그 -7+13j 입니다 번호 : 참조) - [-7+13j,-25+-5j]예에 해당하는 그 반환 132,[-7, 13], [-25, -5], 17
조나단 앨런

젤리를 몰라서 잃어 버렸습니다. 또한 설명 전에 메시지를 보냈습니다. 그러나 그렇습니다, 이것이 작동하는지 확인하십시오 (내가 생각 하는가?)
Muhammad Salman

그것은 젤리와 관련이 없으며 단지 수학입니다. 2 칸의 점은 복소수 와 같습니다 .
Jonathan Allan

내가 의미 한 바가 아닙니다. 정상적인 언어 나는 무슨 일이 일어나고 있는지 읽고 말할 수있을 것입니다. 젤리와 다른 언어들은 읽기 힘들다.
Muhammad Salman

3

자바 스크립트 (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

온라인으로 사용해보십시오!


자바 스크립트 (ES7), 81 80 77 바이트

@Neil 덕분에 3 바이트 절약

입력을 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 는 두 중심 사이의 거리이고 rR 은 반지름입니다.

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)**.53 바이트를 절약합니다.
Neil

@ceilingcat 감사합니다! with(Math)정의를 사용 하고 이동 d하면 2 바이트가 더 절약됩니다.
Arnauld

3

Mathematica 66 57 51 바이트

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

A Disk[{x,y},r]{x,y}반경이 중심 인 원으로 둘러싸인 영역을 나타냅니다 r.

RegionIntersection[a,b]지역의 교회법을 반환합니다 a, b. Area지역을 차지합니다. IntegerPart가장 가까운 정수로 내림합니다.


기록을 위해, 나는 내 자신을하고있는 것처럼 alephalpha의 제출을 ​​보지 못했습니다. 그의 입장은 더 짧았 기 때문에 (그러나 더 성공적인), 어쨌든 나는 내 것을 떠났다.
DavidC

으로 교체 할 수 IntegerPart있습니다 Floor.
matrix89

@mathe, 감사합니다. 전용 바닥 괄호를 사용하면 바이트 수를 계산하는 방법을 알고 있습니까?
DavidC

@DavidC는 각각 3 바이트이므로이 경우 바이트 수의 대체는 중립입니다. 그러나 표현식에 괄호 (1 바이트와 비교 Floor[ ]) 가 필요한 경우 유용합니다 .
attinat






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

파이썬 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

Pyth , 63 바이트

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

테스트 스위트

두 개의 복식과 숫자로 구성된 트리플로 입력을받습니다.


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은 기존 테이블로부터의 입력을 취할 수 tint필드 (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.