Как стать автором
Обновить

Запоминаем календарь

Недавно был опубликован пост в котором достаточно подробно описывается алгоритм вычислении дня недели для любой даты в интервале 19хх — 20хх. В этой статье я приведу алгоритм, позволяющий максимально быстро вычислять день недели по заданной дате для текущего года, не требующий больших вычислительных усилий и запоминания таблиц.

В подавляющем большинстве случаев, если возникает необходимость определить день недели по конкретной дате, то эта дата именно текущего года. Причины отсутствия под рукой гаджета не оговариваются, мало ли их, да и владение таким навыком приравнивается к хранению в памяти календаря на текущий год.

Алгоритм

Для нахождения дня недели для текущего года необходимо провести следующие действия:
d = [(a — m) mod 7] + 1
Где d — день недели,
a — число в дате,
m — число первого понедельника в месяце даты.
То есть (d — 1) — количество дней прошедших с ближайшего понедельника, прибавив 1 получаем порядковый номер дня недели.

Необходимо запомнить

Всё что необходимо знать — на какое число приходит первый понедельник каждого месяца, то есть нужно выучить 12 цифр, что сравнимо с длинной номера мобильного телефона или ip адресом.
Для 2014 года, последовательность (начиная с декабря) такая:163-375-274-163.
Первый понедельник декабря: 1-ое число, первый понедельник января: 6-ое число, февраля: 3-е и т.д.
Для визуализации и удобства запоминания последовательность из 12 цифр можно разбить на 4 блока, они же — времена года:

image

Примеры

22 апреля:
d = [(22 — 7) mod 7] + 1 = 2 (вторник);
19 марта:
d = [(19 — 3) mod 7] +1 = 3 (среда);
В случае если же число раньше первого понедельника, можно либо отсчитывать дни в обратном порядке, сместить число на неделю вперёд:
2 августа:
d = [(2+7 — 4) mod 7] +1 = 6 (суббота).

Дополнительно: количество дней в месяце

Чтобы максимально приблизить модель календаря к реальному, было бы неплохо знать количество дней в каждом месяце, для этого я приведу давно известный способ определения количества дней на кулаке. Счёт начинается с января, если счёт попадает на костяшку, то количество дней 31, если на вогнутость между костяшками то 30, в феврале 28 (29 если год високосный).

image

Вывод

Всё необходимое для воспроизведения календаря на текущий год всегда при себе. Есть недостаток — в начале каждого года необходимо запоминать новую последовательность цифр. Но это 5 минут на протяжении нескольких дней, и остальные 360 дней вспоминать её по мере необходимости. Отточив этот навык, день недели можно определять за 3 — 6 секунд.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.