g l f a t a n 2


18

時には、デカルト座標(x,y)を極座標に変換するのは本当に大変です(r,phi)r = sqrt(x^2+y^2)非常に簡単に計算できますが、角度を計算する際にケースの区別が必要になることがよくあります。phiこれarcsinarccosarctanおよび他のすべての三角関数が、それぞれが円の半分のみに広がる共領域を持つためです。

多くの言語には、直交座標を極座標に変換するための組み込みatan2機能があります。または、少なくとも(x,y)角度を計算する関数がありますphi

仕事

あなたのタスクは、2つ(浮動小数点、両方ではないゼロ)デカルト座標を取るプログラム/関数を記述することで(x,y)、対応する極角出力するphiphiと(度、ラジアン、またはグレードでなければならないグレード Iは、平均グラジアン 1であります/ 400の完全な円)、あなたにとってより便利な方。

角度は正の方向で測定され、の角度はゼロです(1,0)

詳細

あなたは、角度計算ビルトインを使用することはできませんphiを含む2点の座標、与えられたatan2rect2polarargOfComplexNumberおよび同様の機能を。ただし、通常の三角関数とその逆関数を使用できます。これらの関数は1つの引数のみを取ります。単位記号はオプションです。

半径はr非負でなければならない、とphiの範囲でなければなりません[-360°, 360°](それはあなたの出力かどうかは関係ありません270°-90°)。

Input       Output
(1,1)       45°
(0,3)       90°
(-1,1)      135°
(-5,0)      180°
(-2,-2)     225°
(0,-1.5)    270°
(4,-5)      308.66°

ラジアン/度で必要な精度?
ルイスメンドー

使用する実装(float / double / whatever)に応じて、マシンの精度について正確であると言います
-flawr

入力を単一の複素数として取得できますか?
アダム

回答:


9

MATL、12バイト

yYy/X;0G0<?_

結果はラジアン単位です。

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

説明

MATLにはatan機能がありません(持っていますがatan2、このチャレンジには使用できません)。だから私はに頼ったacos

y     % Take x, y implicitly. Duplicate x onto the top of the stack
Yy    % Compute hypothenuse from x, y
/     % Divide x by hypothenuse
X;    % Arccosine (inverse of cosine function)
0G    % Push y again
0<    % Is it negative?
?_    % If so, change sign. Implicitly end conditional branch. Implicitly display

matlには絶対値が組み込まれていませんか?それがない場合は、おそらく交換するためにそれを使用することができます0<?_いくつかのバイトオフ、シェービングを
ツヴァイ

2
@Zwei(|)が付いています。しかし、ここで私は、の符号に基づいて結果の符号を変えてる第二の入力y。また、yすることができますので0、乗算することはできませんy/abs(y))
ルイスメンドー

5

JavaScript(ES6)、50 40バイト

(x,y)=>(Math.atan(y/x)||0)+Math.PI*(x<0)

結果はラジアン単位です。編集:結果が-90°から270°の間にあることが許可されていることに気付いたときに10バイトを保存しました。以前のバージョン-Math.PI<=result<Math.PI

(x,y)=>(Math.atan(y/x)||0)+Math.PI*(x<0)*(y>0||-1)

どのユニット?それらを答えに入れてください。
ソロモンウッコ

何の||0ためですか?
l4m2

@ l4m2そのx=y=0場合。
ニール



2

ゼリー、11 バイト(非競合)

<0×ØP+÷@ÆṬ¥

出力はラジアン単位です。残念なことに、Jellyは部門アトムにサインバグがあり、必要なバグ修正のためにこの回答が競合しなくなりました。

オンラインでお試しください!または、すべてのテストケースを検証します(度に変換)。

使い方

<0×ØP+÷@ÆṬ¥  Main link. Left argument x. Right argument: y

<0           Compare x with 0.
  ×ØP        Multiply the resulting Boolean by Pi.
          ¥  Combine the two links to the left into a dyadic chain.
      ÷@     Divide y by x.
        ÆṬ   Apply arctan to the result.
     +       Add the results to both sides.

バグ修正は、回答が競合しないものとしてカウントされますか?それは奇妙に思えます。正しい動作がすでに指定されている場合、バグ修正は無関係です。(結局のところ、誰も気付かないエッジケースを修正することによって他の回答をいくつ行ったか知っていますか?)
マリオカルネイロ

@MarioCarneiro PPCGでは、インタープリターが言語を定義します。これは、主に意図を判断するのが難しいため(そしてほとんどのエソランには実際に簡潔な仕様がないため)、実装について議論することはできません。インタプリタを変更しても、古い回答の有効性には影響しないことに注意してください。彼らは、通訳のいくつかの公開されたバージョンで動作する必要があります。
デニス

私はあなたがその時試みられなかったいくつかの入力で古い答えの振る舞いを変えたかもしれないことを意味します。PPCGは、事後に発見された悪いテストケースをどのように処理しますか?
マリオカルネイロ

テストケースが不十分であることが判明した場合は、さらにテストケースを追加します。問題のテストケースだけでなく、すべての有効な入力に対してソリューションが期待されます。再:バグ修正。私のインタープリターは、0による除算に対して間違った符号を生成しただけです(の代わりに-1÷0与えられます)ので、ほとんどの課題に影響を与えることはほとんどありません。inf-inf
デニス

2

Python 3、75 67バイト

Dennisのおかげで8バイト。

from math import*
lambda x,y:pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2

できた!


書き出す必要がandありorますか?
flawr

他に何ができますか?
リーキー修道女

1
@flawr Pythonにはandとのみがありorます。
デニス

2
pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2数バイト節約します。
デニス

4
@flawr:&ビット単位の演算子です。
ヴォルター

2

APL(Dyalog Unicode)12 10 バイトSBCS

-2 ngnに感謝します。

匿名の暗黙の挿入機能。alephalphaの式を使用します。取りx右引数として、およびy左引数として。結果はラジアン単位です。

11○∘⍟0J1⊥,

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

, 連結yおよびx

0J1⊥ ベースとして評価 iは桁(すなわち、Y I ¹+ X I ⁰)

 その自然対数

 それから

11○ その虚数部



@ngnありがとう。
アダム

11○∘⍟->12○
ngn

@ngn は使用できません…argOfComplexNumber
アダム

ああ...私は申し訳ありませんが、見る
NGN

1

Mathematica、16バイト

Log2つの座標が与えられた角度を計算する組み込み関数と見なされるかどうかはわかりません。

N@Im@Log[#+I#2]&

例:

In[1]:= N@Im@Log[#+I#2]&[1,1]

Out[1]= 0.785398

In[2]:= N@Im@Log[#+I#2]&[4,-5]

Out[2]= -0.896055

それは賢いアイデアです!この関数を呼び出す方法の例を追加できますか?
flawr

1

x86マシン言語(32ビットLinux)、25 13バイト(非競合)

0:       55                      push   %ebp
1:       89 e5                   mov    %esp,%ebp
3:       dd 45 08                fldl   0x8(%ebp)
6:       dd 45 10                fldl   0x10(%ebp)
9:       d9 f3                   fpatan  
b:       c9                      leave
c:       c3                      ret

するには、オンラインでそれを試して、次のCプログラムをコンパイル(忘れないでください-m32x86_64版にフラグ)

#include<stdio.h>
#include<math.h>
const char j[]="U\x89\xe5\335E\b\335E\20\xd9\xf3\xc9\xc3";
int main(){
  for(double f=-1;f<1;f+=.1){
    for(double g=-1;g<1;g+=.1){
      printf("%.2f %.2f %f %f\n",f,g,atan2(f,g),((double(*)(double,double))j)(f,g));
    }
  }
}




0

Python 3、65バイト

from math import*
f=lambda x,y:atan(y/x if x else y*inf)+pi*(x<0)

これは、度[-π/2, 3π/2)に相当する範囲のラジアンを出力します[-90, 270)


0

公理、58バイト

f(a,b)==(a=0 and b=0=>%i;sign(b)*acos(a*1./sqrt(a^2+b^2)))

テスト(放射を返すacos()のみを使用)

(40) -> [[a,b,f(a,b)*180/%pi] for a in [1,0,-1,-5,-2,0,4] for b in [1,3,1,0,-2,-1.5,-5] ]
   (40)
   [[1.0,1.0,45.0], [0.0,3.0,90.0], [- 1.0,1.0,135.0], [- 5.0,0.0,180.0],
    [- 2.0,- 2.0,- 135.0], [0.0,- 1.5,- 90.0],
    [4.0,- 5.0,- 51.3401917459 09909396]]
                                            Type: List List Complex Float

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