31. Дни недели
Сегодня не воскресенье, а завтра не среда. Вчера была не пятница, а позавчера был не понедельник. Завтра не воскресенье, и вчера было не воскресенье. Послезавтра не суббота и не воскресенье. Вчера был не понедельник, и не среда. Позавчера была не среда, а завтра не вторник. Да, и сегодня не среда. Какой же сегодня день недели, если учесть, что одно утверждение в списке – ложно?
Показать ответ
Воскресенье.
Читайте также
- Языки программирования и технологии для веб-разработки
- GET-запросы в PHP
- Установка и настройка OpenServer
- Условия в PHP
- Виды связей в базах данных
- Как выбрать тематику своего будущего сайта
- Отладка PHP 8 с помощью Xdebug 3 в PHPStorm
- Слушатели: как работают и как их использовать не по стандарту
Об авторе
Если вам интересно узнать
как я стал программистом,
читайте вот эту статью.
Курсы PHP
- Курс HTML для начинающих
- PHP для начинающих
- Курс MySQL с нуля
- ООП в PHP
- PHP для профессионалов
- Курс по Symfony
- Курс по Laravel
Тесты
- Тест по основам HTML
- Тест по основам PHP
- Тест по ООП в PHP
- Тест по основам MySQL
Статьи
Разное
- Песочница
- Алгоритмические задачи
- Логические задачи
- Вопросы и ответы
- Поддержать проект
- Контакты
- Отзывы учеников
- Рейтинг
- Конфиденциальность
- Договор-оферта
Вычисление дня недели в уме
Существует множество способов прокачать мозг. Задачи «n-back» или мобильные приложения для тренировки навыка быстрого счета в уме. Но эти задачи оторваны от текущей реальности, а хотелось бы прокачать мозг практичным навыком.
Зачем? Ведь можно быстро посчитать на гаджете. Увы, совсем не быстро, т.к. потребуется время на поиски и активацию гаджета, поиск приложения, ввод даты, осознание полученного результата. А еще можно друзей/подруг порадовать своими внезапно появившимися экстраординарными способностями. Кстати, друзья быстро осознают удобство использования вечного календаря с голосовым интерфейсом.
Разве это возможно? Как-то раньше обходились без компьютеров. В одной из тв-передач «ищем таланты» показывали натренированного трехлетнего ребенка, который может вычислять произведение трехзначных чисел (пощадите своих детей). Впрочем, взрослые уже не дети и их мозг частично кристаллизован, в смысле слабо обучаем. Значит нужно запоминать как можно меньше и максимально задействовать имеющиеся навыки.
В алгоритмике часто объемы вычислений могут быть скомпенсированы объемами памяти. Т.е. чем больше оперативки доступно, тем меньше потребуется вычислений. Аналогично работает мозг – чем больше мы запомнили, тем быстрее ищем решение. Запомнили несколько формул для сборки кубика Рубика – соберете за пару минут (после длительной тренировки). Запомнили полторы сотни формул – соберете за пару десятков секунд. Мировой рекорд 2013 года – 8.18 сек. Еще раз: чем больше помним – тем быстрее решение.
Алгоритм
Нужно взять смещение (день недели) первого дня года (y) и смещение месяца (m). Затем вычислить сумму y+m+d, где d – день месяца, и найти остаток от деления на 7. Получим номер дня недели.
Что нужно запомнить
Размышления
В целом, достаточно запомнить все дни недели всех 28 лет (периодичность пропорциональна произведению периодов високосных лет и дней недели). Последовательность в 10k. Это довольно много.
Если добавить одну операцию сложения, то будет достаточно запомнить лишь пару рядов чисел:
m(month) = < 6 2 2 5 0 3 5 1 4 6 2 4 >, с января по декабрь
Например: 13 сентября 2013 = (13 + 4 + 2) % 7 = 5 (пятница)
Смещения для месяца берутся из календаря некоторого года. Смещение месяца равно количеству серых квадратов в начале месяца. Например, не високосный 2006 год. Смещение для этого года будет 0.
Все же запомнить смещения для всех лет и затем выполнять быстрый поиск по индексу довольно сложная когнитивная задача. Есть альтернативный путь – вычислить. Нужно взять две последние цифры года (+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)
В итоге может оказаться проще запомнить таблицу смещений в таком виде:
Смещение для года можно вычислить через сумму смещения ближайшего меньшего високосного года и его разницы с искомым годом. Семь цифр запомнить проще чем 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, т.е. суббота.
Структурируем ряд смещений для месяцев. Значения удобно запоминать по сезонам: весна, лето, осень, зима.
Обратите внимание, что вдруг (?), в порядке сверху вниз и слева направо, цифры выстроились в возрастающий ряд (первая цветная таблица). Можно запоминать только остатки от деления на 7 (вторая цветная таблица) или для восстановления всей таблицы запомнить только разности (последняя таблица). Прибавляя 1 к 1, получим для марта 2, для июня 2+1=3, для сентября 3+1=4 и т.д. Одинаковые значения раскрашены в одинаковые цвета. Для быстрого поиска нам поможет вторая цветная таблица. Помним, что строки — это сезоны, начиная с весны. Это крайне непривычно. Но в древнем Риме год начинался именно с марта. Это отражено в названиях месяцев латинскими цифрами: September/October/November/December – 7/8/9/10, т.е. февраль был последним 12м месяцем года, к которому добавляли високосный день.
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).
После непродолжительной тренировки можно порадовать любимых своими уникальными способностями.
- вечный календарь
- тренировка мозгов
Загадка. Если бы вчера было завтра, то сегодня был бы понедельник. какой сегодня день недели? ПОЖАЛУЙСТА ПОМОГИТЕ
получается возвращаемся в прошлое
Вчера-завтра
позавчера это сегодня тип. Сегодня понедельник. Завтра вторник. После завтра среда?
Ответ среда?
Лучший ответ
Если сегодня был бы понедельник, то вчера было бы воскресение.
Но вчера (воскресение) по условию задачи) будет только завтра,
значит сегодня — СУББОТА!
Ответ: суббота.
Проверка: если бы вчера (пятница) было завтра (воскресение), то сегодня был бы понедельник.
Задача решена, всем спасибо за внимание, а мне — ЛОшку!
Гульзара СуюндуковаУченик (123) 6 лет назад
Как проверка может пройти? Если вчера у тебя пятница, то завтра воскресенье а не суббота! подумай снова ты не верно проверил
Советская артель микрочипов Мастер (1692) Вот проследи внимательно за такой цепочкой событий: Читаем условие задачи: ЕСЛИ БЫ ВЧЕРА БЫЛО ЗАВТРА. а далее рассуждаем: следовательно, СЕГОДНЯ будет ПОСЛЕЗАВТРА. И этот день, по условию задачи, — ПОНЕДЕЛЬНИК. СЕГОДНЯ -ПОНЕДЕЛЬНИК — ПОСЛЕЗАВТРА Далее рассуждаем: но если понедельник будет только послезавтра, значит сегодня -суббота. А проверку можно не читать, я написал коротко, с учётом сдвига на два дня.
э эУченик (101) 6 лет назад
Мне кажется вы спутали условие со следствием, ещё раз прочитать Если бы Вчера было бы Завтра, ТО (СЛЕДОВАТЕЛЬНО, имеется в виду )тогда сегодня был бы Понедельник. (А не наоборот) . То есть здесь условие выступает если бы, а следствие выступает воображаемый понедельник. И эту задачу поэтому решать нужно так: 1) соблюдаем условие сначало, к не наоборот: если бы вчера было бы завтра, то чтоб понедельник стал сегодняшним что нужно сделать? — нужно чтоб завтра был вторник, поэтому вторник стал завтрашним, то есть и он же был вчерашним со стороны условия, а на вторник кто может сказать вчерашний? — среда, значит соблюдены все условия и следствия и итог
э э Ученик (101) Вот если бы условия задачи были бы сформированы иначе вот так: если бы сегодня был бы Понедельник, то вчера было бы завтра, Тогда конечно же вчерашнее воскресенье становится завтрашним, а значит на завтрашнее воскресенье кто может сказать — суббота
SibDГуру (4465) 5 лет назад
У задачи 2 решения: Суббота и Среда
«если бы вчера было завтра» — в случае, если вчерашний день ещё только наступил бы завтра
«если бы вчера было завтра» — в случае, если завтрашний день уже был бы вчера
Советская артель микрочипов Мастер (1692) Нет, неверно, задача имеет одно решение. Ключевые слова в условии задачи СЕГОДНЯ — ПОНЕДЕЛЬНИК. А дальше логика простая: если вчера — это завтра, следовательно, СЕГОДНЯ — это ПОСЛЕЗАВТРА. Возвращаемся к ключевым словам: сегодня понедельник, завтра вторник, ПОСЛЕЗАВТРА -СРЕДА..
Иосиф СудиЗнаток (289) 2 месяца назад
- Сегодня понедельник — вчера Воскресенье, завтрашний день для ответа = ответ, сегодня суббота
- Ответ, сегодня среда = вчера Вторник, будет завтрашним для условия, понедельника
- Логика со средой кажется прямее.
Иосиф СудиЗнаток (289) 2 месяца назад
В продолжение, логика со средой прямее из за формулировки. Если бы завтра стояло в предложении раньше вчера, то суббота подошла бы больше
Остальные ответы
Воскресенье, может быть.
Если бы вчера было завтра, то сегодня был бы понедельник. какой сегодня день недели?
Ответ: СРЕДА
Решение: 1. Неизвестное: СЕГОДНЯ!
2.Но известно, что после каких-то изменений и предположений Сегодня стало известно это Понедельник
Имеем. Сегодня-Понедельник, Завтра-Вторник
3.Так же нам из условия известно «Если бы Вчера было Завтра»,Завтра=Вчера, Завтра-Вторник= Вчера, значит Завтра-Вторник=Вчера-Вторник.
Вчера-Вторник, СЕГОДНЯ-СРЕДА, Завтра-Четверг.
Юрий Ученик (110) 1 год назад
А теперь попробуй проверить. Разве получится так сказать в среду? Если уж решаешь как задачу в математике, то проверяй ответ, подставляя его в условие.
Оксана ЮдинаУченик (160) 3 месяца назад
Всё верно, среда ?
У этой загадки два ответа. 1 если вчерашний день был завтра, то это среда. 2 если вчера был завтрашний день, то это суббота.
ПОНЕДЕЛЬНИК.
Загадка. Если бы вчера было завтра, то СЕГОДНЯ БЫЛ БЫ ПОНЕДЕЛЬНИК. какой сегодня день недели?
Зарядка для ума. Логическая задачка про дни недели, на которую нередко дают разные ответы
А мы подготовили для вас новое задание для тренировки ума. Вчера решали задачку про дверные номерки, а на этот раз нас ждут дни недели. Читайте внимательно условие задания.
Сегодня не воскресенье, а завтра не среда. Вчера была не пятница, а позавчера был не понедельник. Завтра не воскресенье, и вчера было не воскресенье. Послезавтра не суббота и не воскресенье. Вчера был не понедельник и не среда. Позавчера была не среда, а завтра не вторник. Да, и сегодня не среда. Какой же сегодня день недели, если учесть, что одно утверждение в списке ложно?
Речь идет про воскресенье. Вот такой любопытный пример решения этой задачи предлагают пользователи одного из тематических сайтов.
Каждое утверждение записываем по отдельности и в них указываем, какие дни не могут быть сегодня:
1) воскресенье, вторник;
2) суббота, среда;
3) суббота, понедельник;
4) четверг, пятница;
5) вторник, четверг;
6) пятница, понедельник;
Так как утверждений семь (как и дней недели), но почти в каждом указано два дня, ложным будет то, в котором содержится день, встречающийся только один раз, т. к. те дни недели, которые на самом деле не являются сегодняшним днем, встречаются два раза. Следовательно, 2 × 7 = 14, это количество всех записанных дней минус один, где единица — тот самый сегодняшний день, не указанный в условии. Выясняем, что ложное — первое утверждение. Из этого также следует, что остальные дни недели не являются сегодняшним днем, а день, который встретился только один раз, и есть сегодняшний.
А вот такой вариант предложила нам читательница Юлия. По ее словам, такое решение будет легко и интересно донести детям.
Сегодня воскресенье, поскольку это единственный день, который зачеркнут только одним цветом. Все остальные — двумя разными цветами. Отменив лишь один из них (одно утверждение по условиям задачи), этот день все равно будет исключен другим цветом (утверждением).
Свои варианты можете отправлять в Telegram нашему журналисту @islandzec.
Читайте также:
- Зарядка для ума. Решите задачу про носки от американского математика?
- Зарядка для ума. Решаем задачку про Иванушку и реку
- Зарядка для ума. А вот такую задачку про воду дают на собеседовании в Microsoft