안 돼요 2


18

때로는 직교 좌표 (x,y)를 극좌표 로 변환하는 것이 실제로 어려운 일 (r,phi)입니다. 당신은 계산할 수 있지만 r = sqrt(x^2+y^2)아주 쉽게 각도를 계산할 때, 당신은 종종의 경우 약간의 구별이 필요 phi하기 때문에를 arcsin, arccos그리고 arctan다른 모든 삼각 함수가 공동 도메인 각 단 경간이이 원을.

많은 언어에는 직사각형을 극좌표로 변환하거나 최소한 각도를 계산 하는 atan2함수 가 내장되어 있습니다 .(x,y)phi

직무

내 작업은 두 (부동 소수점이 아니라 모두 제로) 직교 좌표를 취하는 프로그램 / 함수를 작성하는 것 (x,y), 및 해당 극각 출력하고 phi, phi가진 (각도, 라디안 또는 등급 판정을 갖고 등급 I 평균 gradians 1이다 / 전체 서클의 400) 중 더 편리한 쪽을 선택하십시오.

각도는 양의 방향으로 측정되며에 대한 각도는 0입니다 (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 / degrees에 필요한 정밀도?
Luis Mendo 2016 년

사용하는 구현에 따라 기계 정밀도에 대해 정확하게 말하고 싶습니다 (float / double / whatever)
flawr

단일 복소수로 입력 할 수 있습니까?
Adám

답변:


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))
루이스 Mendo

5

자바 스크립트 (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)

어떤 단위? 답장에 넣으십시오.
Solomon Ucko 2016 년

무엇입니까 ||0?
l4m2

@ l4m2 경우에 x=y=0해당합니다.
Neil


3

자바 스크립트 ES6, 54 바이트

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

라디안을 사용합니다.


2

젤리 , 11 바이트 (비경쟁)

<0×ØP+÷@ÆṬ¥

출력은 라디안입니다. 불행히도 젤리는 분할 원자에 부호 버그가있어 필요한 버그 수정으로 인해 경쟁이 아닙니다.

온라인으로 사용해보십시오!또는 모든 테스트 사례를 확인합니다 (도 단위로 변환).

작동 원리

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

버그 수정은 경쟁이 아닌 답변으로 간주됩니까? 이상해 보인다. 올바른 동작이 이미 지정된 경우 버그 수정은 관련이 없습니다. (결국, 누가 당신이 주목 가장자리 케이스를 고정하여 noncompeting 만든 얼마나 많은 다른 답을 알고있다?)
마리오 Carneiro

@MarioCarneiro PPCG 에서 통역사는 언어를 정의합니다 . 의도를 판단하기가 어렵고 (대부분의 esolang은 간결한 스펙을 가지고 있지 않기 때문에) 구현에 대해서는 논쟁 할 수 없기 때문입니다. 인터프리터를 변경해도 이전 답변의 유효성에는 영향을 미치지 않습니다. 그들은 출판 된 일부 버전의 통역사에서만 작동해야합니다.
Dennis

당시에 시도되지 않은 일부 입력에서 이전 답변의 동작을 변경했을 수 있습니다. PPCG는 사실 이후 발견 된 나쁜 테스트 사례를 어떻게 처리합니까?
마리오 카네이로

테스트 사례가 충분하지 않은 경우 더 많은 테스트 사례가 추가됩니다. 문제의 테스트 사례뿐만 아니라 모든 유효한 입력에 대한 솔루션이 필요합니다. 다시 : 버그 수정. 내 통역 만에 의해 부문에 대한 잘못된 기호를 생산 0 ( -1÷0inf대신 -inf그래서 대부분의 문제에 영향을 미칠 확률이 낮다).
Dennis

2

파이썬 3, 75 67 바이트

Dennis 덕분에 8 바이트

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

무시 했어!


당신이 쓰는해야합니까 andor?
flawr

다른 무엇을 할 수 있습니까?
Leaky Nun

1
@flawr Python에는 and및 만 있습니다 or.
Dennis

2
pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2몇 바이트를 절약합니다.
Dennis

4
@flawr : &는 비트 연산자입니다.
vaultah 2016 년

2

APL (Dyalog Unicode) , 12 10 바이트 SBCS

ngn 덕분에 -2입니다.

익명의 암묵적 삽입 기능. alephalpha 's formula를 사용합니다 . 소요 x오른쪽 인자로하고 y왼쪽 인수로. 결과는 라디안입니다.

11○∘⍟0J1⊥,

온라인으로 사용해보십시오!

, 연결하여 yx

0J1⊥ 기본 i 자릿수 로 평가 (예 : y i ¹ + x i ⁰)

 그 자연 대수

 그때

11○ 그 가상의 부분


1

@ngn 감사합니다.
Adám December

11○∘⍟->12○
ngn

@ngn 당신은 사용할 수 없습니다 ...argOfComplexNumber
Adám

아 ... 미안해
ngn

1

수학, 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

그것은 영리한 생각입니다! 이 함수를 호출하는 방법에 대한 예제를 추가 할 수 있습니까?
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

파이썬 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.