Znajdź kąt między dwoma punktami

13

Biorąc pod uwagę dwa punkty Ai B, znajdź kąt od linii AOdo linii BOwokół punktu, z Októrego Opochodzi początek ( (0,0)). Dodatkowo kąt może być dodatni lub ujemny w zależności od położenia punktów (patrz przykłady). Dane wejściowe będą punktami Ai Bmogą być podane w dowolnej dogodnej formie. Wyjściowy będzie kąt w stopniach (ale jest dodatni, jeśli AOzostanie obrócony przeciwnie do ruchu wskazówek zegara wokół początku, BOa ujemny, jeśli zostanie obrócony zgodnie z ruchem wskazówek zegara). Jeśli kąt wynosi 180 stopni, możesz zwrócić wynik ujemny lub dodatni. Podobnie, kąt może być dodatnią lub ujemną wersją tego samego kąta ( 90 degjest równy -270 deg). Przykłady:

  • Dane wejściowe: Dane A(5,5) B(5,-5)wyjściowe: -90( aby uzyskać stopnie AOobrotu ).-90BO

  • Dane wejściowe: Dane A(5,-5) B(5,5)wyjściowe: 90( aby uzyskać stopnie AOobrotu ).90BO

To jest , więc wygrywa najkrótszy kod w bajtach!

Alien G.
źródło
11
Jaka dokładność jest wymagana?
Reto Koradi
2
Czy możemy brać dane wejściowe jako dwie liczby zespolone?
lirtosiast
5
Jaki powinien być wynik, jeśli jest jeden punkt (0,0)?
lirtosiast
1
@ThomasKwa Nie wiem o OP, ale potraktowałem to tylko jako liczbę całkowitą / dziesiętną, a dane wejściowe nigdy nie miałyby punktu (0,0).
GamrCorps
2
Wskazówka: kąt pomiędzy AOi BObyłby zwykle nazywany kątem AOB.
ETHprodukcje

Odpowiedzi:

12

Pyth, 11 bajtów

.t-FPM.jMQ6

Demonstracja

Dane wejściowe są podawane w formacie:

[[Bx, By], [Ax, Ay]]

Jeśli pożądane jest, aby A był pierwszy, można to zmienić na 1 bajt.

Wyjaśnienie:

.t-FPM.jMQ6
               Implicit: Q = eval(input())
      .jMQ     Convert input pairs to complex numbers.
    PM         Take their phases (angles in the complex plane).
  -F           Take the difference.
.t        6    Convert to degrees
isaacg
źródło
22

TI-BASIC, 13 bajtów

Do kalkulatorów serii TI-83 + / 84 +.

Degree
Input Y
min(ΔList(R►Pθ(Ans,∟Y

Aby użyć tego programu, wprowadź listę {x1,x2}za pomocą zmiennej Ans i {y1,y2}po monicie.

lirtosiast
źródło
Czy polecenie TI-BASIC jest pojedynczym bajtem?
corsiKa
Wszystkie polecenia tutaj, z wyjątkiem ΔList(, to jeden bajt każda. Obejmuje to R►Pθ(.
lirtosiast
+1 za użycie programowania kalkulatora. W czasach licealnych zabiera mnie z powrotem do Triga i Calculusa.
Wideo od
Niezłe referencje! Super fajne.
corsiKa
10

CJam, 14 bajtów

q~::ma:-P/180*

Jest to pełny program, który odczytuje dane wejściowe [[Ax Ay] [Bx By]]z STDIN.

Wypróbuj online w interpretatorze CJam .

Jak to działa

q~             e# Read and evaluate all input.
  ::ma         e# Replace each point (x, y) with atan2(x, y).
               e# This returns its angle with the positive y axis, measured clockwise.
      :-       e# Compute the difference of the two resulting angles.
               e# This returns the angle between the points, measured counter-clockwise.
        P/180* e# Divide by Pi and multiply by 180 to convert to degrees.
Dennis
źródło
5
Zabawne, że prawie połowa tego programu to tylko konwersja radianów na stopnie ...
Darrel Hoffman,
@DarrelHoffman Uważam za jeszcze bardziej zabawne, że w Pyth konwersja ma 3 bajty zamiast 6, więc jeśli wyzwanie pozwoli na raportowanie w radianach, języki zostaną powiązane
FryAmTheEggman
5

Minkolang 0,9 , 112 bajtów

I naprawdę chcą wprowadzić parametrów wyzwalania funkcje jak obecnie budowanych-ins ... ale to była zabawa! (Zastrzeżenie: generuje to dodatnią różnicę kąta, a nie różnicę kąta ze znakiem. Biorąc pod uwagę moje ograniczenia, myślę, że jest to uzasadnione.)

4[n]0c2c*1c3c*+r4[2;1R]r+1R+0g*12$:;$:8[0ci2*3+d1R;0g$:1i1+[i2*1+d1+$:*]*]$+'3.141592654'25*9;$:$:12$:r-66*5**N.

Wypróbuj tutaj.

Wyjaśnienie

Jeśli ktoś tego chce, opublikuję pełniejsze wyjaśnienie, ale jego sedno brzmi:

4[n]                                    Take in 4 integers from input
0c2c*1c3c*+                             dot product
r4[2;1R]r+1R+0g*12$:;                   magnitudes of vectors
$:                                      dot product divided by magnitudes (z)
8[0ci2*3+d1R;0g$:1i1+             *]    Taylor series for arccos
                     [i2*1+d1+$:*]      In particular, the coefficient (1/2 * 3/4 * ...)
$+                                      Add them all up!
'3.141592654'25*9;$:$:                  Divide by pi for converting to degrees
12$:r-                                  Subtract from 1/2 - I now have arccos(z)
66*5**                                  Convert to degrees
N.                                      Output as number and stop.
El'endia Starman
źródło
Czy minkolang obsługuje komentarze? Nie mogłem tego znaleźć w pliku readme.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: To tak jak inne języki 2D - komentarze są tym, czego nie osiągnie licznik programu.
El'endia Starman
W takim razie dobrze. To ma sens, nie wiem o czym myślałem.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Twoje wyraźne użycie komentarzy w jednej z odpowiedzi skłania mnie do rozważenia wprowadzenia podobnej funkcjonalności. To fajny pomysł i nie byłoby dla mnie strasznie trudne do wdrożenia.
El'endia Starman
Dzięki! :DCzy było to wyzwanie Hello World, w którym zauważyłeś komentarze (FYI interpreter, który stworzyłem dla Simplex, działa w różnych „trybach”: trybie łańcuchowym i trybie komentowania. Ułatwia to parsowanie i pozwala zignorować znaki jednego z nich tryb, podczas gdy w drugim.)
Conor O'Brien
4

Mathematica, 22 bajty

{-1,1.}.ArcTan@@@#/°&

Przykład:

In[1]:= {-1,1.}.ArcTan@@@#/°&[{{5,5},{5,-5}}]

Out[1]= -90.

In[2]:= {-1,1.}.ArcTan@@@#/°&[{{5,-5},{5,5}}]

Out[2]= 90.
alephalpha
źródło
Czy to zadziała dla danych wejściowych takich jak{{0,1},{1,0}}
lirtosiast
@ThomasKwa Oczywiście, że tak.
alephalpha
4

JavaScript, 66 bajtów

let f=(a,b)=>(Math.atan2(b.y,b.x)-Math.atan2(a.y,a.x))*180/Math.PI;

próbny

lecoco
źródło
23 sekundy przede mną = P Niezły golf! Przy okazji możesz pominąć let f=i nadal jest uważany za prawidłowy jako funkcja anonimowa.
Mwr247,
3

Julia, 18 25 bajtów

f(A,B)=angle(B/A)/pi*180

Zakłada się, że „jakakolwiek dogodna forma” już pozwala Ai Bmoże być podawana jako liczby zespolone. Następnie arytmetyka liczb zespolonych wykonuje wszystkie ciężkie podnoszenie.

Edycja: przekonwertowany fragment kodu na funkcję. Wersja 18-bajtowa działa tylko w Julia REPL.

ojdo
źródło
3

Python 2.7, 73 bajtów

from math import*
f=lambda A,B:degrees(atan2(B[1],B[0])-atan2(A[1],A[0]))

Test:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0
Aetienne Sardon
źródło
Witamy w PPCG! To jest golf golfowy, więc powinieneś spróbować usunąć jak najwięcej spacji i skrócić swój kod.
mbomb007,
1
Można dokonać kod krótszy o lekkomyślnie dodając niektóre *s wszędzie
FryAmTheEggman
3

Oktawa, 43 bajty

f=@(a,b)(cart2pol(b)-cart2pol(a))(1)*180/pi

Wejście wyjście:

octave:40> f([5,5],[5,-5])
ans = -90

octave:41> f([1,0],[0,1])
ans = 90
dcsohl
źródło
3

CJam, 15 bajtów

l~ma@@ma-P/180*

Myślałem, że wezmę również udział w grze CJam. Wypróbuj online . Dane wejściowe mają postać bx by ax ay. Niestety jest to najkrótsza metoda wykonania tego wyzwania bez kopiowania odpowiedzi Dennisa.

GamrCorps
źródło
3

TeaScript, 28 bajtów

Naprawdę powinienem zaimplementować funkcje trig ...

$.atan2(_[3]-y,z-x)*180/$.PI

Wypróbuj Internecie wejściowya.x a.y b.x b.y

Wyjaśnienie

$.atan2(       // Arc Tangent of...
    _[3] - y,  // 4th input - 2nd input
       z - x,  // 3rd input - 1st input
) * 180 / $.PI // Converts rad -> deg
Downgoat
źródło
2

Rubinowy, 64 , 58 bajtów

a=->(b){b.map{|c|Math.atan2(*c)}.reduce(:-)*180/Math::PI}

Stosowanie

a.call [[5, 5], [5, -5]] # => -90.0
a.call [[5, -5], [5, 5]] # => 90.0
Ostra Gupta
źródło
2

JavaScript, 49 bajtów

(a,b)=>((c=Math.atan2)(...b)-c(...a))/Math.PI*180

Dane wejściowe są pobierane w postaci: [aY, aX], [bY, bX](zauważ odwrócone x / y)

Mwr247
źródło
1

Simplex v.0.7 , 13 bajtów

Cieszę się, że dodałem mathrelations: D Niestety, nie mogę pobierać danych punktowych. Tak więc wpisuję każdy punkt jako osobną liczbę (Ax, Ay, Bx, By). (Użyłem tego jako zasobu.)

(iRi~^fR)2LSo
(       )2    ~~ repeat inner twice
 iRi          ~~ take two chars of input (x,y)
    ~         ~~ switch top 2 on stack
     ^f       ~~ apply atan2 on (y,x)
       R      ~~ go right
          L   ~~ go left
           S  ~~ subtract result
            o ~~ output as number

Mogę zapisać znak, jeśli mogę wziąć dane wejściowe jako (Ay, Axe, By, Bx):

(iRi^fR)2LSo
Conor O'Brien
źródło
1

C, 88 bajtów

#include<math.h>
typedef double d;d g(d x,d y,d a,d b){return atan2(b-y,a-x)*180/M_PI;}

Wymaga kompilacji z GCC, aby skorzystać z M_PIdefinicji zdefiniowanej math.hjako część wbudowanych stałych matematycznych GCC . Wypróbuj online - ponieważ ideone nie używa GCC (najwyraźniej), potrzeba kilku dodatkowych bajtów, aby wystarczająca liczba cyfr π była dokładna.

Mego
źródło
Lub 45/atan(1)zamiast 180/3.14159....(w wersji online).
CompuChip
@CompuChip Nie próbowałem, aby demo online było jak najbardziej golfem
Mego
Możesz usunąć nawiasy okrągłe atan2 (by, ax), chociaż po powrocie potrzebujesz spacji, aby zaoszczędzić tylko 1 bajt. Jeśli możesz użyć funkcji stylu K&R, to podwójnie g (x, y, a, b) podwójnie x, y, a, b; zapisuje również sześć bajtów.
Alchymist