Jam analog memiliki 2 tangan *: Jam dan menit.
Tangan-tangan ini melingkari wajah jam seiring berjalannya waktu. Setiap putaran penuh jarum menit menghasilkan 1/12 putaran jarum jam. 2 putaran penuh jarum jam menandakan satu hari penuh.
Karena tangan-tangan ini terpaku pada titik pusat yang sama, dan berputar di sekitar titik itu, Anda selalu dapat menghitung sudut antara kedua tangan. Bahkan ada 2 sudut pada waktu tertentu; Yang lebih besar, dan yang lebih kecil (kadang-kadang keduanya sama dengan 180, tapi itu tidak penting)
* Jam hipotetis kami tidak memiliki tangan kedua
Tugas
Diberi waktu dalam format 24 jam, menghasilkan sudut yang lebih kecil di antara kedua tangan, dalam derajat. Jika tangan saling berhadapan secara langsung (seperti pada 6:00
, 18:00
dll) keluaran 180
Aturan
Masukan dapat diambil sebagai: - Sebuah pembatas string dipisahkan: 6:32
, 14.26
- 2 nilai terpisah, string atau int: 6, 32
, 14, 26
- Sebuah array dari 2 nilai, string atau int: [6, 32]
,[14, 26]
Anda juga dapat opsional menentukan bahwa jawaban Anda membutuhkan input menjadi empuk untuk 2 digit (dengan asumsi Anda mengambil string), yaitu: 06:32
, 06, 32
,[06, 32]
Anda juga dapat opsional membalik urutan input, mengambil menit kemudian jam, yaitu: 32:6
, 32, 6
,[26, 14]
Jam akan menjadi nilai integer antara 0
dan 23
(inklusif) Menit akan menjadi nilai integer antara 0
dan 59
(inklusif)
Anda dapat mengasumsikan bahwa jarum menit menjepret ke kenaikan 6 derajat di sepanjang wajah (satu posisi dengan jarak yang sama untuk setiap nilai menit)
Anda dapat mengasumsikan bahwa jarum jam menjentikkan ke peningkatan 0,5 derajat di sepanjang wajah (satu posisi dengan jarak yang sama untuk setiap nilai menit per nilai jam)
Keluaran harus diberikan dalam derajat, bukan radian. Anda dapat menyertakan trailing .0
untuk bilangan bulat
Mencetak gol
Ini adalah kode-golf sehingga byte paling sedikit di setiap bahasa menang!
Testcases
Input: 06:32
Output: 4
Input: 06:30
Output: 15
Input: 18:32
Output: 4
Input: 06:01
Output: 174.5
Input: 00:00
Output: 0
Input: 00:01
Output: 5.5
Input: 12:30
Output: 165
Input: 6:00
Output: 180
Input: 23:59
Output: 5.5
00:59 -> 35.5
(nilai kecil dengan nilai besar cenderung membuat beberapa implementasi gagal). mJawaban:
JavaScript (ES6),
41 4039 byteMengambil input sebagai
(h)(m)
.Cobalah online!
Bagaimana?
Alih-alih bekerja secara langsung dalam rentang , kami mendefinisikan variabel sementara dalam rentang :[ 0..360 ] x [ 0..4 ]
Sudut dalam derajat diberikan oleh:
Namun, rumus diimplementasikan sedikit berbeda dalam kode JS, karena kami pasti ingin menghindari penggunaan yang panjang
Math.abs()
danMath.min()
.Alih-alih menghitung nilai absolut, kami memaksakan nilai positif dalam dengan menghitung:[ 0..12 ]
Dan alih-alih menghitung minimum, kita menentukan dalam hal apa kita dengan hanya melakukan bitwise DAN dengan - dan inilah mengapa kita memilih interval yang dibatasi oleh kekuatan di tempat pertama.2 2
sumber
Jelly ,
1412 byteCobalah online!
Tautan monadik yang menggunakan waktu sebagai daftar dua bilangan bulat: jam, menit.
Terima kasih kepada @JonathanAllan karena telah menghemat 2 byte!
Penjelasan
sumber
(-180, 180]
yang setara (mod 360). Orang-orang itu ...Ø°
untuk360
dan“<¿‘
untuk60,11
. Like soד<¿‘Iæ%Ø°AH
TIOMATL, 18 byte
Menerima dua input jam diikuti menit. Menggunakan metode yang sama dengan jawaban ini
Cobalah di MATL Online
Penjelasan
sumber
180
bukan keluaran0
?Bahasa Wolfram (Mathematica) ,
302928 byteCobalah online!
versi tanpa ungolfed:
Argumen fungsi
# = {h,m}
berisi jam dan menit. Daftar panjang-dua ini ditafsirkan sebagai vektor dan dot-produk dengan{30,-5.5}
dihitung:#.{30,-5.5} = 30*h-5.5*m
. Kemudian kita menghitung modulus simetris 360 denganMod[#.{30,-5.5}, 360, -180]
memberikan sudut pada interval -180 .. + 180.Abs
mengambil nilai absolut darinya.Karena semua operator yang terlibat bersifat linier, kami dapat melipatgandakan dan membagi semua angka yang muncul namun paling nyaman. Dengan menarik faktor
5
keluar dari ekspresi dan membagi semua angka dalam ekspresi dengan 5, byte-count diminimalkan.sumber
Alchemist , 134 byte
Cobalah online!
Penjelasan
Pengaturan awal. Input jam dan menit ke
h
danm
, atur sudut saat inid
menjadi 360 derajat (720 setengah derajat), atura
untuk menghitung sudut utama, dan atur bendera keluaran.Setiap jam menambah 30 derajat, dan setiap menit mengurangi 5,5 derajat.
Sementara
r
bendera (mundur) tidak diatur, masing-masingd
atom harus memindahkan satua
atom keb
. Ini terjadi setelah semua menit habis, untuk menghindari "kondisi balapan". Ketika tidak adaa
atom yang tersisa, aturr
untuk membalikkan aliran ini.Perhatikan bahwa aturan kedua ini dapat memicu beberapa kali, dan bahkan dapat memicu sebelum aturan pengaturan awal. Ini tidak membahayakan apa pun, jadi tidak perlu mencegah ini. The
0x
Kondisi menangani kasus tepi: ketika input adalah 06:00, tidak adaa
atom ketika program berakhir, tetapi adax
atom jika hasil akhir setidaknya 1 derajat.Kebalikannya: ketika sudut yang ditandatangani lebih besar dari 180 derajat, pindahkan
b
atom kea
untuk menurunkan sudut ke keluaran. Berhenti membalik ketika sudut mencapai "360".Ketika semua atom berderajat habis, bagi 2 untuk mendapatkan sudut keluaran.
Setelah ini selesai, output tepat sekali menggunakan
f
flag dari pengaturan awal.sumber
Python 3.8 (pra-rilis) ,
4543 byte-2 byte terima kasih kepada Erik .
Cobalah online!
h%12
- jam dalam format 12 jamh%12*30
- sudut jarum jam pada jam penuhm/2
- sudut jarum jam bergerak dalamm
hitungan menith%12*30+m/2
- posisi jarum jam saat ini sebagai sudutm*6
- sudut jarum menit (360°/60 = 6°
)sumber
Stax , 15 byte
Jalankan dan debug itu
m =
jumlah menit sejak tengah malamd = 5.5 * m
min(d % 360, -d % 360)
.sumber
C # (Visual C # Interactive Compiler) ,
4745 byteCobalah online!
sumber
Arang , 22 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai dua bilangan bulat. Penjelasan:
sumber
Perl 6 , 28 byte
Cobalah online!
Menggunakan beberapa trik yang dicuri dari jawaban dan perhitungan lain
sumber
Python 3 , 40 byte
Cobalah online!
h*30
- sudut antara siang dan jamh
saat menitnya0
; jika jam sama atau lebih besar dari 12, sudut ini bisa sama atau lebih besar dari 360 °m*6
- sudut antara siang dan jarum menitm*.5
- sudut jarum jam bergerak maju dari jam penuh setelahm
menit (misalnya: jika jam 4:24, jarum jam bergerak maju 12 derajat dari posisi di jam 4)h*30-m*5.5
- salah satu dari dua sudut antara jarum jam dan jarum menit; koefisien untukm
adalah5.5
karenam*6-m*.5=m*5.5
; ini masih bukan jawabannya karena dapat berupa nilai yang lebih besar dari 360 ° (misalnya: jikah,m=13,0
) atau kurang dari 0 ° (misalnya: jikah,m=12,30
)(h*30-m*5.5)%360
- modulo ini memperhitungkan kasus-kasus di mana nilai yang dihitung di atas tidak antara 0 dan 360 °; ini masih bukan jawabannya karena itu bisa menjadi penguat dari dua sudut, sementara kami ingin yang paling sempit180-abs(180-(h*30-m*5.5)%360)
- ini adalah hasil akhir; aturan umum adalah yangx-abs(x-y)
setara denganmin(y,x-y)
, yang akan memberikan hasil yang benarsumber
Tcl ,
71745954 byteCobalah online!
disimpan 5 byte dengan menggunakan ekspresi lambda
sumber
Python 3,
5857 Bytes-1 / -2 Terima kasih kepada @Shaggy
Implementasi naif, mengambil input dalam bentuk
[6,32]
. Beberapa byte mungkin dapat dicukur dari baris terakhir khususnya.Python 2,
5250 Bytessumber
30*h-5.5*m
seharusnya menghemat beberapa byte.def
fungsi -gaya harus menyimpan beberapa byte juga.Perl 5
-MList::Util=min -p
, 37 byteCobalah online!
Mengambil input sebagai jam diikuti oleh menit pada saluran yang terpisah karena menghemat beberapa byte.
sumber
[R], 45 byte
sumber
Japt , 16 byte
Cobalah
sumber
> <> , 17 byte
Cobalah online! (6:32)
Mengambil input sebagai h, m pada stack.
Penjelasan
sumber
05AB1E , 16 byte
Mengambil jam sebagai input pertama, menit sebagai detik.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Pada dasarnya mengimplementasikan rumus berikut:
sumber
Pyret, 59 byte
sumber