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
źródło
n
którymn
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.Odpowiedzi:
CJam,
58 5642 bajtówJestem pewien, że jest za długi i można w niego dużo grać w golfa. Ale tutaj jest na początek:
Wypróbuj online tutaj
źródło
86400q':/:d_,({60bd\/}{~*mo60bAfmd2/':*}?
:, usuwam swoją odpowiedź.mo
Jest tak, że 0.058159 konwertuje 01:23:45Python 2,
159150141 + 2 = 143 bajtówProste rozwiązanie, może być prawdopodobnie znacznie krótsze. Będzie nad tym pracować.
Dodano dwa bajty, aby uwzględnić dane wejściowe, które muszą być ujęte w „s”. Ponadto Sp3000 wskazał problem z interpretacją ósemkowych przez eval () i pokazał sposób na skrócenie formatowania, użycie map () i usunięcie jednego wydruku.
Sprawdź to na ideone tutaj.
źródło
JavaScript ( ES6 ),
116110 bajtówSkomentowano:
źródło
24:00:00
produkuje,1
ale odwrotność nie jest prawdąPython 3: 143 bajtów
Taki sam bajt jest liczony jak rozwiązanie Pythona 2, ale wygląda na to, że przyjęliśmy inne podejście do matematyki.
źródło
Julia,
152143142 bajtyCóż, zaktualizowałem swoje podejście, by być mniej „Julianem”, jak mówią, ze względu na grę w golfa. Aby uzyskać lepsze (choć mniej zwięzłe) podejście, zobacz historię zmian.
Tworzy to nienazwaną funkcję, która akceptuje ciąg lub 64-bitową liczbę zmiennoprzecinkową i zwraca odpowiednio 64-bitową liczbę zmiennoprzecinkową lub ciąg. Aby to nazwać, nadaj mu nazwę, np
f=x->...
.Niegolfowane + wyjaśnienie:
Przykłady:
źródło
C, 137 bajtów
Pełny program C. Pobiera dane wejściowe na standardowe wejście i wyjścia na standardowe wyjście.
Nie golfił i skomentował:
źródło
J, 85 bajtów
Wyniki:
T '12: 00: 00 '
0,5
T 0,5
12 0 0
T '12: 34: 56 '
0,524259
T 0,524259
12 34 56
Razem 85
źródło
JavaScript,
194192190188 bajtówźródło
JavaScript ES6,
98130 bajtówźródło
C
156 156bajtówMyślałem, że będzie to łatwe dla C. Ale nadal było dość duże. :(
Program testowy:
Wynik:
źródło
PHP,
7069 bajtówpobiera dane z argumentu wiersza poleceń, wypisuje na STDOUT:
Jeśli dane wejściowe zawierają dwukropek, przelicz na czas uniksowy i podziel przez (sekundy na dzień), w
przeciwnym razie pomnóż wartość liczbową przez (sekundy na dzień) i sformatuj czas unix na
hh:mm:ss
.źródło
Perl,
109108101 + 6 (-plaF:
flaga) = 107 bajtówZa pomocą:
Wypróbuj na Ideone.
źródło
Excel, 178 bajtów
źródło