10 отличных задач на логику
hard

10 отличных задач на логику

От простых до школьных

В последние дни года все настолько устали, что иногда не могут решить даже простые логические задачи. Если вы тоже устали, вы не сможете решить эти задачи. А если можете — то не устали и нужно ещё устать.

Уставайте вместе с нами. 

Спор двух программистов

Один программист пришёл к другому и, немного выпив, говорит:

— Загадай любое натуральное число X!

— Отстань.

— Нет, загадай.

— Ну загадал.

— А теперь придумай три любых числа от 6 до 8 включительно.

— Придумал, и что дальше?

— А теперь умножь своё начальное число X на первое из них, прибавь второе и отними третье. Сколько у тебя получилось?

— Минутку… 164.

— Ха, а я знаю, какие ты числа загадал!

— Что, все четыре числа вычислил?!

— Ага!

— НО КАК?!

Действительно, как первому программисту удалось узнать все числа, которые загадал второй?

Обозначим три загаданных числа от 6 до 8 как A, B и C. Если мы сделаем всё, как написано в задаче, то получим равенство: A × X + B − C = 164.

Из этого получим X:

X = (164 − B + C) / A

Исключаем число 7

Если A = 7, то числитель нашей дроби должен нацело делиться на 7, потому что X не может быть дробным (по условию X — натуральное число). Числа, близкие к 164, которые делятся на 7 — это 161 и 168.

Чтобы получить 161 в числителе, числа B и C должны отличаться друг от друга на 3, а это невозможно, потому что максимальная разница равна 8 − 6 = 2.

Чтобы получить 168 в числителе, числа B и C должны отличаться друг от друга на 4, а это тоже невозможно, потому что максимальная разница равна 8 − 6 = 2.

Значит, A точно не равно 7. Запомним это.

Если число A точно не 7, то оно чётное — 6 или 8. Это значит, что числитель (164 − B + C) тоже чётный, чтобы в результате деления получилось целое число. А это возможно, если числа B и C оба чётные или оба нечётные.

Если числа B и C оба нечётные, то это возможно только в случае, если они оба равны 7. В этом случае −B + C = 0, и в числителе остаётся только 164, которое нам предстоит разделить на 6 или 8. Но 164 не делится нацело ни на 6, ни на 8, значит, они тоже не равны 7.

Исключаем одинаковые B и C

Из последнего примера мы видели, что B и С не могут быть одинаковыми в принципе, неважно, чётными или нечётными, поэтому остаются только два варианта:

B = 6, C = 8 или B = 8, C = 6.

Проверяем оставшиеся варианты

Если B = 6 и C = 8, то в числителе получается так: (164 – 6 + 8) = 166. Но 166 не делится нацело ни на 6, ни на 8 (возможные значения A), значит, этот вариант можно исключить.

Получается, что остаётся только пара B = 8 и C = 6: (164 – 8 + 6) = 162. Число 162 нацело делится только на 6: 162 / 6 = 27, значит, A = 6, а второй программист загадал число 27:

X = 27

A = 6

B = 8

C = 6

Проверяем: 6 × 27 + 8 − 6 = 164. Всё сходится.

Как угадать число от 0 до 100 за 7 попыток?

Программист развлекает сына: 

— Загадай любое целое число от 0 до 100!

— Загадал. 

— Спорим, я угадаю его за 7 попыток или быстрее? Я буду называть числа, а ты — отвечать, оно больше, меньше или равно загаданному.

— Ахахах, ты не сможешь угадать за 7 попыток! 

— Спорим, угадаю!

— Ну давай, покажи своё кунфу…

6 попыток спустя отец угадал число, а ребёнок сидит в шоке. Они попробовали снова, и во второй раз отец угадал число за семь попыток. В третий — за четыре. Сколько бы они ни играли, число всегда угадывалось за 7 попыток или менее.

Вопрос: как? 

Это простейшая алгоритмическая задача, которую показывают на первом уроке информатики, чтобы показать мощь алгоритмического мышления. Смысл в том, чтобы...

👉 каждый раз называть число, которое делит пополам диапазон возможных чисел.

Этот приём каждый раз в два раза сокращает область поиска, и в конце нам становится легко угадать даже простым перебором. 

Допустим, сын загадал число 63. Тогда делаем так:

  1. Находим середину диапазона от 0 до 100 — это 50. Называем это число. Сын говорит «Больше».
  2. Значит, его число лежит в диапазоне от 50 до 100. Находим его середину — 75. Называем это число. Сын говорит «Меньше».
  3. Ага, значит, его число находится в диапазоне от 50 до 75. Находим середину — 62. Называем это число. Сын говорит «Больше».
  4. Поиск снова сузился: от 62 до 75. Середина — 67. Называем это число. Сын говорит «Меньше».
  5. У нас осталось 3 попытки и 4 числа. Найдём ещё одну середину — 64. Называем это число. Сын говорит «Меньше».
  6. Раз у нас число, которое больше, чем 62, и меньше, чем 64, то это число 63. Даже седьмая попытка не понадобилась.

Этим способом можно угадать любое число от 0 до 100 за 7 попыток или меньше. Главное — быстро и правильно считать в уме середину и помнить, как выглядит сейчас твой рабочий диапазон.

А если число будет больше? 

На самом деле за 7 шагов можно угадать любое число от 0 до 127 или от 1 до 128. Всё потому, что два в седьмой степени — это как раз 128. Каждый раз, когда мы делим рабочий диапазон на 2, мы как будто убираем одну степень у двойки, постепенно уменьшая наш диапазон угадывания до двух чисел. Для верности лучше добавить ещё попытку. 

Если бы у нас было 8 попыток, можно было бы угадывать числа до 256. 9 попыток — 512 и так далее. 

А где это используется в народном хозяйстве? 

На этом принципе построена модель данных «Бинарное дерево» — это одна из важнейших технологий для составления словарей и поиска данных. Прочитайте об этом в статье про бинарные деревья.

Сложная задача про светодиоды

Стартапер из Кремниевой долины отправился в Китай, чтобы найти производителей для своего нового хайтек-продукта. Проделав путь в тысячу вёрст, он наконец оказался на старом китайском рынке радиодеталей. В самом сердце рынка ему встретился мудрец Синьхуа. Он был известен как лучший вендор электроники и железа провинции Гуандун. Мудрецы говорили: «Если твоим проектом занялся Синьхуа, твоим инвестором станет Бог». 

Синьхуа сидел за большим деревянным столом и сортировал светодиоды из большого мешка. 

— О великий Синьхуа, — начал стартапер, — позволь представить взору твоему CAD-файлы моего будущего проекта! 

Синьхуа посмотрел на него с прищуром и молвил: 

— Если человек при первой встрече готов раскрыть CAD-файлы, он либо стартапер, либо глупец. Но работа с глупцами подобна супу из летучей мыши. Поэтому у меня для тебя загадка. Разгадаешь её — возьму твой проект на свой завод. А не разгадаешь — отправишься в Хабаровск писать код на языке 1С. Идёт? 

Стартапер согласился. 

Синьхуа достал два стакана: побольше и поменьше. 

— В стакан побольше помещается 90 светодиодов. В стакан поменьше — 50 светодиодов. Вот тебе мой мешок светодиодов. Отмерь мне ровно 30 светодиодов, используя только эти два стакана. Считать вручную нельзя. Ежели справишься за 7 пересыпаний или меньше, возьму твой проект. А ежели нет…

Как думаете: справится стартапер с задачей на пересыпание за 7 ходов или поедет в Хабаровск писать конфигурации для 1С? 

Чтобы было наглядно и понятно, что куда пересыпается, нарисуем всё картинками:

10 отличных задач на логику
10 отличных задач на логику
10 отличных задач на логику
10 отличных задач на логику
10 отличных задач на логику
10 отличных задач на логику
10 отличных задач на логику
10 отличных задач на логику

Получается, что на всё потребовалось 8 пересыпаний, а не 7. А раз по условиям нужно было всё успеть за 7 пересыпаний или меньше, наш стартапер проиграл и поедет в Хабаровск.

Сложная задача про поросёнка и NFT

Это классическая задача на логику и экономику. Большинство людей не могут правильно решить её с первого раза, потому что логика взрывает мозг. Проверьте, насколько ваш мозг взрывоустойчивый. 

NFT-трейдер купил редкий токен на картинку с поросёнком, сумма сделки составила 6 тысяч долларов. Через время он продал токен за 7 тысяч, но передумал и выкупил обратно за 8 тысяч. Ещё через какое-то время он продал этот токен за 9 тысяч долларов. 

Вопрос: сколько денег в итоге заработал или потерял трейдер на этой цепочке сделок?

Неправильное решение

Иногда эту задачу решают так: 

потратил 6 (−6), потом заработал 7 (+7), потом потратил 8 (+8), а потом заработал 9 (+9), но раз после последней продажи он остался без токена, который изначально стоил 6, то он ещё потерял 6 (−6): 

 

−6 + 7 − 8 + 9 − 6 = −4 тысячи долларов.

 

❌ По этой логике трейдер потерял за все эти сделки 4 тысячи долларов, но это явно неверное решение.

Правильное решение

Задачу легко решить, если правильно определить исходную точку. А она такая: когда трейдер покупает токен, это не трата, а его цель, за которой он пришёл. На старте у него есть 6 тысяч долларов, а остальное зависит от продавцов.

На первом шаге он покупает токен за 6 тысяч, и его баланс равен −6 тысяч.

На втором шаге он продаёт его за 7 тысяч, и его баланс становится равен −6 + 7 = 1 тысяча.

На третьем шаге трейдер покупает токен назад за 8, и его баланс равен 1 − 8 = −7 тысяч.

А на четвёртом он продаёт токен обратно и получает за это 9 тысяч, и итоговый баланс становится равен −7 + 9 = 2 тысячи. 

Подвох с пропавшей тысячей

🤔 Кажется, что задача решена, но если трейдер в плюсе на 2 тысячи и пришёл на криптобиржу с 6 тысячами на счёте, то у него должно быть 8 тысяч. Но за последнюю продажу он получил 9 тысяч и с ними и остался — куда же тогда делась ещё тысяча?

✅ А тысяча делась на возврат долга самому себе, когда трейдер выкупал обратно свой же токен на тысячу дороже, чем он стоил:

  1. Купил за 6 тысяч ← денег стало 0 (условно, на самом деле мы не знаем, сколько денег у него было на счёте).
  2. Продал за 7 тысяч ← появились 7 тысяч.
  3. Купил за 8 тысяч ← а вот здесь как раз не хватает той тысячи, которую нужно у кого-то занять, чтобы выкупить токен.
  4. Продал за 9 тысяч ← появилось 9 тысяч, возвращаем 1 тысячу долга.

Индийская задача про деньги и баланс

Эта задача пришла к нам в прошлом году из индийских соцсетей, поэтому в ней лихой сюжет и неожиданная развязка.

В одной индийской компании программист в обед услышал громкие крики и причитания из бухгалтерии. Оказывается, в программе, которую сделал этот программист, есть две колонки — «Потрачено» и «Остаток». Но из-за странной ошибки у бухгалтера не сходится баланс. 

Началось всё так: компания выдала менеджеру 50 тысяч на закупку товаров, а каждый расход заносился в программу. Первая покупка вышла в 20 тысяч, и это сразу отразилось в таблице:

10 отличных задач на логику

После этого менеджер сделал ещё три покупки, которые тоже сразу отправились в отчётную таблицу:

10 отличных задач на логику

Но когда программа сложила числа в столбцах, то выяснилось, что суммы различаются и откуда-то взялась лишняя тысяча. В чём ошибка?

10 отличных задач на логику

С точки зрения математики, в этой задаче всё верно — в обоих столбиках сумма посчитана правильно, подвоха здесь нет.

Но проблема в том, что в этой задаче не имеет смысла складывать содержимое столбца «Остаток». Имеет смысл считать только потраченные деньги.

Столбец «Остаток» показывает лишь количество оставшихся денег после всех предыдущих операций и служит показателем лимита расходов. А правильные операции с использованием остатка выглядят так:

10 отличных задач на логику

Как это проверить: попробуйте потратить первым действием потратить не 20 тысяч, а два раза по 10 тысяч. В «Остатке» вы получите сначала 40, потом 30. В сумме это уже даст 70, хотя мы не потратили даже половину. 

Или попробуйте последнее действие (когда тратили 6 тысяч) разделить на 6 действий по одной тысяче. В остатке вы получите 5, 4, 3, 2, 1 и 0. В сумме это 15, хотя потратили мы только 6. 

Короче: суммировать остатки некорректно. Это не «Дебет» и «Кредит», это другое.

То, что в исходной задаче в «Остатке» появилась дополнительная тысяча, — не более чем способ запутать обывателя. Мы намеренно каждый раз вычитаем всё меньшие числа, чтобы было ощущение, что остаток и потраченная сумма как-то связаны. А они не связаны. 

Теперь, когда вы это знаете, попробуйте загадать эту задачку своим коллегам и родственникам и посмотрите, сколько времени им понадобится, чтобы получить правильный ответ 🙂

Сколько нужно ленты для передачи данных?

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

Вот задача:

В петербургском НИИ разрабатывают систему обмена короткими текстовыми сообщениями с помощью ЭВМ. Так как интернет не работает, сообщения записывают на магнитные ленты, запечатывают в конверты и отправляют на абонентский ящик получателя.

Лаборант Сергей попросил завлаба выделить 200 одинаковых ленточек по 110 сантиметров, чтобы закодировать на них старый советский анекдот и разослать всем друзьям.

Завлабу понравился анекдот, и он отправил лаборанта в магазин, чтобы тот купил нужное количество магнитной ленты. В магазине выяснилось, что лента продаётся в бобинах по 25 метров.

Вопрос: сколько бобин нужно купить лаборанту, чтобы хватило на рассылку анекдота всем друзьям? Учтите, что склеивать две ленты в одну целую нельзя.

Большинство детей и их родителей решают эту задачу так:

  1. Длина каждой ленты — 110 сантиметров, или 1,1 метра.
  2. Всего нам требуется 200 лент, значит, нужно умножить 1,1 на 200 — так мы получим общую длину лент, которую нужно купить.
  3. 1,1 × 200 = 220 метров ленты — сколько нужно для рассылки анекдота. 
  4. Раз в бобине 25 метров, то разделим 220 метров на 25 — так мы получим количество бобин: 220 / 25 = 8,8 бобины.
  5. Но так как бобины продаются целыми и поштучно, то округлим 8,8 до следующего числа — получим 9 бобин. Этого точно хватит.

Но это неправильное решение, и если купить всего 9 бобин, то их не хватит для рассылки. Почему так — смотрите в правильном решении.

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

  1. Длина каждой ленты — 110 сантиметров, или 1,1 метра.
  2. В бобине 25 метров, значит, чтобы узнать, сколько лент мы можем сделать из одной бобины, нужно разделить 25 на 1,1.
  3. 25 / 1,1 = 22,72. Получается, что из одной бобины можно сделать 22 ленты и останется ещё какой-то короткий отрезок. Он нам не пригодится — мы не сможем сделать из двух отрезков ещё одну ленту, потому что данные на такую ленту записать невозможно. 
  4. Раз из одной бобины получается 22 ленты, а нам нужно всего 200 лент, то разделим 200 на 22, чтобы узнать, сколько бобин нам нужно.
  5. 200 / 22 = 9,09 бобины. Но так как бобины продаются целыми и поштучно, то округлим 9,09 до следующего числа — получим 10 бобин.

Получается, что если решить эту задачу неправильно, то лаборанту придётся идти в магазин ещё за одной бобиной (или кто-то из друзей не получит рассылку с советским анекдотом). А всё потому, что кто-то поторопился с решением.

Сложная задачка на логику и математику: пассажиры в вагоне

Чтобы поддержать внутренний туризм, команда программистов купила билеты на поезд по Золотому кольцу и заняла все места. Всего в поезде было 11 вагонов и 381 место.

В разных вагонах ввиду конструкционных особенностей разное количество мест и, соответственно, разное количество пассажиров. Но в каждых любых трёх вагонах подряд в сумме едет ровно 99 человек. Какие бы три вагона подряд ни взяли — всё равно 99.

Сколько человек едет в девятом вагоне?

Пронумеруем вагоны и обозначим каждый вагон своей переменной. Когда мы их сложим, то получим 381:

10 отличных задач на логику

x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 = 381


По условию три любых вагона подряд дают в сумме 99. Это значит, что:

x1 + x2 + x3 = 99

x4 + x5 + x6 = 99

x7 + x8 + x9 = 99

10 отличных задач на логику

Заменим эти переменные на числа:

(x1 + x2 + x3) + (x4 + x5 + x6) + (x7 + x8 + x9) + x10 + x11 = 381

99 + 99 + 99 + x10 + x11 = 381

297 + x10 + x11 = 381

x10 + x11 = 84

С другой стороны, по условию в трёх последних вагонах тоже едет в сумме 99 пассажиров:

x9 + x10 + x11 = 99

Вычтем отсюда предыдущее уравнение:

(x9 + x10 + x11) − (x10 + x11) = 99 − 84

 

x9 + x10 − x10 + x11 −x11 = 15

x9 = 15

Получается, что в девятом вагоне едет 15 человек. Кстати, в третьем вагоне тоже 15 человек, потому что он девятый с конца.

Задача про номер дома

На обеденном перерыве, когда было совсем жарко, один программист решил поиздеваться над другим. Он сказал:

— Я загадал два разных числа от 1 до 9, сможешь угадать их сумму?

— Да ну, ты чего, там же куча вариантов.

— Окей, дам подсказку: последняя цифра в произведении моих чисел такая же, как номер моего дома.

— Так я же не знаю номер твоего дома. Хотя подожди, я понял!

И второй программист сразу же назвал сумму двух загаданных чисел. Как он это сделал?

Так как второй программист понял, как решить эту задачу только после информации о произведении чисел, сделаем то же самое: посмотрим, чему равно произведение всех чисел от 1 до 9:

10 отличных задач на логику

Раз нам всё равно, в каком порядке первый программист загадал свои числа, а важен только результат умножения, то мы отбросим половину значений — а всё потому, что 2 × 6 = 6 × 2. Поэтому убираем нижнюю половину таблицы — она дублирует верхние значения:

10 отличных задач на логику

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

10 отличных задач на логику

Так как последняя цифра в результате произведения совпадает с номером дома первого программиста, можно сделать вывод, что номер дома — однозначное число от 1 до 9 (потому что нумерация домов начинается с единицы, а не с нуля). 

Теперь самая нудная часть решения: нам нужно по очереди сравнить все числа от 1 до 9 с последними цифрами произведений, и если таких результатов будет больше одного — отбросить их. Дело в том, что второй программист сразу понял ответ, а это можно сделать, только когда вариантов решения не больше одного.

Для примера подробно разберём число 1: находим все результаты произведений, которые заканчиваются на единицу:

10 отличных задач на логику

Такой результат у нас только один — это число 21. Кажется, что мы сразу нашли верный ответ, но вдруг нет? Нужно точно так же проверить все остальные числа — возможно, будет ещё такое уникальное произведение.

Проверяем двойку:

10 отличных задач на логику

А здесь у нас получилось сразу много произведений с двойкой на конце, поэтому все эти результаты можно отбрасывать как неверные (они не дают однозначного ответа). Точно так же проверим всё остальное и вычеркнем неоднозначные результаты.

Проверяем тройку:

10 отличных задач на логику

Проверяем четвёрку:

10 отличных задач на логику

Проверяем пятёрку:

10 отличных задач на логику

Проверяем шестёрку:

10 отличных задач на логику

Проверяем семёрку:

10 отличных задач на логику

Проверяем восьмёрку:

10 отличных задач на логику

Проверяем девятку: у неё тоже один результат, поэтому тоже оставляем его как один возможных.

10 отличных задач на логику

А всё, что заканчивается на ноль, тоже убираем — у нас нет ноля среди загаданных чисел:

10 отличных задач на логику

Итак, у нас остались всего два числа: 9 и 21, и по идее нам нужно как-то выбрать одно из них, чтобы найти исходную пару чисел и выяснить их сумму. Но давайте посмотрим на то, произведение каких чисел даёт эти результаты:

1 × 9 = 9

3 × 7 = 21

А теперь попробуем сложить эти числа:

1 + 9 = 10

3 + 7 = 10

И там и там сумма равна 10, а значит, мы можем дать правильный ответ в любом случае: сумма загаданных чисел равна 10.

Логическая задача про странные часы

Есть обычные настенные часы, но без цифр и без указания, где у них верх, а где низ. Все стрелки на часах одинаковые — секундная, минутная и часовая. 

Задача — по одному изображению этих часов определить, какое время они показывают. 

Подсказки:

  • Все стрелки двигаются плавно.
  • Циферблат не отзеркален.
  • Крупные риски показывают часы или пятиминутные отрезки.
  • Решение задачи опирается на то, как работают часы.

10 отличных задач на логику

Чтобы как-то отличать стрелки друг от друга, мы их подпишем — A, B и C:

10 отличных задач на логику

Теперь будем делать разные предположения, какая стрелка за что отвечает, а потом посмотрим, к чему это приведёт. Это, кстати, один из вариантов решения любых сложных задач: сформулировать какую-то гипотезу, принять её за правильный ответ и посмотреть, а бьётся ли задача с этим предположением.

Гипотеза: часовая стрелка — A или C. Стрелки A и C указывают точно на часовые (или пятиминутные) отметки. Если бы одна из этих стрелок была часовой (показывала часы), то обе оставшихся стрелки указывали бы ровно на отметку в 12 часов. А всё потому, что часовая стрелка указывает точно на свой час только в тот момент, когда минутная и секундная указывают на 12.

Раз у нас ни одна стрелка не совпадает по расположению с другой, значит наша гипотеза неверна и ни A, ни C — не часовые стрелки. А раз так, значит, остаётся единственная часовая стрелка — это B.

Вывод: B — часовая стрелка.

Раз обе эти стрелки указывают точно на часовые отметки, значит, секундная направлена точно на 12 часов, а минутная — на какую-то только что наступившую минуту.

Теперь получается два варианта:

  1. A — секундная, C — минутная стрелка.
  2. С — секундная, А — минутная стрелка.

Возьмём первый вариант как новую рабочую гипотезу (A — секундная, C — минутная). Раз A — секундная и показывает точно на 12, то мы можем оттолкнуться от этого и пронумеровать все остальные деления на часах:

10 отличных задач на логику

Но раз так, то минутная (C) показывает, что прошло 10 минут с начала часа, а часовая (B) — что час вот-вот закончится. Так не бывает в нормальных часах, поэтому этот вариант мы отбрасываем.

Новая гипотеза: С — секундная, А — минутная стрелка. Рассмотрим второй вариант, когда секундная стрелка — это С, и она указывает точно на 12. Отталкиваясь от этого, пронумеруем остальной циферблат и посмотрим, что получилось:

10 отличных задач на логику

Минутная стрелка у нас указывает теперь на 10 — это значит, что до конца часа осталось 10 минут. Посмотрим на часовую стрелку: она почти дошла до пятёрки, а значит, до конца часа осталось совсем немного, например те же 10 минут. Кажется, мы нашли правильный ответ. Чтобы в этом убедиться, перевернём циферблат правильно:

10 отличных задач на логику

Получается, что часы показывают 4:50 или 16:50.

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Виталий Вебер

Апскиллинг, как говорится
Апскиллинг — это, например, переход с уровня junior на уровень middle, а потом — senior. У «Яндекс Практикума» есть курсы ровно для этого: от алгоритмов и типов данных до модных фреймворков.
Изучить вопрос
Апскиллинг, как говорится Апскиллинг, как говорится Апскиллинг, как говорится Апскиллинг, как говорится
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
hard