Обчислення дня тижня в розумі

  image
Існує безліч способів прокачати мозок. Завдання «n-back» або мобільні додатки для тренування навички швидкого рахунку в розумі. Але ці завдання відірвані від поточної реальності, а хотілося б прокачати мозок практичним навиком.
 
Навіщо? Адже можна швидко порахувати на гаджеті. Жаль, зовсім не швидко, тому що потрібно час на пошуки і активацію гаджета, пошук додатки, введення дати, усвідомлення отриманого результату. А ще можна друзів / подруг порадувати своїми раптово з'явилися екстраординарними здібностями. До речі, друзі швидко усвідомлюють зручність використання вічного календаря з голосовим інтерфейсом.
 
Хіба це можливо? Якось раніше обходилися без комп'ютерів. В одній з тв-передач «шукаємо таланти» показували натренованого трирічної дитини, який може обчислювати твір тризначних чисел (пощадите своїх дітей). Втім, дорослі вже не діти і їх мозок частково кристаллизован, в сенсі слабо навчаємо. Значить потрібно запам'ятовувати якомога менше і максимально задіяти наявні навички.
 
У алгоритміці часто обсяги обчислень можуть бути скомпенсовані обсягами пам'яті. Тобто чим більше оперативки доступно, тим менше буде потрібно обчислень. Аналогічно працює мозок — чим більше ми запам'ятали, тим швидше шукаємо рішення. Запам'ятали кілька формул для складання кубика Рубіка — зберете за пару хвилин (після тривалого тренування). Запам'ятали півтори сотні формул — зберете за пару десятків секунд. Світовий рекорд 2013 року — 8.18 сек. Ще раз: чим більше пам'ятаємо — тим швидше рішення.
 
 
Алгоритм
Треба взяти зміщення (день тижня) першого дня року (y) і зсув місяця (m). Потім обчислюємо суму y + m + d, де d — день місяця, і знайти залишок від ділення на 7. Отримаємо номер дня тижня.
 
 
Що потрібно запам'ятати
В цілому, досить запам'ятати всі дні тижня всіх 28 років (періодичність пропорційна добутку періодів високосних років і днів тижня). Послідовність у 10k. Це досить багато.
 
Якщо додати одну операцію складання, то буде досить запам'ятати лише пару рядів чисел:
 
m (month) = {2 червня 2 травня 0 3 5 1 4 2 червня 4}, з січня по грудень
 
y (year) = {6 0 1 2 4 5 6 0 2 3 4 5 0 1 2 3 5 6 0 1 3 4 5 6 1 2 4 Березня}, з 1988 по 2015
 
Наприклад: 13 вересня 2013 = (13 + 4 + 2)% 7 = 5 (п'ятниця)
 
Зміщення для місяця беруться з календаря деякого року. Зсув місяці дорівнює кількості сірих квадратів на початку місяця. Наприклад, не високосний 2006 рiк. Зсув для цього року буде 0.
 
 image
 
Все ж запам'ятати зміщення для всіх років і потім виконувати швидкий пошук за індексом досить складна когнітивна задача. Є альтернативний шлях — вирахувати. Треба взяти дві останні цифри року (+100 для XXI століття) — Y. Далі знайти найближчий минулий високосний Yв. Взяти dY = Y — Yв. Тоді зсув року можна обчислити
 
y (Y) = (50 — Yв / 2 + dY)
 
Недолік формули в тому, що для 2004 і далі зсув буде негативним, а для початку і середини XX століття двозначними, що злегка утрудняє обчислення в розумі. Можна використовувати різні формули для кожного століття, в яких враховуються тільки дві молодші цифри року. Наприклад, 12 для 2012р і 1912р.
 
XX: (50 — Yв / 2 + dY)% 7 або (8 — Yв / 2% 7 + dY)
XXI: (7 — Yв / 2% 7 + dY)
 
У результаті може виявитися простіше запам'ятати таблицю зміщень в такому вигляді:
 
 image
 
Зсув для року можна обчислити через суму зміщення найближчого меншого високосного року і його різниці з шуканим роком. Сім цифр запам'ятати простіше ніж 28. До того ж, цифри розташовані в порядку спадання з кроком 2. (Так, так, (0 — 2) буде 5, пам'ятаємо про залишок від ділення на 7). Можна запам'ятати цифри (6, 4, 2, 0, -2, -4, -6), що при обчисленнях дасть аналогічний результат. Року кратні 20 розташовуються в косому квадраті 3х3 за схемою «хід конем» c 2000 роком в центрі. Значення зсувів місяців і років узгоджені так, щоб на 2000 рік припадало зміщення 0. А крок між сусідніми рядами 28 років.
 
Наприклад, для 2014 зсув буде y (2014) = y (2012) + 2 = 1 + 2 = 3. А день програміста 13 вересня 2014 буде (y (2014) + m (сен) + 13) = (3 + 4 + 13) = 20 => 20% 7 = 6, тобто Субота.
 
Структуруємо ряд зсувів для місяців. Значення зручно запам'ятовувати по сезонах: весна, літо, осінь, зима.
 
 image
 
Зверніть увагу, що раптом (?), В порядку зверху вниз і зліва направо, цифри вишикувалися в зростаючий ряд (перша кольорова таблиця). Можна запам'ятовувати тільки залишки від ділення на 7 (друга кольорова таблиця) або для відновлення всієї таблиці запам'ятати тільки різниці (остання таблиця). Додаючи 1 до 1, отримаємо для 2 березня, для 2 червня +1 = 3, для 3 вересня +1 = 4 і т.д. Однакові значення розфарбовані в однакові кольори. Для швидкого пошуку нам допоможе друге кольорова таблиця. Пам'ятаємо, що рядки — це сезони, починаючи з весни. Це вкрай незвично. Але в стародавньому Римі рік починався саме з березня.
 
 image
 
12 квітня 1961: (6 + 1 + 5 + 12) = (0 + 5 + 12) => 17% 7 = 3 — середа.
 
Важливо! У програмістів вічна проблема з втраченою одиницею. У нашій завданню без цього не обійшлося. Для січня і лютого високосного року потрібно вичитати одиницю.
 
14 лютого 2012 = (y (2012) + m (лютий) +14) — 1 = (1 + 2 +14) — 1 => 16% 7 = 2, тобто Вівторок.
 
Ще потрібно пам'ятати, що не всі року що діляться на 4 будуть високосними (виключення — 2100, 1900, 1800, ....). Відповідно, необхідно врахувати зсув для століття. Втім, навіть якщо не враховувати останній виняток можна безпомилково оперувати днями тижня за XX і XXI століття, що достатньо для більшості життєвих випадків.
 
 
Трохи оптимізації.
Обчислення можна проводити в потоковому режимі. Зазвичай дату народження (або будь-яку іншу дату) повідомляють починаючи з дня місяця, наприклад, 23 грудня 1913 року. Тобто в процесі повідомлення дати можна частково обчислити шукану суму 23 + m (дек) = 27 або навіть 23% 7 + m (дек) = 2 + 4 = 6 і потім вже задуматися y (1913) = y (1912) + 1 = 3. У підсумку повідомити 30% 7 = (6 + 3)% 7 = 2, вівторок.
 
Часто доводиться оперувати датами поточного року. Тобто зсув року ви завжди будете пам'ятати, тому що від частого використання значення «закешіруется». Наприклад, для 2014 зсув дорівнює 3.
 
Що ми отримали. Правила заповнення таблиць прості і ви швидше за все їх запам'ятали і зможете відтворити собі шпаргалку в будь-якому місці в будь-який час. Але для швидкого рахунку таблиці простіше завчити цілком. Адже ми не відновлюємо таблиці додавання і множення для розрахунку здачі перед касою. Ці таблиці «прошиті» ще в початковій школі. Для запам'ятовування таблиць легше всього скористатися тренажером Week Brain Calc (Windows Phone).
 
Після нетривалого тренування можна порадувати улюблених своїми унікальними здібностями.
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.