pengantar
Waktu membingungkan. Enam puluh detik hingga satu menit, enam puluh menit hingga satu jam, dua puluh empat jam per hari (dan belum lagi sialnya am / pm!).
Tidak ada ruang untuk kekonyolan seperti saat ini, jadi kami telah memutuskan untuk mengadopsi satu-satunya alternatif yang masuk akal: hari desimal! Dengan kata lain, setiap hari dianggap 1 unit keseluruhan, dan apa pun yang lebih pendek ditulis sebagai pecahan desimal hari itu. Jadi, misalnya: "12:00:00" akan ditulis sebagai "0,5", dan "01:23:45" mungkin ditulis sebagai "0,058159".
Karena akan membutuhkan waktu untuk membiasakan diri dengan sistem yang baru, Anda ditugasi untuk menulis sebuah program yang dapat mengkonversi di antara mereka di kedua arah.
Tantangan
Tulis program dalam bahasa pilihan Anda, yang diberi waktu modern dalam format ISO-8601 "hh: mm: ss", akan mengembalikan unit pecahan desimal yang setara. Demikian juga, mengingat pecahan desimal, program harus mengembalikan waktu dalam format modern yang ditentukan sebelumnya.
Anda dapat membuat asumsi berikut:
- Input dan output waktu modern dapat berkisar dari "00:00:00" hingga "24:00:00"
- Input dan output waktu desimal dapat berkisar dari "0" hingga "1", dan harus dapat menerima / output hingga setidaknya 5 tempat desimal (seperti "0,12345"). Lebih presisi bisa diterima
- Program harus dapat mengetahui arah konversi yang akan dijalankan berdasarkan input
- Anda tidak dapat menggunakan fungsi / perpustakaan terkait waktu
Pemenang akan ditentukan oleh kode terpendek yang memenuhi kriteria. Mereka akan dipilih dalam setidaknya 7 unit hari desimal, atau jika / ketika ada cukup kiriman.
Contohnya
Berikut adalah (n sengaja) sepotong kode JavaScript yang ditulis dengan buruk untuk digunakan sebagai contoh:
function decimalDay(hms) {
var x, h, m, s;
if (typeof hms === 'string' && hms.indexOf(':') > -1) {
x = hms.split(':');
return (x[0] * 3600 + x[1] * 60 + x[2] * 1) / 86400;
}
h = Math.floor(hms * 24) % 24;
m = Math.floor(hms * 1440) % 60;
s = Math.floor(hms * 86400) % 60;
return (h > 9 ? '' : '0') + h + ':' + (m > 9 ? '' : '0') + m + ':' + (s > 9 ? '' : '0') + s;
}
decimalDay('02:57:46'); // 0.12344907407407407
decimalDay('23:42:12'); // 0.9876388888888888
decimalDay(0.5); // 12:00:00
decimalDay(0.05816); // 01:23:45
sumber
n
manan
adalah 2 ^ n detik. Jadi nilai '6' memiliki TTL sekitar 1 menit. Nilai '12' memiliki TTL sekitar 1 jam. '15' sekitar 8 jam dan seterusnya. Itu memungkinkan satu byte untuk menentukan batas waktu dan memberi Anda kontrol yang cukup untuk waktu pendek atau panjang.Jawaban:
CJam,
58 5642 byteSaya yakin ini terlalu panjang dan bisa bermain golf banyak. Tapi ini untuk pemula:
Cobalah online di sini
sumber
86400q':/:d_,({60bd\/}{~*mo60bAfmd2/':*}?
saya:, saya menghapus jawaban saya. Themo
adalah agar 0.058159 mengkonversi ke 01:23:45Python 2,
159150141 + 2 = 143 BytesSolusi mudah, mungkin bisa jauh lebih pendek. Akan mengerjakannya.
Menambahkan dua byte ke akun untuk input yang perlu dimasukkan dalam "s. Juga, Sp3000 menunjukkan masalah dengan eval () menafsirkan oktal, dan menunjukkan cara untuk mempersingkat pemformatan, menggunakan peta () dan menghapus satu cetakan.
Lihatlah ideone di sini.
sumber
Javascript ( ES6 ),
116110 byteBerkomentar:
sumber
24:00:00
menghasilkan1
tetapi kebalikannya tidak benarPython 3: 143 Bytes
Byte yang sama dihitung sebagai solusi python 2 tetapi tampaknya kami mengambil pendekatan yang berbeda untuk matematika.
sumber
Julia,
152143142 byteYah, saya memperbarui pendekatan saya menjadi kurang "Julian," seperti yang mereka katakan, demi bermain golf. Untuk pendekatan yang lebih baik (meskipun kurang ringkas), lihat riwayat revisi.
Ini menciptakan fungsi tanpa nama yang menerima string atau 64-bit floating point number dan mengembalikan 64-bit floating point number atau string, masing-masing. Untuk menyebutnya, berikan nama, mis
f=x->...
.Penjelasan + tidak dikumpulkan:
Contoh:
sumber
C, 137 byte
Program C penuh. Mengambil input pada stdin dan output pada stdout.
Tidak dikumpulkan dan berkomentar:
sumber
J, 85 byte
Hasil:
T '12: 00: 00 '
0,5
T 0.5
12 0 0
T '12: 34: 56 '
0,524259
T 0.524259
12 34 56
Total 85
sumber
Javascript,
194192190188 bytesumber
JavaScript ES6,
98130 bytesumber
C,
156152 byteSaya pikir ini akan mudah untuk C. Tetapi masih cukup besar. :(
Program Tes:
Keluaran:
sumber
PHP,
7069 bytemengambil input dari argumen baris perintah, mencetak ke STDOUT:
Jika input berisi titik dua, konversikan ke waktu unix dan bagi dengan (detik per hari),
selain itu nilai numeriknya dengan (detik per hari) dan format waktu unix ke
hh:mm:ss
.sumber
Perl,
109108101 + 6 (-plaF:
flag) = 107 byteMenggunakan:
Cobalah di Ideone.
sumber
Excel, 178 byte
sumber