Согласно этому видео солнечный год составляет 365 дней, 5 часов, 48 минут, 45 секунд и 138 миллисекунд . С текущим григорианским календарем правила для високосных годов следующие:
if year is divisible by 400, LEAP YEAR
else if year is divisible by 100, COMMON YEAR
else if year is divisible by 4, LEAP YEAR
else, COMMON YEAR
К сожалению, этот метод отключен на один день каждые 3216 лет.
Одним из возможных способов реформирования календаря является следующее правило:
if year is divisible by 128, COMMON YEAR
else if year is divisible by 4, LEAP YEAR
else, COMMON YEAR
Это дает нам преимущество, заключающееся в том, что мы не должны снова менять наши календари в течение еще 625 000 лет, «дайте» или «заберите».
Скажем, весь мир решает, что начиная с этого момента мы используем эту систему каждый четвертый год - високосный, за исключением каждого 128-го, меняя наши календари следующим образом:
YEAR GREGORIAN 128-YEAR
2044 LEAP LEAP
2048 LEAP COMMON
2052 LEAP LEAP
...
2096 LEAP LEAP
2100 COMMON LEAP
2104 LEAP LEAP
...
2296 LEAP LEAP
2300 COMMON LEAP
2304 LEAP COMMON
2308 LEAP LEAP
Как это повлияет на наши алгоритмы дня недели?
Соревнование
- Учитывая дату от 2000 до 100000 года, найдите день недели в этом новом календаре.
- Разрешен любой формат ввода и вывода, если вы четко указываете, какие форматы вы используете.
- Это кодовый гольф, поэтому постарайтесь сделать ваши решения как можно лучше!
Контрольные примеры
"28 February 2048" -> "Friday"
"March 1, 2048" -> "Sat"
(2100, 2, 29) -> 0 # 0-indexed with Sunday as 0
"2100-02-29" -> 7 # 1-indexed with Sunday as 7
"28 Feb. 2176" -> "Wednesday"
"1-Mar-2176" -> "Th"
"28/02/100000" -> "F" # DD/MM/YYYYYY
"Feb. 29, 100000" -> 6 # 1-indexed with Sunday as 7
"03/01/100000" -> 1 # MM/DD/YYYYYY and 1-indexed with Sunday as 1
Предложения и отзывы о проблеме приветствуются. Удачи и хорошего гольфа!
Ответы:
C (gcc) , 60 байтов
Попробуйте онлайн!
Простая модификация метода Сакамото . Принимает входные данные как целочисленные аргументы в порядке
month, day, year
и выводит номер дня (индексируется 0 в воскресенье).источник
"-bed=pen+mad."
часть?char
все еще представляет число, так что вы можете сделатьmod 7
напрямую.Wolfram Language (Mathematica) ,
575553 байтаПопробуйте онлайн!
Принимает три входа: год, месяц и день в указанном порядке. Например, если вы сохраните вышеупомянутую функцию как
fun
, тоfun[2048,2,28]
сообщит вам день недели от 28 февраля 2048 года.Как это работает
Формула
m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28]
преобразует год в эквивалентный год (год с точно такими же днями недели) между 6 и 33 годами нашей эры. Для этого мы вычитаем смещение, а затем берем мод года 28; но смещение меняется каждые 128 лет, и для годов, делимых на 128, мы должны сделать дополнительную корректировку, потому что эквивалентный год не должен быть високосным.В любом случае, как только это будет сделано, мы смотрим встроенный месяц и день в том же году
DayName
.источник
Python 2 , 67 байт
Попробуйте онлайн!
int("..."[m])
можно заменить наord("-bed=pen+mad."[m])
.источник
JavaScript,
6559 байтИспользует метод Сакамото. дает0=Sunday, 1=Monday, 2=Tuesday...
-2 байта благодаря Мише Лаврову
-4 байта благодаря Арно
источник
~~y
можно просто изменитьy
. Вы не получите дробный год на входе, верно? Но я признаю, что не владею JavaScript.+y+(y>>2)-(y>>7)
?На самом деле 37 байтов
Это порт модификации notjagan в части алгоритма Сакамото , но с несколькими трюками стеки на основе , как описано ниже. Формат ввода есть
day, year, month
. Выходной формат есть0-indexed with Sunday as 0
. Предложения по игре в гольф приветствуются! Попробуйте онлайн!объяснение
источник
Желе ,
32313028 байтДругой порту модификации notjagan в части алгоритма Сакамото , но с числом базовых 250 вместо
032503514624
(не нужен дополнительный ,0
потому что Желе 1-проиндексированы). Формат ввода естьmonth, year, day
. Выходной формат есть0-based with Sunday as 0
. Предложение игры в гольф очень приветствуется, так как ссылки были сложными для организации и все еще могут быть пригодными для игры в гольф. Попробуйте онлайн!Редактировать: -1 байт от использования битового сдвига вместо целочисленного деления. -1 байт от перестановки начала и формата ввода. -2 байта благодаря Эрику Аутгольферу и Кэрриду.
объяснение
источник