g o l f a t a n 2


18

Іноді це справді боротьба за перетворення декартових координат (x,y)у полярні координати (r,phi). У той час як ви можете розрахувати r = sqrt(x^2+y^2)досить легко, часто потрібно певна різниця випадків при розрахунку кута , phiтому що arcsin, arccosа arctanй всі інші тригонометричні функції мають спільний домен, кожні тільки прольоти половини окружності.

У багатьох мовах є вбудовані для перетворення прямокутних у полярні координати або, принаймні, мають atan2функцію, яка - задано (x,y)- обчислює кут phi.

Завдання

Ваше завдання - написати програму / функцію, яка займає дві (плаваюча точка, а не обидві нульові) декартові координати (x,y), і виводить відповідний полярний кут phi, де phiмає бути в градусах, радіанах або класах (під класами я маю на увазі градіани, які дорівнюють 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°

Необхідна точність у радіо / градусах?
Луїс Мендо

Я б сказав точніше щодо точності машини, залежно від того, якою реалізацією ви користуєтеся (float / double /
what

Чи можемо ми прийняти вклад як єдине комплексне число?
Адам

Відповіді:


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))
Луїс Мендо

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)

Які одиниці? Будь ласка, введіть їх у свою відповідь.
Соломон Учко

Для чого ||0?
l4m2

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

Чи вважає помилку помилкою відповідь? Це здається дивним. Якщо правильна поведінка вже була визначена, виправлення помилок не має відношення. (Зрештою, хто знає, скільки інших відповідей ви зробили неконкурентоспроможними, виправляючи непомітний крайовий випадок?)
Маріо Карнейро

@MarioCarneiro На PPCG перекладач визначає мову . Це головним чином тому, що важко судити про наміри (а більшість езолангів насправді не мають стислої специфікації), тоді як ви не можете сперечатися з реалізацією. Зауважте, що зміна перекладача не впливає на обґрунтованість старих відповідей. Вони повинні працювати лише в якійсь опублікованій версії перекладача.
Денніс

Я маю на увазі, що ви, можливо, змінили поведінку старих відповідей на якийсь вклад, який тоді не намагався. Як PPCG обробляє погані тестові випадки, виявлені після факту?
Маріо Карнейро

Якщо тестових випадків виявиться недостатньо, додаються ще тестові справи. Рішення очікуються для всіх дійсних даних, а не лише для тестових випадків у питанні. Re: виправлення помилок. Мій перекладач видав лише неправильний знак для поділу на 0 ( -1÷0дав infзамість -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

Ідей це!


Вам треба виписати andі or?
flawr

Що ще я можу зробити?
Лина монашка

1
@flawr Python має лише andі or.
Денніс

2
pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2економить кілька байт.
Денніс

4
@flawr: побітний &оператор.
vaultah

2

APL (Dyalog Unicode) , 12 10 байт SBCS

-2 завдяки ngn.

Функція анонімного мовчазного виправлення. Використовує формулу алефалфи . Приймається xяк правий аргумент і yяк лівий аргумент. Результат у радіанах.

11○∘⍟0J1⊥,

Спробуйте в Інтернеті!

, об'єднати yіx

0J1⊥ Оцініть як базові i цифри (тобто y i ¹ + x i ⁰)

 природний логарифм того

 потім

11○ уявна частина цього


1

@ngn Дякую
Адам

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

Це розумна ідея! Чи можете ви додати приклад, як викликати цю функцію?
недолік

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 байт

Функція анонімного мовчазного виправлення. Використовує формулу алефалфи . Приймається 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.