ค้นหามุมระหว่างจุดสองจุด


13

ให้สองจุดAและBหามุมจากบรรทัดหนึ่งAOไปอีกบรรทัดBOเกี่ยวกับจุดOที่Oเป็นต้นกำเนิด ( (0,0)) นอกจากนี้มุมอาจเป็นบวกหรือลบขึ้นอยู่กับตำแหน่งของจุด (ดูตัวอย่าง) การป้อนข้อมูลจะเป็นคะแนนAและBและอาจได้รับในรูปแบบที่สะดวกใด ๆ เอาต์พุตจะเป็นมุมเป็นองศา (แต่จะเป็นบวกถ้าAOหมุนทวนเข็มนาฬิกาเกี่ยวกับจุดกำเนิดเพื่อให้ได้BOและลบถ้าหมุนตามเข็มนาฬิกา) ถ้ามุมเป็น 180 องศาคุณอาจส่งคืนผลลัพธ์เป็นลบหรือบวก ในทำนองเดียวกันมุมอาจเป็นรุ่นบวกหรือลบของมุมเดียวกัน ( 90 degเท่ากับ-270 deg) ตัวอย่าง:

  • อินพุต: A(5,5) B(5,-5)เอาต์พุต: -90( AOคือ-90องศาที่หมุนเพื่อรับBO)

  • อินพุต: A(5,-5) B(5,5)เอาต์พุต: 90( AOคือ90องศาที่หมุนเพื่อรับBO)

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


11
ต้องการความแม่นยำเท่าใด
Reto Koradi

2
เราสามารถรับข้อมูลเป็นจำนวนเชิงซ้อนสองจำนวนได้ไหม
lirtosiast

5
เอาต์พุตควรเป็นเช่นไรหากมีจุดใดจุดหนึ่ง(0,0)?
lirtosiast

1
@ThomasKwa ฉันไม่รู้เกี่ยวกับ OP แต่ฉันถือว่ามันเป็นเพียงการป้อนตัวเลขจำนวนเต็ม / ทศนิยมและอินพุตจะไม่มีจุด (0,0)
GamrCorps

2
คำแนะนำ: มุมระหว่างAOและมักจะถูกเรียกว่ามุมBO 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(เป็นหนึ่งไบต์ในแต่ละ R►Pθ(ซึ่งรวมถึง
lirtosiast

+1 เพียงแค่ใช้โปรแกรมเครื่องคิดเลข พาฉันกลับไปที่ Trig และแคลคูลัสในสมัยมัธยมปลาย
â€ᴎᴅᴏƞ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
น่าขบขันที่เกือบครึ่งหนึ่งของโปรแกรมนี้เป็นเพียงการแปลงเรเดียนเป็นองศา ...
Darrel Hoffman

@DollHoffman ฉันพบว่ามันน่าขบขันมากกว่าเดิมใน Pyth ที่แปลงเป็น 3 ไบต์แทนที่จะเป็น 6 ดังนั้นหากความท้าทายที่อนุญาตให้รายงานเป็นเรเดียนภาษาจะถูกผูกไว้
FryAmTheEggman

5

Minkolang 0.9 , 112 ไบต์

ฉันจริงๆต้องการที่จะใช้ฟังก์ชั่นหนุนเป็นตัว -ins ตอนนี้ ... แต่ก็สนุก! (Caveat: สิ่งนี้ให้ผลต่างมุมบวกไม่ใช่ความแตกต่างของมุมที่เซ็นชื่อด้วยข้อ จำกัด ของฉันฉันคิดว่านั่นเป็นเหตุผล)

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
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: มันก็เหมือนกับภาษา 2D อื่น ๆ - ความคิดเห็นเป็นสิ่งที่ไม่สามารถเข้าถึงได้โดยเคาน์เตอร์โปรแกรม
El'endia Starman

โอ้ไม่เป็นไร นั่นทำให้รู้สึกไม่เป็นสิ่งที่ฉันคิด
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ: การใช้ความเห็นอย่างชัดเจนของคุณในหนึ่งในคำตอบของคุณทำให้ฉันพิจารณาใช้ฟังก์ชั่นที่คล้ายกัน มันเป็นความคิดที่เรียบร้อยและจะไม่ยากสำหรับฉันที่จะใช้
El'endia Starman

ขอบคุณ! :Dนี่เป็นความท้าทายของ Hello World ที่คุณสังเกตเห็นความคิดเห็นใน (FYI ล่ามที่ฉันทำสำหรับ Simplex ทำงานใน "โหมด" ที่แตกต่างกัน: โหมดสตริงและโหมดความคิดเห็นมันทำให้ง่ายในการแยกวิเคราะห์และช่วยให้คุณละเว้นอักขระสัญญาณของหนึ่ง ขณะที่อยู่ในโหมดอื่น))
Conor O'Brien

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}}
lirtosiast

@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 กอล์ฟที่ดี! Btw คุณสามารถละlet f=และมันก็ยังถือว่าถูกต้องเป็นฟังก์ชั่นที่ไม่ระบุชื่อ
Mwr247

3

Julia, 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
คุณสามารถทำให้รหัสของคุณสั้นโดยประมาทเพิ่มบาง*s ทั่วทุกสถานที่
FryAmTheEggman

3

อ็อกเทฟ 43 ไบต์

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

Input / Output:

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 ไบต์

ฉันควรใช้ฟังก์ชันตรีโกณฯ จริง ๆ ...

$.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

Simplex v.0.7 , 13 ไบต์

ฉันดีใจที่ฉันเพิ่มmathrelations: D น่าเสียดายที่ฉันไม่สามารถรับอินพุตแบบจุด ดังนั้นฉันใส่แต่ละจุดเป็นตัวเลขแยกต่างหาก (Axe, 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, Axe, By, Bx):

(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 (เห็นได้ชัด) จำเป็นต้องมีไบต์เพิ่มอีกสองสามตัวเพื่อให้ตัวเลข enough เพียงพอที่จะแม่นยำ


หรือ45/atan(1)แทน180/3.14159....(ในการสาธิตออนไลน์)
CompuChip

@CompuChip ฉันไม่ได้พยายามที่จะสาธิตการเล่นกอล์ฟออนไลน์ให้มากที่สุด
Mego

คุณสามารถลบวงเล็บเหลี่ยมรอบ atan2 (โดย, ขวาน), ถึงแม้ว่าคุณต้องการช่องว่างหลังจากกลับมาดังนั้นมันจึงประหยัดได้เพียง 1 ไบต์เท่านั้น หากคุณสามารถใช้ฟังก์ชันสไตล์ K&R จากนั้นดับเบิล g (x, y, a, b) double x, y, a, b; ยังช่วยประหยัดหกไบต์
เล่นแร่แปรธาตุ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.