Wprowadzenie
Czas jest zagmatwany. Sześćdziesiąt sekund do minuty, sześćdziesiąt minut do godziny, dwadzieścia cztery godziny do dnia (nie wspominając już o tym nieznośnym am / pm!).
W dzisiejszych czasach nie ma miejsca na taką głupotę, dlatego postanowiliśmy przyjąć jedyną sensowną alternatywę: dni dziesiętne! To znaczy, każdy dzień jest uważany za 1 całość, a cokolwiek krótszego jest zapisywane jako ułamek dziesiętny tego dnia. Na przykład: „12:00:00” można zapisać jako „0,5”, a „01:23:45” jako „0,058159”.
Ponieważ przyzwyczajenie się do nowego systemu zajmie trochę czasu, Twoim zadaniem jest napisanie programu, który może konwertować między nimi w obu kierunkach.
Wyzwanie
Napisz program w wybranym języku, który, biorąc pod uwagę współczesny czas w formacie ISO-8601 „gg: mm: ss”, zwróci równoważną jednostkę ułamka dziesiętnego. Podobnie, biorąc pod uwagę ułamek dziesiętny, program powinien zwrócić czas w nowoczesnym formacie początkowo określonym.
Możesz przyjąć następujące założenia:
- Współczesny czas wejścia i wyjścia może wynosić od „00:00:00” do „24:00:00”
- Wejście i wyjście czasu dziesiętnego może zawierać się w przedziale od „0” do „1” i powinno być możliwe przyjęcie / wyprowadzenie do co najmniej 5 miejsc po przecinku (takich jak „0.12345”). Dopuszczalna jest większa precyzja
- Program powinien wiedzieć, który kierunek konwersji wykonać na podstawie danych wejściowych
- Nie można używać funkcji / bibliotek związanych z czasem
Zwycięzca zostanie określony na podstawie najkrótszego kodu spełniającego kryteria. Zostaną one wybrane w co najmniej 7 jednostkach dziesiętnych lub, jeśli / kiedy liczba zgłoszeń będzie wystarczająca.
Przykłady
Oto (n celowo) źle napisany fragment kodu JavaScript, który można wykorzystać jako przykład:
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
którym n
jest 2 ^ n sekund. Tak więc wartość „6” miała TTL około 1 minuty. Wartość „12” miała TTL około 1 godziny. „15” trwało około 8 godzin i tak dalej. Pozwoliło to jednemu bajtowi zdefiniować limit czasu i dać ci wystarczającą kontrolę na krótki lub długi czas.