З огляду на три невід'ємні цілі числа y
, m
і d
(з яких принаймні один повинен бути позитивним) і коректну дату з позитивним року (в будь-якому зручному форматі , який включає в себе рік, місяць і день, і ніякої додаткової інформації), вихід на дата, яка є y
роками, m
місяцями та d
днями після початкової дати.
Григоріанський календар слід використовувати для всіх дат (навіть дат до прийняття григоріанського календаря).
Метод обчислення наступної дати такий:
- Додайте
y
до року - Додайте
m
до місяця - Нормалізуйте дату, застосувавши перекидання (наприклад
2018-13-01
->2019-01-01
) - Якщо день минув останній день місяця, змініть його на останній день місяця (наприклад
2018-02-30
->2018-02-28
) - Додати
d
в день - Нормалізуйте дату, застосувавши перекидання (наприклад
2019-01-32
->2019-02-01
)
Випускні роки (роки, що діляться на 4, але не діляться на 100, якщо також не поділяються на 400), повинні оброблятися належним чином. Усі входи та виходи знаходяться в межах цілого діапазону вашої мови.
Випробування
Тестові приклади надаються у форматі input => output
, де input
є об’єкт JSON.
{"date":"2018-01-01","add":{"d":1}} => 2018-01-02
{"date":"2018-01-01","add":{"M":1}} => 2018-02-01
{"date":"2018-01-01","add":{"Y":1}} => 2019-01-01
{"date":"2018-01-30","add":{"M":1}} => 2018-02-28
{"date":"2018-01-30","add":{"M":2}} => 2018-03-30
{"date":"2000-02-29","add":{"Y":1}} => 2001-02-28
{"date":"2000-02-29","add":{"Y":4}} => 2004-02-29
{"date":"2000-01-30","add":{"d":2}} => 2000-02-01
{"date":"2018-01-01","add":{"Y":2,"M":3,"d":4}} => 2020-04-05
{"date":"2018-01-01","add":{"Y":5,"M":15,"d":40}} => 2024-05-11
Ви можете використовувати цю JSFiddle для тестування.
Це є код-гольф, тому найкоротше рішення (кожною мовою) виграє.
y
, m
і d
(наприклад, це може d
бути 2147483000?)
All inputs and outputs will be within the representable integer range of your language.