サークル交差点


14

説明:

所与x及びyそれらと一緒に二つの円の位置radii、出力2円の交点の領域。


入力:

次の入力が与えられます。

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

出力:

  • 2つの円の交差領域に等しい負でない整数(小数なし)。

  • 上記の整数に等しい文字列。

注意 :

  • 面積は負にできないため、出力は0以上でなければなりません。
  • 10進数の場合、最も近い整数に切り捨てます

例:

([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チェック。問題の一部であることを報告して申し訳ありません。数学とジオメトリを示すタグを参照してください。数学を磨くのは良い言い訳です。どう思いますか。しかし、あなたが同意しない場合、私は質問を更新し、式を追加すると思います。
ムハンマドサルマン

@MuhammadSalman変更answer must be positiveanswer must be >= 0-円は最後の私は肯定的ではありません確認して、正しい答えが0である、(例4、7、10のように)交差しない場合。
manassehkatz-Reinstate Monica

@manassehkatz:わかりました。完了
ムハンマドサルマン

回答:


3

ゼリー 27 25 24  22 バイト

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

完全なプログラムは、2つの中心のリストを複雑な座標として受け入れ、半径を結果として出力します(ダイアディックリンクとして、長さ1のリストを返します)。

オンラインでお試しください!

ペアが追加ように2つの座標を取るために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 ある -番号:)) [-7+13j,-25+-5j]その戻り例に対応する132[-7, 13], [-25, -5], 17
ジョナサンアラン

私はゼリーを知らないので、私はそれに負けています。また、説明の前にメッセージを送信しました。しかし、ええ、これはうまくいくと思います(私が推測しますか?)
ムハンマドサルマン

それはゼリー自体とは何の関係もなく、ただの数学です。2空間の点は、複素数と同じです。
ジョナサンアラン

私が意図したものではありません。通常の言語では、何が起こっているかを読んで伝えることができます。Jellyと他のそのような言語は読むのが苦痛です。
ムハンマドサルマン

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バイト

@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は2つの中心間の距離で、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

d2rより大きい場合、Math.acos()を返しますNaN。これは、右シフトが適用されると強制的に0になります。d> 2rは交差点がまったくないことを意味するため、これは期待される結果です。


d*(r*r-d*d)**.53バイト節約します。
ニール

@ceilingcatありがとう!with(Math)の定義を使用して移動すると、dさらに2バイト節約されます。
アーナウルド

3

Mathematica 66 57 51バイト

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

A Disk[{x,y},r]{x,y}、半径を中心とする円で囲まれた領域を指しrます。

RegionIntersection[a,b]地域の交差点を返しabAreaエリアを取ります。 IntegerPart最も近い整数に切り捨てます。


記録のために、私は自分でやっていたので、alephalphaの提出を見ませんでした。彼はより短い(したがってより成功した)エントリですが、とにかく私のものを残しました。
DavidC

あなたは置き換えることができIntegerPartFloor
matrix89

@mathe、ありがとう。専用のフロアブラケットを使用している場合、バイトのカウント方法を知っていますか?
DavidC

@DavidCはそれぞれ3バイトなので、この場合のバイトカウントの置換は中立です。ただし、式に括弧を使用する必要がある場合は便利です(-1と比較して-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

Pyth、63バイト

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

テストスイート

2つのdoubleと1つの数値で構成されるトリプルとして入力を受け取ります。


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は、フォーマットrの座標を含むフィールドrとフィールド aおよびbを持つ既存のテーブルtから入力を取得できます。intvarchar(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.