Угадай, что я задумал

Задача

Костя задумал натуральное число K от 1 до 2013 и готов отвечать «да» или «нет» на любые вопросы, которые допускают такие ответы. При этом он имеет право дать ошибочный ответ не более одного раза (за все ответы).

Саша хочет задать Косте не более 15 вопросов, по ответам на которые он всегда сможет угадать задуманное число. Помогите ему это сделать.


Подсказка 1

Обычно в подобных задачах стараются задавать «вопросы-сравнения», то есть «Верно ли, что твоё число меньше такого-то» (или «больше такого-то»). Однако Саше совершенно незачем ограничивать себя именно такими вопросами. Более общий тип вопросов выглядит так: Саша записывает любое множество чисел (в которое входят какие-то из чисел от 1 до 2013) и спрашивает Костю: «Верно ли, что ты задумал одно из этих чисел?».


Подсказка 2

Если бы Костя не мог ошибаться, то Саше хватило бы 11 вопросов (подумайте, почему). Значит, у Саши есть четыре вопроса «в запасе», и он должен постараться задавать вопросы так, чтобы если в какой-то момент ответы Кости стали противоречить друг другу, то дальше можно было угадывать число K стандартным образом, каждый раз деля пополам количество оставшихся вариантов.


Подсказка 3

Попробуйте придумать множества для первых 11 вопросов Саши так, чтобы после ответов на них Саша мог оставить в «списке подозрительных» только 12 чисел — одно при условии, что Костя ещё не ошибался, и ещё по одному числу на каждую возможную ошибку Кости.


Решение

Сначала сделаем то, что было предложено в подсказке 3.

Проще всего для этого воспользоваться двоичной системой. Поскольку 2013 меньше, чем 211 = 2048, то двоичная запись любого из возможных задуманных чисел содержит не более 11 разрядов. Поскольку цифра в каждом разряде — это 0 или 1, то Саша может первыми вопросами непосредственно спрашивать: «Верно ли, что цифра в i-м (справа) разряде двоичной записи задуманного числа равна 1?», последовательно перебирая все i от 1 до 11.

Если Костя не ошибётся в ответах ни на один из этих вопросов, то Саша выяснит все разряды задуманного числа, то есть узнает число K (правда, поскольку он не знает, ошибался ли Костя, то он не может сделать вывод о том, что он знает задуманное число). Если же Костя ошибётся в ответе на какой-то вопрос, это будет значить, что задуманное число K отличается от данных Костей ответов в каком-то одном разряде. Но такое число тоже только одно — и так как ошибка могла быть сделана в любом из 11 разрядов, то имеется ещё ровно 11 подозрительных чисел.

Обозначим 12 чисел из полученного списка K0K1, ..., K11 (первое — при отсутствии ошибок, остальные — при ошибке в ответе на соответствующий вопрос).

Как теперь должен действовать Саша? Если он задаст следующий вопрос (см. подсказку 1 о структуре вопросов) про множество из d чисел (всё равно каких, но не включающих K0; например, K1, ..., Kd) и получит ответ «да», это может означать одно из двух: либо загадано действительно одно из этих d чисел, либо Костя ошибся в ответе на этот вопрос. Но если Костя ошибся, то он мог загадать только K0, потому что остальные варианты Kd+1, ..., K11 означают, что Костя уже ошибался в ответе на какой-то из предыдущих вопросов, а второй ошибки он допустить не может! Значит, при ответе «да» у Саши остаётся ровно d + 1 вариантов, причём он точно понимает, что в одном из предыдущих ответов Костя ошибся. Поскольку после этого вопроса у Саши остаются в запасе ещё 3 вопроса, он сможет угадать задуманное число из 8 вариантов. Поэтому можно положить d + 1 = 8, то есть d = 7, и рассмотреть только ответ «нет» на 12-й вопрос.

Ответ «нет» означает, что Костя действительно не мог задумать числа K1, ..., K7 (иначе это было бы второй его ошибкой). Значит, после такого ответа список подозрительных чисел уменьшился до 5: K0, K8, K9, K10, K11. Рассуждая так же, как выше, убедимся, что 13-м вопросом Саша может спрашивать про числа K8, K9, K10: в случае ответа «да» он должен будет угадать одно из четырёх чисел K0, K8, K9, K10, для чего ему хватит двух оставшихся вопросов, а в случае ответа «нет» в списке подозрительных останутся только K0 и K11.

Теперь (14-м вопросом) достаточно спросить про одно число K11. Как и в разобранных выше ситуациях, ответ «да» будет означать, что Костя уже точно ошибался, — и тогда Саша угадает одно из двух чисел за последний, 15-й, вопрос. Ну а после ответа «нет» 15-го вопроса можно уже и не задавать — Саша может сразу сделать вывод о том, что Костя задумал K = K0.


Послесловие

1. Можно ли было обойтись без применения двоичной системы? Да, несомненно.

Заметим, что в каждый момент «игры» между Костей и Сашей ситуация («состояние игры») полностью описывается двумя числами [ab]: a — количество чисел, которые мог загадать Костя при условии, что он ещё не делал ошибок, а b — количество чисел, которые Костя мог загадать при условии, что он допустил уже ошибку в одном из предыдущих ответов. Игра начинается из состояния [2013; 0], а закончиться должна в тот момент, когда «подозреваемое» число осталось единственным — то есть либо на состоянии [1; 0], либо на [0; 1].

Пусть первый вопрос Саши относился ко множеству из d чисел. Тогда после ответа «да» новым состоянием игры стало [d; 2013 – d], а после ответа «нет» — [2013 – dd] (подумайте, почему это так). Если Саша разделит множество из 2013 чисел на две почти равных части, то он получит одно из состояний [1007; 1006] и [1006; 1007]. Вторым вопросом он может разделить пополам каждую из этих частей — и получить либо [504; 1006], либо [503; 1007] (здесь 1007 чисел получаются следующим образом: во-первых, это те 504 числа из b = 1007, которые Саша включил в своё множество, а во-вторых, это те 503 чисел из a = 1006, которые он во множество не включил — но если Костя допустил ошибку при ответе на этот вопрос, то эти числа могли быть им загаданы).

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

[504; 1006] → [252; 755] → [126; 504] → [63; 315] → [32; 189] → [16; 111] → [8; 64] → [4; 36] → [2; 20] → [1; 11]

(или [503; 1007] → [251; 755], что меньше, чем в вышеприведенной цепочке. Еще несколько аналогичных вариантов в этой цепочке я сразу позволил себе опустить.)

Таким образом, к описанной в нашем решении ситуации «1 + 11» можно было прийти и безо всяких упоминаний двоичной системы. Ну а дальше [1; 11] → ([1; 4] или [0; 8]) → ([1; 1] или [0; 4]) → ([1; 0] или [0; 2]) → [0; 1].

2. Наше решение демонстрирует, что вместо чисел от 1 до 2013 Саша мог позволить Косте загадывать числа от 0 до 2047, и всё равно уложиться с угадыванием за 15 вопросов. Однако оно оставляет без ответа очень естественный обобщающий вопрос. Пусть Саше разрешено задавать не 15, а N вопросов. В каком диапазоне (от 0 до M) он может разрешить Косте загадывать числа, чтобы этих вопросов хватило для гарантированного угадывания?

Полный ответ на этот вопрос (точнее, доказательство верности этого ответа) далеко не так прост, как кажется на первый взгляд. Его можно записать так: если (здесь [x] — целая часть числа x, то есть наибольшее целое число, не превосходящее x) чётно, то M = s, а если s нечётно, то M = s – 1. Небезынтересно и то, что от момента постановки задачи до получения полного её решения прошло более 20 лет!

По-видимому, впервые задачу угадывания с возможностью совершать ошибки в ответах сформулировал замечательный венгерский математик Альфред Реньи в статье 1961 года на венгерском языке. Спустя несколько лет (в своей автобиографии «Приключения математика») её популяризовал американский математик Станислав Улам.

«Мы с Хокинсом [Дэвид Хокинс, философ, впоследствии автор замечательной научно-популярной книги «Язык природы». — Прим. авт.] размышляли над следующей связанной с этим задачей: вариация игры «Двадцать вопросов». Один человек задумывает число в интервале от единицы до одного миллиона (который как раз меньше, чем 220). Другому человеку позволяется задать до двадцати вопросов, на каждый из которых первый участник должен отвечать только «да» или «нет». Очевидно, что число можно угадать, если сначала спросить: это число в первой половине миллиона? В следующем вопросе опять ополовинить получившийся интервал чисел и так далее. В конечном итоге, число можно угадать менее чем за log21000000 раз. Предположим теперь, что участник имеет право солгать один или два раза. Сколько вопросов потребуется, чтобы получить верный ответ? Ясно, что для того, чтобы угадать одно из 2n чисел, требуется более n вопросов, поскольку о том, когда была сказана ложь, неизвестно. В общем виде эта задача не решена».

Полное решение задачи Улама для случая одной ошибки было получено Анджеем Пельцем в 1986 году, а для двух ошибок — в 1990 году. Еще через 10 лет математикам удалось полностью решить задачу для «права на три ошибки». Для задач с большим числом ошибок решены только отдельные частные случаи, а полных решений пока не найдено.

3. Если не требовать оптимальных решений и минимального числа вопросов, то всё становится намного проще. Так, в 1991 году на Всесоюзной олимпиаде по математике предлагалась следующая задача (авторы — А. Анджанс, И. Соловьев, В. Слитинский.)

Следователь придумал план допроса свидетеля, гарантирующий раскрытие преступления. Он собирается задавать вопросы, на которые возможны только ответы «да» или «нет» (то, какой вопрос будет задан, может зависеть от ответов на предыдущие). Следователь считает, что все ответы будут верными, он подсчитал, что при любом варианте ответов придётся задать не более 91 вопроса. Докажите, что следователь может составить план не более чем со 105 вопросами, гарантирующий раскрытие преступления и в случае, если на один вопрос может быть дан неверный ответ (но может быть, что все ответы верные).

Решение этой задачи было основано на другой идее: как можно модифицировать исходный план вопросов, добавляя в него «контрольные вопросы». Сначала следователь задаёт первые 13 вопросов первоначального плана, а потом задаёт 14-й вопрос «Солгали ли Вы в предыдущей серии вопросов?». Получив ответ «нет», он может продолжать задавать серии из 12, 11, 10, ..., 1 вопросов плана, повторяя контрольный вопрос после каждой серии (подумайте, почему ответ «нет» на контрольный вопрос гарантирует, что ответы на вопросы серии действительно были верными). Если же на какой-то из контрольных вопросов получен ответ «да», то повторяется вся предыдущая серия, при этом больше контрольных вопросов можно не задавать. Если ответ «да» получен на k-й контрольный вопрос, то сверх исходного плана придётся задать k + (14 – k) = 14 вопросов. Отметим, что ложь могла быть и в ответе на контрольный вопрос — в этом случае ответы на повторно заданную серию будут точно такими же, как и в первый раз.

Почему «модификация плана» не является оптимальной стратегией и не гарантирует минимальности числа заданных вопросов? Например, потому, что исходная задача следователя была равносильна угадыванию задуманного числа из диапазона от 0 до 291 – 1. Но для этого, как мы уже знаем, хватает не 105, а всего 98 вопросов: 298/99 > 298/27 = 291. Тем не менее предложенная в олимпиадной задаче модификация увеличивает длину плана из N(N – 1)/2 вопросов не более чем на N, то есть на величину порядка квадратного корня из удвоенной исходной длины. Что, в общем, тоже не так и плохо.

4. Почему серьёзные математики вообще занимаются такими «игрушечными» задачками? Дело в том, что эта задача очень близка к классическим задачам теории кодирования и тесно связана с ними (см.: Обнаружение и исправление ошибок, Код Хэмминга). Действительно, в описанной нами игре Костя и Саша могут заранее (до выбора Костей задуманного числа) договориться о списке задаваемых вопросов (в том числе — договориться о том, какой вопрос будет задан вторым при ответе «да» на первый вопрос, а какой — при ответе «нет», и аналогично договориться про следующие вопросы). Это означает, что Костя может просто послать Саше последовательность из 15 ответов — или, если угодно, последовательность из 15 символов «0» и «1». По каждой такой последовательности Саша сможет отгадать («реконструировать») задуманное Костей число, а значит — определить, в ответе на какой вопрос Костя ошибся. Это и есть код Хэмминга, исправляющий одну ошибку.

Статья Р. Хэмминга «Коды, обнаруживающие и исправляющие ошибки» была опубликована в 1950 году (оригинал можно увидеть, например, здесь, PDF, 3,1 Мб). В то время исходные данные в компьютеры загружались с помощью перфокарт, и устройства ввода перфокарт были настолько ненадёжными, что практически никакая достаточно толстая колода не считывалась без ошибок. Запуск программы, содержащей ошибку, приводил в лучшем случае к сбою, после которого вычисления останавливались и колоду приходилось считывать ещё раз, а в худшем — к полной остановке машины. Придуманные Хэммингом коды позволяли не только обнаруживать ошибки, но и автоматически исправлять их. Это была настоящая революция!

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


4
Показать комментарии (4)
Свернуть комментарии (4)

  • Alexey Lubkin  | 15.03.2013 | 00:34 Ответить
    Числа 11 (бит в K) и 15 сразу напомнили классический код Хэмминга (15, 11) с 11 информационными битами и 4 проверочными: обнаруживает 2 ошибки, исправляет 1 ошибку. Минимальное кодовое расстояние (МКР) равно 3.
    Т.е. в пространстве допустимых 15-битных кодовых слов (их 2048 штук) в побитовой разности между ЛЮБЫМИ двумя такими словами будет как минимум 3 единицы. Если на вход поступает кодовое слово, не принадлежащее множеству допустимых кодовых слов, то значит, что при передаче произошло искажение. В случае однократной ошибки, мы всегда можем найти близлежащее кодовое слово, отличающееся от полученного на 1 бит, это и будет исходное кодовое слово. Если добавить бит чётности (16 вопросов вместо 15), то МКР увеличится до 4, что позволит исправлять 2-кратные ошибки, обнаруживать 3-кратные.

    Возвращаясь к задаче, вопросы будут строиться так: первые 11 - про биты загаданного числа, последующие 4 - про проверочные биты, которые несложно вычислить, попросив загадывающего помножить 11-битное слово (вектор-строка) на правую часть порождающей матрицы размером (11, 4). Эту же операцию нужно будет провести и самостоятельно с полученными 11 битами. По разнице сможем установить, где именно произошла ошибка.
    Ответить
    • Валя Гриневич > Alexey Lubkin | 16.03.2013 | 14:27 Ответить
      А правда ли, что если три раза передать одно и то же сообщение, то можно исправить в нем все ошибки? Это равносильно тому, что увеличить число бит в сообщении в три раза?
      Ответить
      • Alexey Lubkin > Валя Гриневич | 16.03.2013 | 15:51 Ответить
        > А правда ли, что если три раза передать одно и то же сообщение, то можно исправить в нем все ошибки?

        Нет, все не исправить. Но однократная ошибка подлежит исправлению при 3-кратной передаче исходного сообщения.
        Ответить
  • taras  | 07.10.2017 | 18:38 Ответить
    1. Разряды принято нумеровать с ноля.
    2. Костя не обязан знать двоичного счисления и нумерацию разрядов. Поэтому лучше спрашивать так: "число чётно?", "Если отбросить от половины числа дробную часть, то получится чётное число?", "Если отбросить от четверти числа дробную часть, то получится чётное число?" и так далее. Смысл тот же, но формулировка вопроса позволит понять его без специальных знаний.
    3. В запасе всего 4 вопроса, а подозреваются 11 бит.
    Ответить
Написать комментарий
Элементы

© 2005–2025 «Элементы»