Temukan sudut referensi

17

Ini pertanyaan yang cukup sederhana. Menurut website ini random saya menemukan - Web Archive , sudut referensi the acute angle formed by the terminal side of the given angle and the x-axis.Anda harus menulis sebuah program untuk menemukan ini.

Saya tidak ingat apa pun dari aljabar 2, apa artinya ini?

Angles biasanya diberikan dalam bentuk standar , yang diukur dengan menempatkan satu sisi sudut dan mengukur ke sisi lain, berlawanan, seperti:

Bentuk standar

Ini akan menjadi masukan Anda. Output Anda akan menjadi sudut referensi ini. Anda dapat menganggap ini pada dasarnya jarak terkecil dari sisi terminal ke sumbu x. Kecuali itu sudut, bukan jarak. Berikut ini beberapa contohnya:

Ref 2 Quad Ref 1 kuad

Rujukan kuad 3 Ref 4 kuad

Klarifikasi

  • Semua default pada input dan pengiriman.
  • Sudut dalam derajat .
  • Sudut negatif, sudut non-integer, dan sudut> 360 deg yang diperbolehkan.
  • Output dalam bentuk 60 deg.
  • Ini adalah , jadi kode terpendek dalam byte menang!

Tautan bermanfaat lainnya .

Uji Kasus

70      ->  70 deg
135     ->  45 deg
210     ->  30 deg
-60     ->  60 deg
91      ->  89 deg
610     ->  70 deg
-1000   ->  80 deg
Maltysen
sumber
1
Apa yang kita lakukan pada input 90?
lirtosiast
2
@ ThomasKwa itu akan menjadi 90 dari kedua arah.
Maltysen
1
Solusi singkatnya adalah abs(arcsin(sin(input)))+" deg", meskipun saya tidak tahu bahasa mana yang akan menang (itu perlu mendukung operasi derajat dan string).
lirtosiast
Apakah input selalu berupa bilangan bulat?
lirtosiast
6
Karena sudut non-integer diperbolehkan, Anda harus memasukkan satu dalam kasus uji.
Dennis

Jawaban:

6

Pyth, 18 byte

+.a-%+QK90yKK" deg

Cobalah online.

grovesNL
sumber
turun ke 19 menggunakan algo Anda tetapi dengan inline assign, jangan ragu untuk menggunakan: pyth.herokuapp.com/…
Maltysen
@Maltysen: Terima kasih, menemukan peningkatan lain juga
grovesNL
5

Python 2, 34 byte

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

Menggunakan "%d deg"pemformatan string akan lebih lama karena tanda kurung yang dibutuhkan.

Sp3000
sumber
5

CJam (21 byte)

180qd1$%z_@@-e<" deg"

Demo online

Peter Taylor
sumber
4

dc, 25

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

Note dcmenggunakan _sebagai tanda -ve bukan -.

Output tes:

$ 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
$
Trauma Digital
sumber
3

Mathematica, 22 31

ToString@Abs@Mod[#,180,-90]deg&
alephalpha
sumber
1
@ LegionMammal978 Jika saya hanya melipatgandakannya deg, 0 degakan menjadi 0.
alephalpha
1
Karena Anda tidak peduli dengan tipe output, Anda dapat menyimpan 2 byte seperti ini:Row@{Abs@Mod[#,180,-90],deg}&
LegionMammal978
3

Python 2, 35

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

Semakin kecil sudut dan modulo negatifnya 180. Secara efektif mengubah sudut ke rentang dari 0 hingga 180 dan membawa jarak ke titik akhir yang lebih dekat. Perhatikan bahwa -x%180kelompokkan sebagai (-x)%180.

Panjang yang sama dengan pemformatan string untuk Python 3:

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

Pyth 25 30 byte

Solusi menyakitkan yang tidak kreatif, menggunakan fungsi trigonometri. Permalink

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

Ada saran yang diterima.

Winny
sumber
1
.t+.R.t.a.tF[Q7Z3)6?%Q1Q0" deg
Menurunkannya
Rapi. Saya melihat tidak muncul untuk bekerja dengan masukan floating point: 90.5 => 90.0 deg, meskipun.
Winny
Itu karena punyamu juga tidak: pyth.herokuapp.com/...
Maltysen
Tangkapan yang menarik. Dengan input -60.5 => 60.5 degtetapi dengan 60.5 => 60.0 deg. Sepertinya masalah dengan Pyth - Contoh menggunakan pyth / macros.py
Winny
1

JavaScript (ES6), 43 byte

Mirip dengan jawaban Sp3000 , meskipun modulo cukup panjang karena perilaku dalam JavaScript .

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

Demo

Kode ditulis ulang dalam ES5 untuk kompatibilitas browser:

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 byte

f=(x)->90-Math.abs((x%180+180)%180-90)+' deg'
rink.attendant.6
sumber
5
Saya berasumsi itu adalah keputusan desain oleh seorang insinyur perangkat keras PDP yang bertanggung jawab atas kenyataan bahwa beberapa dekade kemudian kita masih memiliki sedikit bahasa yang mengimplementasikannya dengan %bijaksana.
Peter Taylor
Mengganti 180 pertama dengan (t=180)kemudian mengganti 180 berikut dengan t mungkin akan menghemat beberapa byte
Downgoat
@ vihan1086 Sama saja
rink.attendant.6
1

J, 26 byte

m=:180&|
' deg',~m@-":@<.m

Sama seperti metode xnor .

Legendre
sumber
1

Matlab, 44

Menggunakan fungsi anonim:

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

Contoh:

>> 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
Luis Mendo
sumber
4
Ini tidak menambahkan 'deg' pada akhirnya. (Tidak downvote.)
Legendre
@Legendre Ups. Terima kasih! Diperbaiki
Luis Mendo
1

Scala, 40 35 Karakter

(a:Int)⇒s"${90-(a%180-90).abs} deg"
gilad hoch
sumber
0

Tcl , 83 byte

proc R a {puts [expr [set a $a%360]>90?$a>180?$a>270?360-$a:$a-180:180-$a:$a]\ deg}

Cobalah online!

sergiol
sumber
-1

PHP, 44 byte

Mengambil satu parameter baris perintah. Sekali lagi PHP menderita masalah yang sama dengan JavaScript .

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

Menggunakan solusi kanonik membutuhkan 53 byte (konversi derajat dan radian membutuhkan banyak karakter):

<?=rad2deg(abs(asin(sin(deg2rad($argv[1])))))+' deg';
rink.attendant.6
sumber
1
Bukankah PHP digunakan .untuk penggabungan?
Downgoat
@ vihan1086 Ya, PHP menggunakan .. Diturunkan hingga diperbaiki
Ismael Miguel