Читать «Вычислительное мышление: Метод решения сложных задач» онлайн - страница 29

Питер Макоуэн

Новые фокусы с помощью информатики

Как мы уже знаем, алгоритмические фокусы и компьютерные программы — по сути, одно и то же. В некоторых фокусах применяются точно такие же алгоритмы, как и в программах, — например, поисковый. Значит, мы вправе применить и повторно использовать некоторые решения. В описанном фокусе надо было найти 16-ю карту, но на примере перфокарт мы видим, что, если перевести числа в двоичный код и таким образом определить, какую стопку оставить, можно выделить любую карту. А значит, эту идею легко вернуть в мир магии. Например, подготовить фокус, в котором перед показом карту можно положить куда угодно. И это необязательно должна быть 16-я карта! Конечно же, при этом необходимо точно знать, где она находится. Еще надо уметь переводить числа в двоичный код в уме. Проводить математические операции в уме — полезный навык и для фокусника, и для ученого-информатика!

Однако пойдем немного дальше и не просто слегка изменим фокус, как мы сделали ранее. Если от происходящего и выделить математический принцип, стоящий за алгоритмом, то есть скорее результат, а не шаги, приводящие к нему, то вы придумаете совершенно новый фокус.

Выберите стопку

Давайте посмотрим, как этот принцип работает в «Сне об австралийском маге». Как мы увидели на примере перфокарт, он работает, потому что на каждом этапе мы сбрасываем и оставляем некий набор чисел в зависимости от их представления в двоичной системе. На первом этапе уходят перфокарты с нечетными числами, то есть с 1 в первой позиции двоичного кода (в первом колонке) — это 1 3 5 7 (0001, 0011, 0101, 0111, ). В следующем раунде мы отбрасываем числа 2 6 Это карты с 1 во второй позиции двоичного кода (во втором колонке), то есть 0010, 0110, Это не все карты, у которых есть 1 в этой позиции, потому что некоторые мы уже отбросили. Давайте перечислим все такие карты. У нас получится более длинный список: 2, 3, 6, 7, 10, (0010, 0011, 0110, 1111, 1010, ). В следующий раз избавляемся от карт с 1 в третьей позиции двоичного кода (колонке четверок). В полный список войдут 4, 5, 6, 7, 12, (0100, 0101, 0110, 0111, 1100, ...). Теперь стоит отметить, что мы наблюдаем здесь еще одну модель. Первое число в каждом списке карт указывает на колонку в двоичном коде, которой соответствует весь список.

На этом основан еще один фокус. Сделайте стопку карт, на которых написаны числа 1, 3, 5, 7, 9, 11, 13, 15. Сделайте еще одну стопку карт, с числами 2, 3, 6, 7, 10, 11, 14, 15. Сделайте третью стопку, с 4, 5, 6, 7, 12, 13, 14, 15. И наконец, четвертую, с 8, 9, 10, 11, 12, 13, 14, 15. Перетасуйте карты в каждой стопке. Сами стопки могут идти в любом порядке.

Теперь попросите добровольца задумать число от 1 до 15 и запомнить его, но не говорить вам. Возьмите одну из стопок и сдавайте карты по одной. Объясните, что вы читаете мысли человека, который смотрит на карты, даже не глядя на него. Вам достаточно смотреть на карты. Когда вы закончите сдавать карты, попросите добровольца сказать, было ли задуманное число в этой стопке, что является «дополнительной проверкой на детекторе лжи», которая поможет вам настроиться на его мысли. Если доброволец скажет, что число было в стопке, отложите карты в сторону. Если нет, оставьте их на месте. Повторите эту процедуру с каждой стопкой.