g o l f a t a n 2


18

บางครั้งจริงๆมันคือการต่อสู้การแปลงพิกัดคาร์ทีเซียนพิกัดขั้วโลก(x,y) (r,phi)ในขณะที่คุณสามารถคำนวณr = sqrt(x^2+y^2)ได้ง่ายมากคุณมักจะต้องแตกต่างจากกรณีเมื่อคำนวณมุมphiเพราะarcsin, arccosและarctanและฟังก์ชันตรีโกณมิติอื่น ๆ ทุกคนมีร่วมโดเมนที่เฉพาะในแต่ละช่วงครึ่งวงกลม

ในหลายภาษามี built-in สำหรับการแปลงสี่เหลี่ยมพิกัดเชิงขั้วหรืออย่างน้อยก็มีatan2ฟังก์ชั่นที่ - รับ(x,y)- phiคำนวณมุม

งาน

งานของคุณคือการเขียนโปรแกรม / ฟังก์ชั่นที่ใช้เวลาสอง (จุดลอยไม่ใช่ทั้งสองศูนย์) พิกัดคาร์ทีเซียน(x,y)และเอาท์พุทมุมขั้วโลกที่สอดคล้องกันphiที่phiจะต้องมีในองศาเรเดียนหรือเกรด (มีเกรดผมหมายถึงGradiansซึ่งเป็น 1 / 400 ของวงกลมเต็ม) แล้วแต่ว่าอะไรจะสะดวกสำหรับคุณ

(1,0)มุมที่เป็นวัดในทิศทางบวกและเรามีมุมสำหรับศูนย์

รายละเอียด

คุณไม่สามารถใช้สร้างเพิ่มเติมที่คำนวณมุมที่phiได้รับสองพิกัดรวมทั้งatan2, rect2polar, argOfComplexNumberและฟังก์ชั่นที่คล้ายกัน อย่างไรก็ตามคุณสามารถใช้ฟังก์ชั่นตรีโกณมิติปกติและการกลับด้านได้ซึ่งจะรับเพียงหนึ่งอาร์กิวเมนต์เท่านั้น สัญลักษณ์หน่วยใดก็ได้เป็นตัวเลือก

รัศมี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°

ต้องการความแม่นยำใน rads / องศา?
Luis Mendo

ผมว่าที่ถูกต้องเกี่ยวกับความแม่นยำเครื่องขึ้นอยู่กับสิ่งที่คุณใช้การดำเนินงาน (float / / คู่อะไรก็ตาม)
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<?_โกนสักสองสามไบต์
Zwei

2
@Zwei มันมี ( |) แต่ที่นี่ฉันเปลี่ยนสัญญาณของผลลัพธ์ตามสัญญาณของอินพุตที่สอง , y. นอกจากนี้yเป็นไปได้0ดังนั้นฉันจึงไม่สามารถคูณด้วยy/abs(y))
Luis Mendo

5

JavaScript (ES6), 50 40 ไบต์

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

ผลลัพธ์จะเป็นเรเดียน แก้ไข: บันทึก 10 ไบต์เมื่อฉันสังเกตเห็นว่าได้รับอนุญาตสำหรับผลลัพธ์ที่อยู่ระหว่าง -90 °ถึง 270 ° รุ่นก่อนหน้าด้วย-Math.PI<=result<Math.PI:

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

หน่วยอะไร กรุณาใส่ไว้ในคำตอบของคุณ
โซโลมอน Ucko

อะไร||0หา?
l4m2

@ l4m2 สำหรับx=y=0กรณี
Neil



2

Jelly , 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.

การแก้ไขข้อบกพร่องนับรวมกันเป็นคำตอบที่ไม่ใช่การแข่งขันหรือไม่? ดูเหมือนว่าแปลก หากระบุพฤติกรรมที่ถูกต้องแล้วข้อผิดพลาดควรไม่เกี่ยวข้อง (ท้ายที่สุดใครจะรู้ว่ามีคำตอบอื่น ๆ อีกกี่คำตอบที่คุณไม่ได้ทำการแข่งขันด้วยการแก้ไขเคสที่ไม่มีใครสังเกตเห็น?)
Mario Carneiro

@MarioCarneiro ใน PPCG, ล่ามภาษาที่กำหนด นี่เป็นส่วนใหญ่เพราะมันยากที่จะตัดสินความตั้งใจ (และ esolangs ส่วนใหญ่ไม่มีสเป็คที่กระชับจริงๆ) ในขณะที่คุณไม่สามารถโต้เถียงกับการใช้งาน โปรดทราบว่าการแก้ไขล่ามจะไม่ส่งผลต่อความถูกต้องของคำตอบที่เก่ากว่า พวกเขาจะต้องทำงานในล่ามที่ตีพิมพ์บางรุ่นเท่านั้น
Dennis

ฉันหมายความว่าคุณอาจเปลี่ยนพฤติกรรมของคำตอบที่เก่ากว่าในการป้อนข้อมูลบางอย่างที่ไม่ได้พยายามในเวลานั้น PPCG จัดการกับกรณีทดสอบที่ไม่ดีได้อย่างไรหลังจากข้อเท็จจริงแล้ว
Mario Carneiro

หากกรณีทดสอบพิสูจน์ว่าไม่เพียงพอจะเพิ่มกรณีทดสอบเพิ่มเติม คาดว่าจะได้รับการแก้ปัญหาสำหรับอินพุตที่ถูกต้องทั้งหมดไม่ใช่แค่กรณีทดสอบในคำถาม เรื่องการแก้ไขข้อผิดพลาด ล่ามของฉันสร้างเครื่องหมายที่ไม่ถูกต้องสำหรับการหารด้วย0 ( -1÷0มอบให้infแทน-inf) ดังนั้นจึงไม่น่าจะส่งผลกระทบต่อความท้าทายส่วนใหญ่
Dennis

2

Python 3, 75 67 ไบต์

8 ไบต์ขอบคุณเดนนิส

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

ไอเดียมัน!


คุณต้องเขียนออกมาandและor?
ข้อผิดพลาด

ฉันจะทำอะไรได้อีก
Leun Nun

1
@flawr Python มีandและorเท่านั้น
Dennis

2
pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2บันทึกไม่กี่ไบต์
Dennis

4
@flawr: &เป็นตัวดำเนินการระดับบิต
vaultah

2

APL (Dyalog Unicode) , 12 10 ไบต์SBCS

-2 ขอบคุณ ngn

ฟังก์ชั่นเงียบสงบไม่ระบุชื่อ ใช้สูตร alephalpha ของ รับxอาร์กิวเมนต์ที่ถูกต้องและyอาร์กิวเมนต์ซ้าย ผลลัพธ์เป็นเรเดียน

11○∘⍟0J1⊥,

ลองออนไลน์!

, เชื่อมต่อyและx

0J1⊥ ประเมินเป็นฐานฉันตัวเลข (เช่น Y ฉัน ¹ + x ฉัน ⁰)

 ลอการิทึมธรรมชาติของสิ่งนั้น

 แล้วก็

11○ ส่วนจินตภาพของสิ่งนั้น



@ngn ขอบคุณ
อดัม

11○∘⍟->12○
ngn

@ngn คุณอาจจะไม่ได้ใช้ ...argOfComplexNumber
อดัม

โอ้ ... ฉันเข้าใจแล้วขอโทษ
ก.ย.

1

Mathematica ขนาด 16 ไบต์

ฉันไม่แน่ใจว่าจะLogถูกพิจารณาว่าเป็นบิวด์อินหรือไม่ซึ่งจะคำนวณมุมที่ได้รับจากสองพิกัด

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

นั่นเป็นความคิดที่ฉลาด! คุณสามารถเพิ่มตัวอย่างวิธีเรียกใช้ฟังก์ชันนี้ได้หรือไม่
ข้อบกพร่อง

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 ต่อไปนี้ (อย่าลืม-m32ตั้งค่าสถานะใน x86_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));
    }
  }
}

1

J , 10 ไบต์

ฟังก์ชั่นเงียบสงบไม่ระบุชื่อ ใช้สูตร alephalpha ของ ใช้xอาร์กิวเมนต์ซ้ายและyอาร์กิวเมนต์ขวา ผลลัพธ์เป็นเรเดียน

11 o.^.@j.

ลองออนไลน์!

j. คำนวณx+ y× i

@ แล้วก็

^. ลอการิทึมธรรมชาติของสิ่งนั้น

11 o. ส่วนจินตภาพของสิ่งนั้น




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 () มันจะส่งกลับ radiants)

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