На моем сайте пользователи вводят дату своего рождения в стиле xx.xx.xx
- три двузначных числа, разделенных точками. К сожалению, я забыл сказать пользователям, какой именно формат использовать. Все, что я знаю, это то, что один раздел используется для месяца, один для даты и один для года. Год определенно наступил в 20 веке (1900-1999), так что формат 31.05.75
означает 31 May 1975
. Кроме того, я предполагаю, что все используют либо григорианский, либо юлианский календарь.
Теперь я хочу просмотреть свою базу данных, чтобы навести порядок. Я хотел бы начать с работы с пользователями с самыми неоднозначными датами, то есть с теми, где диапазон возможных дат является самым большим.
Например, дата 08.27.53
означает 27 August 1953
в григорианском или юлианском календаре. Дата в юлианском календаре - 13 дней спустя, поэтому диапазон просто 13 days
.
Напротив, запись 01.05.12
может относиться ко многим возможным датам. Самое раннее 12 May 1901 (Gregorian)
, а самое последнее 1 May 1912 (Julian)
. Диапазон есть 4020 days
.
правила
- Ввод - это строка в формате
xx.xx.xx
, где каждое поле состоит из двух цифр и дополняется нулями. - Выход - количество дней в диапазоне.
- Вы можете предположить, что ввод всегда будет действительной датой.
- Вы не можете использовать какие-либо встроенные функции даты или календаря.
- Самый короткий код (в байтах) выигрывает.
Testcases
01.00.31
=>12
29.00.02
=>0
(Единственная возможность29 February 1900 (Julian)
)04.30.00
=>13
06.12.15
=>3291
5, May 1975
должно быть31st
? Кроме того, мы должны учитывать високосные годы?Ответы:
Pyth, 118 байт
Попробуйте онлайн: демонстрация или тестовый набор .
Необходимые знания юлианского и григорианского календарей
Юлианский и Григорианский календарь довольно похожи. Каждый календарь делит год на 12 месяцев, каждый из которых содержит 28-31 день. Точные дни в месяце есть
[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. Единственная разница между календарями заключается в их определении високосного года. В юлианском календаре любой год, делимый на 4, является високосным. Григорианский календарь немного более конкретен. Любой год, делимый на 4, является високосным, кроме года, делимого на 100 и не делимого на 400.Так что в 20 веке только один год отличается. 1900 год - високосный год по юлианскому календарю, но не високосный год по григорианскому календарю. Таким образом, единственной датой, которая существует в одном календаре, но нет в другом календаре, является день
29.02.1900
.Из-за разного определения високосного года существует разница между датой в юлианском календаре и григорианском календаре. Разница в 12 дней для даты до
29.02.1900
и разница в 13 дней для даты после29.02.1900
.Упрощенный псевдокод
Подробное объяснение кода
Первая часть
M++28@j15973358 4G&qG2!%H4
определяет функциюg(G,H)
, которая вычисляет количество дней в месяцеG
годаH
в юлианском календаре.А следующая часть - это просто цикл for и ifs. Обратите внимание, что я интерпретирую
N
в формате(month, year, day)
. Просто потому, что это экономит несколько байтов.источник
Perl 5 , 294 байта
Попробуйте онлайн!
298 байт при удалении пробелов, символов новой строки и комментариев.
Строки 1-4 инициализирует (если не сделано)
%g
и%j
хэш , где значения являются григорианскими и Julian числа дня соответственно считая от Jaunary первых до 1900 по 31 декабря 1999 года.В строке 5 вводится дата ввода в $ 1, $ 2 и $ 3.
В строке 9 перечислены все шесть перестановок этих трех входных чисел.
Строка 8 преобразует эти шесть в два числа каждое, номера григорианского и юлианского дней, но только те, которые являются действительными датами.
Строка 7 удостоверяется в этом, она отфильтровывает несуществующие номера дней.
Строка 6 сортирует список допустимых чисел даты от наименьшего к наибольшему.
Строка 10 возвращает разницу между последним и первым (максимум и минимум), который был желаемым диапазоном.
источник