Знайдіть кут між двома точками


13

Дано дві точки Aі B, знайдіть кут від прямої AOдо лінії BOпро точку, Oде Oпоходження ( (0,0)). Крім того, кут може бути позитивним чи негативним залежно від позицій точок (див. Приклади). Вхідні дані будуть балами Aта Bможуть бути подані у будь-якій зручній формі. Вихідним буде кут у градусах (але він позитивний, якщо AOйого повернути проти годинникової стрілки щодо початку, щоб отримати, BOі негативним, якщо повернути його за годинниковою стрілкою). Якщо кут становить 180 градусів, ви можете повернути негативний чи позитивний вихід. Аналогічно, кут може бути позитивним або негативним варіантом того ж кута ( 90 degдорівнює -270 deg). Приклади:

  • Вхід: A(5,5) B(5,-5)Вихід: -90( AOповертається на -90градуси для отримання BO).

  • Вхід: A(5,-5) B(5,5)Вихід: 90( AOповертається на 90градуси для отримання BO).

Це , тому найкоротший код у байтах виграє!


11
Яка точність потрібна?
Рето Коради

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

5
Яким повинен бути результат, якщо одна точка (0,0)?
lirtosiast

1
@ThomasKwa Я не знаю про ОП, але я вважав це лише введенням цілого чи десяткового числа, і вхід ніколи не матиме (0,0) точки.
GamrCorps

2
Підказка: кут між AOі BOзазвичай називається кутом AOB.
ETHproductions

Відповіді:


12

Pyth, 11 байт

.t-FPM.jMQ6

Демонстрація

Введення подано у форматі:

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

Якщо бажано, щоб A вийшов першим, це можна змінити на 1 байт.

Пояснення:

.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

22

TI-BASIC, 13 байт

Для калькуляторів серії TI-83 + / 84 +.

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

Щоб скористатися цією програмою, введіть список {x1,x2}через змінну Ans і {y1,y2}під запитом.


Чи є команда TI-BASIC єдиним байтом?
corsiKa

Всі команди тут, за винятком того ΔList(, є один байт кожен. Сюди входить R►Pθ(.
lirtosiast

+1 лише для використання програмування калькулятора. Повертає мене до Тріга та Числення в мої середньошкільні дні.
вʀаᴎᴅᴏƞ вєнᴎєƞ

Приємна довідка! Супер круто.
corsiKa

10

CJam, 14 байт

q~::ma:-P/180*

Це повна програма, яка читає вхідні дані [[Ax Ay] [Bx By]]від STDIN.

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

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.

5
Забавно, що майже половина цієї програми просто перетворює радіани в градуси ...
Даррел Гофман

@DarrelHoffman Мені здається, що це ще більше забавно, що в Pyth конверсія становить 3 байти замість 6, тому якщо виклик, дозволений для звітування в радіанах, мови будуть пов'язані
FryAmTheEggman

5

Міньколанг 0,9 , 112 байт

Мені дуже хочеться реалізувати функції триггера як вбудовані зараз ... але це було весело! (Caveat: це дає позитивну різницю кутів, а не підписану різницю кутів. Враховуючи мої обмеження, я думаю, що це виправдано.)

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.

Спробуйте тут.

Пояснення

Я опублікую більш повне пояснення, якщо хтось цього хоче, але суть його:

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.

Чи підтримує minkolang коментарі? Я не зміг його знайти в режимі readme.
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Так само, як і в інших двовимірних мовах - коментарі не досягаються лічильником програми.
El'endia Starman

О, добре, значить. Це має сенс, не знаю, що я думав.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ: Однак явне використання коментарів в одній з ваших відповідей змушує мене реалізувати подібну функціональність. Це ідеальна ідея, і мені не було б дуже важко реалізувати.
El'endia Starman

Спасибі! :DЦе виклик Hello World, який ви помітили в коментарях (FYI - інтерпретатор, який я зробив для Simplex, працює в різних "режимах": рядковому режимі та режимі коментарів. Це робить його дуже просто для розбору та дозволяє ігнорувати символи сигналу одного режим, в той час як в іншому.)
Conor O'Brien

4

Математика, 22 байти

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

Приклад:

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

Out[1]= -90.

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

Out[2]= 90.

Чи працюватиме це для таких входів, як{{0,1},{1,0}}
lirtosiast

@ThomasKwa Звичайно, так і буде.
алефальфа

4

Javascript, 66 байт

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

демонстрація


За 23 секунди до мене = Хороший гольф! До речі, ви можете опустити цю функцію let f=, і вона як і раніше вважається дійсною як анонімна функція.
Mwr247

3

Джулія, 18 25 байт

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

Це передбачає, що "будь-яка зручна форма" вже дозволяє Aі Bнадаватись як складні числа. Тоді комплексна арифметика чисел робить усі важкі підйоми.

Редагувати: перетворений фрагмент у функцію. 18-байтна версія працює лише в системі REPL-версія Julia.


3

Python 2.7, 73 байт

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

Тест:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0

Ласкаво просимо до PPCG! Це код-гольф, тому вам слід спробувати видалити якомога більше пробілів і скоротити код.
mbomb007

1
Ви можете скоротити свій код, нерозумно додаючи повсюди деякі *s
FryAmTheEggman

3

Октава, 43 байти

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

Введення-виведення:

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

octave:41> f([1,0],[0,1])
ans = 90

3

CJam, 15 байт

l~ma@@ma-P/180*

Думав, що я потрапляю і в гру CJam. Спробуйте в Інтернеті . Введення здійснюється у формі bx by ax ay. На жаль, це найкоротший метод вирішити цей виклик без копіювання відповіді Денніса.


3

TeaScript, 28 байт

Я дійсно повинен реалізувати триггерні функції ...

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

Спробуйте це введення в Інтернетa.x a.y b.x b.y

Пояснення

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

2

Рубі, 64 , 58 байт

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

Використання

a.call [[5, 5], [5, -5]] # => -90.0
a.call [[5, -5], [5, 5]] # => 90.0

2

JavaScript, 49 байт

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

Введення приймається у формі: [aY, aX], [bY, bX](зверніть увагу на зворотний х / у)


1

Simplex v.0.7 , 13 байт

Я радий, що додав mathrelations: D На жаль, не можу взяти точне введення. Отже, я ввожу кожну точку як окреме число (Ax, Ay, Bx, By). (Я використовував це як ресурс.)

(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

Я можу зберегти знак, якщо я можу взяти дані як (Ay, Axe, By, Bx):

(iRi^fR)2LSo

1

C, 88 байт

#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;}

Вимагає компілювання з GCC, щоб скористатися M_PIтим, що його визначають math.hяк частину вбудованих математичних констант GCC . Спробуйте в Інтернеті - оскільки ideone не використовує GCC (мабуть), потрібно кілька додаткових байтів, щоб достатньо точних цифр π.


Або 45/atan(1)замість 180/3.14159....(у демонстрації в Інтернеті).
CompuChip

@CompuChip Я не намагався зробити онлайн-демонстрацію максимально гольф
Mego

Ви можете зняти дужки навколо atan2 (by, ax), хоча після повернення вам знадобиться пробіл, щоб зберегти лише 1 байт. Якщо ви можете використовувати функції стилю K&R, тоді подвійні g (x, y, a, b) подвійні x, y, a, b; також зберігає шість байтів.
Алхімік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.