Temukan jarum jam terdekat

15

Tantangan

Diberikan beberapa detik lewat tengah malam, menghasilkan sudut terkecil antara dua tangan pada permukaan jam, menggunakan sesedikit mungkin byte.

Anda dapat mengasumsikan bahwa jumlah detik selalu kurang dari 86400. Sudut dapat direpresentasikan dalam derajat atau radian.

Solusi referensi ada di: http://ideone.com/eVdgC0

Uji Kasus (menghasilkan derajat)

0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333

Klarifikasi

  • Jam ini memiliki 3 tangan: jam, menit dan detik.
  • Semua tangan bergerak terus menerus, oleh karena itu jarum jam dan menit dapat ditemukan di antara wisuda di permukaan jam.
toto
sumber
Tantangan terkait (hanya jarum menit dan jam, dalam derajat)
Sp3000
1
Anda mungkin harus secara spesifik mengatakan bahwa ada jarum detik di jam.
isaacg
Bisakah Anda menambahkan beberapa test case?
Beta Decay
1
Pada beberapa jam, jarum menit melompat ke menit berikutnya ketika jarum detik mencapai puncak. Pada yang lain, itu bergerak terus menerus. Saya pikir ini adalah jam di mana ia bergerak terus menerus? Juga, meskipun sudah jelas setelah Anda membaca dengan seksama, saya awalnya menemukan "tangan kedua" ambigu, karena sebagian besar jam setidaknya memiliki dua tangan, jadi menambahkan "tangan kedua" benar-benar menambahkan tangan ketiga.
Reto Koradi
1
@ BetaDecay Tentu saja. Saya mungkin mengatakan sesuatu seperti: "Jam memiliki tiga tangan: jam, menit, dan detik."
Reto Koradi

Jawaban:

10

CJam, 36 35 34 32 30 byte

riP*30/_60/_C/]2m*::-:mc:mC$3=

Outputnya dalam radian. Saya telah memverifikasi solusi untuk semua 86400 input yang mungkin.

Cobalah online di penerjemah CJam .

Ide

Karena radian adalah putaran penuh, setiap interval menit / detik pada jam adalah 2π / 60 = π / 30 lebar radian.

Jadi, membagi jumlah detik dengan π / 30 menghasilkan posisi tangan kedua.

Jarum menit bergerak pada 1/60 dari laju jarum detik, jadi bagilah hasilnya dari atas 60 menghasilkan posisi jarum menit.

Demikian juga, membagi hasil terakhir dengan 12 menghasilkan posisi jarum jam.

Perhatikan bahwa tiga hasil bagi kami dari atas tidak harus dalam kisaran [0,2π).

Dengan menghitung sembilan kemungkinan perbedaan sudut tangan, kami memperoleh tiga 0 (jarak sudut antara tangan dan dirinya sendiri) dan enam jarak antara tangan yang berbeda.

Jika tangan terdekat berada di setengah yang tidak termasuk 12 , salah satu perbedaan dari atas akan menjadi output yang diinginkan (mod ).

Namun, pada 01:55:30 (misalnya), jarum jam berada pada sudut 1,008 rad (57,75 derajat) dan jarum menit pada sudut 5,812 rad (333,00 derajat) dari 12 , memberikan perbedaan 4,804 rad (275,25 derajat). Dengan mengurangi hasil ini dari putaran penuh, kita mendapatkan sudut yang diukur "ke arah lain", yang sama dengan 1,479 rad (84,75 rad).

Sekarang, daripada memetakan setiap sudut θ dalam [0,2π) dan secara kondisional mengurangi hasil dari π , kita dapat menghitung arccos (cos (θ)) , karena cos bersifat periodik dan genap, dan arccos selalu menghasilkan nilai dalam [ 0, π) .

Melewati tiga hasil terkecil (semua nol), terkecil keempat akan menjadi output yang diinginkan.

Kode

ri                             e# Read an integer from STDIN.
  P*30/                        e# Multiply by π and divide by 30.
       _60/                    e# Divide a copy by 60.
           _C/                 e# Divide a copy by 12.
              ]2m*             e# Push the array of all pairs of quotients.
                  ::-          e# Replace each pair by its difference.
                     :mc       e# Apply cosine to each difference.
                        :mC    e# Apply arccosine to each cosine.
                           $3= e# Sort and select the fourth smallest element.

Versi alternatif (34 byte)

rd6*_60/_C/]360f%2m*::m360X$f-+$6=

Outputnya dalam derajat dan tidak ada fungsi trigonometri yang digunakan.

Cobalah online di penerjemah CJam .

Dennis
sumber
9

Mathematica, 40 byte

Min@Abs@Mod[#{11,708,719}/120,360,-180]&

Penjelasan: Biarkan tbeberapa detik sejak tengah malam. Posisi masing-masing tangan adalah

hour: t/120 (mod 360)
min:  t/10 (mod 360)
sec:  6t (mod 360)

Untuk menghitung jarak sudut absolut antara xderajat dan yderajat, kita dapat mod y - xdengan 360 ke dalam rentang [-180, 180]dan kemudian mengambil nilai absolut. (Perhatikan bahwa tidak ada pembatasan xdan y.) Jadi fungsi ini hanya menghitung perbedaan berpasangan t/10-t/120, 6t-t/10dan 6t-t/120dan melakukan itu.

jcai
sumber
Maaf, tidak terbiasa dengan Mathematica, tetapi apakah ini benar-benar menerima argumen atau variabel untuk jumlah detik sejak tengah malam?
Winny
1
@ Winny Ya, ini adalah fungsi murni (ditunjukkan oleh &) dan argumen pertama yang diteruskan disebut sebagai inside #.
jcai
7

Python, 65

lambda n,l={720,60,1}:6*min((n/x-n/y)%60for x in l for y in{x}^l)

Jarak yang ditempuh oleh jam, menit, dan tangan kedua, dalam satuan 1/60 lingkaran h,m,s = n/720, n/60, n/1. Kita dapat mengambil mod 60 ini untuk mendapatkan posisi mereka pada lingkaran dari 0ke 60.

Jika kita mengambil perbedaan mod 60, kita mendapatkan jumlah unit yang satu di depan yang lain. Kami mengambil semua enam perbedaan yang mungkin, temukan min, lalu kalikan dengan 6skala ulang menjadi 360derajat.

Dua-lapisan pemahaman daftar pertama memilih tangan pertama yang diwakili oleh 720, 60atau1 , kemudian memilih sisi lain dari yang ditetapkan dengan pilihan pertama dihapus melalui set XOR.

Saya menguji ini secara mendalam terhadap kode referensi.

Tidak
sumber
6

C #, 163 152 byte

Ini menciptakan setiap tangan dua kali untuk menghitung lilitan, kemudian memutari setiap kombinasi dan menemukan sudut minimum di antara kedua tangan. Perhitungan dilakukan dalam 60 divisi, lalu dikalikan 6 untuk mendapatkan gelar.

Diindentasi untuk kejelasan:

float F(int s){
    float b=60,c;
    float[]a={c=s/b/b%12*5,c+b,c=s/b%b,c+b,s%=60,s+b};
    for(s=36;s-->0;)
        b=s%6!=s/6&(c=(c=a[s%6]-a[s/6])<0?-c:c)<b?c:b;
    return b*6;
}

Contoh output:

    0 seconds, 00:00:00, smallest angle is 0°
43200 seconds, 12:00:00, smallest angle is 0°
86399 seconds, 23:59:59, smallest angle is 0.09164429°
 3330 seconds, 00:55:30, smallest angle is 54.75°
39930 seconds, 11:05:30, smallest angle is 60.25001°
21955 seconds, 06:05:55, smallest angle is 65.49998°
21305 seconds, 05:55:05, smallest angle is 59.50001°
 5455 seconds, 01:30:55, smallest angle is 75.45831°
41405 seconds, 11:30:05, smallest angle is 44.95834°
Makanan Tangan
sumber
Solusi bagus untuk akun pembungkus
toto
2

TI-BASIC, 17 byte

min(cos⁻¹(cos(ΔList(Ans{6,.1,5!⁻¹,6

Menggunakan Dennis arccos(cos(untuk menormalkan jarak; Namun, alih-alih menghitung semua jarak berpasangan, itu hanya menghitung tiga yang diperlukan menggunakan ΔList([seconds],[minutes],[hours],[seconds].

Program ini mengharapkan Degree mode dan mengembalikan jawabannya dalam derajat.

EDIT: 5!lebih pendek satu byte dari 120.

lirtosiast
sumber