g o l f a t a n 2


18

Đôi khi nó thực sự là một cuộc đấu tranh để chuyển đổi tọa độ Cartesian sang tọa độ (x,y)Polar (r,phi). Trong khi bạn có thể tính toán r = sqrt(x^2+y^2)khá dễ dàng, bạn thường cần một số phân biệt các trường hợp khi tính toán góc phiarcsin, arccosarctanvà tất cả các hàm lượng giác khác có một đồng miền mà mỗi nhịp chỉ một nửa vòng tròn.

Trong nhiều ngôn ngữ, có các hàm dựng sẵn để chuyển đổi tọa độ hình chữ nhật sang cực, hoặc ít nhất có một atan2hàm, được cho (x,y)- tính góc phi.

Bài tập

Nhiệm vụ của bạn là viết một chương trình / hàm lấy hai tọa độ Cartesian (không phải cả hai số 0) (x,y)và đưa ra góc cực tương ứng phi, trong đó phiphải tính theo độ, radian hoặc điểm (với cấp I có nghĩa là độ dốc là 1 / 400 vòng tròn đầy đủ), tùy theo cái nào thuận tiện hơn cho bạn.

Góc được đo theo hướng tích cực và chúng ta có góc bằng không (1,0).

Chi tiết

Bạn không thể sử dụng built-in mà tính toán góc phicho hai tọa độ, bao gồm atan2, rect2polar, argOfComplexNumbervà các chức năng tương tự. Tuy nhiên, bạn có thể sử dụng các hàm lượng giác thông thường và đảo ngược của chúng, chỉ mất một đối số. Bất kỳ biểu tượng đơn vị là tùy chọn.

Bán kính rphải không âm và phiphải nằm trong phạm vi [-360°, 360°](không quan trọng bạn xuất 270°hay không -90°).

Ví dụ

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°

Độ chính xác cần thiết trong rads / độ?
Luis Mendo

Tôi muốn nói chính xác về độ chính xác của máy, tùy thuộc vào việc bạn sử dụng triển khai gì (float / double /
anything

Chúng ta có thể lấy đầu vào là một số phức không?
Adám

Câu trả lời:


9

MATL , 12 byte

yYy/X;0G0<?_

Kết quả là bằng radian.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

MATL không có atanchức năng (nó có atan2, nhưng nó không thể được sử dụng cho thử thách này). Vì vậy, tôi đã viện đến 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

Liệu matl thực sự không có giá trị tuyệt đối dựng sẵn? Nếu vậy, có lẽ bạn có thể sử dụng nó để thay thế 0<?_, cạo sạch một vài byte
Zwei

2
@Zwei Nó có ( |). Nhưng ở đây tôi đang thay đổi dấu hiệu của kết quả dựa trên dấu hiệu của đầu vào thứ hai , y. Bên cạnh đó, ycó thể 0, vì vậy tôi không thể nhân lêny/abs(y))
Luis Mendo

5

JavaScript (ES6), 50 40 byte

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

Kết quả là bằng radian. Chỉnh sửa: Đã lưu 10 byte khi tôi nhận thấy rằng kết quả cho phép nằm trong khoảng từ -90 ° đến 270 °. Phiên bản trước với -Math.PI<=result<Math.PI:

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

Đơn vị nào? Hãy đặt chúng vào câu trả lời của bạn.
Solomon Ucko

Để làm gì ||0?
l4m2

@ l4m2 Dành cho x=y=0trường hợp.
Neil


3

Javascript ES6, 54 byte

(x,y,m=Math)=>x<0&!y?m.PI:m.atan(y/(m.hypot(x,y)+x))*2

Sử dụng radian.


2

Jelly , 11 byte (không cạnh tranh)

<0×ØP+÷@ÆṬ¥

Đầu ra là bằng radian. Thật không may, Jelly đã có một dấu hiệu lỗi trong các nguyên tử phân chia của nó, khiến câu trả lời này không cạnh tranh do sửa lỗi bắt buộc.

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm (chuyển đổi sang độ).

Làm thế nào nó hoạt động

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

Có sửa lỗi được tính là làm cho một câu trả lời không cạnh tranh? Điều đó có vẻ kỳ lạ. Nếu hành vi đúng đã được xác định, lỗi không liên quan. (Rốt cuộc, ai biết được bạn đã trả lời bao nhiêu câu trả lời khác bằng cách sửa một trường hợp cạnh không được chú ý?)
Mario Carneiro

@MarioCarneiro Trên PPCG, trình thông dịch xác định ngôn ngữ . Điều này chủ yếu là vì rất khó để đánh giá ý định (và hầu hết các esolang không thực sự có một thông số ngắn gọn), trong khi bạn không thể tranh luận với việc thực hiện. Lưu ý rằng việc thay đổi trình thông dịch không ảnh hưởng đến tính hợp lệ của các câu trả lời cũ hơn. Họ chỉ phải làm việc trong một số phiên bản được xuất bản của trình thông dịch.
Dennis

Ý tôi là bạn có thể đã thay đổi hành vi của các câu trả lời cũ hơn trên một số đầu vào không được thử vào thời điểm đó. Làm thế nào để PPCG xử lý các trường hợp thử nghiệm xấu được phát hiện sau khi thực tế?
Mario Carneiro

Nếu các trường hợp thử nghiệm chứng minh là không đủ, nhiều trường hợp thử nghiệm được thêm vào. Các giải pháp được mong đợi cho tất cả các đầu vào hợp lệ, không chỉ các trường hợp thử nghiệm trong câu hỏi. Re: sửa lỗi. Thông dịch viên của tôi chỉ tạo ra dấu hiệu sai cho phân chia bởi 0 ( -1÷0đã infthay -inf), vì vậy nó không ảnh hưởng đến hầu hết các thách thức.
Dennis


2

APL (Dyalog Unicode) , 12 10 byte SBCS

-2 nhờ ngn.

Chức năng ẩn danh ẩn danh. Sử dụng công thức của alephalpha . Đưa ra xnhư là đối số phải và ynhư là đối số trái. Kết quả là bằng radian.

11○∘⍟0J1⊥,

Hãy thử trực tuyến!

, nối yx

0J1⊥ Đánh giá là chữ số cơ sở i (tức là y i ¹ + x i )

 logarit tự nhiên của điều đó

 sau đó

11○ phần tưởng tượng của điều đó



@ngn Cảm ơn bạn.
Adám

11○∘⍟->12○
ngn

@ngn Bạn không được sử dụng chương trìnhargOfComplexNumber
Adám

oh ... tôi hiểu rồi, xin lỗi
ngn

1

Toán học, 16 byte

Tôi không chắc liệu có Logđược coi là tích hợp để tính góc cho hai tọa độ hay không.

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

Thí dụ:

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

Đó là một ý tưởng thông minh! Bạn có thể thêm một ví dụ làm thế nào để gọi chức năng này?
flawr

1

Ngôn ngữ máy x86 (Linux 32 bit), 25 13 byte (không dịch)

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

Để dùng thử trực tuyến , hãy biên dịch chương trình C sau (đừng quên -m32cờ trên 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 byte

Chức năng ẩn danh ẩn danh. Sử dụng công thức của alephalpha . Đưa ra xnhư đối số trái và ynhư đối số phải. Kết quả là bằng radian.

11 o.^.@j.

Hãy thử trực tuyến!

j. tính x+ y× i

@ sau đó

^. logarit tự nhiên của điều đó

11 o. phần tưởng tượng của điều đó




0

Python 3, 65 byte

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

Điều này xuất ra radian trong phạm vi [-π/2, 3π/2), tương đương với [-90, 270)độ.


0

Tiên đề, 58 byte

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

kiểm tra (tôi chỉ sử dụng acos () nó trả về bức xạ)

(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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.