円は重なりますか?


21

中心の座標と2つの円の半径を指定して、重なるかどうかの真理値を出力します。

入力

  • 入力は、STDINまたは同等の関数引数を介して取得できますが、変数としては取得できません。それらを単一の変数(リスト、文字列など)として、または複数の入力/引数として、任意の順序で受け取ることができます。

  • 入力は6つのフロートになります。これらのフロートは、小数点以下3桁までです。座標は正でも負でもかまいません。半径は正になります。

出力

  • 出力は、STDOUTまたは関数戻りを介して行うことができます。

  • プログラムには、正確な2つの出力が必要です。1つはTrue値(円はオーバーラップ)で、もう1つはFalse出力(オーバーラップしません)です。

テストケース

(入力は[(x1, y1, r1), (x2, y2, r2)]テストケースのタプルのリストとして提供されます。任意の形式で入力を取得できます)

本当

[(5.86, 3.92, 1.670), (11.8, 2.98, 4.571)]
[(8.26, -2.72, 2.488), (4.59, -2.97, 1.345)]
[(9.32, -7.77, 2.8), (6.21, -8.51, 0.4)]

[(4.59, -2.97, 1.345), (11.8, 2.98, 4.571)]
[(9.32, -7.77, 2.8), (4.59, -2.97, 1.345)]
[(5.86, 3.92, 1.670), (6.21, -8.51, 0.4)]

これはCode Golfで、バイト単位の最短回答が勝ちです。


4
2つの円が外部から接触している場合、何を返す必要がありますか?
ジョンファンミン

6
「接触するが重ならない」という専門用語は「接線」であり、他にない場合は幾何学上のものです。
dmckee

2
浮動小数点数の取得は、かなり厳しい要件のようです。もっと一般的な表現にリラックスしてもらえますか?Brain-Flakでこれを解決したいのですが、IEEEフロートを実装するのに時間がかかる可能性は低いです。そうすると、とにかくバイトカウントの90%になるため、フロート実装をゴルフするだけです。
小麦ウィザード

4
また、多くの場合、浮動小数点数は「小数点以下3桁」まで正確ではないことを指摘したいと思います。あなたが答えに何を処理したいのか正確にはわかりませんが、今は少し混乱しています。
小麦ウィザード

2
あなたはフロートがどのように機能するかについて根本的な誤解があるかもしれないと思います。これらは固定サイズであるため、値が大きくなると精度が低下します。フロートが小数点以下3桁以内のすべての値を正確に表すことができないポイントがあります。また、不必要な制限を削除するためにチャレンジを編集することは推奨されません。
MEGO

回答:


18

ゼリー、5バイト

IA<S}

最初の引数として2つの複素数(中心)を取り、2番目の引数として2つの実数(半径)を取ります。

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

使い方

IA<S}  Main link.
       Left argument:  [x1 + iy1, x2 + iy2]
       Right argument: [r1, r2]

I      Increments; yield (x2 - x1) + i(y2 - y1).
 A     Absolute value; yield √((x2 - x1)² + (y2 - y1)²).
   S}  Take the sum of the right argument, yielding r1 + r2.
  <    Compare the results.

くそー、座標に複素数を使うことを忘れていた。いいね!:D
HyperNeutrino

Aここでの結果は、行ベクトルの「中心」のノルムと見なされますか?(ÆḊそれ自体は複雑なコンテンツでエラーが発生します。)
ジョナサンアラン

1
@JonathanAllanはい、A中心の距離を差分ベクトルのノルムとして計算します。
デニス

11

JavaScript(ES6)、38バイト

入力を6つの異なる変数x1y1r1x2y2r2として受け取ります。

(x,y,r,X,Y,R)=>Math.hypot(x-X,y-Y)<r+R

テストケース


これまでMath.hypotに見えなかった人向け。
Pureferret


@ V.Courtoisパラメーターを渡す方法がメソッド宣言と一致しません。あるはずですa:Double,x:Double,b:Double,y:Double,r:Double,q:Double
アーナウルド

1
@Arnauldああ〜ありがとう!個別に投稿する必要がありますか?
V.クルトワ

@ V.Courtois確かに。頑張れ!
アーナルド


7

MATL、5バイト

ZPis<

入力形式は次のとおりです。

[x1, y1]
[x2, y2]
[r1, r2]

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

ZP   % Take two vectors as input. Push their Euclidean distance
i    % Input the vector of radii
s    % Sum of vector
<    % Less than?

私であるかどうかはわかりませんが、試用リンクを使用して実行を押すと、「エラーサーバーの応答をデコードできませんでした」というメッセージが表示されます-それが役立つかどうかもわかりませんが、(ab)ゼリーの答え?
デニスJaheruddin

@DennisJaheruddinねえ、ここでまたお会いできてうれしいです!(1)おそらくキャッシュを非難します。ハードリフレッシュを試みましたか?(2)私はやったが、5(バイトでは-|なくZP)バイトだと思う
ルイスメンドー

ファイアウォールだと思います。今、私はあなたが2つの違いと追加の代わりに3つの違いを必要とするので、-r2代わりのような入力形式r2が役立つかどうか疑問に思っています...私はあまりにも深く描かれる前に実行した方が良いです!
デニスJaheruddin

1つの入力を否定することが入力形式として許容されるとは思わない。Try It Onlineサービスで問題が見つかった場合は、ここに報告してください
ルイスメンドー

6

R、39バイト

function(k,r)dist(matrix(k,2,2))<sum(r)

入力k=c(x1,x2,y1,y2)を受け取りますr=c(r1,r2); FALSE接線の円を返します。

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

27バイト:

function(m,r)dist(m)<sum(r)

入力を、行として指定された円の中心と半径のベクトルを持つ行列として受け取ります。

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


-2バイトfunction(k,r)dist(matrix(k,2))<sum(r)
-djhurio

どうdist(matrix(scan(),2))<sum(scan())
-djhurio

6

Python、40バイト

lambda x,y,r,X,Y,R:abs(x-X+(y-Y)*1j)<r+R

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

Pythonの複素数演算を使用して、2つの中心間の距離を計算します。入力ポイントを複素数として直接取ることができないと想定しているため、コードはそれらを次のように表現しますx+y*1j






3

Mathematica、16バイト

Norm[#-#2]<+##3&

入力: [{x1, y1}, {x2, y2}, r1, r2]


MathematicaにはRegionIntersection組み込み機能がありますが、それだけで18バイト長です...

組み込みバージョン:

RegionIntersection@##==EmptyRegion@2&

2つのDiskオブジェクトを受け取ります。[Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]]



3

ゼリー、12バイト

I²+⁴I²¤<⁵S²¤

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

-デニスのおかげで2バイト


ạ/²同じバイトで新しいリンクを作成しませんか?
ケアード共産主義者

@cairdcoinheringaahing?
ハイパーニュートリノ

気にしないで、私が行って、14のバイトを得、これを
caird coinheringaahing

I絶対差を減らす代わりに使用できます。
デニス

@Dennis Oohありがとう
HyperNeutrino


3

Java 8、41 38バイト

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R

ここで試してみてください。

どうやら、JavaにもがありMath.hypot、これは3バイト短くなっています。

編集:この答えは@OlivierGrégoireのJava 8の答えとまったく同じであることに気付いたので、38バイトの答えが好きなら私ではなく彼に賛成してください。

古い回答(41バイト)

(x,y,r,X,Y,R)->(x-=X)*x+(y-=Y)*y<(r+=R)*r

ここで試してみてください。


1
ああ!それが今日3つのアップ投票を得た理由ですが、チャレンジが投稿されたときに0です?^^この奇妙な振る舞いを引き起こしたのは何だろうと思っていました;)私は私の答えが好きで、あなたが同じものを投稿したので、あなたも+1を受け取ります!:p
オリビエグレゴワール



2

タクシー、1582バイト

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to Tom's Trims.Pickup a passenger going to Tom's Trims.Go to Tom's Trims:n.[a]Go to Post Office:s.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to What's The Difference.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 5 l.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 r.Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Addition Alley.Go to Tom's Trims:s 1 r 3 r.Pickup a passenger going to The Babelfishery.Switch to plan "b" if no one is waiting.Switch to plan "a".[b]Go to Addition Alley:n 1 r 1 l 3 l 1 l.Pickup a passenger going to Magic Eight.Go to Post Office:n 1 r 1 r 3 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 5 l 1 l.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Magic Eight.Go to Magic Eight:s 1 r.Switch to plan "c" if no one is waiting.'1' is waiting at Writer's Depot.[c]'0' is waiting at Writer's Depot.Go to Writer's Depot:w 1 l 2 l.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

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

1重なり合う円の出力。
出力0(接線円を含む)非重複円用。

未ゴルフ/フォーマット済み:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to Tom's Trims.
Pickup a passenger going to Tom's Trims.
Go to Tom's Trims: north.
[a]
Go to Post Office: south.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: north 5th left.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st right.
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: south 1st left 2nd right 4th left.
Pickup a passenger going to Addition Alley.
Go to Tom's Trims: south 1st right 3rd right.
Pickup a passenger going to The Babelfishery.
Switch to plan "b" if no one is waiting.
Switch to plan "a".
[b]
Go to Addition Alley: north 1st right 1st left 3rd left 1st left.
Pickup a passenger going to Magic Eight.
Go to Post Office: north 1st right 1st right 3rd right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: north 5th left 1st left.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left.
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: south 1st left 2nd right 4th left.
Pickup a passenger going to Magic Eight.
Go to Magic Eight: south 1st right.
Switch to plan "c" if no one is waiting.
'1' is waiting at Writer's Depot.
[c]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: west 1st left 2nd left.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

2

C#、50 41バイト

(x,y,r,X,Y,R)=>(x-=X)*x+(y-=Y)*y<(r+=R)*r

@KevinCruijssenのおかげで9バイト節約されました。


(r+R)*2代わりに書くことでそこに数バイトを保存することはできません(r+R)+(r+R)か?
イアンH.

@IanH。うん、どうしてそれを見逃したのか分からない。
TheLethalCoder

私は何かを逃していますか、これは機能しませか?
イアンH.

@IanH。私はタイプミスをしてい+ました、RHSでのはずだったはず*です。
TheLethalCoder

そして、私のフィードバックはそれをさらに悪化させました。しかし、解決策については良い仕事です!
イアンH.


1

PostgreSQL、41文字

prepare f(circle,circle)as select $1&&$2;

準備されたステートメント、入力を2つのパラメーターとして受け取ります。 circle表記法で

サンプル実行:

Tuples only is on.
Output format is unaligned.
psql (9.6.3, server 9.4.8)
Type "help" for help.

psql=# prepare f(circle,circle)as select $1&&$2;
PREPARE

psql=# execute f('5.86, 3.92, 1.670', '11.8, 2.98, 4.571');
t

psql=# execute f('8.26, -2.72, 2.488', '4.59, -2.97, 1.345');
t

psql=# execute f('9.32, -7.77, 2.8', '6.21, -8.51, 0.4');
t

psql=# execute f('4.59, -2.97, 1.345', '11.8, 2.98, 4.571');
f

psql=# execute f('9.32, -7.77, 2.8', '4.59, -2.97, 1.345');
f

psql=# execute f('5.86, 3.92, 1.670', '6.21, -8.51, 0.4');
f

1

Java、50 38バイト

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R

他の回答のアイデアを使用すると、これは次のように38に短縮できます(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R。実際、これがArnauldのJavaScriptの答えとまったく同じであることに気づきました。
laszlok

おかげで...この回答はnevee golfedすることを意図していた...私はそれが何も存在しないだろうな、単純な挑戦だと思ったことができます ... golfedこと
ローマグラーフ

私はあなたの答えは、今と全く同じである怖いことにより、既に投稿答え@OlivierGrégoire ...
ケビンCruijssen

1

x86マシンコード(SSE2を使用)、36バイト

; bool CirclesOverlap(double x1, double y1, double r1,
;                     double x2, double y2, double r2);
F2 0F 5C C3        subsd   xmm0, xmm3      ; x1 - x2
F2 0F 5C CC        subsd   xmm1, xmm4      ; y1 - y2
F2 0F 58 D5        addsd   xmm2, xmm5      ; r1 + r2
F2 0F 59 C0        mulsd   xmm0, xmm0      ; (x1 - x2)^2
F2 0F 59 C9        mulsd   xmm1, xmm1      ; (y1 - y2)^2
F2 0F 59 D2        mulsd   xmm2, xmm2      ; (r1 + r2)^2
F2 0F 58 C1        addsd   xmm0, xmm1      ; (x1 - x2)^2 + (y1 - y2)^2
66 0F 2F D0        comisd  xmm2, xmm0
0F 97 C0           seta    al              ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3                 ret

上記の関数は、2つの円(中心点と半径のx座標とy座標)の記述を受け入れ、それらが交差するかどうかを示すブール値を返します。

パラメータがSIMDレジスタで渡されるベクター呼び出し規約を使用します。x86-32および64ビットWindowsでは、これは__vectorcall呼び出し規約です。64ビットUnix / Linux / Gnuでは、これは標準のSystem V AMD64呼び出し規約です。です。

戻り値は、の下位バイトに残ります EAX、すべてのx86呼び出し規約の標準であるようます。

このコードは、SSE2命令セットをサポートしている限り、32ビットと64ビットのx86プロセッサーで同様に機能します。(Intel Pentium 4以降またはAMD Athlon 64以降)ます。

AVXバージョン、まだ36バイト

AVXをターゲットにしている場合は、おそらく命令にVEXプレフィックスを追加する必要があります。これはバイトカウントを変更しません。命令のエンコードに使用される実際のバイトのみ:

; bool CirclesOverlap(double x1, double y1, double r1,
;                     double x2, double y2, double r2);
C5 FB 5C C3      vsubsd   xmm0, xmm0, xmm3   ; x1 - x2
C5 F3 5C CC      vsubsd   xmm1, xmm1, xmm4   ; y1 - y2
C5 EB 58 D5      vaddsd   xmm2, xmm2, xmm5   ; r1 + r2
C5 FB 59 C0      vmulsd   xmm0, xmm0, xmm0   ; (x1 - x2)^2
C5 F3 59 C9      vmulsd   xmm1, xmm1, xmm1   ; (y1 - y2)^2
C5 EB 59 D2      vmulsd   xmm2, xmm2, xmm2   ; (r1 + r2)^2
C5 FB 58 C1      vaddsd   xmm0, xmm0, xmm1   ; (x1 - x2)^2 + (y1 - y2)^2
C5 F9 2F D0      vcomisd  xmm2, xmm0
0F 97 C0         seta     al                 ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3               ret

AVX命令には3つのオペランドを使用するという利点があり、非破壊的な操作を行うことができますが、それでもここでコードを圧縮するのに役立ちません。ただし、VEXプレフィックスを含む命令と含まない命令を混在させると、最適でないコードが生成される可能性があるため、一般に、AVXをターゲットにしている場合はすべての AVX命令を使用する必要がありますが、この場合、バイトカウントさえ損ないません。



1

PHP、66バイト

<?php $i=$argv;echo hypot($i[1]-$i[4],$i[2]-$i[5])<$i[3]+$i[6]?:0;

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

入力を6つのコマンドラインパラメーター引数として受け取り、円が重なる場合は1、それ以外の場合は0を出力して、コマンドラインから実行します。


0

ジュリア0.6.0(46バイト)

a->((a[1]-a[2])^2+(a[3]-a[4])^2<(a[5]+a[6])^2)

0

Clojure、68バイト

#(<(+(*(- %4 %)(- %4 %))(*(- %5 %2)(- %5 %2)))(*(+ %6 %3)(+ %6 %3)))

6つの引数を取ります:x1、y1、r1、x2、y2、r2。trueまたはfalseを返します。

悲しいことに、Clojureにはpow何らかの機能がありません。多くのバイトがかかります。


0

実際には、8バイト

-)-(h@+>

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

説明:

-)-(h@+>  (implicit input: [y1, y2, x1, x2, r1, r2])
-         y2-y1 ([y2-y1, x1, x2, r1, r2])
 )-       move to bottom, x1-x2 ([x1-x2, r1, r2, y2-y1])
   (h     move from bottom, Euclidean norm ([sqrt((y2-y1)**2+(x2-x1)**2), r1, r2])
     @+   r1+r2 ([r1+r2, norm])
       >  is r1+r2 greater than norm?

0

R(+ pryr)、31バイト

pryr::f(sum((x-y)^2)^.5<sum(r))

関数に評価する

function (x, y, z) 
sum((x - y)^2)^0.5 < sum(z)

x円1の座標はどこですかy、円2の座標はz半径は。

ピタゴラスを使用して2つの中心間の距離を計算し、その距離が半径の合計よりも小さいかどうかをテストします。

Rのベクトル化を使用して、(x1-x2)^2とを同時に計算し(y1-y2)^2ます。これらは合計され、平方根になります。


0

Go、93バイト

package q
import c "math/cmplx"
func o(a,b complex128,r,R float64)bool{return c.Abs(b-a)<r+R}

組み込みのアルゴリズムを使用することを除いて、他のいくつかの回答と同じ、かなり単純なアルゴリズム complex型を math / cmplx.Abs()を呼び出す。

半径を複素数として扱うことは役に立ちません。float64へのキャストは、変数宣言が保存するよりも多くのバイトを追加するからです(できないfloat64 < complex128)。

オンラインでお試しください!テストケースを含み、ライブラリの代わりにパッケージmainを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.