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.
Jawaban:
CJam,
3635343230 byteOutputnya dalam radian. Saya telah memverifikasi solusi untuk semua 86400 input yang mungkin.
Cobalah online di penerjemah CJam .
Ide
Karena 2π 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 2π ).
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
Versi alternatif (34 byte)
Outputnya dalam derajat dan tidak ada fungsi trigonometri yang digunakan.
Cobalah online di penerjemah CJam .
sumber
Mathematica, 40 byte
Penjelasan: Biarkan
t
beberapa detik sejak tengah malam. Posisi masing-masing tangan adalahUntuk menghitung jarak sudut absolut antara
x
derajat dany
derajat, kita dapat mody - x
dengan 360 ke dalam rentang[-180, 180]
dan kemudian mengambil nilai absolut. (Perhatikan bahwa tidak ada pembatasanx
dany
.) Jadi fungsi ini hanya menghitung perbedaan berpasangant/10-t/120
,6t-t/10
dan6t-t/120
dan melakukan itu.sumber
&
) dan argumen pertama yang diteruskan disebut sebagai inside#
.Python, 65
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 dari0
ke60
.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
6
skala ulang menjadi360
derajat.Dua-lapisan pemahaman daftar pertama memilih tangan pertama yang diwakili oleh
720
,60
atau1
, kemudian memilih sisi lain dari yang ditetapkan dengan pilihan pertama dihapus melalui set XOR.Saya menguji ini secara mendalam terhadap kode referensi.
sumber
C #,
163152 byteIni 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:
Contoh output:
sumber
TI-BASIC, 17 byte
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 dari120
.sumber