g o l f a t a n 2


18

Manchmal ist es wirklich schwierig, kartesische Koordinaten (x,y)in Polarkoordinaten umzuwandeln (r,phi). Während Sie berechnen können , r = sqrt(x^2+y^2)ganz einfach, Sie müssen oft einige Unterscheidung von Fällen , in denen die Winkelberechnungs phida arcsin, arccosund arctanalle anderen trigonometrischen Funktionen haben eine Co-Domäne , die jeweils nur Spannweiten Hälfte der Kreis.

In vielen Sprachen gibt es eingebaute Funktionen zur Umrechnung von Rechteckkoordinaten in Polarkoordinaten oder zumindest eine atan2Funktion, die - vorausgesetzt (x,y)- den Winkel berechnetphi .

Aufgabe

Ihre Aufgabe ist es, ein Programm / Funktion zu schreiben , die zwei (Gleitkomma-, nicht beid Nullen) hat kartesisch (x,y)und gibt den entsprechenden Polarwinkel phi, wobei phiin Grad Bogenmaß oder Noten werden (mit Qualitäten I mittlere Gon , die 1 sind / Je nachdem, was für Sie am bequemsten ist.

Der Winkel wird in positiver Orientierung gemessen und wir haben den Nullwinkel für (1,0).

Einzelheiten

Sie können nicht Einbauten verwenden, um den Winkel zu berechnen phigegebenen zwei Koordinaten, einschließlich atan2, rect2polar, argOfComplexNumberund ähnliche Funktionen. Sie können jedoch die üblichen trigonometrischen Funktionen und ihre Umkehrungen verwenden, die nur ein Argument enthalten. Beliebige Einheitensymbole sind optional.

Der Radius rdarf nicht negativ sein und phimuss im Bereich liegen [-360°, 360°](es spielt keine Rolle, ob Sie ausgeben 270°oder-90° ).

Beispiele

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°

Erforderliche Genauigkeit in Rad / Grad?
Luis Mendo

Ich würde sagen, genau über Maschinengenauigkeit, je nachdem, welche Implementierung Sie verwenden (float / double / was auch immer)
Fehler

Dürfen wir Eingaben als eine einzige komplexe Zahl annehmen?
Adám

Antworten:


9

MATL , 12 Bytes

yYy/X;0G0<?_

Das Ergebnis ist im Bogenmaß.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

MATL hat keine atanFunktion (es hat atan2, aber es kann nicht für diese Herausforderung verwendet werden). Also habe ich mich bedient 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

Hat matl wirklich keinen eingebauten absoluten Wert? In diesem Fall könnten Sie es wahrscheinlich als Ersatz verwenden 0<?_und ein paar Bytes sparen
Zwei

2
@ Zwei Es hat ( |). Aber hier bin ich zu ändern Vorzeichen des Ergebnisses basierend auf dem Vorzeichen des dem zweiten Eingang , y. Außerdem ykann 0ich nicht multiplizieren mity/abs(y))
Luis Mendo

5

JavaScript (ES6), 50 bis 40 Byte

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

Das Ergebnis ist im Bogenmaß. Bearbeiten: 10 Bytes gespeichert, als ich bemerkte, dass das Ergebnis zwischen -90 ° und 270 ° liegen darf. Vorherige Version mit -Math.PI<=result<Math.PI:

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

Welche Einheiten? Bitte tragen Sie sie in Ihre Antwort ein.
Solomon Ucko

Wofür ist das ||0?
14.

@ l4m2 Für den x=y=0Fall.
Neil


3

Javascript ES6, 54 Bytes

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

Verwendet Bogenmaß.


2

Jelly , 11 Bytes (nicht konkurrierend)

<0×ØP+÷@ÆṬ¥

Die Ausgabe erfolgt im Bogenmaß. Leider hatte Jelly einen Zeichenfehler in der Atomdivision, weshalb diese Antwort aufgrund der erforderlichen Fehlerbehebung nicht konkurrierend war.

Probieren Sie es online! oder überprüfen Sie alle Testfälle (umgerechnet in Grad).

Wie es funktioniert

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

Gilt das Beheben von Fehlern, wenn eine Antwort nicht konkurrierend ist? Das scheint merkwürdig. Wenn das korrekte Verhalten bereits beschrieben wurde, sollte der Bugfix nicht in Beziehung stehen. (Schließlich, wer weiß, wie viele andere Antworten Sie nicht konkurrierend gemacht haben, indem Sie einen unbemerkten Rand-Fall repariert haben?)
Mario Carneiro

@MarioCarneiro Bei PPCG definiert der Interpreter die Sprache . Dies liegt hauptsächlich daran, dass es schwierig ist, Absichten zu beurteilen (und die meisten Esolangs haben keine genauen Spezifikationen), während Sie sich nicht mit einer Implementierung auseinandersetzen können. Beachten Sie, dass das Ändern des Interpreters keine Auswirkungen auf die Gültigkeit älterer Antworten hat. Sie müssen nur in einer veröffentlichten Version des Interpreters arbeiten.
Dennis

Ich meine, Sie haben möglicherweise das Verhalten älterer Antworten bei einigen Eingaben geändert, die zu diesem Zeitpunkt nicht versucht wurden. Wie geht PPCG mit schlechten Testfällen um, die nachträglich entdeckt wurden?
Mario Carneiro

Wenn sich Testfälle als unzureichend herausstellen, werden weitere Testfälle hinzugefügt. Lösungen werden für alle gültigen Eingaben erwartet, nicht nur für die in Frage kommenden Testfälle. Re: Bugfix. Mein Dolmetscher nur das falsche Zeichen für die Division durch produziert 0 ( -1÷0gab infstatt -inf), so ist es unwahrscheinlich , die meisten Herausforderungen beeinflussen.
Dennis

2

Python 3, 75 67 Bytes

8 Bytes dank Dennis.

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

Ideone es!


Müssen Sie schreiben andund or?
Fehler

Was kann ich sonst noch tun?
Undichte Nonne

1
@flawr Python hat nur andund or.
Dennis

2
pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2spart ein paar Bytes.
Dennis

4
@flawr: &ist ein bitweiser Operator.
Gewölbe

2

APL (Dyalog Unicode) , 12 10 Byte SBCS

-2 danke an ngn.

Anonyme stillschweigende Infix-Funktion. Verwendet die Formel von Alephalpha . Nimmt xals rechtes Argument und yals linkes Argument. Ergebnis ist im Bogenmaß.

11○∘⍟0J1⊥,

Probieren Sie es online!

, verketten die yundx

0J1⊥ Werten Sie als Basis i Ziffern aus (dh y i ¹ + x i ⁰)

 natürlicher Logarithmus davon

 dann

11○ Imaginärteil davon


1
3.

@ngn Danke.
Adám

11○∘⍟->12○
ngn

@ngn Sie dürfen nicht verwenden ...argOfComplexNumber
Adám

oh ... ich
verstehe

1

Mathematica, 16 Bytes

Ich bin mir nicht sicher, ob Loges sich um ein eingebautes Gerät handelt, das den Winkel bei zwei Koordinaten berechnet.

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

Beispiel:

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

Das ist eine clevere Idee! Könnten Sie ein Beispiel hinzufügen, wie diese Funktion aufgerufen wird?
Fehler

1

x86-Maschinensprache (32-Bit-Linux), 25 bis 13 Byte (nicht konkurrierend)

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

Um zu versuchen , es online , kompilieren Sie das folgende C - Programm (nicht vergessen -m32Flagge auf 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 Bytes

Anonyme stillschweigende Infix-Funktion. Verwendet die Formel von Alephalpha . Nimmt xals linkes Argument und yals rechtes Argument. Ergebnis ist im Bogenmaß.

11 o.^.@j.

Probieren Sie es online!

j. berechne x+ y× i

@ dann

^. natürlicher Logarithmus davon

11 o. Imaginärteil davon




0

Python 3, 65 Bytes

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

Dies gibt Bogenmaß in dem Bereich aus [-π/2, 3π/2), der [-90, 270)Grad entspricht.


0

Axiom, 58 Bytes

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

test (ich benutze nur acos () es gibt strahlen zurück)

(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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.