g o l f a t a n 2


18

Bazen Kartezyen koordinatları (x,y)Kutupsal koordinatlara dönüştürmek gerçekten bir mücadeledir (r,phi). Hesaplayabileceğiniz iken r = sqrt(x^2+y^2)oldukça kolay açısını hesaplarken, genellikle vakaların bazı ayrım ihtiyaç phinedeniyle arcsin, arccosve arctandiğer tüm trigonometrik fonksiyonlar eş domain her biri sadece açıklıklı buna sahip yarım daire.

Birçok dilde, dikdörtgeni kutupsal koordinatlara dönüştürmek veya en azından açıyı hesaplayan bir atan2işleve sahip olmak için yerleşikler vardır .(x,y)phi

Görev

Görev iki (kayan nokta değil, her ikisi birden) Kartezyen koordinatları alan bir programı / fonksiyonu yazmak için (x,y)ve karşılık gelen kutup açısı verir phi, phiile (derece, radyan ya da dereceleri olmak zorundadır sınıflar I ortalama Gradians şunlardır: 1 / Tam dairenin 400'ü), hangisi sizin için daha uygunsa.

Açı pozitif yönde ölçülür ve sıfır açısına sahibiz (1,0).

ayrıntılar

Sen açısını hesaplamak yerleşik ins kullanamaz phiolmak üzere iki koordinatları verilen atan2, rect2polar, argOfComplexNumberve benzeri fonksiyonlar. Bununla birlikte, sadece bir argüman alan olağan trigonometrik fonksiyonları ve bunların terslerini kullanabilirsiniz. Herhangi bir birim sembolü isteğe bağlıdır.

Yarıçap rnegatif phiolmamalı ve aralıkta olmalıdır [-360°, 360°](çıktı almanız 270°veya-90° ).

Örnekler

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°

Çubuk / derece cinsinden gerekli hassasiyet?
Luis Mendo


Girişi tek bir karmaşık sayı olarak alabilir miyiz?
Adám

Yanıtlar:


9

MATL , 12 bayt

yYy/X;0G0<?_

Sonuç radyan cinsindendir.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

MATL'nin bir atanişlevi yoktur (vardır atan2, ancak bu meydan okuma için kullanılamaz). Bu yüzden başvurdum 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'nin yerleşik mutlak değeri yok mu? Eğer öyleyse, muhtemelen 0<?_birkaç bayt tıraş ederek değiştirmek için kullanabilirsiniz
Zwei

2
@Zwei ( |) sahiptir. Ama burada ben işareti dayalı sonucun işareti değiştiriyorum ikinci girişi , y. Ayrıca, yolabilir 0, bu yüzden y/abs(y))
çarpamam

5

JavaScript (ES6), 50 40 bayt

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

Sonuç radyan cinsindendir. Düzenleme: Sonucun -90 ° ile 270 ° arasında olmasına izin verildiğini fark ettiğimde 10 bayt kaydedildi. Önceki sürüm -Math.PI<=result<Math.PI:

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

Hangi birimler? Lütfen bunları cevabınıza koyun.
Solomon Ucko

Ne ||0için?
l4m2

@ l4m2 Durum için x=y=0.
Neil



2

Jöle , 11 bayt (rakip olmayan)

<0×ØP+÷@ÆṬ¥

Çıktı radyan cinsindendir. Ne yazık ki, Jelly'in bölüm atomlarında bir işaret hatası vardı, bu da gerekli hata düzeltmesi nedeniyle bu cevabı rakipsiz hale getirdi.

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın (dereceye dönüştürülmüş).

Nasıl çalışır

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

Hata düzeltme, bir cevabı rakipsiz sayıyor mu? Tuhaf görünüyor. Doğru davranış zaten belirtilmişse, hata düzeltmesinin ilgisiz olması gerekir. (Sonuçta, fark edilmemiş bir kenar davasını düzelterek rekabet etmediğiniz başka kaç cevabı kim bilir?)
Mario Carneiro

@MarioCarneiro PPCG'de yorumlayıcı dili tanımlar . Bunun nedeni, bir uygulama ile tartışamazken, niyetleri yargılamanın zor olmasıdır (ve çoğu esolangın gerçekten özlü bir spesifikasyonu yoktur). Tercümanı değiştirmenin eski yanıtların geçerliliğini etkilemediğini unutmayın. Sadece tercümanın yayınlanmış bazı versiyonlarında çalışmak zorundadırlar.
Dennis

Demek istediğim, o anda denenmeyen bazı girdilerdeki eski yanıtların davranışını değiştirmiş olabilirsiniz. PPCG, olaydan sonra bulunan kötü test vakalarını nasıl ele alıyor?
Mario Carneiro

Test senaryolarının yetersiz olduğu kanıtlanırsa, daha fazla test vakası eklenir. Sadece söz konusu test senaryoları için değil, tüm geçerli girdiler için çözüm beklenmektedir. Re: hata düzeltme. Yorumcum sadece 0 yerine bölme için yanlış işaret üretti ( bunun yerine -1÷0verdi ), bu yüzden çoğu zorluğu etkilemesi pek mümkün değil. inf-inf
Dennis

2

Python 3, 75 67 bayt

Dennis sayesinde 8 bayt.

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

Boşver!


Yazmak zorunda mısın andve or?
Kusur

Başka ne yapabilirim?
Sızan Rahibe

1
@flawr Python'da sadece andve vardır or.
Dennis

2
pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2birkaç bayt kaydeder.
Dennis

4
@flawr: &bitsel bir operatördür.
vaultah

2

APL (Dyalog Unicode) , 12 10 bayt SBCS

-2 sayesinde teşekkürler.

Anonim zımni infix fonksiyonu. Alephalpha'nın formülünü kullanır . Alır xsağ argüman olarak ve ysol argümanı. Sonuç radyan cinsindendir.

11○∘⍟0J1⊥,

Çevrimiçi deneyin!

, birleştirmek yvex

0J1⊥ Temel i basamakları olarak değerlendirin (örn. Y i ¹ + x i ⁰)

 bunun doğal logaritması

 sonra

11○ bunun hayali kısmı



@ngn Teşekkür ederim.
Adám

11○∘⍟->12○
ngn

@ngn Kullanamazsınız argOfComplexNumber
Adám

oh ... anlıyorum, üzgünüm
ngn

1

Mathematica, 16 bayt

Logİki koordinat verilen açıyı hesaplayan yerleşik olarak kabul edilip edilmediğinden emin değilim .

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

Misal:

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

Bu akıllıca bir fikir! Bu işlevi nasıl arayacağınıza bir örnek ekleyebilir misiniz?
flawr

1

x86 makine dili (32 bit Linux), 25 13 bayt (rakipsiz)

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

İçin çevrimiçi denemek aşağıdaki C programı derlemek, (unutma -m32x86_64'lerde bayrağı)

#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 bayt

Anonim zımni infix fonksiyonu. Alephalpha'nın formülünü kullanır . Alır xsol argüman olarak ve ysağ argüman olarak. Sonuç radyan cinsindendir.

11 o.^.@j.

Çevrimiçi deneyin!

j. hesapla x+ y× i

@ sonra

^. bunun doğal logaritması

11 o. bunun hayali kısmı




0

Python 3, 65 bayt

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

Bu [-π/2, 3π/2), [-90, 270)dereceye eşdeğer aralıktaki radyanları çıkarır .


0

Aksiyom, 58 bayt

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

test (sadece radyan döndüren acos () kullanıyorum)

(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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.