Na mojej stronie użytkownicy wpisują datę urodzenia zgodnie ze stylem xx.xx.xx
- trzy dwucyfrowe liczby oddzielone kropkami. Niestety zapomniałem powiedzieć użytkownikom, jakiego formatu użyć. Wiem tylko, że jedna sekcja jest używana dla miesiąca, jedna dla daty, a druga dla roku. Rok jest zdecydowanie w XX wieku (1900-1999), więc format 31.05.75
oznacza 31 May 1975
. Zakładam też, że wszyscy używają kalendarza gregoriańskiego lub kalendarza juliańskiego.
Teraz chcę przejrzeć moją bazę danych, aby usunąć bałagan. Chciałbym zacząć od kontaktu z użytkownikami z najbardziej niejednoznacznymi datami, czyli tymi, w których zakres możliwych dat jest największy.
Na przykład data 08.27.53
oznacza 27 August 1953
w kalendarzu gregoriańskim lub juliańskim. Data w kalendarzu juliańskim to 13 dni później, więc zakres jest sprawiedliwy 13 days
.
Natomiast notacja 01.05.12
może odnosić się do wielu możliwych dat. Najwcześniejsza jest 12 May 1901 (Gregorian)
, a najnowsza jest 1 May 1912 (Julian)
. Zakres wynosi 4020 days
.
Zasady
- Dane wejściowe to ciąg znaków w formacie
xx.xx.xx
, w którym każde pole składa się z dwóch cyfr i jest uzupełnione zerami. - Dane wyjściowe to liczba dni w zakresie.
- Możesz założyć, że dane wejściowe zawsze będą prawidłową datą.
- Nie możesz używać żadnych wbudowanych funkcji daty ani kalendarza.
- Najkrótszy kod (w bajtach) wygrywa.
Przypadki testowe
01.00.31
=>12
29.00.02
=>0
(Jedyną możliwością jest29 February 1900 (Julian)
)04.30.00
=>13
06.12.15
=>3291
5, May 1975
powinno być31st
? Czy też musimy brać pod uwagę lata przestępne?Odpowiedzi:
Pyth, 118 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy .
Niezbędna znajomość kalendarzy juliańskich i gregoriańskich
Kalendarz juliański i gregoriański są dość podobne. Każdy kalendarz dzieli rok na 12 miesięcy, z których każdy zawiera 28–31 dni. Dokładne dni w miesiącu to
[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. Jedyną różnicą między kalendarzami jest ich definicja roku przestępnego. W kalendarzu juliańskim każdy rok podzielny przez 4 jest rokiem przestępnym. Kalendarz gregoriański jest nieco bardziej szczegółowy. Każdy rok podzielny przez 4 jest rokiem przestępnym, z wyjątkiem roku podzielnego przez 100 i niepodzielnego przez 400.Tak więc w XX wieku tylko jeden rok jest inny. Rok 1900, który jest rokiem przestępnym w kalendarzu juliańskim, ale nie rokiem przestępnym w kalendarzu gregoriańskim. Tak więc jedyną datą, która istnieje w jednym kalendarzu, ale nie w drugim, jest dzień
29.02.1900
.Ze względu na inną definicję roku przestępnego istnieje różnica między datą w kalendarzu juliańskim a kalendarzem gregoriańskim. Różnica 12 dni dla daty poprzedzającej
29.02.1900
i 13 dni różnica dla dat po29.02.1900
.Uproszczony pseudo-kod
Szczegółowe objaśnienie kodu
Pierwsza część
M++28@j15973358 4G&qG2!%H4
określa funkcjęg(G,H)
, która oblicza liczbę dni w miesiącuG
rokuH
w kalendarzu juliańskim.Następna część to tylko pętla for i ifs. Zauważ, że interpretuję
N
w formacie(month, year, day)
. Tylko dlatego, że oszczędza niektóre bajty.źródło
Perl 5 , 294 bajtów
Wypróbuj online!
298 bajtów po usunięciu spacji, znaków nowej linii i komentarzy.
Linie 1-4 inicjują (jeśli nie są wykonywane)
%g
i%j
hashe, gdzie wartościami są gregoriańskie i juliańskie liczby dni, odpowiednio licząc od 1 stycznia 1900 r. Do 31 grudnia 1999 r.W wierszu 5 wstawiana jest data 1, 2 i 3 USD.
W wierszu 9 wymieniono wszystkie sześć kombinacji tych trzech liczb wejściowych.
Wiersz 8 konwertuje te sześć na dwie liczby, gregoriańską i juliańską, ale tylko te, które są ważnymi datami.
Wiersz 7 zapewnia to, odfiltrowuje nieistniejące liczby dni.
Wiersz 6 sortuje listę prawidłowych numerów dat od najmniejszej do największej.
Linia 10 zwraca następnie różnicę między ostatnim a pierwszym (maks. I min.), Który był pożądanym zakresem.
źródło