2点間の角度を見つける


13

2つの点Aとが与えられたとき、原点()である点の周りの線Bから線AOへの角度を見つけます。さらに、角度は、ポイントの位置に応じて正または負になる場合があります(例を参照)。入力はポイントとになり、便利な形式で入力できます。出力は度単位の角度になります(ただし、取得する原点を中心に反時計回りに回転した場合は正、時計回りに回転した場合は負になります)。角度が180度の場合、負または正の出力を返すことができます。同様に、角度は同じ角度の正または負のバージョンにすることができます(に等しい)。例:BOOO(0,0)ABAOBO90 deg-270 deg

  • 入力:A(5,5) B(5,-5)出力:-90AO回転させる-90度取得しますBO)。

  • 入力:A(5,-5) B(5,5)出力:90AO回転させる90度取得しますBO)。

これはなので、バイト単位の最短コードが勝ちです!


11
どのくらいの精度が必要ですか?
レトコラディ

2
入力を2つの複素数として受け取ることはできますか?
リトシアスト

5
1つのポイントが出力される場合、出力は(0,0)どうなりますか?
リトシアスト

1
@ThomasKwa OPについては知りませんが、整数/ 10進数の入力のみとして扱い、入力には(0,0)ポイントはありません。
GamrCorps

2
ヒント:との間の角度はAOBO通常angleと呼ばれAOBます。
ETHproductions

回答:


12

Pyth、11バイト

.t-FPM.jMQ6

デモンストレーション

入力は次の形式で提供されます。

[[Bx, By], [Ax, Ay]]

Aが最初に来ることが望ましい場合、これは1バイトで変更できます。

説明:

.t-FPM.jMQ6
               Implicit: Q = eval(input())
      .jMQ     Convert input pairs to complex numbers.
    PM         Take their phases (angles in the complex plane).
  -F           Take the difference.
.t        6    Convert to degrees

22

TI-BASIC、13バイト

TI-83 + / 84 +シリーズの計算機用。

Degree
Input Y
min(ΔList(R►Pθ(Ans,∟Y

このプログラムを使用{x1,x2}するには、Ans変数と{y1,y2}プロンプトでリストを入力します。


TI-BASICコマンドはシングルバイトですか?
corsiKa

ここではすべてのコマンドを除いてはΔList(、あるバイト1それぞれ。これにはが含まれR►Pθ(ます。
リスト管理者

計算機プログラミングを使用するためだけに+1。高校時代にTrigとCalculusに戻ります。
вʀaᴎᴅᴏƞвєнᴎєƞ

素敵なリファレンス!超クール。
corsiKa

10

CJam、14バイト

q~::ma:-P/180*

これは、入力を次のように読み取る完全なプログラムです。 [[Ax Ay] [Bx By]] STDINから。

CJamインタープリターでオンラインでお試しください

使い方

q~             e# Read and evaluate all input.
  ::ma         e# Replace each point (x, y) with atan2(x, y).
               e# This returns its angle with the positive y axis, measured clockwise.
      :-       e# Compute the difference of the two resulting angles.
               e# This returns the angle between the points, measured counter-clockwise.
        P/180* e# Divide by Pi and multiply by 180 to convert to degrees.

5
ほぼ半分このプログラムのがちょうど...ラジアンを度に変換されていることを面白い
ダレル・ホフマン

@DarrelHoffman私はそれがさらにPythに変換が3課題は、言語が結ばれることになるラジアンで報告するために許可されている場合は、バイトの代わりに6であることを楽しま見つける
FryAmTheEggman

5

ミンコルン0.9バイト

私は本当に組み込み関数としてトリガー関数を実装したいのですが...これは楽しかったです!(注意:これは符号付きの角度差ではなく、正の角度差を出力します。私の制限を考えると、それは正当化されると思います。)

4[n]0c2c*1c3c*+r4[2;1R]r+1R+0g*12$:;$:8[0ci2*3+d1R;0g$:1i1+[i2*1+d1+$:*]*]$+'3.141592654'25*9;$:$:12$:r-66*5**N.

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

説明

誰かがそれを望むならば、私はより完全な説明を投稿します、しかし、それの要点は次のとおりです:

4[n]                                    Take in 4 integers from input
0c2c*1c3c*+                             dot product
r4[2;1R]r+1R+0g*12$:;                   magnitudes of vectors
$:                                      dot product divided by magnitudes (z)
8[0ci2*3+d1R;0g$:1i1+             *]    Taylor series for arccos
                     [i2*1+d1+$:*]      In particular, the coefficient (1/2 * 3/4 * ...)
$+                                      Add them all up!
'3.141592654'25*9;$:$:                  Divide by pi for converting to degrees
12$:r-                                  Subtract from 1/2 - I now have arccos(z)
66*5**                                  Convert to degrees
N.                                      Output as number and stop.

minkolangはコメントをサポートしていますか?READMEで見つけることができませんでした。
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴ:他の2D言語とまったく同じです。コメントは、プログラムカウンターが届かないものです。
エレンディアスターマン

ああ、それでは。それは理にかなっている、私が考えていたことを知らない。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ:回答の1つでコメントを明示的に使用すると、同様の機能を実装することを検討できます。それはきちんとしたアイデアであり、私が実装するのはひどく難しいことではありません。
エレンディアスターマン

ありがとう!:DHello Worldのチャレンジに気づいたのは、Hello Worldチャレンジでした(FYIシンプレックス用に作成したインタープリターは、さまざまな「モード」で実行されます。文字列モードとコメントモードです。モード中に他の。)
コナーオブライエン

4

Mathematica、22バイト

{-1,1.}.ArcTan@@@#/°&

例:

In[1]:= {-1,1.}.ArcTan@@@#/°&[{{5,5},{5,-5}}]

Out[1]= -90.

In[2]:= {-1,1.}.ArcTan@@@#/°&[{{5,-5},{5,5}}]

Out[2]= 90.

これは次のような入力に対して機能しますか{{0,1},{1,0}}
リトシアスト

@ThomasKwaもちろんそうです。
-alephalpha

4

Javascript、66バイト

let f=(a,b)=>(Math.atan2(b.y,b.x)-Math.atan2(a.y,a.x))*180/Math.PI;

デモ


私の23秒前= P ところで、を省略することもできますがlet f=、匿名関数としても有効と見なされます。
Mwr247

3

ジュリア、18 25バイト

f(A,B)=angle(B/A)/pi*180

これは、「任意の便利な形式は、」すでにを可能にすることを前提とAし、B複素数として与えられることに。次に、複素数演算がすべての重荷を持ち上げます。

編集:スニペットを機能に変換しました。18バイトバージョンは、Julia REPLでのみ機能します。


3

Python 2.7、73バイト

from math import*
f=lambda A,B:degrees(atan2(B[1],B[0])-atan2(A[1],A[0]))

テスト:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0

PPCGへようこそ!これはコードゴルフなので、できるだけ多くのスペースを削除し、コードを短くする必要があります。
mbomb007

1
*
むやみに

3

オクターブ、43バイト

f=@(a,b)(cart2pol(b)-cart2pol(a))(1)*180/pi

入出力:

octave:40> f([5,5],[5,-5])
ans = -90

octave:41> f([1,0],[0,1])
ans = 90

3

CJam、15バイト

l~ma@@ma-P/180*

CJamゲームにも参加すると思います。オンラインでお試しください。入力はの形式ですbx by ax ay。残念ながら、これはデニスの答えをコピーせずにこのチャレンジを行う最短の方法です。


3

TeaScript、28バイト

私は本当にtrig関数を実装する必要があります...

$.atan2(_[3]-y,z-x)*180/$.PI

オンラインで入力してみてくださいa.x a.y b.x b.y

説明

$.atan2(       // Arc Tangent of...
    _[3] - y,  // 4th input - 2nd input
       z - x,  // 3rd input - 1st input
) * 180 / $.PI // Converts rad -> deg

2

Ruby、64、58バイト

a=->(b){b.map{|c|Math.atan2(*c)}.reduce(:-)*180/Math::PI}

使用法

a.call [[5, 5], [5, -5]] # => -90.0
a.call [[5, -5], [5, 5]] # => 90.0

2

JavaScript、49バイト

(a,b)=>((c=Math.atan2)(...b)-c(...a))/Math.PI*180

入力の形式は次のとおりです[aY, aX], [bY, bX](x / yが逆になっていることに注意してください)。


1

シンプレックスv.0.7、13バイト

追加できてうれしいですmathrelations:D残念ながら、私は点ごとの入力を取ることができません。そのため、各ポイントを個別の数値(Ax、Ay、Bx、By)として入力します。(これをリソースとして使用ました。)

(iRi~^fR)2LSo
(       )2    ~~ repeat inner twice
 iRi          ~~ take two chars of input (x,y)
    ~         ~~ switch top 2 on stack
     ^f       ~~ apply atan2 on (y,x)
       R      ~~ go right
          L   ~~ go left
           S  ~~ subtract result
            o ~~ output as number

入力を(Ay、Ax、By、Bx)として取得できる場合は、charを保存できます。

(iRi^fR)2LSo

1

C、88バイト

#include<math.h>
typedef double d;d g(d x,d y,d a,d b){return atan2(b-y,a-x)*180/M_PI;}

GCCの組み込み数学定数の一部としてM_PI定義されmath.hていることを利用するには、GCCでコンパイルする必要があります。 オンラインで試してください -ideoneはGCCを使用していないため(明らかに)、十分なπ桁を正確にするには、さらに数バイトが必要です。


または(オンラインデモで)45/atan(1)代わりに180/3.14159....
CompuChip

@CompuChipオンラインデモを最大限にゴルフしようとはしていませんでした
Mego

atan2(by、ax)の角かっこを削除できますが、戻り値の後にスペースが必要になるため、1バイトしか節約できません。K&Rスタイルの関数を使用できる場合は、double g(x、y、a、b)double x、y、a、b; また、6バイトを節約します。
アルキミスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.