С какими годами совпадает календарь?
Чёткой периодичности повторения календарей нет. Это может быть 5, 6 или 11 лет. Единственное “чёткое”, неизменное число в этом вопросе — 28 лет, однако и до него могут встречаться совпадающие календари.
Однажды, найдя старый датированный ежедневник, я задался вопросом, когда его можно будет применить повторно, чтобы календарь был актуален, то есть дни недели так же совпадали с числами месяцев.
Исходя из этого, я решил написать небольшой скриптик. Его алгоритм работы довольно прост: он проходит по списку годов от -100 до +100 от заданного и проверяет, совпадают ли дни недели 1 января, и не являются ли оба года високосными. Оценить работу скрипта на PHP вы можете здесь.
Также привожу вариант скрипта на Python:
from datetime import datetime as dt
def is_int(str):
try:
int(str)
return True
except ValueError:
return False
except TypeError:
return False
def is_leap_year(year):
try:
dt(year, 2, 29)
return True
except ValueError:
return False
c_year = None
while not is_int(c_year) or int(c_year)<=0:
c_year = input("Введите год: ")
c_year = int(c_year)
c_wd = dt(c_year,1,1).isoweekday()
c_leap = is_leap_year(c_year)
years = []
for i in range(-100, 100):
if c_year+i>0 and dt(c_year+i,1,1).isoweekday() == c_wd and is_leap_year(c_year+i) == c_leap and i!=0:
years.append(str(c_year+i))
print("Календарь %d года совпадает с %s." % (c_year, ", ".join(years)))
input()
…и JavaScript!
function isInt(num) {return (num ^ 0) === num;}
function isLeap(year) {return new Date(year, 1, 29).getDate() === 29;}
let years = [];
let c_year
while (!(parseInt(c_year)>0) || parseInt(c_year) > 275760) {
c_year = prompt('Введите год: ', new Date().getFullYear());
}
c_year = parseInt(c_year)
let c_wd = new Date(c_year,0,1).getDay();
let c_leap = isLeap(c_year);
for (let i = -100; i < 101; i++) {
if (c_year+i>0 &&
new Date(c_year+i, 0, 1).getDay() === c_wd &&
isLeap(c_year+i) === c_leap &&
i != 0) years.push(c_year+i);
}
alert(`Календарь ${c_year} года совпадает с ${years.join(', ')}.`);
Таким образом, календарь 2024 года (високосный!) совпадает с 1940, 1968, 1996, 2052, 2080, 2120 годами.
А календарь 2025 года совпадает с 1930, 1941, 1947, 1958, 1969, 1975, 1986, 1997, 2003, 2014, 2031, 2042, 2053, 2059, 2070, 2081, 2087, 2098, 2110, 2121 годами.