g o l f a t 2


18

有时将笛卡尔坐标转换(x,y)为极坐标确实很费力(r,phi)。虽然你可以计算r = sqrt(x^2+y^2)很容易,你经常计算时的角度需要的情况下有些区别phi,因为arcsinarccos以及arctan和所有其他三角函数有一个共同域,每个只有跨越半个圆。

在许多语言中,都有用于将直角坐标转换为极坐标的内置atan2函数,或者至少具有给定的(x,y)计算角度的函数phi

任务

你的任务是写一个程序/功能采用两个(浮点,但不能同时为零)笛卡尔坐标(x,y),并输出对应的极角phi,其中phi必须处于度,弧度或等级(与等级余平均gradians其是1 /整圆的400),以您较方便的为准。

角度是在正方向上测量的,对于,我们有零角度(1,0)

细节

您不得使用内置插件是计算角度phi给出两个坐标,其中包括atan2rect2polarargOfComplexNumber和类似的功能。但是,您可以使用通常的三角函数及其反函数,它们只需一个参数。任何单位符号都是可选的。

半径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°

需要以弧度/度为单位的精度吗?
Luis Mendo

我会说精确到机器精度,这取决于您使用的是什么实现方式(浮动/双精度/无论
哪种

我们可以将输入作为单个复数吗?
亚当

Answers:


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)

结果以弧度为单位。编辑:当我注意到允许结果在-90°和270°之间时,保存了10个字节。先前版本-Math.PI<=result<Math.PI

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

什么单位?请把它们放入您的答案中。
所罗门·乌科2016年

有什么||0
l4m2 '18

@ l4m2对于这种x=y=0情况。
尼尔


3

Javascript ES6,54个字节

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

使用弧度。


2

果冻,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并没有一个简洁的规范),而您不能对实现进行争论。请注意,更改解释器不会影响较早答案的有效性。他们只需要在解释器的某些发行版本中工作即可。
丹尼斯

我的意思是,您可能已更改了某些当时未尝试输入的较早答案的行为。PPCG如何处理事后发现的不良测试案例?
马里奥·卡内罗

如果测试用例证明不足,则添加更多测试用例。期望所有有效输入的解决方案,而不仅仅是问题中的测试用例。回复:错误修复。我的解释只能由生产除法错误标志0-1÷0inf代替-inf),所以它不会影响到大多数的挑战。
丹尼斯

2

Python 3,75 67字节

丹尼斯感谢8个字节。

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

伊迪恩!


您必须写出andor吗?
瑕疵的

我还可以做些什么?
Leaky Nun

1
@flawr Python仅具有andor
丹尼斯

2
pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2保存一些字节。
丹尼斯

4
@flawr:&是按位运算符。
vaultah '16

2

APL(Dyalog Unicode)12个 10 字节SBCS

-2感谢ngn。

匿名默认隐式函数。使用alephalpha的公式。注意到x作为右边的参数,并y为左参数。结果以弧度为单位。

11○∘⍟0J1⊥,

在线尝试!

, 连接yx

0J1⊥ 评估作为碱位数(即ý ¹+ X ⁰)

 那个的自然对数

 然后

11○ 那个虚构的部分



@ngn谢谢。
亚当

11○∘⍟->12○
ngn

@ngn 您不能使用...argOfComplexNumber
亚当

哦...我明白了,对不起
ngn

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程序(不要忘记-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));
    }
  }
}

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()返回辐射)

(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.