Niedawno zsumowałem wiek siebie, mojej żony i dzieci i zdałem sobie sprawę, że w pewnym momencie w niezbyt odległej przyszłości wszystkie nasze czasy sumują się dokładnie do 100 lat.
Wyzwanie
W przypadku danych wejściowych składających się z łącznego (całkowitego) wieku i listy dat urodzenia należy podać datę, w której wszystkie połączone wieku sumują się do podanej sumy.
- Łączny wiek wejściowy (w latach) będzie dodatnią liczbą całkowitą
- Wprowadzana lista dat urodzenia będzie listą (niezależnie od formatu dogodnego dla twojego języka) dat, które muszą zawierać numeryczną reprezentację dnia, miesiąca i roku. Liczba dni od określonej epoki jest niedopuszczalna. Możesz założyć, że lista dat wprowadzania jest posortowana w porządku chronologicznym.
- Dane wyjściowe będą pojedynczą datą w tym samym formacie co daty wejściowe
- Do celów połączonego wieku za 1 rok uważa się dokładnie 365,25 dnia
- W przypadku niektórych danych wejściowych niemożliwe będzie znalezienie daty po wszystkich datach urodzenia, gdy wszystkie zsumują się do łącznego wieku. Weźmy na przykład dwie daty urodzenia w odstępie 20 lat, ale chcemy połączyć 10 lat. W takim przypadku wynikiem będzie 10. urodziny starszej daty urodzenia. Innymi słowy, poszczególne grupy wiekowe uważa się za 0 dla wszystkich dat przed datą urodzenia tej osoby
- Produkcja globalna będzie pierwszą datą, w której połączony wiek sumuje się co najmniej z wiekiem wejściowym
- Możesz korzystać z wbudowanych funkcji daty i godziny
- Musisz wspierać daty sięgające 1970/01/01.
Przykłady
Tutaj podaję wszystkie daty w formacie RRRR / MM / DD, ale możesz wybrać dowolny format.
Input Output
10 2000/01/01 2010/01/01
100 1975/03/05,1978/07/23,2008/11/12,2012/12/20 2018/11/22
100 1975/03/06,1978/07/23,2008/11/12,2012/12/20 2018/11/23
100 1975/03/09,1978/07/23,2008/11/12,2012/12/20 2018/11/23
100 1975/03/10,1978/07/23,2008/11/12,2012/12/20 2018/11/24
3 1990/08/01,1995/07/02 1993/08/01
50 1975/03/05,1978/07/23,2008/11/12,2012/12/20 2001/11/13
Należy zauważyć, że w dwóch ostatnich przykładach data wyjściowa mieści się w zakresie dat wejściowych, zgodnie z regułą 5.
Odpowiedzi:
Mathematica
138 107237 bajtówMoje pierwsze próby były niechlujne i niegodne. Powinno to ogólnie działać, pod warunkiem, że daty urodzenia podano w kolejności od najwcześniejszego do najpóźniejszego, jak w przypadkach testowych.
Przypadki testowe zostały dobrze wybrane i trudne do prawidłowego wdrożenia. Kod okazał się znacznie dłuższy, niż się spodziewałem.
Ogólna logika jest taka
Przypadki testowe
źródło
PowerShell,
145125 bajtówDość trudne wyzwanie, ale po zrozumieniu stosunkowo proste.
Rozszerzony i skomentowany:
Przykład:
Dane wejściowe muszą zawierać jawnie sformatowaną tablicę reprezentacji ciągów-dat. Dane wyjściowe mają
MM/DD/YYYY
format (domyślny dla lokalizacji en-us w PowerShell).Edytuj - gra w golfa 20 bajtów, zmieniając sposób, w jaki iterujemy przez urodziny, i używając while zamiast do / do
źródło
PHP, 220 bajtów
Dodałem kilka nowych linii dla czytelności.
Ideone
Oto wersja bez golfa:
źródło