Znajdź kąt odniesienia


17

To dość proste pytanie. Według tej przypadkowej witryny, którą znalazłem - Web Archive , kątem odniesienia jest to, the acute angle formed by the terminal side of the given angle and the x-axis.że musisz napisać program, aby je znaleźć.

Nic nie pamiętam z algebry 2, co to znaczy?

Kąty są zwykle podawane w standardowej formie , którą mierzy się, umieszczając jedną stronę kąta i mierząc drugą stronę, przeciwnie do ruchu wskazówek zegara, tak:

Forma standardowa

To będzie twój wkład. Twój wynik będzie kątem odniesienia tego. Można to uznać za zasadniczo najmniejszą odległość od strony końcówki do osi X. Tyle że to kąt, a nie odległość. Oto kilka przykładów:

Quad 2 ref Quad 1 ref

Quad 3 ref Quad 4 ref

Wyjaśnienia

  • Wszystkie wartości domyślne dotyczące danych wejściowych i przesyłanych.
  • Kąty są w stopniach .
  • Dozwolone kąty ujemne, kąty inne niż całkowite oraz kąty> 360 stopni .
  • Dane wyjściowe w formie 60 deg.
  • To jest , więc wygrywa najkrótszy kod w bajtach!

Kolejny pomocny link .

Przypadki testowe

70      ->  70 deg
135     ->  45 deg
210     ->  30 deg
-60     ->  60 deg
91      ->  89 deg
610     ->  70 deg
-1000   ->  80 deg

1
Co robimy na wejściu 90?
lirtosiast

2
@ThomasKwa byłoby 90 z obu kierunków.
Maltysen

1
Krótkim rozwiązaniem jest abs(arcsin(sin(input)))+" deg", choć nie wiem, który język by wygrał (musiałby obsługiwać stopnie i operacje na łańcuchach).
lirtosiast

Czy wejście jest zawsze liczbą całkowitą?
lirtosiast

6
Ponieważ dozwolone są kąty inne niż całkowite, należy uwzględnić jeden w przypadkach testowych.
Dennis

Odpowiedzi:




5

Python 2, 34 bajty

lambda x:`90-abs(x%180-90)`+' deg'

Korzystanie z "%d deg"formatowania ciągów byłoby dłuższe z powodu wymaganych nawiasów.



4

dc, 25

90?90+d*v180%-d*vn[ deg]p

Uwaga dcużywa _znaku -ve zamiast -.

Wyjście testowe:

$ for test in 70 135 210 _60 91 610 _1000; do dc -e'90?90+d*v180%-d*vn[ deg]p' <<< $test ; done
70 deg
45 deg
30 deg
60 deg
89 deg
70 deg
80 deg
$

3

Mathematica, 22 31

ToString@Abs@Mod[#,180,-90]deg&

1
@ LegionMammal978 Jeżeli po prostu pomnożyć przez deg, 0 degbędzie stać 0.
alephalpha

1
Ponieważ nie obchodzi Cię typ wyjścia, możesz zapisać 2 bajty w następujący sposób:Row@{Abs@Mod[#,180,-90],deg}&
LegionMammal978

3

Python 2, 35

lambda x:`min(x%180,-x%180)`+' deg'

Mniejszy kąt i jego ujemny moduł 180 . Skutecznie konwertuje kąt do zakresu od 0 do 180 i przenosi odległość do bliższych punktów końcowych. Pamiętaj, że -x%180grupy jako (-x)%180.

Ta sama długość z formatowaniem ciągów w Pythonie 3:

lambda x:'%d deg'%min(x%180,-x%180)

3

Pyt 25 30 bajtów

Bolesnie nietwórcze rozwiązanie, wykorzystujące funkcje triggera. Permalink

+.R.t.a.t.t.tQ7Z3 6?%Q1Q0" deg

Wszelkie sugestie są mile widziane.


1
Sprowadziłem go do 28, przyjmując .ttelefony i składając je:+.R.t.a.tF[Q7Z3)6?%Q1Q0" deg
Maltysen,

Schludny. Zauważyłem, że nie działa z wejściem zmiennoprzecinkowym: 90.5 => 90.0 degjednak.
Winny,

To dlatego, że twoje też nie: pyth.herokuapp.com/…
Maltysen

Ciekawy haczyk. Z wejściem, -60.5 => 60.5 degale z 60.5 => 60.0 deg. Wygląda na problem z Pyth - Przykład użycia pyth / macros.py
Winny

1

JavaScript (ES6), 43 bajty

Podobne do odpowiedzi Sp3000 , chociaż moduł jest dość długi ze względu na zachowanie w JavaScript .

f=x=>90-Math.abs((x%180+180)%180-90)+' deg'

Próbny

Kod został przepisany w ES5 w celu zapewnienia zgodności z przeglądarkami:

function f(x){return 90-Math.abs((x%180+180)%180-90)+' deg'}

// Snippet stuff
console.log = function(x){document.body.innerHTML += x + '<br>'};
[70,135,210,-60,91,610,-1000].map(function(v){console.log(f(v))});

CoffeeScript, 45 bajtów

f=(x)->90-Math.abs((x%180+180)%180-90)+' deg'

5
Zakładam, że była to decyzja projektowa inżyniera sprzętu PDP, który jest odpowiedzialny za fakt, że kilkadziesiąt lat później wciąż mamy bardzo mało języków, które %rozsądnie się implementują .
Peter Taylor,

Zastąpienie pierwszych 180 z (t=180)następnie zastąpieniem kolejnych 180 z t prawdopodobnie zaoszczędziłoby kilka bajtów
Downgoat

@ vihan1086 To jest to samo
rink.attendant.6


1

Matlab, 44

Korzystanie z anonimowej funkcji:

f=@(x)[num2str(min(mod([x -x],180))) ' deg']

Przykład:

>> f=@(x)[num2str(min(mod([x -x],180))) ' deg']
f = 
    @(x)[num2str(min(mod([x,-x],180))),' deg']

>> f(70)
ans =
70 deg

>> f(210)
ans =
30 deg

>> f(-1000)
ans =
80 deg

4
Na końcu nie dołącza to jednak „deg”. (Nie przegłosował.)
Legendre,

@Legendre Oops. Dzięki! Poprawiono
Luis Mendo,



-1

PHP, 44 bajty

Pobiera jeden parametr wiersza polecenia. Znów PHP cierpi na ten sam problem co JavaScript .

<?=90-abs(($argv[1]%180+180)%180-90)+' deg';

Korzystanie z rozwiązania kanonicznego wymaga 53 bajtów (konwersja stopni i radianów zajmuje dużo znaków):

<?=rad2deg(abs(asin(sin(deg2rad($argv[1])))))+' deg';

1
Czy PHP nie używa .do konkatenacji?
Downgoat

@ vihan1086 Tak, PHP używa .. Doceniony, dopóki nie zostanie naprawiony
Ismael Miguel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.