Найти:

С какими годами совпадает календарь?

Чёткой периодичности повторения календарей нет. Это может быть 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 годами.

Оставить комментарий

Все поля, отмеченные звёздочкой (*), обязательны к заполнению