İki nokta arasındaki açıyı bulun


13

İki puan verilir Ave Bhattından açısının bulunması, AOhattına BOnokta hakkında kökenli olduğu ( ). Ek olarak, açı, noktaların konumlarına bağlı olarak pozitif veya negatif olabilir (örneklere bakın). Girdi noktalar olacaktır ve herhangi bir uygun biçimde verilebilir. Çıktı derece cinsinden açı olacaktır (ancak alınacak orijin etrafında saat yönünün tersine döndürülmesi pozitif, saat yönünde döndürülmesi ise negatiftir). Açı 180 dereceyse, negatif veya pozitif çıktı döndürebilirsiniz. Benzer şekilde, açı aynı açının pozitif veya negatif versiyonu olabilir ( eşittir ). Örnekler:OO(0,0)ABAOBO90 deg-270 deg

  • Girdi: A(5,5) B(5,-5)Çıktı: -90( almak için derece AOdöndürülür ).-90BO

  • Girdi: A(5,-5) B(5,5)Çıktı: 90( almak için derece AOdöndürülür ).90BO

Bu , bayt en kısa kod kazanır!


11
Ne kadar hassasiyet gereklidir?
Reto Koradi

2
Girdiyi iki karmaşık sayı olarak alabilir miyiz?
lirtosiast

5
Bir nokta varsa çıktı ne olmalıdır (0,0)?
lirtosiast

1
@ThomasKwa Ben OP hakkında bilmiyorum, ama ben sadece tamsayı / ondalık sayı girişi olarak kabul, ve giriş asla (0,0) noktası olmazdı.
GamrCorps

2
İpucu: AOve arasındaki açıya BOgenellikle açı denir AOB.
ETHproductions

Yanıtlar:


12

Pyth, 11 bayt

.t-FPM.jMQ6

gösteri

Giriş şu biçimde verilir:

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

A'nın önce gelmesi istenirse, bu 1 bayt için değiştirilebilir.

Açıklama:

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

TI-83 + / 84 + serisi hesap makineleri için.

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

Bu programı kullanmak {x1,x2}için Ans değişkeninden ve {y1,y2}komut isteminden listeyi girin .


TI-BASIC komutu tek bir bayt mı?
corsiKa

Buradaki tüm komutlar ΔList(, her biri bir bayttır . Bu içerir R►Pθ(.
lirtosiast

+1 yalnızca hesap makinesi programlamasını kullanmak için. Lise günlerimde beni Trig ve Calculus'a geri götürüyor.
вʀaᴎᴅᴏƞ вєнᴎєƞ

Güzel referans! Süper havalı.
corsiKa

10

CJam, 14 bayt

q~::ma:-P/180*

Bu, [[Ax Ay] [Bx By]]STDIN'den girişi okuyan tam bir programdır .

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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
Bu programın neredeyse yarısının sadece
radyanı

@DarrelHoffman Pyth'de dönüşümün 6 yerine 3 bayt olduğunu daha da eğlenceli buluyorum, bu yüzden radyanlarda raporlamaya izin verilen zorluk bağlanırdı
FryAmTheEggman

5

Minkolang 0.9 , 112 bayt

Ben gerçekten artık yerleşik ins olarak açı fonksiyonları uygulamak istiyorum ... ama bu eğlenceliydi! (Dikkat: Bu, işaretli açı farkını değil, pozitif açı farkını verir. Sınırlarım göz önüne alındığında, bunun haklı olduğunu düşünüyorum.)

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.

Burada deneyin.

açıklama

Herkes isterse daha ayrıntılı bir açıklama gönderirim, ama bunun özü:

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 yorumları destekliyor mu? Benioku üzerinde bulamadım.
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Diğer 2D diller gibi - yorumlar program sayacı tarafından ulaşılmayan şeylerdir.
El'endia Starman

Oh, tamam o zaman. Bu mantıklı, ne düşündüğümü bilmiyorum.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ: Cevaplarınızdan birinde yorumları açıkça kullanmanız, benzer işlevleri uygulamayı düşünmemi sağlıyor. Bu güzel bir fikir ve benim için uygulamak çok zor olmayacaktı.
El'endia Starman

Teşekkürler! :D(Simplex için yaptığım yorumlayıcı FYI farklı "modlarında" çalışır: dize modu ve yorum modu: Bu yorumların ayrıştırılmasını kolaylaştırır ve birinin karakter karakterlerini yok saymanıza izin verir. modundayken.)
Conor O'Brien

4

Mathematica, 22 bayt

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

Misal:

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

Out[1]= -90.

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

Out[2]= 90.

Bu gibi girişler için çalışır mı{{0,1},{1,0}}
lirtosiast

@ThomasKwa Tabii ki olacak.
alephalpha

4

Javascript, 66 bayt

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

gösteri


23 saniye önce b = P Güzel golf olsa! Btw, atlayabilirsiniz let f=ve yine de anonim bir işlev olarak geçerli kabul edilir.
Mwr247

3

Julia 18 25 bayt

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

Bu, "herhangi bir uygun formun" zaten karmaşık sayılara izin verdiğini Ave Bverildiğini varsayar . Ardından, karmaşık sayı aritmetiği tüm ağır kaldırmayı yapar.

Düzenleme: snippet'i işleve dönüştürdü. 18 bayt sürümü yalnızca Julia REPL'de çalışır.


3

Python 2.7, 73 Bayt

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

Ölçek:

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

PPCG'ye Hoşgeldiniz! Bu kod golf, bu yüzden mümkün olduğunca çok sayıda alanı kaldırmak ve kodunuzu kısaltmak için çalışmalısınız.
mbomb007

1
Her yerde dikkatsizce bazı *s ekleyerek kodunuzu daha kısa yapabilirsiniz
FryAmTheEggman

3

Oktav, 43 bayt

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

Giriş çıkış:

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

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

3

CJam, 15 bayt

l~ma@@ma-P/180*

CJam oyununa da gireceğimi düşündüm. Çevrimiçi deneyin . Girdi şeklinde bx by ax ay. Ne yazık ki, bu sorunun Dennis'in cevabını kopyalamadan yapmanın en kısa yöntemi.


3

TeaScript, 28 bayt

Gerçekten trig fonksiyonlarını uygulamalıyım ...

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

Çevrimiçi deneyin giriş:a.x a.y b.x b.y

açıklama

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

2

Yakut, 64 , 58 bayt

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

kullanım

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

2

JavaScript, 49 bayt

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

Giriş şu şekilde alınır: [aY, aX], [bY, bX](ters x / y'ye dikkat edin)


1

Simpleks s.0.7 , 13 bayt

Eklediğim için memnunum mathrelations: D Maalesef, noktadan girdi alamıyorum. Böylece, her noktayı ayrı bir sayı olarak giriyorum (Ax, Ay, Bx, By). (Ben , bu bir kaynak olarak).

(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

Eğer (Ay, Axe, By, Bx) olarak girdi alabilir bir karakter kaydedebilirsiniz:

(iRi^fR)2LSo

1

C, 88 bayt

#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'nin yerleşik matematik sabitlerinin bir parçası olarak M_PItanımlanmaktan yararlanmak için GCC ile derlenmeyi gerektirir . Çevrimiçi deneyin - ideone GCC'yi (görünüşe göre) kullanmadığından, yeterli its rakamın doğru olması için birkaç bayt daha gereklidir.math.h


Ya da (çevrimiçi demoda) 45/atan(1)yerine 180/3.14159.....
CompuChip

@CompuChip Çevrimiçi demoyu maksimum golf oynamaya çalışmıyordum
Mego

Atanmış (balta) yuvarlak köşeli parantezleri kaldırabilirsiniz, ancak daha sonra dönüşten sonra bir boşluğa ihtiyacınız vardır, böylece sadece 1 bayt tasarruf sağlar. K&R stil işlevlerini kullanabiliyorsanız çift g (x, y, a, b) çift x, y, a, b; ayrıca altı bayt tasarruf sağlar.
Simyacı
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.