Учитывая три неотрицательные целые числа 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.