Jestem podróżnikiem w czasie i mam obsesję na punkcie upływu czasu. Szczególnie podoba mi się chwila, w której wskazówki zegara mijają 12 lub kiedy mogę przejść do następnej strony mojego kalendarza lub kiedy wszyscy krzyczą „Szczęśliwego Nowego Roku”!
Proszę, napisz mi program pokazujący, jak daleko jestem od ostatniej chwili do następnej, w formie paska postępu. Na przykład, jeśli powiem, że jest godzina 09:12, powinien wydrukować to:
09:00 ####---------------- 10:00
Jeśli powiem, że jest to maj 1982 r., Powinien wydrukować to:
1982-01 #######------------- 1983-01
Czy wspomniałem, że jestem podróżnikiem w czasie? Podróżuję do dowolnego miejsca od pierwszej milisekundy 0 AD do ostatniej milisekundy 9999 AD, więc program musi obsługiwać dowolną datę i godzinę w tym zakresie.
Wkład
Dane wejściowe będą miały jeden z następujących formatów:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
To jedyne formaty, które należy obsłużyć. Każda część będzie miała dokładnie taką liczbę wyświetlanych cyfr, co oznacza, że ułamki sekund mogą mieć końcowe zera (np.
.120
Nigdy.12
). TheT
Jest dosłownym litera „T” ograniczającej datę od czasu. Godziny są na zegarze 24-godzinnym.Miesiące i dni są oparte na 1 (więcej na ten temat poniżej).
Nieprawidłowe i spoza zakresu dane wejściowe nie muszą być obsługiwane.
Według uznania programisty, wejście może mieć jedną końcową nową linię.
Matematyka paska postępu
Program dotyczy najmniej znaczących i drugich najmniej istotnych jednostek na danym wejściu. Na przykład, jeśli dane wejściowe mają dokładność na poziomie dnia (np. 2016-12-14
), Pasek postępu wskaże, jaka część dni w miesiącu wejściowym upłynęła, a co pozostało.
Pasek postępu będzie miał 20 jednostek (znaków), a reprezentowana proporcja zostanie zaokrąglona do najbliższego przyrostu 1 ⁄ 20 . Na przykład, 2016-12-14T12:28
pasek postępu pokaże Round ( 28 ⁄ 60 × 20) = 9 z 20 jednostek „wypełnionych”.
1 miesiące i dni
Chociaż dzień 1 grudnia (na przykład) jest 01
w 2016-12-01
środku, dla celów obliczeń jest to 0 dzień miesiąca, ponieważ skrócone jednostki oznaczają 0 milisekundę 0 minuty 0 godziny dnia. Innymi słowy, 2016-12-01
wynosi 0 ⁄ 31 drogi do grudnia i 2016-12-02
wynosi 1 ⁄ 31 i tak dalej.
Podobnie 2016-01
jest 0TH milisekundy z 0th dnia stycznia, zatem w obliczeniach jest 0 / 12 , czyli 2016-12
jest 11 / 12 .
Tak, oznacza to, że miesiące i dni nigdy nie wypełnią całkowicie paska postępu.
Różny czas trwania miesiąca i lata przestępne
Różne miesiące mają różną liczbę dni i wynik musi to odzwierciedlać - w tym lata przestępne. Pasek postępu dla 6 lutego 2017 r. Będzie inny niż pasek postępu dla 6 lutego 2016 r. (Lub 6 stycznia obu lat).
Różne
- Podróżujący w czasie używają proleptycznego kalendarza gregoriańskiego . TL; DR: Brak szczególnych przypadków, takich jak brakujące dni w 1752 roku . Dane wejściowe będą obejmować daty w roku 0 ne
- Podróżujący w czasie ignorują czas letni.
- Program nie musi uwzględniać sekund przestępnych, ale może.
Wydajność
Program (lub funkcja) musi wydrukować (lub zwrócić jako ciąg) zorientowany poziomo 20-znakowy pasek postępu, który jest „wypełniany” dla upływającego czasu i „otwarty” dla pozostałego czasu. Musi „wypełnić” od lewej do prawej.
Pasek postępu musi mieć etykietę po lewej stronie pokazującą początek zliczanego okresu, a drugą po prawej stronie pokazującą początek następnego okresu, w tym samym formacie co dane wejściowe (ale pokazującą tylko dwie jednostki dokładności). W naszym przykładzie 2016-12-14
prawidłowe dane wyjściowe to:
12-01 #########----------- 01-01
Oto prawidłowe formaty etykiet dla każdego z możliwych okresów:
- Miesięcy:
YYYY-MM
- Dni:
MM-DD
- Godziny:
DDThh
- Minuty:
hh:mm
- Sekundy:
mm:ss
- Milisekundy:
ss.sss
Etykiety nie mogą zawierać żadnych dodatkowych jednostek i nie można ich pominąć.
Notatki wyjściowe
- „Wypełnione” jednostki paska postępu będą reprezentowane przez
#
postać. Jednostki „otwarte” będą reprezentowane przez-
. - Musi być dokładnie jedna spacja między paskiem postępu a każdą etykietą.
- Dopuszczalne są wiodące lub końcowe spacje i / lub pojedyncza nowa linia.
Zwycięski
To jest golf golfowy . Najkrótszy kod w bajtach wygrywa. Obowiązują standardowe zasady. Standardowe luki zabronione.
Przykłady
Input Output
----------------------- -------------------------------------
2016-12-12T12:17 12:00 ######-------------- 13:00
2016-12-12 12-01 #######------------- 01-01
0000-01-01T00:00:00.000 00.000 -------------------- 01.000
0000-01-01T00:00 00:00 -------------------- 01:00
1899-12-31T23 31T00 ###################- 01T00
1899-12-31 12-01 ###################- 01-01
1899-12 1899-01 ##################-- 1900-01
1982-05-15T17:15 17:00 #####--------------- 18:00
1982-05-15T17 15T00 ##############------ 16T00
1982-05 1982-01 #######------------- 1983-01
9999-12-31T23:59:59.999 59.000 #################### 00.000
9999-12 9999-01 ##################-- 10000-01
2000-01-06 01-01 ###----------------- 02-01
2000-02-06 02-01 ###----------------- 03-01
2001-02-06 02-01 ####---------------- 03-01
1742-09-10 09-01 ######-------------- 10-01
Odpowiedzi:
JavaScript, 282 bajty
Przechodzi wszystkie testy
Funkcja testowa nie drukuje nic dla zaliczenia, wartości dla niepowodzenia.
Przypadki testowe:
źródło
Pyth, 213 bajtów
Mój pierwszy kod w pyth! Ujrzeć:
Mój kod Pyth jest ściśle oparty na mojej poprzedniej odpowiedzi na python. Oto wersja bez golfa z komentarzami:
Testowanie wielu wartości można łatwo wykonać, tworząc pętlę kodu i dodając na końcu wydruk nowego wiersza:
Wtedy wpadłem
cat testinput | pyth code.pyth > output
idiff output testoutput
albo spróbować go online .źródło
Python 2, 371 bajtów
To wyzwanie było zaskakująco trudne! Wyglądało na to, że będę miał mniej niż 300 lat, dopóki nie opracuję formatowania ciągu wyjściowego.
Fajne jest to, że moja odpowiedź nie korzysta z żadnego pakietu dat:
źródło