Вступ
Час заплутаний. Шістдесят секунд на хвилину, шістдесят хвилин на годину, двадцять чотири години на день (і не кажучи вже про цей прискіпливий ранок / вечір!).
Сьогодні немає місця для такої глупоти, тому ми вирішили прийняти єдину розумну альтернативу: десяткові дні! Тобто кожен день вважається 1 цілою одиницею, і все коротше пишеться як десятковий дріб цього дня. Так, наприклад: "12:00:00" буде записано як "0,5", а "01:23:45" може бути записано як "0,0515159".
Оскільки знадобиться час, щоб звикнути до нової системи, перед вами поставлено завдання написати програму, яка може конвертувати між ними в обох напрямках.
Виклик
Напишіть програму на обрану вами мову, яка за сучасного часу у форматі ISO-8601 "hh: mm: ss" поверне еквівалентну одиницю десяткового дробу. Так само, з урахуванням десяткового дробу, програма повинна повертати час у первинному заданому сучасному форматі.
Можна зробити наступні припущення:
- Сучасний час введення та виведення може варіюватися від "00:00:00" до "24:00:00"
- Десятковий час введення та виведення може коливатися від "0" до "1", і він повинен мати можливість приймати / виводити щонайменше до 5 знаків після коми (наприклад, "0.12345"). Більш висока точність прийнятна
- Програма повинна мати можливість знати, який напрямок перетворення виконувати на основі введення
- Ви не можете використовувати функції / бібліотеки, пов'язані з часом
Переможець визначатиметься за найкоротшим кодом, який відповідає критеріям. Вони будуть відібрані щонайменше за 7 одиниць десяткового дня, або якщо / коли їх було достатньо.
Приклади
Ось (навмисне) погано написаний фрагмент коду JavaScript, який можна використати як приклад:
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
n
де n
знаходиться 2 ^ n секунди. Таким чином, значення "6" мала TTL приблизно 1 хвилину. Значення «12» становило TTL близько 1 години. "15" було близько 8 годин тощо. Це дозволило одним байтом визначити час очікування та дати вам достатній контроль на короткий чи тривалий час.