Text
                    Д. М. Златопольский

ЗАНИМАТЕЛЬНАЯ
ИНФОРМАТИКА
3-е издание (электронное)

Москва
БИНОМ. Лаборатория знаний
2015


УДК 004.9 ББК 32.97 З-67 З-67 Златопольский Д. М. Занимательная информатика [Электронный ресурс] : учебное пособие / Д. М. Златопольский. — 3-е изд. (эл.). — Электрон. текстовые дан. (1 файл pdf : 427 с.). — М. : БИНОМ. Лаборатория знаний, 2015. — Систем. требования: Adobe Reader XI ; экран 10". ISBN 978-5-9963-2554-2 Книга во многом аналогична популярным книгам «Занимательная физика» Я. И. Перельмана, «Математические чудеса и тайны» М. Гарднера, «В царстве смекалки» Е. И. Игнатьева, «Математическая смекалка» Б. А. Кордемского и др. Она содержит большое количество разнообразных занимательных логических задач и головоломок, интересных фактов и полезных программ, простейших компьютерных игр, фокусов и др. Материалы книги охватывают широкий круг вопросов информатики, вычислительной техники и информационных и коммуникационных технологий (системы счисления, кодирование информации, логика, основы программирования, Интернет и др.). Эти материалы можно использовать как в учебном процессе, так и для внеклассной работы с учащимися. Для учащихся 5—11 классов и их родителей, а также для учителей информатики и для всех, кто интересуется информатикой. УДК 004.9 ББК 32.97 Деривативное электронное издание на основе печатного аналога: Занимательная информатика : учебное пособие / Д. М. Златопольский. — М. : БИНОМ. Лаборатория знаний, 2011. — 424 с. : ил. — ISBN 978-5-9963-0052-5. В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации ISBN 978-5-9963-2554-2 c БИНОМ. Лаборатория знаний, 2011 ○
Содержание Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1. Двоичная система — не только в компьютере! . . . . . . . . . . . . . . . . . . 13 1.1. Штрихкод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2. Двоичное кодирование в фотоаппарате . . . . . . . . . . . . . . . . . . . . 17 1.3. Повар и пицца . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.4. Градуировка весов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.5. Серебряная цепочка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.6. Семь кошельков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.7. Волшебная таблица. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.8. Семь табличек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.9. Волшебная карточка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.10. Фокус . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.11. Как отгадать число? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1.12. А если солгать? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1.13. Пять мешков с фальшивыми монетами. . . . . . . . . . . . . . . . . . . . 25 1.14. Найти фальшивую монету . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.15. Двоичная система и «Ханойские башни» . . . . . . . . . . . . . . . . . . 28 1.16. Задача Иосифа Флавия — частный случай . . . . . . . . . . . . . . . . . 29 1.17. Игра «ним» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 1.18. «Шоколадка» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2. Перемещение предметов и… животных . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.1. Выкатить шарики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.2. Восемь монет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.3. Шесть монет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.4. Еще две задачи на перекладывание монет . . . . . . . . . . . . . . . . . 36 2.5. Задачи со спичками. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.5.1. Собрать в группы по 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.5.2. Собрать в группы по 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.6. Переставить шашки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.7. Девять шашек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.8. «Уголки». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.9. Перемещение лошадей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.10. В зоопарке. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.11. Перестановка коней . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.12. Перемещаем карточки, или Как апельсин превратить в собаку. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.13. Еще 8 задач на перемещение карточек . . . . . . . . . . . . . . . . . . . . 43 2.14. Упорядочить карточки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4 Занимательная информатика 2.15. Сортировка, или «По ранжиру — стройся!» . . . . . . . . . . . . . . . . 45 2.15.1. Сортировка выбором . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.15.2. Сортировка вставками . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.15.3. Сортировка обменом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.16. Ханойские башни . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3. 64 задачи для Водомера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4. Взвешиваем всё — от крупы до золотых монет . . . . . . . . . . . . . . . . . 62 4.1. Взвешивание крупы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.2. Как отмерить 9 кг гвоздей? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.3. Как отмерить 1 кг сахара? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.4. Неправильные весы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.5. Потерянная гиря . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.6. 19 гирек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.7. Как оставить себе золотую монету? . . . . . . . . . . . . . . . . . . . . . . . 63 4.8. Три монеты, одна — фальшивая . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.9. 81 монета, одна — фальшивая . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.10. 101 монета, одна — фальшивая . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.11. 51 монета, одна — фальшивая . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.12. Антиквар и 99 монет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.13. 61 монета, две — фальшивые . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.14. 103 монеты, две — фальшивые . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.15. 10 монет: 5 золотых и 5 серебряных . . . . . . . . . . . . . . . . . . . . . . . 65 4.16. Шесть монет, две — фальшивые . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.17. Странные весы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.18. 6 монет, 2 фальшивые, не очень точные весы . . . . . . . . . . . . . . . 66 4.19. 8 монет, 2 фальшивые. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.20. Разложить 22 монеты на две кучки . . . . . . . . . . . . . . . . . . . . . . . 66 4.21. Мешок с фальшивыми монетами . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.22. Еще один мешок с фальшивыми монетами. . . . . . . . . . . . . . . . . 66 4.23. 12 мешков с золотыми монетами . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.24. 101 монета, 50 фальшивых . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.25. Пять кучек по 5 монет. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.26. Экспертиза фальшивых монет . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.27. 201 монета, 50 фальшивых . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.28. Случай в тюрьме для пиратов . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.29. Три пары монет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.30. 20 металлических кубиков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.31. Двенадцать монет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 5. Маневры, переходы, переезды.... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.1. Формирование состава . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.2. Перестановка вагонов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.3. И опять формирование состава . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.4. Перестановка вагона и цистерны . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.5. Ночной переход по мосту . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.6. Переход по пустыне. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.7. Задача о лифте . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Содержание 5 6. Пляшущие человечки и лысина раба . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 6.1. Шифр Цезаря . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6.2. Буратино и шифровка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.3. Машина для расшифровки из бумаги . . . . . . . . . . . . . . . . . . . . . 77 6.4. «Тарабарская грамота» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 6.5. Карл пишет Кларе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 6.6. Номера вместо букв . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 6.7. Однажды в поезде . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 6.8. Расшифровка текста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 6.9. Частотный анализ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 6.10. Что такое «лягяня»? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 6.11. Шифр Вижинера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 6.12. Послание будущим издателям . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 6.13. Перестановочный шифр. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 6.14. Шифрование двумя цифрами . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.15. Шифр Тритемиуса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 6.16. Три письма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 6.17. Шифрование текста с помощью таблиц. . . . . . . . . . . . . . . . . . . . 86 6.18. Игра в прятки, или Что такое стеганография. . . . . . . . . . . . . . . 89 7. Числовые ребусы и кросснамберы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 7.1. Ребусы со звездочками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 7.2. Ребусы в четверичной системе счисления. . . . . . . . . . . . . . . . . . 98 7.3. Числовой ребус в шестеричной системе счисления . . . . . . . . . . 98 7.4. Числовые ребусы в двенадцатеричной системе счисления . . . 99 7.5. Числовой ребус в системе счисления с неизвестным основанием . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 7.6. Кросснамберы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 8. На пальцах и в уме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 8.1. Рука человека как счетная машина . . . . . . . . . . . . . . . . . . . . . . 108 8.2. Возведение двузначных чисел в квадрат. . . . . . . . . . . . . . . . . . 111 8.3. Еще восемь приемов быстрого счета . . . . . . . . . . . . . . . . . . . . . 112 8.3.1. Быстрое возведение в квадрат . . . . . . . . . . . . . . . . . . . . . 112 8.3.2. Квадраты чисел, состоящих из единиц . . . . . . . . . . . . . 112 8.3.3. Другие степени числа 11 . . . . . . . . . . . . . . . . . . . . . . . . . . 112 8.3.4. Произведение двух «особых» чисел . . . . . . . . . . . . . . . . 113 8.3.5. Умножение числа 37 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 8.3.6. Особенные случаи умножения на 9 . . . . . . . . . . . . . . . . . 113 8.3.7. Особенные случаи деления на 9 . . . . . . . . . . . . . . . . . . . . 114 8.3.8. Деление на число без восьмерки . . . . . . . . . . . . . . . . . . . 114 8.4. Извлечение корня — не на пальцах и не в уме . . . . . . . . . . . . . 115 8.4.1. Правило извлечения квадратного корня . . . . . . . . . . . . 115 8.4.2. Правило извлечения кубического корня . . . . . . . . . . . . 118 8.5. Извлечение кубического корня в уме . . . . . . . . . . . . . . . . . . . . 120 8.6. Сокращенное вычисление среднего арифметического . . . . . . 121 9. Семь полезных программ, и не только . . . . . . . . . . . . . . . . . . . . . . . . . 123 9.1. Превратим компьютер в будильник. . . . . . . . . . . . . . . . . . . . . . 123 9.2. Как установить на программу пароль . . . . . . . . . . . . . . . . . . . . 125 9.3. Каким днем недели был день вашего рождения . . . . . . . . . . . 128 9.4. «Звездное небо» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 9.5. Проверка скорости реакции человека . . . . . . . . . . . . . . . . . . . . 131
6 Занимательная информатика 9.6. Биологические ритмы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 9.7. Обмен значениями между переменными . . . . . . . . . . . . . . . . . 139 9.8. Рекурсия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 10. Ваш помощник — калькулятор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 10.1. Вычисление процентов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 10.2. Память калькулятора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 10.3. Автоматическая память. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 10.4. Использование клавиши обратного числа . . . . . . . . . . . . . . . . 149 10.5. Калькулятор-«переводчик» . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 10.6. Фокус с датой рождения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 11. Компьютерные фокусы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 11.1. Компьютер отгадывает день рождения . . . . . . . . . . . . . . . . . . . 153 11.2. Компьютер отгадывает дату рождения . . . . . . . . . . . . . . . . . . . 154 11.3. Компьютерные фокусы на отгадывание чисел. . . . . . . . . . . . . 156 11.3.1. Фокус ¹ 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 11.3.2. Фокус ¹ 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 11.3.3. Фокус ¹ 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 11.3.4. Фокус ¹ 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 11.3.5. Фокус ¹ 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 11.3.6. Фокус ¹ 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 11.3.7. Фокус ¹ 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 11.3.8. Фокус ¹ 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 11.3.9. Фокус ¹ 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 11.3.10. Фокус ¹ 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 11.3.11. Фокус ¹ 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 11.3.12. Фокус ¹ 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 11.4. Компьютерный фокус «Отгадай число» . . . . . . . . . . . . . . . . . . 161 11.5. Фокус «Отгадывание названий». . . . . . . . . . . . . . . . . . . . . . . . . 166 11.6. Варианты фокуса «Отгадывание названий» . . . . . . . . . . . . . . 169 11.7. Игра-упражнение «Поймай слово» . . . . . . . . . . . . . . . . . . . . . . 172 11.8. «Отгадыватель мыслей» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 12. Моделирование простейших игр на компьютере . . . . . . . . . . . . . 177 12.1. Игра «Чет или нечет»? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 12.1.1. Программа на школьном алгоритмическом языке . . 177 12.1.2. Игра в среде Microsoft Excel . . . . . . . . . . . . . . . . . . . . . . 179 12.2. Игра «Отгадай число» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 12.3. Игра «Кубик». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 12.3.1. Программа на школьном алгоритмическом языке . . 183 12.3.2. Игра в среде Microsoft Excel . . . . . . . . . . . . . . . . . . . . . . 184 12.4. Игра «Карты» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 12.4.1. Программа на школьном алгоритмическом языке . . 185 12.4.2. Игра в среде Microsoft Excel . . . . . . . . . . . . . . . . . . . . . . 187 12.5. Игра «Быки и коровы» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 12.6. Игра Баше. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 13. Лабиринты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 13.1. Нить Ариадны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 13.2. Лабиринт из комнат . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 13.3. Мышь в лабиринте . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 13.4. Разные лабиринты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Содержание 7 14. Софизмы и парадоксы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 14.1. 4 руб. = 40 000 коп. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 14.2. 2 ´ 2 = 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 14.3. 5 = 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 14.4. 2 = 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 14.5. 5 = 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 14.6. 4 = 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 14.7. Все числа равны между собой . . . . . . . . . . . . . . . . . . . . . . . . . . 207 14.8. Любое отличающееся от нуля число равно противоположному ему числу . . . . . . . . . . . . . . . . . . . . . . . . . 207 14.9. Любое число a равно меньшему числу b . . . . . . . . . . . . . . . . . 207 14.10. Любое число равно своей половине. . . . . . . . . . . . . . . . . . . . . . 207 14.11. Отрицательное число больше положительного . . . . . . . . . . . 208 14.12. Любое число равно числу, в два раза большему его . . . . . . . . 208 14.13. Любое число равно нулю . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 14.14. 2 > 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 14.15. Вес слона равен весу комара. . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 14.16. Хитрый хозяин гостиницы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 14.17. Парадокс «Куча» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 14.18. Парадокс «Мэр города» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 14.19. Парадокс «Генерал и брадобрей» . . . . . . . . . . . . . . . . . . . . . . . 211 14.20. Парадокс «Каталог всех нормальных каталогов» . . . . . . . . . 211 15. Жаргонизмы Интернета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 15.1. Откуда пришла «собачка»? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Что русским — «собачка», финнам — «кошка» . . . . . . . . . . . 214 И все-таки — почему «собачка»? . . . . . . . . . . . . . . . . . . . . . . . . 215 15.2. Что такое «спам» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 15.3. Смайлики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 16. Задачи о шапках. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 16.1. Приятели и их шапки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 16.2. Те же приятели и те же шапки . . . . . . . . . . . . . . . . . . . . . . . . . . 220 16.3. Зачет по логике . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 16.4. Умный сговор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 16.5. Три коробки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 17. Шутки и розыгрыши на компьютере . . . . . . . . . . . . . . . . . . . . . . . . . 222 17.1. «Фальшивый» рабочий стол Windows . . . . . . . . . . . . . . . . . . . 222 17.2. Невидимая сумма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 17.3. Необычный результат расчета по формуле в Microsoft Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 17.4. Очень важный вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 17.5. Проверка знания таблицы умножения . . . . . . . . . . . . . . . . . . . 226 18. Разные задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 18.1. Вкусные ломтики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 18.2. Три лампочки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 18.3. Как приготовить эликсир бессмертия . . . . . . . . . . . . . . . . . . . 228
8 Занимательная информатика 18.4. Единственные часы остановились . . . . . . . . . . . . . . . . . . . . . . 229 18.5. Древнеегипетская задача. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 18.6. Задача о стрелках . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 18.7. Високосные годы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 18.8. Почтовые индексы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 18.9. Десять утверждений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 18.10. Сказка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 18.11. Отец сына . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 18.12. Разговор родственников . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 18.13. Кто изображен на портрете? . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 18.14. Слова после чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 18.15. «Ей было 1100 лет» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 18.16. Непредвиденное затруднение . . . . . . . . . . . . . . . . . . . . . . . . . . 235 18.17. Пропущенное число . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 18.18. Кощей Бессмертный и Иван Царевич . . . . . . . . . . . . . . . . . . . 236 18.19. Бедный торговец (старинная задача) . . . . . . . . . . . . . . . . . . . . 236 18.20. Может ли такое быть? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 18.21. А такое?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 18.22. Об экономичности систем счисления . . . . . . . . . . . . . . . . . . . . 236 18.23. Прабабушки и прадедушки . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 18.24. Илья Муромец и Змей Горыныч . . . . . . . . . . . . . . . . . . . . . . . . 238 18.25. Шутники и серьезные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 18.26. Три очень умных попугая. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 18.27. Умная обезьяна . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 18.28. Импульсы с планеты t Кита . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 18.29. 10 единиц и 10 двоек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 18.30. Еще одна «Шоколадка» (задача-шутка) . . . . . . . . . . . . . . . . . 240 18.31. Почему трижды? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 18.32. Детская песенка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 18.33. Умеете ли вы считать? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 18.34. Два вопроса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 18.35. Пятьдесят вопросов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Приложение 1. Из истории систем счисления . . . . . . . . . . . . . . . . . . 394 1. Вавилонская нумерация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 2. Система счисления майя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 3. Буквенная цифирь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 4. Римские цифры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 5. Арабские цифры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 Приложение 2. Азбука Морзе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 Приложение 3. Луи Брайль и его шрифт. . . . . . . . . . . . . . . . . . . . . . . 404 Приложение 4. Русская семафорная азбука . . . . . . . . . . . . . . . . . . . . 406 Ответы на дополнительные задания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Посвящаю эту книгу своей жене Татьяне Предисловие Книга, которую вы держите в руках, по своему содержанию и стилю продолжает традиции широко известных книг из серий «Занимательная физика» и «Занимательная математика» Я. И. Перельмана, Е. И. Игнатьева, Б. А. Кордемского и других авторов. В ней приведено большое количество занимательных задач и познавательных материалов, которые охватывают широкий круг вопросов информатики, вычислительной техники, информационных и коммуникационных технологий, в том числе это задачи, связанные с использованием компьютера (простейшие компьютерные игры, фокусы и т. п.), с применением двоичной и других систем счисления, с историей Интернета, информатики и вычислительной техники, задачи-шутки и др. Все эти задачи имеют развивающее значение для интеллекта школьников, формируют общеучебные навыки и способствуют повышению интереса к информатике. Книга состоит из 18 глав и содержит четыре приложения. В главе 1 «Двоичная система — не только в компьютере» приведены примеры использования двоичной системы счисления «в некомпьютерной жизни». Среди них — штриховое кодирование товаров (широко применяемое в настоящее время), маркировка фотопленок, а также игры, фокусы, головоломки и задачи, основанные на двоичной системе. Глава 2, как следует из ее названия — «Перемещение предметов и… животных», посвящена алгоритмам решения задач на перемещение. Кроме того, в ней рассматриваются такие вопросы, как сортировка и рекурсия, знать которые должен каждый, кто хотел бы стать программистом. Может быть, на уроках информатики читатели уже знакомились с исполнителями «Переливашка» и/или «Водолей» и знают, как, имея два сосуда вместимостью 10 и 2 литра, отмерить 4 литра воды. А как отмерить 1 литр воды, имея 3- и 5-литровые ем-
10 Занимательная информатика кости? Эта и еще много других интересных задач такого типа предлагаются в главе 3 — «64 задачи для Водомера». В главе 4 «Взвешиваем все — от крупы до золотых монет» приведены задачи на нахождение фальшивых монет (одной, нескольких или даже целых мешков!) и другие занимательные задачи на взвешивание. Содержание главы 5 «Маневры, переходы, переезды» связано с разработкой алгоритмов решения задач перестановки вагонов на железной дороге, перехода по пустыне, перемещения в лифте и др. Шифрование текста используется человечеством с того момента, как появилась первая секретная информация, которая должна быть недоступна посторонним. Существует много разных систем шифрования. Некоторые из них описаны в главе 6 «Пляшущие человечки и лысина раба». В ней рассказывается также о стеганографии (не путайте ее со стенографией!). Если вы хотите узнать, что это такое (и при чем тут «лысина раба»), — читайте эту главу. Любителям головоломок предназначена глава 7 «Числовые ребусы и кросснамберы» («кросснамберы» — это головоломки, похожие на кроссворды, но вместо слов в них записываются числа). Головоломки в ней — особенные: в них применяются числа, записанные не в десятичной системе счисления, а в других системах. Простейшая счетная машина, которую можно использовать для вычислений, это… человеческие руки. Доказательства этого утверждения приведены в главе 8 «На пальцах и в уме». В ней также рассказывается о ряде полезных приемов вычислений в уме. Полезных — потому, что не всегда ведь под рукой имеется калькулятор, а тем более компьютер... Глава 9 «Семь полезных программ, и не только» будет интересна тем, кто умеет программировать. В ней приводится несколько программ, написанных, как правило, на так называемом «школьном алгоритмическом языке», русский синтаксис которого делает программы максимально понятными. При желании вы легко сможете разработать аналогичные программы на любом известном вам языке программирования. Название главы 10 «Ваш помощник — калькулятор» говорит само за себя: в ней описывается ряд возможностей вашего электронного помощника, знать которые полезно каждому человеку, использующему калькулятор.
Предисловие 11 В главе 11 «Компьютерные фокусы» рассказывается о нескольких простейших компьютерных фокусах с отгадыванием чисел, названий, даты рождения и даже... мыслей J! Играть в компьютерные игры любят и дети, и взрослые. А знаете ли вы о том, что некоторые простые игры вы можете запрограммировать сами? В главе 12 «Моделирование простейших игр на компьютере» описано шесть таких игр. Глава 13 «Лабиринты» посвящена алгоритмам поиска выхода из лабиринтов. Кроме «теории» в ней представлены и сами лабиринты, найти выход из которых предлагается читателю. Оказывается, что можно «доказать», что 2 ´ 2 = 5, а вес слона равен весу комара! «Доказательства» этого и других аналогичных парадоксальных примеров приводятся в главе 14 «Логические софизмы и парадоксы». В главе 15 «Жаргонизмы Интернета» рассказано о терминах, которые широко используются пользователями «Всемирной паутины», — о «собачке», «спаме» и смайликах. Название главы 16 «Задачи о шапках» также говорит само за себя — в ней приведен ряд задач, в которых фигурируют эти головные уборы... ну и, конечно, логика. Напряженная работа по решению задач и головоломок и разработке программ должна сочетаться с отдыхом и развлечениями. Поэтому в книге есть глава 17 «Шутки и розыгрыши на компьютере». Содержание же последней главы 18 «Разные задачи» автор оставляет без комментариев J. В каждой главе есть как легкие, так и трудные задачи. Ко всем задачам даны ответы с подробными комментариями и... дополнительными заданиями. Кроме того, книга снабжена несколькими приложениями, где содержатся интересные и не всем известные материалы. В Приложении 1 рассказывается о нескольких «древних» системах счисления — римской, вавилонской, системе индейцев
12 Занимательная информатика майя, славянской алфавитной системе («буквенная цифирь»), а также о том, почему цифры, которыми мы пользуемся, называют арабскими. Здесь есть и задания для самостоятельной работы (также с ответами). В Приложении 2 описывается азбука Морзе — система кодирования символов с помощью двух сигналов — малого и большого (точки и тире, дефиса и тире, короткого и длинного световых сигналов и т. п.). О человеке, создавшем систему кодирования букв для слепых людей, и о самой этой системе рассказывается в Приложении 3, посвященном азбуке Брайля. Завершает книгу Приложение 4, в котором говорится о русской семафорной азбуке — системе передачи информации с помощью флажков, применяющейся на флоте. Книга предназначена для учащихся 5–11 классов, но будет также полезна и учителям информатики, которые могут использовать ее материалы как в учебном процессе, так и для внеклассной работы.
1 Двоичная система — не только в компьютере! ы, конечно, знаете о том, что в компьютере все вычисления производятся в двоичной системе счисления. А знаете ли вы В о других примерах использования этой системы? 1.1. Штрихкод Сегодня на упаковке большинства товаров можно найти ряд вертикальных полосок различной толщины, разделенных пустыми интервалами, под которыми написано число (рис. 1.1). Наверное, вы знаете, что такое изображение называется штриховым кодом, или штрихкодом. Что же это такое и зачем оно нужно? Рис. 1.1 В свое время производители товаров и торговые фирмы столкнулись с серьезной проблемой: товаров много (например, в среднем универмаге имеется в продаже около десяти тысяч наименований), и каждый из них сопровождается длинным сертифика-
14 Занимательная информатика том — документом, в котором указано, где сделан товар, на какой фирме, сколько он весит, каковы его габариты и т. д. Чтобы упростить учет этих товаров, придумали систему кодирования такой информации в виде последовательности цифр штрихового кода. Более 30 лет назад была создана глобальная международная организация системы товарных номеров EAN/UCC, образованная на основе Европейской (European Article Numbering Association — EAN International) и Северо-Американской (Uniform Code Council — UCC) ассоциаций товарной нумерации. В настоящее время система EAN/UCC объединяет национальные организации в более чем 100 странах мира. Каждая страна имеет свой номер: коды стран, как правило, трехзначные (например, Россия имеет номера с 460 по 469), а внутри каждой страны производится нумерация предприятий — изготовителей товаров. В Российской Федерации национальной организацией товарной нумерации — членом EAN International является Ассоциация автоматической идентификации ЮНИСКАН/EAN РОССИЯ, которая насчитывает более 5000 предприятий-членов. Всем им присвоены уникальные идентификационные номера, которые начинаются с цифр 460 (EAN РОССИЯ). Каждому продукту назначается уникальный 13-значный номер. Его первые три цифры называют префиксом EAN, и именно они указывают страну. Следующие 9 цифр содержат номер предприятия, зарегистрированного внутри национальной организации, и номер товара. Структура этих 9 знаков, приходящихся на номер предприятия и номер товара, определяется непосредственно национальной организацией, например: 5 знаков — предприятие + 4 знака — товар; 6 знаков — предприятие + 3 знака — товар и т. п. В настоящее время ЮНИСКАН/EAN РОССИЯ определила следующую структуру: 6 цифр — номер предприятия, 3 цифры — номер товара. Итак, всю необходимую информацию о конкретном товаре отражают 12 цифр*. Но внимательный читатель, конечно, уже обнаружил, что на приведенном выше рисунке (рис. 1.1) в числе не 12, а 13 цифр! Эта последняя, тринадцатая, цифра — контрольная. Для чего она нужна — мы расскажем чуть позже. При наличии на упаковке товаров такой закодированной информации можно автоматизировать процесс распознавания этой информации, если считывать ее специальным устройством — * Обратим внимание на то, что по первым трем цифрам кода абсолютно точно определить страну происхождения товара все же нельзя, так как изготовители могут зарегистрироваться не в своей отечественной организации товарной нумерации, а за рубежом, и получить тем самым штрихкод другой страны.
1. Двоичная система — не только в компьютере! 15 сканером штрихкода. При этом можно, конечно, использовать для распознавания информации о товаре сами указываемые на его упаковке цифры, но это потребовало бы применения сложной компьютерной технологии распознавания символов. Проще и надежнее это делать с использованием двоичного кодирования этой информации. Нет, речь не идет о том, чтобы представлять число-код в виде цифр двоичной системы счисления. Просто десятичный номер товара изображается на упаковке в виде тех самых вертикальных полосок различной толщины и интервалов между ними, а эта информация является двоичной, хотя на первый взгляд этого и не скажешь. Однако если сделать тонкий «срез» этих полосок, то можно увидеть изображение, показанное на рис. 1.2 (в увеличенном масштабе): Рис. 1.2 Эти полоски и пробелы на графическом изображении штрихового кода очень хорошо понятны сканеру штрихкода. Считывая такую информацию слева направо, сканер присваивает «1» первой встреченной черной полоске, а «0» — первому промежутку. Следующие промежутки и штрихи считываются как последовательности из одного, двух, трех или четырех нулей или единиц в зависимости от ширины штриха или промежутка. В результате все изображение будет представлено как последовательность битов, например: 1 0 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 ... Как вы уже, наверное, догадались, эти биты и есть двоичное представление десятичного числа — кода товара! При считывании штрихового кода сканер по комбинации штрихов восстанавливает закодированный номер. В крупных магазинах кассир, делая расчет, просто проносит товар, повернув его штрихкодом вниз, над кассовым аппаратом, и на экране этого аппарата мгновенно «выскакивает» цена. Это происходит потому, что кассы со считывателями штрихового кода подключены к компьютеру, который обрабатывает считанную информацию*. Кроме * Многие думают, что в штрихкоде сразу записана цена. Но на самом деле в коде данных о цене нет, ведь один и тот же товар в разных магазинах продается по разным ценам, которые к тому же то и дело меняются. Просто когда товар поступает в данный магазин и принимается решение, по какой цене его продавать, в компьютер заносятся данные о его штрихкоде и цене. Кассовый аппарат распознает, с каким именно товаром он имеет дело, и высвечивает заложенную в компьютере стоимость.
16 Занимательная информатика удобства работы кассира и повышения скорости обслуживания покупателей такая автоматизированная система может также обеспечить учет объема продаж того или иного товара и уровня спроса на те или иные изделия, заблаговременно сделать заказ на склад для восполнения запасов товаров на полках торгового зала и т. п. Некоторых покупателей смущает, когда на штрихкоде есть только собственно штрихи, а цифр нет. Но это вовсе не признак подделки! Для кассового аппарата цифры вообще не имеют значения, поэтому если места для штрихкода мало, то их не ставят. Не нужно «пытать» продавца и в том случае, если штрихкод «слишком узкий» или «слишком короткий», или вообще «какой-то не такой». Обычно так бывает на маленьких по размеру товарах; ЮНИСКАН разрешает производителям таких товаров использовать сокращенный, 8-цифровой вариант кодировки. Как же так? — спросите вы, — получается, что нам можно на штрихкод вообще не смотреть, там нет полезной для нас информации? Это не совсем так: есть способ (хотя и несколько трудоемкий) узнать по штрихкоду, поддельный ли это товар. Помните, мы говорили, что последняя цифра кода — контрольная? Именно с ее помощью можно проверить правильность кода товара. Итак, если вы хотите узнать, с чем вы имеете дело, нужно произвести следующие арифметические действия: 1) сложить цифры, стоящие на четных позициях (для штрихкода, изображенного на рис. 1.1, — 6 + 0 + 5 + 0 + 0 + 1 = = 12); 2) полученную сумму умножить на 3 (12 × 3 = 36); 3) сложить цифры, стоящие на нечетных позициях, не учитывая контрольную цифру (4 + 0 + 9 + 2 + 0 + 0 = 15); 4) сложить то, что получилось в результате второго и третьего действий (36 + 15 = 51); 5) в полученном результате отбросить первую цифру (получится 1); 6) вычесть из 10 то, что получилось в пятом пункте (10 – 1 = 9). Этот результат должен совпадать с контрольной цифрой. Если нет — товар поддельный! Метод этот, конечно, сложный. Однако если вы покупаете дорогую вещь или у вас есть сомнения, доброкачественный ли про-
1. Двоичная система — не только в компьютере! 17 дукт питания, имеет смысл произвести эти в общем-то элементарные процедуры*. Ведь разочарование от неудачной покупки обойдется гораздо дороже. И в любом случае вы очень удивите окружающих своими знаниями… А в заключение обратите внимание на штриховой код, имеющийся на обложке данной книги. Он не начинается с цифр 460! Но книга — не поддельная! J. Просто для книг и ряда других видов товара выделены специальные префиксы. 1.2. Двоичное кодирование в фотоаппарате Прежде всего заметим, что речь идет об «обычном», пленочном фотоаппарате: в цифровых фотоаппаратах информация об отснятых кадрах всегда хранится в специальной памяти в двоичном виде — как набор единиц и нулей (что и отражено в названии таких фотоаппаратов). Но в некоторых случаях двоичная информация используется и в пленочных фотоаппаратах. Если взять кассету с фотопленкой, то во многих случаях можно увидеть на ней набор серебристых и черных квадратов (рис. 1.3). Этот набор называется DX-кодировкой. Составляющие его 12 квадратов можно рассматривать как 12 битов, если серебристый квадрат считать единицей, а черный — Рис. 1.3 нулем. Что означают эти биты? Вы, возможно, знаете, что фотопленки различаются по светочувствительности, которая измеряется в специальных единицах, установленных Международной организацией по стандартизации (ISO), и может принимать 24 стандартных значения (табл. 1.1). Самыми распространенными являются пленки светочувствительностью 100, 200 и 400 единиц. * Конечно, если касса магазина оборудована сканером для считывания штрихового кода, то все за вас сделает компьютер, который по описанному выше алгоритму рассчитает контрольную сумму и сравнит ее с последней цифрой. Совпадение считанного и вычисленного контрольных разрядов означает правильное считывание штрихового кода. В этом случае на сканере появляется соответствующий световой/звуковой сигнал. Если же код читается плохо, то одна или несколько цифр кода могут быть при считывании искажены. В этом случае сканер не даст сигнала о правильном считывании. Аналогично, если кто-то поставил фальшивый код из произвольных 13 цифр или если контрольный разряд имеет произвольное значение, то этот штриховой код сканером считываться не будет!
Занимательная информатика 18 Таблица 1.1 25 100 400 1600 32 125 500 2000 40 160 640 2500 50 200 800 3200 64 250 1000 4000 80 320 1250 5000 Так вот, чувствительность в единицах ISO не только напечатана на упаковке, но и закодирована на кассете с пленкой! Сколько битов требуется, чтобы закодировать все возможные значения светочувствительности пленки? Ответ прост — 5! Так как 24 = 16, то четыре бита для 24 возможных значений мало, а 25 = 32 — более чем достаточно. Если пронумеровать квадраты на кассете от 1 до 12 (рис. 1.4), то соответствие между ними и светочувствительностью иллюстрирует табл. 1.2 (в ней приведены только некоторые значения чувствительности пленки). Коды на кассетах используются практически на всех современных фотоаппаратах для автоматического определения светочувствительности пленки. Электрическая схема фотоаппарата построена так, что ток подРис. 1.4 водится к первому квадрату на кассете (поэтому он — всегда серебристый). Этот ток будет (или не будет) проведен пятью контактами на квадратах со 2-го по 6-й, в зависимости от того, окрашены они серебристой краской или нет. Если ток присутствует на контактах 4 и 5, но отсутствует на контактах 2, 3 и 6, то это значит, что в фотоаппарат вставлена пленка 400 ISO (см. табл. 1.2). Соответственно, при съемке выдержка будет установлена автоматически. Заметим, что в дорогих моделях фотоаппаратов контакты, определяющие чувствительность пленки, во избежание ошибок продублированы. Квадраты с 8-го по 12-й тоже используются для кодирования информации. В квадратах 8, 9 и 10 зашифровано количество кадров на пленке: в вариантах, показанных на рис. 1.3, — 36 кадров (слева) и 24 кадра (справа), а квадраты 11 и 12 содержат сведения о том, черно-белая это пленка или цветная и позитивная она или негативная.
1. Двоичная система — не только в компьютере! 19 Таблица 1.2 Квадрат 2 Квадрат 3 0 0 0 0 0 0 Квадрат 4 Квадрат 5 Квадрат 6 0 0 0 1 0 1 0 1 1 Чувствительность 25 32 40 1 0 100 1 0 200 1 0 400 0 1 1 1 4000 5000 ... 0 1 0 ... 1 1 0 ... 0 0 1 ... 1 1 1 1 1 1 1.3. Повар и пицца В распоряжении повара имеются перец, лук, грибы, помидоры, морковь и анчоусы, причем все это можно, по его мнению, добавлять к сыру, чтобы приготовить пиццу (а можно и ничего не добавлять!). Сколько типов пиццы может приготовить повар? 1.4. Градуировка весов Есть пружинные весы, которые нужно отградуировать (рис. 1.5). Каким должен быть набор гирьразновесов для градуировки таких весов на интервал масс 1, 2, …, 31 кг, чтобы количество гирь в этом наборе было минимальным? 1.5. Серебряная цепочка Рис. 1.5 В гостиницу приехал путешественник. Выяснилось, что деньги он забыл дома. У него была с собой лишь серебряная цепочка из 7 звеньев. Он договорился с хозяином гостиницы, что за каждый день пребывания в гостинице будет расплачиваться одним звеном этой цепочки. 1. Какое звено цепочки надо аккуратно расцепить, чтобы прожить в гостинице 7 дней и ежедневно расплачиваться с хозяином? (Хозяин может давать сдачу звеньями, полученными им ранее.)
Занимательная информатика 20 2. Сколько звеньев пришлось бы расцепить, если бы путешественник жил в гостинице 100 дней и имел цепочку из 100 звеньев? 1.6. Семь кошельков Как разложить по семи кошелькам 127 рублевых монет, чтобы любую сумму от 1 до 127 рублей можно было выдать, не открывая кошельков (т. е. вместе с кошельками)? 1.7. Волшебная таблица Посмотрите на табл. 1.3. С помощью этой таблицы можно отгадать любое задуманное число, не большее 31, если задумавший это число скажет, в каких столбцах таблицы оно встречается (номера столбцов указаны в первой строке таблицы). Например, если задумано число 22, то по названным номерам столбцов (5, 3 и 2) его можно вычислить так: 25–1 + 23–1+ 22–1 = 16 + 4 + 2 (это можно сделать, даже не глядя на таблицу). Таблица 1.3 5 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 4 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 3 4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 2 2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 1 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 В чем же секрет «волшебной» таблицы? Найдите ответ на этот вопрос.
1. Двоичная система — не только в компьютере! 21 1.8. Семь табличек Имеются 7 табличек, каждая из которых содержит, подобно шахматной доске, 64 клетки (табл. 1.4–1.10). В эти клетки вписаны различные числа от 1 до 127. Пусть ваш собеседник задумает какое-либо из этих чисел и скажет, в каких таблицах (они имеют номера от 1 до 7) это число встречается*. Тогда вы сможете точно назвать это число. Как это делается? Таблица 1.4 1 1 17 33 49 65 81 97 113 3 19 35 51 67 83 99 115 5 21 37 53 69 85 101 117 7 23 39 55 71 87 103 119 9 25 41 57 73 89 105 121 11 27 43 59 75 91 107 123 13 29 45 61 77 93 109 125 15 31 47 63 79 95 111 127 Таблица 1.5 2 2 18 34 50 66 82 98 114 3 19 35 51 67 83 99 115 6 22 38 54 70 86 102 118 7 23 39 55 71 87 103 119 10 26 42 58 74 90 106 122 11 27 43 59 75 91 107 123 14 30 46 62 78 94 110 126 15 31 47 63 79 95 111 127 Таблица 1.6 3 4 20 36 52 68 84 100 116 * 5 21 37 53 69 85 101 117 6 22 38 54 70 86 102 118 7 23 39 55 71 87 103 119 12 28 44 60 76 92 108 124 13 29 45 61 77 93 109 125 14 30 46 62 78 94 110 126 15 31 47 63 79 95 111 127 Если вы будете демонстрировать кому-нибудь этот фокус, то вы можете дать загадывающему число пачку карточек с этими таблицами и предложить передать вам те карточки, на которых имеется задуманное им число.
Занимательная информатика 22 Таблица 1.7 4 8 24 40 56 72 88 104 120 9 25 41 57 73 89 105 121 10 26 42 58 74 90 106 122 11 27 43 59 75 91 107 123 12 28 44 60 76 92 108 124 13 29 45 61 77 93 109 125 14 30 46 62 78 94 110 126 15 31 47 63 79 95 111 127 Таблица 1.8 5 16 24 48 56 80 88 112 120 17 25 49 57 81 89 113 121 18 26 50 58 82 90 114 122 19 27 51 59 83 91 115 123 20 28 52 60 84 92 116 124 21 29 53 61 85 93 117 125 22 30 54 62 86 94 118 126 23 31 55 63 87 95 119 127 Таблица 1.9 6 32 40 48 56 96 104 112 120 33 41 49 57 97 105 113 121 34 42 50 58 98 106 114 122 35 43 51 59 99 107 115 123 36 44 52 60 100 108 116 124 37 45 53 61 101 109 117 125 38 46 54 62 102 110 118 126 39 47 55 63 103 111 119 127 Таблица 1.10 7 64 72 80 88 96 104 112 120 65 73 81 89 97 105 113 121 66 74 82 90 98 106 114 122 67 75 83 91 99 107 115 123 68 76 84 92 100 108 116 124 69 77 85 93 101 109 117 125 70 78 86 94 102 110 118 126 71 79 87 95 103 111 119 127
1. Двоичная система — не только в компьютере! 23 1.9. Волшебная карточка Теперь, когда вы уже знаете секрет двух предыдущих фокусов, рассмотрим аналогичный, но более эффектный фокус. Для его демонстрации необходимо подготовить шесть* карточек с числами (см. рис. 1.6, внизу) и одну «волшебную» карточку (почему «волшебную» — вы скоро поймете). В принципе, эти карточки с числами не отличаются от карточек, использовавшихся в предыдущем фокусе, но числа на них не расположены в порядке возрастания, так что ключевые числа (числа, каждое из которых меньше всех остальных на данной карточке) занимают разные положения среди остальных чисел. Кроме того, некоторые числа на каждой карточке повторяются. На всех карточках имеются отверстия (на рисунке они показаны в виде закрашенных кружков). Отверстия в «волшебной» карточке при этом соответствуют местам, где на шести карточках расположены ключевые числа, а на каждой из шести числовых карточек отверстия сделаны в тех же местах, что и на «волшебной» карточке, за исключением одного, где проставлено ключевое число данной карточки. Рис. 1.6 * Для случая, когда отгадываемое число находится в диапазоне от 1 до 64.
Занимательная информатика 24 Когда зритель выберет все карточки, на которых имеется задуманное число, положите их друг на друга и накройте сверху «волшебной» карточкой. Теперь, чтобы получить задуманное число, достаточно сложить числа, видимые сквозь отверстия. 1.10. Фокус Возьмите какие-либо 15 названий (пусть, например, это будут термины, связанные с информатикой и компьютерами, — см. табл. 1.11). Таблица 1.11 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Бит Системный блок Дискета Монитор Принтер Джойстик Сканер Байт Логика Система счисления «Мышка» Цифра Число Разряд Программа Показывая зрителям эту таблицу, попросите одного из них задумать какой-нибудь термин. Потом, стоя спиной к таблицам, показанным ниже (табл. 1.12–1.15), попросите сказать, в каких из этих таблиц присутствует задуманное слово или словосочетание (номер каждой таблицы указан в ее правом верхнем углу). Получив ответ, вы сразу называете задуманное слово. Затем вы обращаетесь к другому зрителю и опять безошибочно называете задуманное им слово. Как вы сможете это сделать? Таблица 1.12 1 Сканер Число Логика Бит Принтер Программа Дискета «Мышка» Таблица 1.13 2 Сканер Система счисления Программа «Мышка» Системный блок Дискета Разряд Джойстик
1. Двоичная система — не только в компьютере! Таблица 1.14 3 Цифра Число Монитор Принтер Джойстик Сканер Программа Разряд 25 Таблица 1.15 4 Цифра Байт Разряд Логика Система счисления Программа Число «Мышка» 1.11. Как отгадать число? Я загадал некоторое целое число из интервала от 500 до 1000 включительно. Беретесь ли вы узнать его, задав мне не более 10 вопросов, на каждый из которых я буду отвечать только «да» или «нет»? (Вопросы типа «Задуманное число больше 800?», в которых фигурируют слова «больше», «больше либо равно», «меньше», «не меньше», «превышает» и т. п., а также вопросы типа «Задуманное число находится в интервале от ... до ... ?» задавать нельзя.) Беритесь, эта задача вполне разрешима! 1.12. А если солгать? Допустим, что номер моего телефона 5-значный. Как его узнать, задав наименьшее количество вопросов, вы, решив предыдущую задачу, уже, наверное, знаете. Предположим теперь, что на один из ваших вопросов (любой) я могу дать неправильный ответ. Какие вопросы в этом случае нужно задавать и какое наименьшее количество вопросов вам понадобится, чтобы все равно отгадать этот номер? 1.13. Пять мешков с фальшивыми монетами Предлагая эту задачу, автор немного опередил события — подобным задачам будет посвящена глава 4. Тем не менее обсудим ее здесь. Есть 5 мешков с монетами. В некоторых из них монеты фальшивые (они на 1 грамм легче настоящих). Есть также еще 100 настоящих монет. Необходимо за одно взвешивание на чашечных весах с указателем, показывающим разность весов грузов на левой и правой чашках с точностью до 1 г в пределах от 0 до 100 г, установить, в каких мешках находятся фальшивые монеты.
26 Занимательная информатика 1.14. Найти фальшивую монету И здесь автор тоже несколько «опережает события»... Есть 8 монет: 7 настоящих, каждая из которых весит 10 г, и одна фальшивая весом 9 г. Необходимо, используя электронные весы, показывающие вес с точностью до 1 г, найти фальшивую монету за минимальное количество взвешиваний. Решение Пронумеруем монеты: 1, 2, ..., 8 и обозначим их вес соответственно как m1, m2, ..., m8. При первом взвешивании определим вес любых четырех монет, например 1-й, 2-й, 3-й и 4-й. Если весы покажут 40 г, то фальшивая монета находится среди оставшихся монет; если 39 г — то среди взвешиваемых. Затем нужно узнать вес любых двух монет из соответствующей группы и выявить пару монет, среди которых есть фальшивая. Третье взвешивание покажет, какая монета из этой пары фальшивая. Все возможные варианты взвешиваний можно оформить в виде следующего алгоритма: | Первое взвешивание m1 + m2 + m3 + m4 = ? если m1 + m2 + m3 + m4 = 40 то | Фальшивая монета — в другой группе | Второе взвешивание m5 + m6 = ? | Можно взвесить и другие монеты если m5 + m6 = 19 то | Фальшивая монета — в рассматриваемой паре | Третье взвешивание m5 = ? если m5 = 10 то | Фальшивая монета – номер 6 иначе | Фальшивая монета - номер 5 все иначе | Фальшивая монета — в паре (7, 8) | Третье взвешивание m8 = ? если m8 = 10 то | Фальшивая монета - номер 7
1. Двоичная система — не только в компьютере! 27 иначе | Фальшивая монета - номер 8 все все иначе |m1 + m2 + m3 + m4 = 39 | Фальшивая монета — среди монет (1, 2, 3, 4) | Второе взвешивание m1 + m2 = ? |Можно взвесить и другие монеты и т. д. ... Конечно, такая запись довольно громоздкая. Попробуйте разработать алгоритм поиска номера фальшивой монеты, схема которого имеет вид: 1. Закодируем номера монет в виде ... 2. Проведем три взвешивания | Первое взвешивание m? + m? + ... = ? если ... то ... иначе ... все | Второе взвешивание m? + m? + ... = ? если ... то ... иначе ... все | Третье взвешивание m? + m? + ... = ? если ... то ... иначе ... все 3. Определяем номер фальшивой монеты ...
Занимательная информатика 28 1.15. Двоичная система и «Ханойские башни» Головоломка «Ханойские башни» будет подробно описана в конце главы 2 (обязательно прочитайте о ней, прежде чем идти дальше). Там подробно будет рассмотрен алгоритм ее решения. А здесь мы пока заметим лишь, что последовательность перекладывания дисков с одного стержня на другой (см. рис. 1.7) может быть найдена при использовании двоичной системы счисления. Рис. 1.7 Прежде всего обозначим диски, начиная с самого маленького, соответственно как A, B, С и т. д. Далее запишем в таблицу десятичные числа n от 1 до 8, переведенные в двоичную систему (табл. 1.16). Если теперь обозначить разряды двоичных чисел, начиная с крайнего справа, соответственно как A, B и С (табл. 1.17), то последовательность перекладывания дисков, обеспечивающая решение головоломки при трех дисках, будет такой: при n-м ходе перекладывается диск, имя которого совпадает с именем разряда, в котором появляется новая* цифра 1 (табл. 1.18). Таблица 1.16 * Таблица 1.17 Таблица 1.18 n Цифры n Цифры n Цифры 1 0 1 0 1 0 0 0 1 0 1 Перекладывается диск 1 А 2 0 1 0 2 0 1 0 2 0 1 0 В 3 0 1 1 3 0 1 1 3 0 1 1 А 4 1 0 0 4 1 0 0 4 1 0 0 С 5 1 0 1 5 1 0 1 5 1 0 1 А 6 1 1 0 6 1 1 0 6 1 1 0 В 7 1 1 1 7 1 1 1 7 1 1 1 А С В А С В А Можно также сказать: самая правая единица в двоичном числе.
1. Двоичная система — не только в компьютере! 29 Читатель может самостоятельно убедиться в правильности сделанных выводов, а также определить последовательность перекладывания дисков в случае, когда их 4. 1.16. Задача Иосифа Флавия — частный случай Задача, которую называют задачей Иосифа Флавия, основана на легенде о том, что известный историк I-го века н. э. Иосиф Флавий выжил и стал известным благодаря математической одаренности. В ходе Иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство плену, воины решили выстроиться в круг и последовательно убивать каждого третьего из еще остающихся в живых до тех пор, пока не останется живым ни одного человека*. Однако Иосиф, наряду с одним из своих единомышленников, счел подобный конец бессмысленным и быстро вычислил спасительные места в круге, на которые поставил себя и своего товарища. Эта «мрачная» по смыслу задача у нас в стране более известна как «задача о считалке». Во многих играх (прятки и др.), чтобы выяснить, кому «водить», кто-либо из играющих произносит недлинный стихотворный текст — «считалку». Играющий, на которого попадает последнее слово текста, выходит из круга, а затем считалку повторяют для оставшихся. Кто последним останется в кругу, тому и «водить». В общем виде эта задача формулируется так: «По кругу размещены n человек. Задан параметр расчета k, т. е. каждый k-й человек будет выбывать из круга. Требуется определить P — порядковый номер человека, который останется в круге последним». Предлагаем читателю решить эту задачу для частного случая, когда k = 2. Обратим внимание, что при этом нет необходимости разрабатывать программу на каком-либо языке программирования — задача может быть решена просто путем рассуждений. Указания к решению. Сначала рассмотрите вариант, когда значение n есть степень двойки, а затем исследуйте общий случай. 1.17. Игра «ним» Эта игра была известна еще в Древнем Китае. Играют в нее вдвоем, используя камешки, монеты, спички и т. п. В наиболее известном варианте «нима» 12 предметов выкладывают в три ряда так, как показано на рис. 1.8. Правила игры просты. Игроки по очереди * По-видимому, предполагалось, что последний должен был убить себя сам.
Занимательная информатика 30 Рис. 1.8 забирают по одному или по нескольку предметов из любого ряда. Выигрывает тот, кто возьмет последний предмет*. Подумав и/или рассмотрев несколько возможных ходов, вы наверняка обнаружите, что добиться победы можно, если оставить сопернику два одинаковых ряда предметов (с одним и тем же количеством предметов в каждом ряду), если в каждом ряду будет находиться более одного предмета. Выиграть можно и в том случае, если в первом ряду останется один, во втором — два, а в третьем — три предмета. Тот, кто начинает игру, наверняка побеждает, если первым ходом он забирает два предмета из верхнего ряда, а затем рационально продолжает игру. Казалось, что анализ столь простой игры не может привести к каким-либо неожиданностям, однако в начале ХХ в. было сделано удивительное открытие. Обнаружилось, что «ним» допускает обобщение на любое число рядов с любым числом фишек в каждом ряду и что с помощью простой стратегии, используя двоичную систему счисления, любой желающий может стать непобедимым игроком. Полный анализ и доказательство существования оптимальной стратегии этой игры впервые опубликовал в 1901 г. Чарлз Л. Бутон, профессор математики Гарвардского университета (США). Именно Бутон и назвал игру «ним» — от устаревшей формы английских глаголов «брать», «взять». Каждую комбинацию предметов в обобщенной игре Бутон назвал «опасной» или «безопасной». Если позиция, создавшаяся после очередного хода игрока, гарантирует ему выигрыш, то она называется «безопасной»; в противном случае позиция называется «опасной». Так, при игре в «ним» по описанной выше схеме «3, 4, 5» (см. рис. 1.8) первый игрок окажется в «безопасной» позиции, взяв два предмета из верхнего ряда. Любую «опасную» позицию, сделав соответствующий ход, всегда можно превратить в «безопасную», а каждая «безопасная» позиция становится «опасной» после любого хода. Следовательно, рациональная игра заключается в том, чтобы каждый раз превращать «опасную» позицию в «безопасную» (выигрышную). * Можно играть и наоборот: считать того, кто возьмет последний предмет, проигравшим.
1. Двоичная система — не только в компьютере! 31 Чтобы определить, «опасна» или «безопасна» данная позиция, количество предметов в каждом ряду нужно записать в двоичной системе. Если сумма чисел в каждом столбце (разряде) равна нулю или четна, то позиция «безопасна». Если же сумма нечетна хотя бы в одном разряде, то позиция «опасна». Записывая в двоичной системе число предметов в каждом ряду, расставленных по схеме «3, 4, 5», мы получим табл. 1.19. Таблица 1.19 Количество предметов 3 4 5 Сумма цифр Двоичная запись числа 1 1 1 0 0 1 0 1 2 1 2 Сумма цифр в среднем столбце равна 1 — нечетному числу, что свидетельствует об «опасности» данной позиции. Первый игрок может сделать ее «безопасной». Как уже говорилось, именно это он и делает, когда забирает из верхнего ряда два предмета. В результате в верхнем ряду останется лишь 1 предмет (двоичное число также равно 1), и нечетное число в последовательности сумм чисел по столбцам пропадает. Перепробовав остальные ходы, нетрудно убедиться в том, что только указанный ход может сделать исходную позицию «безопасной». Если в каждом ряду стоит не более 31 фишки, то любую позицию легко проанализировать, использовав в качестве «вычислительной машины» (работающей в двоичной системе!) пальцы левой руки. Предположим, что в начальной позиции в первом ряду стоит 7, во втором — 13, в третьем — 24 и в четвертом — 30 фишек. Вы должны сделать первый ход. «Опасна» или «безопасна» исходная позиция? Поверните левую руку с растопыренными пальцами ладонью к себе. Большой палец будет означать коэффициент при 16, указательный — коэффициент при 8, средний — при 4, безымянный — при 2 и мизинец — коэффициент при 1. Чтобы ввести в вашу «вычислительную машину» число 7, сначала нужно загнуть палец, соответствующий наибольшей степени двойки, входящей в 7. Такой степенью является 4, поэтому вы загибаете средний палец. Продолжая двигаться направо, добавляйте степени двойки до тех пор, пока в сумме не получится 7. Для этого потребуется загнуть средний, безымянный пальцы и мизинец. Три остальных числа — 13, 24 и 30 — вводятся в вашу «вычислительную машину» точно так же, но, поскольку вам требуется вычислить сумму чисел, стоящих в столбцах при одной и той же степени двойки, вы, дойдя до согнутого пальца, который вам нужно согнуть еще раз, просто разгибаете его.
32 Занимательная информатика Независимо от количества рядов позиция «безопасна», если по окончании работы вашей «вычислительной машины» на левой руке не останется ни одного загнутого пальца. Это означает, что любым ходом вы наверняка сделаете положение «опасным» и заведомо проиграете (если, конечно, ваш противник знает о «ниме» столько же, сколько и вы, и будет тоже придерживаться выигрышной стратегии). В приведенном же нами примере большой и указательный пальцы останутся согнутыми. Это говорит о том, что позиция «опасна» и что, сделав правильный ход, вы сможете превратить ее в выигрышную. А далее расчет «опасности» новой позиции производится аналогично. Задача В игре «ним» используются 10 предметов. Определите, сколько начальных позиций из всех возможных при таком количестве предметов являются выигрышными для игрока, делающего второй ход. Для игры в «ним» позже были созданы специальные машины. Одним из создателей первой машины такого рода был Эдвард Н. Кондон. Машина была запатентована в 1940 г. под названием «Ниматрон»; ее построила фирма «Вестингауз». «Ниматрон» экспонировался на Всемирной выставке в Нью-Йорке, он сыграл 100 000 партий и 90 000 из них выиграл. Причем большая часть проигрышей была намеренно подстроена экскурсоводом, чтобы доказать скептикам, что и машину можно победить. В 1941 г. существенно усовершенствованную машину для игры в «ним» спроектировал Рэймонд М. Редхеффер. Емкость памяти машины Редхеффера была такой же, как и у машины Кондона (четыре ряда с семью фишками в каждом), но «Ниматрон» весил целую тонну и для его изготовления требовались дорогостоящие реле. Машина же Редхеффера весила несколько килограммов, а для ее изготовления достаточно было четырех вращающихся переключателей. Возможны и другие варианты «нима». Среди полностью изученных вариантов игры в «ним» особый интерес представляет вариант, предложенный в 1910 г. американским математиком Элиакимом X. Муром. Правила этой игры во всем совпадают с правилами обычного «нима», с той лишь разницей, что в варианте Мура игроки могут брать из любого ряда не более k фишек, где k — некоторое заранее заданное число. Любопытно заметить, что анализ «безопасности» позиции с помощь двоичных чисел оказывается применимым и в этом случае, если «безопасной» называть такую позицию, в которой сумма двоичных цифр в каждом столбце делится без остатка на (k + 1).
1. Двоичная система — не только в компьютере! 33 1.18. «Шоколадка» «На закуску» J (в заключение этой главы) автор хочет угостить читателя «шоколадкой» — еще одной игрой. Чтобы сыграть в нее, возьмите шоколадку, — а если у вас ее нет, то нарисуйте ее на листе бумаги, как это сделано на рис. 1.9. Игра состоит в том, что двое игроков по очереди разламывают шоколадку по какой-нибудь прямой, делящей ее на дольки, и съедают ту часть, которая не содержит отмеченной дольки. (Если шоколадка нарисована, то соответствующую ее часть заштриховывают.) Проигрывает тот, Рис. 1.9 кто не сможет сделать очередной ход, т. е. ему остается лишь одна отмеченная долька. Существует ли в этой игре выигрышная стратегия, т. е. может ли начинающий игру обязательно довести ее до победы? Счетные веревки Еще в древности людям приходилось считать предметы, домашних животных, а затем и деньги. Первые обитатели Южной Америки при счете использовали особые счетные веревки, изготовленные из шерсти (как правило, ламы) или из листьев агавы. На них узелки разного типа соответствовали разным числам. Первый урок английского языка в школе. У ч и т е л ь : «Кто из вас, дети, знает буквы английского алфавита?» С ы н п р о г р а м м и с т а : «Я!». — Пожалуйста, назови их по порядку. — Q,W,E,R,T,Y...
2 Перемещение предметов и… животных с данной главой, вы не только решите ряд интересных задач, но и: О знакомившись 1) увидите, что с помощью алгоритма любой процесс, даже не очень сложный, распадается на достаточно длинную последовательность простых и однообразных операций; 2) научитесь делать из мухи слона... вернее, из «апельсина» — «собаку»; 3) узнаете несколько методов, позволяющих отсортировать некоторый набор чисел; 4) узнаете, когда наступит конец света (J) и что такое рекурсия. 2.1. Выкатить шарики В узком желобе размещены 8 шариков: слева — четыре белых, а справа — четыре черных (вид желоба сверху показан на рис. 2.1). Диаметр белых шариков чуть-чуть меньше диаметра черных. В средней части желоба в стенке имеется небольшая ниша, в которой может разместиться только один шарик (любой). Два шарика
2. Перемещение предметов и… животных 35 Рис. 2.1 могут расположиться рядом поперек желоба только в том месте, где находится ниша. Левый конец желоба закрыт и в пустом промежутке есть место только для трех шариков, а в правом конце есть отверстие, через которое может пройти наружу только любой белый шарик, но не черный. Вынимать шарики из желоба другим способом не разрешается. Разработайте алгоритм, по которому можно выкатить из желоба все белые шарики. В этом алгоритме можно использовать следующие команды: 1) переместить черный шарик ¹... влево (сокращенное обозначение команды — ЧN¬, где N — номер шарика); 2) переместить черный шарик ¹... вправо (ЧN®); 3) переместить черный шарик ¹... в нишу (ЧN­); 4) переместить черный шарик ¹... из ниши (ЧN¯); 5) переместить белый шарик ¹... влево (БN¬); 6) переместить белый шарик ¹... вправо (БN®); 7) переместить белый шарик ¹... в нишу (БN­); 8) переместить белый шарик ¹... из ниши (БN¯). 2.2. Восемь монет Восемь монет выложены в ряд (рис. 2.2): Рис. 2.2 Надо собрать их в две группы по 4 монеты в каждой группе (в которой монеты, например, лежат одна на другой), перекладывая за каждый ход одну монету. При этом перекладываемую монету можно соединять лишь с монетой, отделенной от нее двумя монетами (разрозненными или объединенными в группу). Разработайте алгоритм решения этой задачи, используя в нем команды типа «3 к 6», где 3 — номер перекладываемой монеты, а 6 — номер монеты, на которую кладется перекладываемая.
Занимательная информатика 36 2.3. Шесть монет На ровной гладкой поверхности (например, на столе) выложен треугольник из шести монет (рис. 2.3а). Требуется за наименьшее число ходов переложить монеты так, чтобы они образовали кольцо, показанное на рис. 2.3б. Рис. 2.3 Каждый ход состоит в передвигании только одной монеты. Сдвигать при этом другие монеты нельзя. В новом положении каждая монета должна касаться двух других монет. Поднимать монеты с поверхности стола при решении задачи не разрешается. При разработке алгоритма используйте команды типа: «1 к (3, 6)», где 1 — номер перекладываемой монеты, а 3 и 6 — номера монет, к которым кладется перекладываемая. 2.4. Еще две задачи на перекладывание монет 2.4.1. Десять монет расположены в виде равностороннего треугольника (рис. 2.4). Необходимо переложить три монеты на новые места так, чтобы снова получился равносторонний треугольник. Рис. 2.4 Рис. 2.5 2.4.2. Из рис. 2.5 видно, что девять монет можно расположить в восемь рядов по три монеты в каждом, т. е. можно указать восемь прямых линий, на каждой из которых лежат центры трех какихнибудь монет. Как за минимальное число перекладываний сделать так, чтобы эти девять монет оказались расположенными в десять рядов по три монеты в каждом?
2. Перемещение предметов и… животных 2.5. 37 Задачи со спичками 2.5.1. Собрать в группы по 2 Десять спичек выложены в один ряд (рис. 2.6). Рис. 2.6 Требуется распределить их в 5 пар, перекладывая по одной спичке через две соседние (например, можно спичку ¹ 1 переложить к спичке ¹ 4 и т. д. — см. рис. 2.7). Рис. 2.7 При разработке алгоритма решения этой задачи используйте команды типа: «1 к 4», где 1 — номер перекладываемой спички, а 4 — номер спички, к которой кладется перекладываемая. 2.5.2. Собрать в группы по 3 15 спичек выложены в один ряд, как показано на рис. 2.8. Рис. 2.8 Необходимо собрать их в 5 групп (кучек) по 3 спички в каждой. Перекладывать спички можно только по одной, каждый раз «перескакивая» через 3 спички. При разработке алгоритма решения задачи используйте команды типа: «6 к 10», где 6 — номер перекладываемой спички, а 10 — номер спички, к которой кладется перекладываемая. 2.6. Переставить шашки 2.6.1. На листе бумаги нарисуйте 10 клеток и положите в них 6 шашек, как показано на рис. 2.9.
Занимательная информатика 38 Рис. 2.9 Переместите шашки так, чтобы они оказались в тех же шести клетках, но сначала слева — все черные, а вслед за ними — все белые. При этом перемещать на свободное место нужно сразу две шашки, не меняя порядка, в котором они лежат. Решите также эту задачу для случая, когда 4 свободные клетки располагаются справа. 2.6.2. В 8 клетках лежат 8 шашек в ряд попеременно — белая, черная, белая, черная и т. д. (рис. 2.10). Слева есть также две свободные клетки. Рис. 2.10 Требуется переместить шашки так, чтобы начиная с левой клетки оказались все черные, а вслед за ними все белые шашки (т. е. не обязательно на тех же восьми местах). При этом перемещать на свободные клетки нужно сразу две шашки, не меняя порядка, в котором они лежат. Решите также эту задачу для случая, когда аналогичное свободное место располагается справа. 2.6.3. Решите предыдущую задачу для 10, 12 и 14 шашек. 2.6.4. Две белые и две черные шашки расположены так, как показано на рис. 2.11. Рис. 2.11 Требуется переставить черные шашки в клетки с номерами 4 и 5, а белые — в клетки с номерами 1 и 2 с соблюдением следующих условий: 1) каждая шашка может «перескочить» в соседнюю клетку или через одну клетку, но не дальше;
2. Перемещение предметов и… животных 39 2) никакая шашка не должна возвращаться в клетку, где она уже побывала; 3) в каждой клетке не должно быть более одной шашки; 4) начинать надо с белой шашки. Считать при этом, что других клеток (кроме пяти имеющихся) нет. 2.6.5. Соблюдая условия предыдущей задачи, решите ее: а) для шести шашек (рис. 2.12): требуется переставить белые шашки в клетки с номерами 1, 2, и 3, а черные — в клетки с номерами 5, 6 и 7; Рис. 2.12 б) для восьми шашек (рис. 2.13): требуется переставить белые шашки в клетки с номерами 1, 2, 3 и 4, а черные — в клетки с номерами 6, 7, 8 и 9. Рис. 2.13 2.7. Девять шашек Пронумеруйте девять шашек числами от 1 до 9. Расставьте шашки на специальном поле, изображенном на рис. 2.14, так, чтобы номера шашек и клеток совпадали; только шашку с номером 1 поместите в клетку ¹ 10, а клетку ¹ 1 оставьте свободной. Рис. 2.14
Занимательная информатика 40 Разработайте алгоритм решения следующей задачи: не вынимая шашки из клеток, а только перемещая их, требуется перевести шашку с номером 1 в клетку ¹ 1. При этом можно временно ставить по одной шашке в клетки А, Б и В; перепрыгивать одной шашкой через другую нельзя. Когда шашка с номером 1 перейдет на свое место — в клетку ¹ 1, то и все остальные шашки должны оказаться на своих прежних местах, т. е. так, чтобы номера шашек и клеток совпадали. При этом используйте в алгоритме команды типа: «m—n», где первое число m показывает номер шашки, а второе число n (а в ряде случаев — буква) указывает номер клетки, в которую ставится эта шашка. 2.8. «Уголки» Вы, конечно, знаете, об игре с использованием шашек, которая называется «Уголки». Напомним, что в исходном положении в ней шашки расположены так, как показано на рис. 2.15. Один из участников игры перемещает белые шашки, а второй — черные. Перемещать свою шашку можно на свободную клетку, расположенную выше, ниже, правее или левее, а также через шашку (свою или чужую), находящуюся на указанных клетках, если клетка, на которую делается такой ход, свободна; причем «перепрыгивать» таким образом через другие шашки можно многократно. Рис. 2.15
2. Перемещение предметов и… животных 41 Решите следующую задачу: за наименьшее число ходов надо переставить по правилам игры «Уголки» четыре шашки из левого нижнего угла доски (полей al, a2, bl, b2) в правый верхний угол. 2.9. Перемещение лошадей В конюшне устроены девять стойл в один ряд (рис. 2.16). Рис. 2.16 В стойлах с номерами 1, 2, 3 и 4 находятся черные лошади, в стойлах 6, 7, 8 и 9 — белые; пятый номер не занят. Требуется поменять местами белых и черных лошадей при следующих условиях: 1) каждая лошадь может переходить только в ближайшее стойло или в соседнее с ним, но не дальше; 2) никакая лошадь не должна возвращаться на прежнее место; 3) в каждом стойле не может быть больше одной лошади. Начинать перемещение нужно с белой лошади. При разработке алгоритма решения этой задачи используйте команды типа: m в n, где первое число m показывает номер стойла, из которого перемещается лошадь, а второе число n — номер стойла, в которое она перемещается. 2.10. В зоопарке Из-за ошибок служителей зоопарка звери оказались не в своих клетках (рис. 2.17). Примечание. В верхней части рис. 2.17 указаны надписи на клетках. Буквами П, Т, О, Л и В обозначены животные (соответственно, пантера, тигр, осел, лев и волк), на самом деле находящиеся в той или иной клетке. Рис. 2.17
Занимательная информатика 42 Работнику зоопарка необходимо как можно быстрее разместить животных в их «правильных» клетках. Каким должен быть алгоритм действий этого работника? Поскольку все звери, кроме осла, — хищники, их нельзя помещать вдвоем в одну клетку, а при выводе какого-то животного из клетки в общий вольер его можно оставить там или переместить только в соседнюю клетку (в последнем случае в общем вольере может находиться еще один из зверей). 2.11. Перестановка коней Рис. 2.18 Эта задача придумана итальянцем Гуарини еще в XVI в. В углах шахматной доски 3 ´ 3 стоят два белых и два черных коня (рис. 2.18). Как поменять черных и белых коней за наименьшее число их перемещений по правилам шахмат? 2.12. Перемещаем карточки, или Как апельсин превратить в собаку* На листе бумаги нарисованы 15 клеток (рис. 2.19). Рис. 2.19 В них лежат 8 карточек с буквами, образующих слово АПЕЛЬСИН (рис. 2.20). * А вот и еще одна похожая задача. Вам, конечно, известно, выражение «Делать из мухи слона». Попробуйте сделать из слова «муха» слово «слон», последовательно заменяя только одну букву. Поpядок следования букв пpи этом менять нельзя.
2. Перемещение предметов и… животных Рис. 2.20 43 Рис. 2.21 Требуется, перекладывая карточки в соседнюю свободную клетку, за минимальное количество перекладываний получить слово СПАНИЕЛЬ (рис. 2.21). Решите также аналогичную задачу со словом ПЕРЕПРАВА (рис. 2.22, 2.23). Рис. 2.22 Рис. 2.23 2.13. Еще 8 задач на перемещение карточек Следующие 8 задач на перемещение карточек отличаются от предыдущих тем, что в них новые слова должны быть расположены в тех же клетках, что и исходные (рис. 2.24–2.39).
Занимательная информатика 44 Рис. 2.24 Рис. 2.25 Рис. 2.26 Рис. 2.27 Рис. 2.28 Рис. 2.29 Рис. 2.30 Рис. 2.31 Рис. 2.32 Рис. 2.33 Рис. 2.34 Рис. 2.35
2. Перемещение предметов и… животных 45 Рис. 2.36 Рис. 2.37 Рис. 2.38 Рис. 2.39 2.14. Упорядочить карточки В ряд выложены карточки, на которых записаны числа: 7, 8, 9, 4, 5, 6, 1, 2, 3. Разрешается взять несколько подряд лежащих карточек и переставить их в обратном порядке. За четыре такие операции добиться расположения карточек: 1, 2, 3, 4, 5, 6, 7, 8, 9 можно так, как показано в табл. 2.1 (жирным курсивом отмечены номера карточек, место расположения которых изменилось). Таблица 2.1 Исходное состояние 1. Переставляем все 9 карточек 2. Переставляем карточки 3, 2, 1 3. Переставляем карточки 6, 5, 4 4. Переставляем карточки 9, 8, 7 7 8 9 4 5 6 1 2 3 3 2 1 6 5 4 9 8 7 1 2 3 6 5 4 9 8 7 1 2 3 4 5 6 9 8 7 1 2 3 4 5 6 7 8 9 Ответьте на вопрос: можно ли решить эту задачу за три операции? 2.15. Сортировка, или «По ранжиру — стройся!» Сортировкой называют процесс размещения заданного множества объектов в определенном порядке, — в частности процесс размещения множества чисел в порядке их возрастания или убывания.
Занимательная информатика 46 Зачем нужна сортировка? Очевидно, что с отсортированными данными в ряде случаев работать легче, чем с произвольно расположенными. Когда элементы отсортированы, их проще найти (например, как в телефонном справочнике, в словаре либо в файловых панелях программы Windows Commander или FAR Manager), обновить, исключить, добавить в список и слить воедино. В отсортированных данных легче определить, имеются ли пропущенные элементы, и удостовериться, что все элементы были проверены. Легче найти общие элементы двух множеств, если оба множества уже были отсортированы. Сортировка является мощным средством ускорения работы программ, в которых часто нужно обращаться к определенным элементам. Так что если вы хотите стать программистом, то вам обязательно надо знать методы сортировки. В настоящее время известно большое число методов сортировки наборов чисел, из которых мы рассмотрим несколько наиболее простых. 2.15.1. Сортировка выбором Проиллюстрируем этот метод на примере десяти карточек с числами (рис. 2.40). Рис. 2.40 Как упорядочить эти карточки по возрастанию чисел? Ответ достаточно очевиден. Надо: 1) найти карточку с минимальным числом; 2) положить ее где-то отдельно на первом месте; 3) затем найти карточку с минимальным числом из оставшихся; 4) разместить ее на втором месте (справа от ранее положенной первой); и т. д. В конце оставшуюся 10-ю карточку (с числом 44) остается разместить на последнем, 10-м, месте в уже упорядоченной последовательности карточек.
2. Перемещение предметов и… животных 47 В общем виде описанный алгоритм выглядит следующим образом: цикл для i от 1 до 10 1. Найти карточку с минимальным числом 2. Разместить ее в отдельной последовательности на i-м месте конец цикла При программировании сортировка часто используется применительно к задаче сортировки чисел в массиве. В этом случае возникает проблема, заключающаяся в том, что удалять найденное на очередном проходе цикла число из массива (и смещать оставшиеся элементы на одну позицию влево) нецелесообразно — это потребует слишком больших затрат времени. Если же найденное минимальное число оставлять в исходном массиве, то при следующем проходе оно опять окажется минимальным. Решением этой проблемы является замена найденного на каком-то проходе минимального значения на число, заведомо превышающее любой элемент массива. С учетом сказанного, алгоритм сортировки чисел в массиве может быть оформлен в виде (где n — количество элементов в массиве в заданном и в дополнительном массивах): цикл для i от 1 до n 1. Определить минимальный элемент массива 2. Записать его на i-е место в дополнительном массиве 3. В исходном массиве на месте минимального элемента записать "большое" число кц Нетрудно убедиться, что описанный метод приведет к получению упорядоченной последовательности чисел и в случае, когда в исходной последовательности есть одинаковые значения. А можно ли решить задачу, если дополнительного места для размещения карточек с упорядоченными числами нет (в программе — без использования дополнительного массива)? Можно, и делается это так: 1) просматривая все карточки, найти карточку с минимальным числом; 2) поменять ее местами с первой карточкой; 3) просматривая карточки, начиная со второй, найти карточку с минимальным числом; 4) поменять ее местами с карточкой, находящейся на втором месте; 5) просматривая карточки, начиная с третьей, найти карточку с минимальным числом; ...
Занимательная информатика 48 17) просматривая карточки, начиная с предпоследней, найти карточку с минимальным числом; 18) поменять найденную карточку с карточкой, находящейся на девятом месте. В общем виде такой вариант алгоритма сортировки для 10 карточек оформляется следующим образом: цикл для i от 1 до 9 1. Среди карточек, находящихся на местах от i–го до 10-го, найти карточку с минимальным числом 2. Поменять найденную карточку с карточкой, находящейся на i-м месте конец цикла Преимущества такого варианта метода выбора оцените самостоятельно. Задачи 1. Разместите 15 карточек с числами случайным образом и отсортируйте их двумя описанными выше вариантами метода выбора по убыванию чисел. 2. Если вы владеете каким-либо языком программирования, то разработайте программы сортировки числового массива по возрастанию чисел методом выбора (два варианта). 2.15.2. Сортировка вставками Обсуждая данный метод, будем считать, что все карточки с числами, кроме первой, лежат «числами вниз». Пусть нам надо упорядочить карточки по возрастанию чисел. Открываем вторую карточку и сравниваем число на ней (n2) с числом на первой карточке (n1). Если n2 < n1, то поменяем карточки местами (рис. 2.41), в противном случае оставляем все как есть. Рис. 2.41 Итак, две карточки уже отсортированы. Открываем третью карточку (рис. 2.42) и размещаем ее так, чтобы числа на всех трех карточках были упорядочены* (рис. 2.43). Рис. 2.42 * Рис. 2.43 Возможно, для этого третью карточку потребуется оставить на том же самом месте, если она уже лежит «правильно».
2. Перемещение предметов и… животных 49 Открываем четвертую карточку (см. рис. 2.44) и видим, что уже на четырех карточках числа размещены в порядке возрастания. Если же число на четвертой карточке оказалось бы меньше 10, то мы бы поместили эту карточку на соответствующее место. Рис. 2.44 Итак, можно сформулировать общее правило (алгоритм) сортировки всех карточек: надо последовательно открывать по одной карточке, начиная со второй, и размещать их так, чтобы последовательность чисел на уже открытых карточках была упорядоченной при ее просмотре слева направо. Такой метод сортировки называют «сортировкой вставками» или «сортировкой включениями». Кстати, аналогичный метод упорядочивания используют игроки в карты. Разместить очередную карточку на соответствующем ей месте в предыдущей, уже упорядоченной, последовательности при этом можно по-разному. Можно (и, наверное, вы, читатель, так и делали), просматривая открытые числа слева направо, найти место, которое должна занимать размещаемая карточка, положить ее там, а карточку, которая ранее занимала это место, и все карточки справа от нее вплоть до той, которая предшествует перемещаемой, — сместить вправо на одну позицию. Например, для ситуации, показанной на рис. 2.45, описанные перемещения приведут к ситуации, представленной на рис 2.46. Рис. 2.45 Рис. 2.46 Можно поступить и по-другому — многократно сравнивать число на размещаемой карточке с числом на предыдущей карточке и менять эти карточки местами до тех пор, пока слева от размещаемой карточки не окажется число, меньшее или равное числу на ней, или пока размещаемая карточка не окажется на первом месте.
Занимательная информатика 50 Задачи 1. Разместите 15 карточек с числами случайным образом и отсортируйте их по возрастанию чисел методом вставок, используя оба варианта помещения очередной карточки на требуемое место. 2. На известном вам языке программирования разработайте программы сортировки числового массива по убыванию чисел методом вставок (два варианта). 2.15.3. Сортировка обменом Сортировка обменом заключается в том, что числа на соседних карточках попарно сравниваются друг с другом и карточки меняются местами, если предшествующее число больше последующего (когда упорядочивание происходит по возрастанию) или если предшествующее число меньше последующего (когда упорядочивание происходит по убыванию). Проиллюстрируем этот метод на примере сортировки десяти карточек с числами по убыванию их значений. Будем, как и в предыдущем случае, считать, что все карточки лежат «числами вниз». Открываем первую и вторую карточки (рис. 2.47) и сравниваем числа на них. Так как число на первой карточке меньше, чем на второй, то меняем карточки местами (рис. 2.48). Рис. 2.47 Рис. 2.48 Открываем третью карточку (рис. 2.49). Так как 6 > 3, то меняем местами вторую и третью карточки (рис. 2.50). Рис. 2.49 Рис. 2.50 Открыв четвертую карточку (рис. 2.51), видим, что здесь ничего менять не надо. Рис. 2.51 Если на остальных карточках записаны числа, показанные на рис. 2.52, то после соответствующих обменов мы получим ситуацию, изображенную на рис. 2.53 (убедитесь в этом сами).
2. Перемещение предметов и… животных 51 Рис. 2.52 Рис. 2.53 Стали ли числа на карточках упорядочеными? Еще нет. Но видно, что карточка с самым маленьким числом заняла «положенное ей» место (последнее). Кроме того, некоторые карточки (с небольшими числами, в частности 3 и 2) сместились вправо. Если теперь повторить процесс сравнения соседних карточек (последнюю карточку при этом можно уже не учитывать), то в результате «правильное» место займет карточка с числом 2 (рис. 2.54). Рис. 2.54 Ясно, что после девятого прохода все карточки станут отсортированными (рис. 2.55). Рис. 2.55 Если теперь последовательность сортируемых карточек расположить вертикально (первая слева карточка — внизу) и проследить за перемещением карточек (рис. 2.56), то можно увидеть, что карточки с минимальными значениями, подобно пузырькам воздуха в воде, «всплывают» на соответствующую им позицию. Поэтому сортировку таким способом также называют «сортировкой методом пузырька» или «пузырьковой сортировкой». Задачи 1. Разместите 15 карточек с числами случайным образом и отсортируйте их по возрастанию чисел, используя метод обмена. 2. На известном вам языке программирования разработайте программы сортировки числового массива по убыванию и по возрастанию чисел методом обмена. 3. Возникает вопрос: всегда ли для упорядочивания десяти карточек требуется 9 проходов? Получите ответ на него, проведя несколько экспериментов с десятью карточками, представленными на рис. 2.52, но с другим исходным порядком их размещения.
Занимательная информатика 52 Рис. 2.56 2.16. Ханойские башни Эта головоломка известна уже довольно давно. Ее автором принято считать французского математика Э. Люка, создавшего головоломку на основе древних легенд. В русской литературе она впервые появилась в 1902 г. в книге Е. И. Игнатьева «В царстве смекалки». Если вы возьмете детскую пирамидку (диски в ней располагаются по возрастанию: верхний — самый маленький, а нижний — самый большой) и еще два стержня от таких же детских пирамидок, то головоломка — уже у вас в руках (рис. 2.57). Пронумеруем стержни: тот, на котором находятся диски, получит номер I, а другие — номера II и III. Задача состоит в том, чтобы перенести диски со стержня I на стержень III, используя Рис. 2.57
2. Перемещение предметов и… животных 53 стержень II как промежуточный. При этом должны соблюдаться три условия: 1) за один ход можно переносить лишь один диск; 2) нельзя класть больший диск на меньший; 3) снятый диск нельзя отложить в сторону — он должен быть надет на один из стержней. Согласно легенде, в древнем Ханое стоит храм, в котором на одном из трех алмазных стержней надеты 64 золотых диска, и монахи без устали, сменяя друг друга, переносят диски с одного стержня на другой в соответствии с описанными правилами. Когда монахи перенесут все диски с первого стержня на третий, как гласит легенда, наступит конец света. Давайте попробуем справиться с этой головоломкой. При четырех дисках задача решается легко (вы можете попробовать решить ее, использовав, например, монеты разного диаметра и сложив из них пирамидку. Если вы будете записывать свои действия, то получите следующий алгоритм (примем, что диски-монеты нужно перенести с первого «стержня» на третий): 1) I ® II*; 2) I ® III; 3) II ® III; 4) I ® II; 5) III ® I; 6) III ® II; 7) I ® II; 8) I ® III; 9) II ® III; 10) II ® I; 11) III ® I; 12) II ® III; 13) I ® II; 14) I ® III; 15) II ® III. Конечно, вы наверняка сможете решить задачу и при большем числе дисков. А каким должен быть алгоритм не в конкретном, а в общем случае, когда количество дисков равно некоторому числу k? Чтобы ответить на этот вопрос, давайте разберемся, как перенести диски с первого стержня на третий, а заодно выясним, скоро ли наступит обещанный конец света. J * Смысл этого действия, конечно, понятен.
54 Занимательная информатика Если бы в пирамиде был только один диск, то решение очевидно — перенести его на третий стержень, и дело с концом. При этом мы выполнили требуемое задание за один ход. А если бы было два диска? Тогда сначала надо положить меньший диск на второй стержень, затем перенести второй диск на третий стержень, а потом перенести меньший диск на третий стержень, положив его поверх второго. Итого за три действия мы смогли переложить оба диска на третий стержень. Заметим, что 1 = 21 – 1, а 3 = 22 – 1. При трех дисках мы можем сначала перенести два верхних на второй стержень (ведь подобную задачу мы только что решили), потом оставшийся нижний (самый большой) диск перенести на третий стержень, а затем на него же можно перенести те два диска, которые находятся на втором стержне. Теперь предположим, что мы умеем перекладывать на третий стержень пирамиду из п дисков за (2п – 1) действие. Покажем, что в этом случае можно перенести на третий стержень и пирамиду из (п + 1) дисков за (2п+1 – 1) действие. Пусть на пирамиде лежит (п + 1) дисков. Временно изменим нумерацию стержней: второй назовем третьим, а третий — вторым. Теперь мы можем перенести п верхних дисков с первого стержня на третий (уже в новой нумерации!), произведя (2п – 1) действие, а на первом стержне останется лишь один диск. Перенесем его на свободный второй стержень. Снова перенумеруем стержни: вернем второму стержню номер три, первому дадим номер два, а третьему присвоим номер один. Теперь у нас на первом стержне лежит п дисков, второй — свободен, а на третьем лежит самый большой диск. Осталось перенести с первого стержня на третий п дисков, что мы умеем делать за (2п – 1) операцию. Вот и все! Мы собрали на третьем стержне все (п + 1) дисков, совершив ((2п – 1) + 1 + (2п – 1)) = (2п+1 – 1) действие. Отсюда, в соответствии с принципом математической индукции, вытекает, что для любого натурального числа k можно, имея пирамиду с k дисками, перенести их с первого стержня на третий, соблюдая правила, за (2k – 1) действие. Учитывая все сказанное, можно предложить следующий алгоритм решения задачи при k дисках: алг Перемещение_дисков(k дисков) нач если k = 1 то Переносим его иначе | Используем этот же алгоритм, но с k – 1 | верхними дисками
2. Перемещение предметов и… животных 55 Перемещение_дисков((k – 1) дисков) Переносим самый большой диск | Еще раз используем этот же алгоритм с k – 1 | верхними дисками Перемещение_дисков((k – 1) дисков) все кон Нетрудно показать, что меньше чем за (2k – 1) действие перенести k дисков с первого стержня на третий невозможно. Поэтому легендарным жрецам понадобится (264 – 1) действие, чтобы завершить свою работу. И если тратить на каждое действие лишь по одной секунде, то понадобится 18 446 744 073 709 551 615 секунд, т. е. более 500 миллиардов лет! Так что до конца света еще очень далеко J. Мы же в заключение заметим, что прием, когда какая-то задача сводится к такой же задаче, но с другими исходными данными (в нашем случае — с другим количеством дисков), в программировании называют рекурсией. Более детально о рекурсии будет рассказано в главе 9. Счеты Старинный русский счетный прибор. Наиболее старыми на данный момент являются счеты середины XVII в., хранящиеся в Государственном историческом музее в Москве. Они имеют четыре счетных поля для неполных рядов. Форма же «современных» счетов окончательно выработалась в начале XVIII в. Идет урок русского языка. У ч и т е л ь : «Как пишется частица не с глаголами: слитно или раздельно?) С ы н п р о г р а м м и с т а : «Через пробел!»
3 64 задачи для Водомера* меется исполнитель, который мы назовем Водомером**, так как он занимается отмериванием того или иного количества воды. У него есть источник воды (река, озеро или т. п.), количество воды в котором не ограничено, и две или три емкости (банки, ведра или т. п.): А и В или А, В и С. При наличии двух емкостей система команд, которые может выполнять Водомер, будет такой: И К1. К2. К3. К4. К5. К6. * ** Наполнить А. Наполнить В. Перелить из А в В. Перелить из В в А. Вылить из А. Вылить из В. Примечание для учителя: задачи данной главы могут быть использованы для организации классных или школьных конкурсов по информатике или математике. В этом случае все задачи целесообразно сгруппировать в задания для шести туров (рекомендуемое количество задач по турам: 6, 12, 12, 14, 12 и 8). «Водомер» — предложенное автором название исполнителя, который в других источниках носит название «Водолей» или «Переливашка». Логично: ведь этот исполнитель занимается именно отмериванием воды, — не так ли J?
3. 64 задачи для Водомера 57 При наличии трех емкостей система команд Водомера будет существенно больше, хотя по смыслу набор операций в ней аналогичен приведенному выше: К1. К2. К3. К4. К5. К6. К7. К8. К9. К10. К11. К12. Наполнить А. Наполнить В. Наполнить С. Перелить из А Перелить из А Перелить из В Перелить из В Перелить из С Перелить из С Вылить из А. Вылить из В. Вылить из С. в в в в в в В. С. А. С. А. В. Требуется составить алгоритмы решения следующих задач, которые должен решить Водомер. Если иное не оговорено особо, то задача должна решаться за минимально возможное количество действий*. 3.1. Объем емкости А равен 3 л, а емкости В — 4 л. Надо отмерить 2 л. 3.2. Объем емкости А равен 3 л, а емкости В — 10 л. Надо отмерить 5 л. 3.3. Объем емкости А равен 4 л, а емкости В — 10 л. Надо отмерить 2 л. 3.4. Объем емкости А равен 5 л, емкости В — 10 л, а емкости С — 12 л. Надо отмерить 4 л. 3.5. Объем емкости А равен 5 л, емкости В — 10 л, а емкости С — 12 л. Надо отмерить 1 л. 3.6. Объем емкости А равен 4 л, емкости В — 5 л, а емкости С — 10 л. Надо отмерить 7 л. 3.7. Объем емкости А равен 3 л, емкости В — 5 л, а емкости С — 8 л. Надо отмерить 7 л. 3.8. Объем емкости А равен 3 л, емкости В — 5 л, а емкости С — 10 л. Надо отмерить 9 л. * Среди предложенных имеются задачи с одинаковыми исходными данными и одинаковым требуемым результатом, но отличающиеся условиями получения результата (минимальное количество операций или минимально возможное количество используемой воды — см., например, задачу 3.9).
58 Занимательная информатика 3.9. Объем емкости А равен 3 л, емкости В — 5 л, емкости С — 11 л. Надо отмерить 9 л, использовав минимально возможное количество воды (здесь и далее в аналогичных задачах имеется в виду общий объем воды, используемой при выполнении команд Наполнить А, Наполнить В и Наполнить С). 3.10. Объем емкости А равен 3 л, емкости В — 6 л, а емкости С — 11 л. Надо получить 4 л в емкости С. 3.11. Объем емкости А равен 3 л, емкости В — 10 л, а емкости С — 11 л. Надо отмерить 9 л. 3.12. Объем емкости А равен 3 л, емкости В — 7 л, емкости С — 12 л. Надо отмерить 11 л. 3.13. Объем емкости А равен 4 л, емкости В — 5 л, а емкости С — 8 л. Надо отмерить 6 л. 3.14. Объем емкости А равен 4 л, емкости В — 5 л, а емкости С — 8 л. Надо отмерить 2 л, использовав минимально возможное количество воды. 3.15. Объем емкости А равен 4 л, емкости В — 7 л, а емкости С — 11 л. Надо отмерить 10 л. 3.16. Объем емкости А равен 4 л, емкости В — 7 л, а емкости С — 11 л. Надо отмерить 6 л. 3.17. Объем емкости А равен 4 л, емкости В — 8 л, а емкости С — 9 л. Надо отмерить 3 л. 3.18. Объем емкости А равен 4 л, емкости В — 8 л, а емкости С — 9 л. Надо отмерить 7 л. 3.19. Объем емкости А равен 3 л, емкости В — 5 л, а емкости С — 11 л. Надо отмерить 9 л. 3.20. Объем емкости А равен 3 л, емкости В — 6 л, а емкости С — 10 л. Надо получить 2 л в емкости А. 3.21. Объем емкости А равен 3 л, емкости В — 6 л, а емкости С — 11 л. Надо отмерить 7 л, использовав минимально возможное количество воды. 3.22. Объем емкости А равен 3 л, емкости В — 7 л, а емкости С — 10 л. Надо отмерить 2 л. 3.23. Объем емкости А равен 3 л, емкости В — 7 л, а емкости С — 10 л. Надо отмерить 8 л, использовав минимально возможное количество воды.
3. 64 задачи для Водомера 59 3.24. Объем емкости А равен 3 л, емкости В — 8 л, а емкости С — 12 л. Надо отмерить 10 л. 3.25. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 10 л. Надо получить 5 л в емкости С, использовав минимальное количество воды. 3.26. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 10 л. Надо получить 8 л в емкости В, использовав минимальное количество воды. 3.27. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 11 л. Надо получить 1 л в емкости С. 3.28. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 11 л. Надо отмерить 10 л, использовав минимальное количество воды. 3.29. Объем емкости А равен 4 л, емкости В — 5 л, а емкости С — 11 л. Надо отмерить 7 л. 3.30. Объем емкости А равен 4 л, емкости В — 7 л, а емкости С — 12 л. Надо отмерить 6 л. 3.31. Объем емкости А равен 4 л, а емкости В — 9 л. Надо отмерить 7 л. 3.32. Объем емкости А равен 4 л, а емкости В — 11 л. Надо отмерить 2 л. 3.33. Объем емкости А равен 6 л, а емкости В — 14 л. Надо отмерить 10 л. 3.34. Объем емкости А равен 3 л, а емкости В — 8 л. Надо отмерить 1 л. 3.35. Объем емкости А равен 3 л, а емкости В — 8 л. Надо отмерить 4 л. 3.36. Объем емкости А равен 7 л, а емкости В — 8 л. Надо отмерить 3 л. 3.37. Объем емкости А равен 7 л, а емкости В — 12 л. Надо отмерить 4 л. 3.38. Объем емкости А равен 5 л, а емкости В — 6 л. Надо отмерить 3 л. 3.39. Объем емкости А равен 3 л, емкости В — 6 л, а емкости С — 11 л. Надо отмерить 7 л.
60 Занимательная информатика 3.40. Объем емкости А равен 3 л, емкости В — 6 л, а емкости С — 11 л. Надо отмерить 10 л, использовав минимальное количество воды. 3.41. Объем емкости А равен 3 л, емкости В — 7 л, а емкости С — 10 л. Надо получить 5 л в емкости В. 3.42. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 10 л. Надо получить 5 л в емкости С. 3.43. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 11 л. Надо получить 1 л в емкости С, использовав минимальное количество воды. 3.44. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 11 л. Надо отмерить 10 л. 3.45. Объем емкости А равен 3 л, емкости В — 7 л, а емкости С — 10 л. Надо отмерить 8 л. 3.46. Объем емкости А равен 3 л, емкости В — 8 л, а емкости С — 12 л. Надо отмерить 10 л, использовав минимальное количество воды. 3.47. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 11 л. Надо отмерить 7 л. 3.48. Объем емкости А равен 4 л, емкости В — 8 л, а емкости С — 9 л. Надо отмерить 6 л. 3.49. Объем емкости А равен 6 л, а емкости В — 10 л. Надо отмерить 2 л. 3.50. Объем емкости А равен 6 л, а емкости В — 16 л. Надо отмерить 8 л. 3.51. Объем емкости А равен 6 л, а емкости В — 22 л. Надо отмерить 14 л. 3.52. Объем емкости А равен 5 л, а емкости В — 8 л. Надо отмерить 4 л. 3.53. Объем емкости А равен 7 л, а емкости В — 10 л. Надо отмерить 2 л. 3.54. Объем емкости А равен 9 л, а емкости В — 11 л. Надо отмерить 5 л. 3.55. Объем емкости А равен 5 л, а емкости В — 12 л. Надо отмерить 6 л.
3. 64 задачи для Водомера 61 3.56. Объем емкости А равен 7 л, а емкости В — 9 л. Надо отмерить 1 л. 3.57. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 10 л. Надо получить 8 л в емкости В. 3.58. Объем емкости А равен 3 л, емкости В — 9 л, а емкости С — 11 л. Надо отмерить 7 л, использовав минимальное количество воды. 3.59. Объем емкости А равен 4 л, емкости В — 5 л, а емкости С — 9 л. Надо отмерить 7 л. 3.60. Объем емкости А равен 4 л, емкости В — 5 л, а емкости С — 10 л. Надо отмерить 7 л, использовав минимальное количество воды. 3.61. Объем емкости А равен 4 л, емкости В — 8 л, а емкости С — 9 л. Надо отмерить 3 л. 3.62. Объем емкости А равен 3 л, емкости В — 5 л, а емкости С — 11 л. Надо получить 4 л в емкости В, использовав минимальное количество воды. 3.63. Объем емкости А равен 5 л, а емкости В — 16 л. Надо отмерить 9 л. 3.64. Объем емкости А равен 5 л, а емкости В — 16 л. Надо отмерить 8 л. Если вы решите все эти задачи, то можете считать себя чемпионом СНГ среди школьников по переливанию воды J (так назывался конкурс для учащихся, проводившийся редакцией газеты «Информатика»). Логарифмическая линейка Логарифмическая линейка — многофункциональный J счетный инструмент, с помощью которого с большой степенью точности можно умножать и делить, вычислять логарифмы, синусы, тангенсы, квадраты, квадратные корни и др. До появления и широкого распространения компьютерной вычислительной техники такие линейки были незаменимы при выполнении многих технических расчетов и являлись непременным инструментом инженеров.
4 Взвешиваем всё — от крупы до золотых монет аже если умение разрабатывать алгоритмы нахождения Д фальшивых (а значит, и настоящих J) монет не понадобится вам для выхода на свободу J (см. задачу 4.28) или для обогащения J (см. задачи 4.6 и 4.7), все равно решение таких задач является очень увлекательным занятием. Как написал в Интернете один молодой человек, «эта задача* уже несколько дней не дает мне заснуть»... Впрочем, начнем мы с более прозаичных вещей — с крупы, гвоздей, сахара... 4.1. Взвешивание крупы В пакете содержится 9 кг муки. Необходимо при помощи чашечных весов с гирями распределить эту крупу по двум пакетам: в один насыпать 2 кг, а в другой — 7 кг. При этом разрешается произвести только 3 взвешивания. Имеется неограниченное количество гирь в 50 и 100 г. * Речь шла о задаче 4.31.
4. Взвешиваем всё — от крупы до золотых монет 63 4.2. Как отмерить 9 кг гвоздей? В мешке имеется 24 кг гвоздей. Как, располагая только чашечными весами без стрелок и гирь, отмерить 9 кг гвоздей? 4.3. Как отмерить 1 кг сахара? Дан мешок сахарного песка, чашечные весы и гирька в 1 г. Можно ли за 10 взвешиваний отмерить 1 кг сахара? 4.4. Неправильные весы Имеются неправильные весы с двумя чашками и сколько угодно любых «правильных» гирь. Как отвесить на таких весах 1 кг муки? 4.5. Потерянная гиря Было 8 гирь весом в 1 кг, 2 кг, …, 8 кг, без надписей на них. Все гири выполнены из одного материала, так что чем больше вес гири, тем больше ее размер (но при этом размер не пропорционален весу). Одну из гирь потеряли. Необходимо за два взвешивания на чашечных весах выяснить, какая именно гиря потеряна. 4.6. 19 гирек Имеются 19 гирек весом в 1 г, 2 г, 3 г, …, 19 г. Одна из них — золотая, остальные — «поддельные» (похожие на золотые), причем все «поддельные» гирьки выполнены из двух видов сплавов, — А (9 гирек) и Б (9 гирек). Известно, что общий вес всех гирек из сплава А на 90 г больше, чем общий вес всех гирек из сплава Б. Одному мальчику сказали, что если он найдет золотую гирьку, то получит ее в подарок. Мальчик подумал, правильно указал, какая из 19 гирек золотая, и получил ее. А смогли бы найти золотую гирьку вы? 4.7. Как оставить себе золотую монету? Представьте, что перед вами — несколько монет, среди которых есть золотые и похожие на них фальшивые. Настоящих монет больше, чем фальшивых. Все настоящие монеты весят одинаково, а любая фальшивая монета отличается по весу от настоящей. Если вы сможете, используя чашечные весы без гирь, выделить хотя бы одну настоящую золотую монету, то она достанется вам.
64 Занимательная информатика Правда, владелец весов выдвинул условие: после каждого взвешивания он забирает себе в качестве арендной платы любую выбранную им монету из только что взвешенных. Как получить золотую монету? 4.8. Три монеты, одна — фальшивая Среди трех одинаковых по виду монет есть одна фальшивая — более легкая, чем настоящие, имеющие одинаковый вес. Можно ли одним взвешиванием на чашечных весах без гирь выявить фальшивую монету? 4.9. 81 монета, одна — фальшивая Среди 81 одинаковой по виду монеты есть одна фальшивая — более легкая, чем настоящие, имеющие одинаковый вес. Как на чашечных весах без гирь за 4 взвешивания найти фальшивую монету? 4.10. 101 монета, одна — фальшивая Среди 101 одинаковой по виду монеты есть одна фальшивая, отличающаяся по весу от настоящих. Как за два взвешивания с помощью чашечных весов без гирь определить, легче или тяжелее настоящих эта фальшивая монета? (Находить саму эту фальшивую монету не требуется.) 4.11. 51 монета, одна — фальшивая Среди 51 монеты есть одна фальшивая. Не более чем за 25 взвешиваний на чашечных весах без гирь, не взвешивая никакую монету более одного раза, требуется найти эту монету. По виду все монеты одинаковы. Все настоящие монеты весят одинаково, и известно, что фальшивая монета легче настоящих. 4.12. Антиквар и 99 монет Антиквар приобрел 99 одинаковых по виду старинных монет. Ему сообщили, что одна из монет — фальшивая и что она легче настоящих (все настоящие весят одинаково). 1. Как, используя чашечные весы без гирь, не более чем за 5 взвешиваний выявить фальшивую монету? 2. Как выявить фальшивую монету за 7 взвешиваний при условии, выдвинутом антикваром: не взвешивая никакую монету более двух раз?
4. Взвешиваем всё — от крупы до золотых монет 65 4.13. 61 монета, две — фальшивые Есть 61 монета одинакового внешнего вида. Известно, что две из них — фальшивые. Все настоящие монеты одинакового веса, а обе фальшивые — тоже одинакового веса, отличающегося от веса настоящих монет. Как узнать с помощью трех взвешиваний на чашечных весах без гирь, легче или тяжелее настоящих эти фальшивые монеты? (Определять сами эти фальшивые монеты не требуется.) 4.14. 103 монеты, две — фальшивые Из 103 монет две — фальшивые (фальшивые монеты одинаковы по весу, все настоящие — тоже). За три взвешивания надо определить, тяжелее они настоящих или легче. (Определять сами эти фальшивые монеты не требуется.) 4.15. 10 монет: 5 золотых и 5 серебряных Имеются 5 золотых и 5 серебряных монет одного веса. Фальшивомонетчик заменил одну золотую и одну серебряную монету фальшивыми, не отличающимися внешне от настоящих. Фальшивые монеты легче настоящих и имеют одинаковый вес. Как за три взвешивания на чашечных весах без гирь найти фальшивые монеты? 4.16. Шесть монет, две — фальшивые Среди шести одинаковых по виду монет есть две фальшивые (они легче настоящих; все настоящие монеты весят одинаково). Как не более чем за три взвешивания на чашечных весах без гирь найти фальшивые монеты? 4.17. Странные весы Имеются четыре монеты, три из которых — настоящие, весящие одинаково, а одна — фальшивая, отличающаяся от них по весу. Есть чашечные весы без гирь, такие, что если положить на их чашки одинаковые по весу грузы, то любая из чашек может перевесить (что странно), а если грузы различны по весу, то всегда перевешивает чашка с более тяжелым грузом (что естественно). Как за три взвешивания на таких весах выявить фальшивую монету и определить, легче она или тяжелее настоящих?
66 Занимательная информатика 4.18. 6 монет, 2 фальшивые, не очень точные весы Перед вами лежат 6 одинаковых по виду монет, две из которых — фальшивые (каждая из них тяжелее настоящей на 1 г). Есть также чашечные весы без гирь, правда, не очень чувствительные и реагирующие на разность веса не менее 2 г. Как за наименьшее количество взвешиваний выявить фальшивые монеты? 4.19. 8 монет, 2 фальшивые Имеются 8 монет, из которых две — фальшивые: одна легче настоящей, а другая — тяжелее. Можно ли за три взвешивания на чашечных весах без гирь установить, что тяжелее: две фальшивые монеты или две настоящие, или же они весят одинаково? 4.20. Разложить 22 монеты на две кучки Известно, что в наборе из 22 одинаковых по виду монет есть две фальшивые монеты, которые отличаются от остальных по весу (настоящие монеты равны по весу друг другу; фальшивые монеты также равны по весу друг другу). Как разделить все монеты на две равные по весу кучки, сделав не более четырех взвешиваний на чашечных весах без гирь? Решите также эту задачу для 32 монет, из которых две — фальшивые. 4.21. Мешок с фальшивыми монетами Имеются 10 мешков, набитых монетами. Известно, что все монеты в девяти мешках не фальшивые. Относительно оставшегося мешка известно, что в нем либо все монеты фальшивые, либо все настоящие. Фальшивая монета весит 11 г, а настоящая — 10 г. Как с помощью одного взвешивания на точных (до 1 г) весах выяснить, есть ли среди 10 мешков мешок с фальшивыми монетами, а если есть, то указать какой. 4.22. Еще один мешок с фальшивыми монетами Имеются 11 мешков, набитых монетами. В десяти мешках монеты настоящие, а в еще одном — все монеты фальшивые. Все настоящие монеты одинаковы по весу. Все фальшивые монеты тоже одинаковы, но отличаются по весу от настоящих монет на d граммов (причем заранее не известно, легче они или тяжелее настоящих). Как с помощью двух взвешиваний на точных (до d граммов) весах определить, в каком мешке фальшивые монеты, и указать, легче они или тяжелее настоящих?
4. Взвешиваем всё — от крупы до золотых монет 67 4.23. 12 мешков с золотыми монетами Имеются 12 мешков с золотыми монетами. Все монеты во всех мешках имеют одинаковый размер и внешний вид. Известно, что в некоторых мешках все монеты фальшивые и что все фальшивые монеты легче настоящих. Предложите способ определения мешков с фальшивыми монетами за минимальное количество взвешиваний на чашечных весах без гирь. 4.24. 101 монета, 50 фальшивых Из 101 монеты 50 монет — фальшивые, которые на 1 грамм легче настоящих (все настоящие монеты имеют одинаковый вес). За одно взвешивание на чашечных весах, которые показывают разность весов на чашках, определите, является ли выбранная монета фальшивой. 4.25. Пять кучек по 5 монет Имеются пять кучек по 5 одинаковых монет в каждой. В одной из кучек (неизвестно, какой) все монеты — фальшивые. Известен вес настоящих монет, а также то, что каждая фальшивая монета на 1 г тяжелее настоящей. В нашем распоряжении есть точные аптекарские весы с набором гирь, позволяющим определить любой необходимый вес. Как с помощью всего лишь одного взвешивания определить, в какой кучке находятся фальшивые монеты? Можно ли решить эту задачу, если в каждой кучке будет 4 монеты? 3 монеты? 2 монеты? 4.26. Экспертиза фальшивых монет На суде в качестве вещественного доказательства предъявлено 14 монет. Эксперт обнаружил, что семь из них — фальшивые, а остальные — настоящие, причем узнал, какие именно монеты являются фальшивыми, а какие — настоящими. Суд же знает только, что все фальшивые монеты весят одинаково, все настоящие монеты тоже весят одинаково, а фальшивые монеты легче настоящих. Эксперт хочет тремя взвешиваниями на чашечных весах без гирь доказать суду, что все обнаруженные им фальшивые монеты действительно являются фальшивыми, а остальные — настоящими. Сможет ли он это сделать?
68 Занимательная информатика 4.27. 201 монета, 50 фальшивых Среди 201 монеты 50 фальшивых. Каждая фальшивая отличается от настоящей по весу на 1 грамм (тяжелее или легче). Имеются чашечные весы без гирь, но со стрелкой, показывающей разность масс грузов на чашках. За одно взвешивание для одной выбранной монеты нужно узнать, фальшивая она или настоящая. Как это сделать? 4.28. Случай в тюрьме для пиратов Однажды начальник тюрьмы для пиратов (морских, а не компьютерных J) обещал выпустить одного из заключенных на свободу, если он среди 25 внешне одинаковых монет, в числе которых есть три фальшивые, с помощью чашечных весов без гирь за два взвешивания найдет 6 настоящих монет. Все настоящие монеты имели одинаковый вес. Все фальшивые монеты также имели одинаковый вес, причем фальшивая монета была легче настоящей. Заключенный решил эту задачу и вышел на свободу. А сможете ли решить эту задачу вы? 4.29. Три пары монет Имеются три пары монет: первая пара — золотые, вторая — серебряные, третья — бронзовые. В каждой паре одна монета настоящая, а другая — фальшивая. Все настоящие монеты — одинакового веса, все фальшивые — тоже одинакового веса. Известно, что фальшивые монеты легче настоящих. Как на чашечных весах без гирь найти настоящие монеты за два взвешивания? 4.30. 20 металлических кубиков Имеются 20 металлических кубиков, одинаковых по размеру и внешнему виду. Некоторые из них — алюминиевые, а остальные — дюралевые (более тяжелые). При помощи не более 11 взвешиваний на чашечных весах без гирь определите количество дюралевых кубиков. Примечание. В задаче предполагается, что все кубики могут быть алюминиевыми, но дюралевыми все они быть не могут (иначе если бы все кубики оказались одного веса, то без этого условия мы никак не смогли бы определить, алюминиевые они или дюралевые).
4. Взвешиваем всё — от крупы до золотых монет 69 4.31. Двенадцать монет Среди 12 монет имеется одна фальшивая. Известно, что фальшивая монета отличается по весу от настоящих, но не известно, легче она или тяжелее. Настоящие монеты — все одного веса. Как с помощью трех взвешиваний на чашечных весах без гирь выделить фальшивую монету и одновременно установить, легче она или тяжелее остальных? Палочки Непера Палочки (бруски, пластины) Непера — это простейшее счетное приспособление, с помощью которого можно быстро умножать многозначные числа на однозначные. Предложены Джоном Непером в 1617 г. Идет урок литературы. У ч и т е л ь : «Кто может привести пример языка, на котором сегодня никто не говорит, но который является основой других языков?» О д и н и з у ч е н и к о в : «HTML». * * * Ученик опоздал в школу и говорит учителю: — Извините — я помогал бабушке перейти на следующий уровень! * * * Приходит программист к пианисту — посмотреть на новый рояль. Долго ходит вокруг, хмыкает, потом заявляет: — Клавиатура неудобная: всего 84 клавиши, половина из них функциональные и ни одна не подписана. Хотя Shift нажимать ногой — это оригинально...
5 Маневры, переходы, переезды... десь мы будем рассматривать различные маневры (не военные J, а на железной дороге), переходы (по пустыне и через мост), З и переезды (в лифте). 5.1. Формирование состава Рядом с основным участком АВ железной дороги имеются два запасных пути (рис. 5.1). Тепловоз Т и три вагона размещены так, как показано на рисунке. Необходимо сформировать состав, который поедет по основному пути направо, так, чтобы порядок следования сцепленных с тепловозом вагонов соответствовал их номерам (начиная от тепловоза). Тепловоз работает без машиниста в автоматическом режиме. Так же работают и стрелки С1 и С2, переводящие рельсы на одно из трех направлений движения. Первоначально обе стрелки установлены на движение по основному участку. Справа от стрелки С2 находится точка С на таком расстоянии от С2, что между С и С2 умещаются тепловоз и два вагона.
5. Маневры, переходы, переезды... 71 Рис. 5.1 Для управления перемещением тепловоза и работой стрелок могут быть использованы следующие команды: 1) двигаться вперед до сцепки с вагоном ¹ 1*; 2) двигаться вперед до сцепки с вагоном ¹ 2; 3) двигаться вперед до сцепки с вагоном ¹ 3; 4) двигаться назад до сцепки с вагоном ¹ 1; 5) двигаться назад до сцепки с вагоном ¹ 2; 6) двигаться назад до сцепки с вагоном ¹ 3; 7) двигаться вперед до стрелки С1; 8) двигаться вперед до стрелки С2; 9) двигаться назад до стрелки С1; 10) двигаться назад до стрелки С2; 11) двигаться вперед до точки С**; 12) двигаться назад до точки А***; 13) отцепить прицепленный к тепловозу вагон; 14) перевести стрелку С1 на основной путь; 15) перевести стрелку С1 на верхний («северный») запасной путь; 16) перевести стрелку С1 на нижний («южный») запасной путь; 17) перевести стрелку С2 на основной путь; 18) перевести стрелку С2 на «северный» запасной путь; 19) перевести стрелку С2 на «южный» запасной путь. Какой должна быть программа для решения этой задачи? * Сцепка тепловоза с вагоном и вагонов между собой происходит автоматически. О точке С см. выше. *** Место расположения точки А на железнодорожном пути соответствует показанному на рис. 5.1. **
Занимательная информатика 72 5.2. Перестановка вагонов На основном участке железной дороги находится тепловоз Т, а на запасном пути — два вагона: белый и черный (рис. 5.2). Машинисту тепловоза надо поменять местами эти вагоны и оказаться на первоначальном месте. Проблема заключается в том, что на запасном пути есть старый мост М, по которому тепловоз проходить не может. Мост небольшой — на нем может находиться только один вагон. Может ли машинист решить стоящую перед ним задачу? Рис. 5.2 5.3. И опять формирование состава На основном участке железной дороги и на запасном пути находятся тепловоз Т и три вагона (рис. 5.3). Машинисту тепловоза необходимо сформировать состав, который поедет по основному пути направо, так, чтобы порядок следования сцепленных с тепловозом вагонов соответствовал их номерам (начиная от тепловоза). Мост М на запасном пути — такой же, как и в задаче 5.2. Может ли машинист решить стоящую перед ним задачу? Рис. 5.3
5. Маневры, переходы, переезды... 73 5.4. Перестановка вагона и цистерны На рис. 5.4 изображен кольцевой участок железной дороги с мостом М и тупиком А. На этом участке находится тепловоз Т, товарный вагон В и вагон-цистерна Ц. Через мост может проехать только тепловоз (без вагонов). Вагоны могут перемещаться, только когда они сцеплены с тепловозом (с двух его сторон или друг с другом). В тупике умещается только один из вагонов. Как должен маневрировать тепловоз, чтобы поменять местами товарный вагон и вагон-цистерну и оказаться на первоначальном месте? Рис. 5.4 5.5. Ночной переход по мосту Ночью к мосту подошла семья (папа, мама, малыш и бабушка). Папа может перейти мост за 1 минуту, мама — за 2, малыш — за 5, бабушка — за 10 минут. Мост выдерживает только двоих. Какое минимальное время потребуется этой семье для перехода через мост? (Есть один фонарик. Двигаться по мосту без фонарика нельзя. Светить издали нельзя. Нести друг друга на руках нельзя. Бросать фонарик друг другу нельзя. Если мост переходят двое, то они идут с меньшей из их скоростей.) 5.6. Переход по пустыне Сколько носильщиков должен нанять путешественник, чтобы осуществить шестидневный переход из пункта А в пункт Б по пустыне, если и он сам, и каждый из носильщиков могут нести запас пищи и еды на 4 дня на одного человека? Каким должен быть алгоритм действий каждого участника этого перехода?
Занимательная информатика 74 5.7. Задача о лифте В кабине лифта 20-этажного дома есть две кнопки. При нажатии на одну из них лифт поднимается на 13 этажей, при нажатии на другую — опускается на 8 этажей. Как попасть с 13-го этажа на 8-й? Машина Шиккарда — первая вычислительная машина До середины ХХ в. считалось, что первую вычислительную машину изобрел в 1642 г. Блез Паскаль. Но в 1958 г. были обнаружены письма Вильгельма Шиккарда (профессора восточных языков в Тюбингенском университете) к известному астроному Иоганну Кеплеру, относящиеся к 1623 и 1624 гг., в которых приведено описание схемы и принципа работы изобретенной Шиккардом машины. В доме-музее Кеплера, на его родине в городе Вайле (Германия), по схемам Шиккарда была изготовлена и успешно эксплуатируется модель этой машины. Папа-программист рассказывает сыну сказку: «...И дважды кликнул он свою верную мышь».
6 Пляшущие человечки и лысина раба омните удивительную историю с пляшущими человечками, рассказанную знаменитым сыщиком Шерлоком Холмсом П своему другу доктору Ватсону? Пересказывать ее я не буду, а только приведу странные записки (рис. 6.1), которые преступник посылал своей жертве, а потом напомню конец рассказа. Рис. 6.1 Такие пляшущие человечки могут показаться смешными — детские рисунки, глупая забава. А вот Шерлок Холмс, хорошо знакомый с различными видами тайнописи и даже написавший
76 Занимательная информатика небольшую статью по этому вопросу, сразу определил, что перед ним шифр. Он понял: фигурки означают буквы, — и начал искать ключ. Вскоре ключ был найден, и знаменитый сыщик постепенно вытащил из небытия одну букву за другой. Это позволило ему не только прочитать записки, но и самому послать преступнику строчку пляшущих человечков, чтобы преступник попал в руки правосудия. Пляшущие фигурки означали слова: «Приходи немедленно». Вообще же существует много различных систем шифрования. К ним прибегают в военном деле, на дипломатической службе и в других случаях, когда нужно сохранить в тайне содержание переписки. Шифрование текста используется человечеством с того самого момента, когда появилась первая секретная информация — такая, которая должна быть недоступна тем, кому она не предназначена. 6.1. Шифр Цезаря Один из самых первых известных методов шифрования носит имя римского императора Юлия Цезаря (I в. до н. э.), который если и не изобрел его сам, то активно им пользовался. Этот метод основан на замене каждой буквы шифруемого текста на другую путем смещения в алфавите от исходной буквы на фиксированное количество символов; причем алфавит читается по кругу, т. е. после буквы «я» снова идет буква «а». Регистр символов при этом не учитывается. Например, слово «БАЙТ» при смещении на два символа вправо кодируется словом «ГВЛФ». 1. Расшифруйте слово «НУЛТХСЁУГЧЛВ», закодированное с помощью шифра Цезаря, если известно, что каждая буква исходного текста заменяется третьей после нее буквой. 2. Расшифруйте четверостишие Омара Хайяма: РЛЗЬ ЁМЭЙЗ АВБЖУ ИЙЗАВЛУ, БЖЩЛУ ЖЩЭЗЬЖЗ ЖЮЁЩЕЗ, ЭЫЩ ЫЩАЖФО ИЙЩЫВЕЩ БЩИЗЁЖВ ЭЕШ ЖЩРЩЕЩ: ЛФ ЕМРСЮ ЪЗЕЗЭЩГ, РЮЁ РЛЗ ИЗИЩЕЗ ЮКЛУ В ЕМРСЮ ЬМЭУ ЗЭВЖ, РЮЁ ЫЁЮКЛЮ К ДЮЁ ИЗИЩЕЗ. Конкретный вариант шифрования методом Цезаря при этом неизвестен.
6. Пляшущие человечки и лысина раба 77 6.2. Буратино и шифровка Буратино обнаружил начальную строку зашифрованного послания, написанного неизвестным ему шифром: ШЫР-ПИР Ю ПАПУЖГЫ ЗЭЛЭМЪЫЙ ГЁСРЫГ... Помогите Буратино расшифровать послание. 6.3. Машина для расшифровки из бумаги Для шифра Цезаря существует простой способ расшифровки текста, даже если направление и величина сдвига букв в алфавите неизвестны, — это так называемый «метод полосок». Берутся несколько полосок из бумаги, картона и т. п. и на каждую из них наносятся по порядку буквы алфавита (буквы «е» и «ё» не различаются — рис. 6.2). В криптограмме (тексте, представляющем собой зашифрованное сообщение) берется некоторое слово (например, «ОНКДЖДМ»). Полоски прикладываются друг к другу так, чтобы образовать данное слово (рис. 6.2). Теперь, двигаясь вдоль полосок, можно найти среди строк единственное осмысленное сочетание «ПОЛЕЗЕН», которое является расшифровкой данного слова. Одновременно определяется и величина сдвига. Рис. 6.2
Занимательная информатика 78 В качестве упражнения предлагаю читателю расшифровать методом полосок следующую криптограмму, зашифрованную методом Цезаря: ЕИФИРРЛМ ФЕИХОЮМ ЗИРЯ НОСРОФВ Н ЕИЫИУЦ РСКСЕЮИ ХЦЫНЛ ФХСВОЛ ЕЮФСНС Е ВФОСП РИДИ Л НГКГССЯ РИ ТОЮОЛ ПЛПС Г ЦШСЗЛОЛ Е ФГПЦБ ЖОЦДЯ ОГКЦУЛ. Чтобы полнее оценить преимущества описанной «машины», попробуйте с ее помощью расшифровать также и приведенное в задаче 6.1 четверостишие Омара Хайяма. 6.4. «Тарабарская грамота» Найдите ключ к «тарабарской грамоте» — тайнописи, применявшейся ранее в России для дипломатической переписки: Пайцике тсюг т «камащамлтой чмароке» — кайпонили, нмирепяшвейля ш Моллии цся цинсоракигелтой неменилти Ключом в данном случае называются правила, по которым шифруется исходный текст. 6.5. Карл пишет Кларе Клара получила от Карла письмо по электронной почте. Однако из-за неправильной настройки компьютера то ли у Карла, то ли у Клары текст письма выглядел так (рис. 6.3): Рис. 6.3 Помогите Кларе прочитать послание. Клара знает, что Карл всегда правильно расставляет в письмах знаки препинания, а вместо буквы «ё» всегда пишет «е». 6.6. Номера вместо букв Если в некотором слове заменить буквы на номера этих букв в алфавите, то получится число 222122111121. Какое это слово?
6. Пляшущие человечки и лысина раба 79 6.7. Однажды в поезде Когда-то давно, когда еще существовала страна под названием «СССР», автор этих строк ехал в поезде и с удивлением обнаружил, что если в названиях пунктов отправления и назначения поезда заменить буквы их номерами в алфавите, то они (названия) записываются с помощью всего лишь двух цифр: 211221 и 21221. Откуда и куда ехал автор? 6.8. Расшифровка текста В рассмотренных ранее задачах шифрование текста было основано на принципе замены, когда буквы одного языка заменяются буквами другого языка, цифрами или какими-то символами. Но это, как нетрудно видеть, решая предыдущие задачи, — не самый надежный способ: при известном навыке можно очень легко дойти до истинного смысла зашифрованного текста, даже не зная того, что называется таблицей кодировки, — в том числе для достаточно сложного шифра. Пусть, например, в ваши руки попала криптограмма, написанная по принципу замены букв числами (одинаковые буквы заменены одинаковыми числами) — рис. 6.4. 1, 2, 3 – 2, 3 – 4, 5, 6, 7, 4, 8 – 2, 3, 7 – 9, 10, 2, 8 11, 4, 12, 13, 14 – 1, 15, 16, 17 – 6 – 4, 9, 2 – 13, 9, 17, 14, 18, 2, 19, 20 21, 9, 13 – 18, 16, 4, 9, 11 – 22, 6, 23, 24 – 9, 13, 2, 9, 25, 11, 14, 18, 2, 19, 20 15, 16, 25, 13, 16, 3, 7, 4, 8 – 26, 22, 6, 25 – 1, 3, 2, 8 Рис. 6.4 Слова в ней отделены друг от друга при помощи тире («–»), а буквы — запятыми. Известно, что в самом зашифрованном тексте тире нет и что буквы «е» и «ё» закодированы одним и тем же числом. Расшифруйте эту криптограмму — это можно сделать путем рассуждений. 6.9. Частотный анализ Восстановить буквы текста, зашифрованного путем замены, с большой уверенностью можно, анализируя частоту появления тех или иных букв и их сочетаний. Этот метод (он так и называется — частотный анализ) основывается на том, что известно, как часто встречается та или иная буква в русском языке (или в английском — именно это учитывал герой рассказа Эдгара По «Золотой жук», расшифровывая найденный пергамент). А затем,
Занимательная информатика 80 даже если в каких-то частях текста возникает неоднозначность, она легко устраняется по смыслу. Относительные частоты букв русского языка указаны в табл. 6.1. Таблица 6.1 ¹ Буква 0 1 2 3 4 5 6 7 8 9 а б в г д е, ё ж 3 и и Относительная частота 0,062 0,014 0,038 0,013 0,025 0,072 0,007 0,016 0,062 0,010 ¹ Буква 10 11 12 13 14 15 16 17 18 19 к л м н о п р с т у Относительная частота 0,028 0,035 0,026 0,053 0,090 0,023 0,040 0,045 0,053 0,021 ¹ Буква 20 21 22 23 24 25 26 27 28 29 30 ф x ц ч ш щ ы ь, ъ э ю я Относительная частота 0,002 0,009 0,004 0,012 0,006 0,003 0,016 0,014 0,003 0,006 0,018 Буквы «е» и «ё», а также «ь» и «ъ» обычно кодируются одинаково, поэтому в табл. 6.1 они тоже не различаются. Как видно из таблицы, наиболее часто используемая буква русского языка — «о». Ее относительная частота, равная 0,090, означает, что на 1000 букв русского текста приходится в среднем 90 букв «о». В аналогичном смысле понимаются относительные частоты и остальных букв. В табл. 6.1 не указан еще один символ — пробел (промежуток между словами). Его относительная частота — наибольшая и равна 0,175. С помощью табл. 6.1 расшифруйте криптограмму: Цярснсмщи ямякзж онкдждм мд снкыйн гкю онгрсямнбнцмщф йпзоснвпялл мн б гптвзф рктцяюф нм ркнемдд 6.10. Что такое «лягяня»? Расшифруйте следующий текст: тядзгыщхоэь пэжо ч йчтэяшаь гэнэшюэь епяу дызысю, бэхыэь пыъ бэ лягяня чтгыщюпмчо ю ч ячпыхмшаью дызысыью, Ыщпяга
6. Пляшущие человечки и лысина раба 81 Известно, что он зашифрован следующим образом. Гласные буквы* («а», «о», «у», «ы», «я», «е», «ю», «и», «э», «й») каким-то способом разбиты на пары. Согласные буквы («б», «в», «г», «д», «ж», «з», «к», «л», «м», «н», «п», «р», «с», «т», «ф», «х», «ц», «ч», «ш», «щ», «ъ», «ь») тоже как-то разбиты на пары. Каждая буква в тексте заменена на другую букву из той же пары. Зашифрованный текст записан по правилам русской пунктуации. 6.11. Шифр Вижинера Шифр Вижинера представляет собой разновидность шифра Цезаря с переменной величиной сдвига, которая задается некоторым ключевым словом. Например, ключевое слово «ВАЗА» означает следующую последовательность сдвигов букв исходного текста: 3, 1, 9, 1, 3, 1, 9, 1 и т. д. Используя ключевое слово «ВАГОН», зашифруйте слова: «АЛГОРИТМ», «ПРАВИЛА» и «ИНФОРМАЦИЯ». 6.12. Послание будущим издателям В одной книге, которая переводилась с английского языка, при переводе были сделаны ошибки. Редактору, который готовит новое издание книги, читатели послали следующую шифровку: ИВСЬПТРЕА СРТЫАЕ ОБШКИИ И ОАПТЕКЧИ И НЕ ДЙЕТЛЕА НЫОХВ! Расшифруйте ее. 6.13. Перестановочный шифр При рассмотрении задач 6.8 и 6.9 уже отмечалась ненадежность (сравнительная легкость расшифровки) подстановочных криптограмм, основанных на принципе замены. Потому были разработаны другие методы шифрования. Среди них важное место занимают так называемые «перестановочные криптограммы». При их составлении весь текст разбивается на группы, состоящие из одинакового количества букв, и внутри каждой группы буквы некоторым образом переставляются. Если группа достаточно длинная (иногда — это весь текст целиком), то количество возможных перестановок может быть очень велико; отсюда — большое многообразие перестановочных криптограмм. Мы рассмотрим один тип перестановочной криптограммы, которая составляется при помощи ключевого слова. Буквы тек* Буква «й» условно причислена к гласным, а буквы «ь», «ъ» — к согласным.
Занимательная информатика 82 ста, который должен быть передан в зашифрованном виде, первоначально записываются в клетки прямоугольной таблицы по ее строкам. Буквы же ключевого слова пишутся над ее столбцами и указывают порядок (нумерацию) этих столбцов способом, объясняемым чуть ниже. Чтобы получить теперь закодированный текст, надо выписывать буквы по столбцам с учетом их нумерации. Пусть исходный текст таков: «В связи с создавшимся положением отодвигаем сроки возвращения домой. Рамзай»*. Используем для записи этого текста (в котором 65 букв) прямоугольную таблицу размером 11 ´ 6, а в качестве ключевого возьмем слово «запись» из 6 букв. Столбцы нумеруются в соответствии с положением букв ключевого слова при их сортировке по алфавиту. В результате получится следующая шифровочная таблица (табл. 6.2). Таблица 6.2 з 2 в с в п н о е и а д а а 1 с с ш о и д м в щ о м п 4 в о и л е в с о е м з и 3 я з м о м и р з н о а с 5 з д с ж о г о в и й й ь 6 и а я е т а к р я р Выписывая буквы из столбцов этой таблицы в порядке, соответствующем числам во второй строке (т. е. сначала из второго столбца, затем из первого и т. д.), получим такую шифровку: ссшоидмвщомвсвпноеиадаязмомирзно авоилевсоемзздсжоговийииаяетакряр Ключевое слово известно, конечно, и адресату, который поэтому без труда расшифрует это сообщение. Но для тех, кто этим ключом не владеет, восстановление исходного текста весьма проблематично (хотя в принципе возможно). Частотный анализ здесь * Рамзай — псевдоним советского разведчика Рихарда Зорге.
6. Пляшущие человечки и лысина раба 83 по вполне понятным причинам не решает задачи. В лучшем случае, поскольку частоты букв будут примерно такие, как в табл. 6.1, он позволит предположить, что было применено перестановочное кодирование. Использование ключевого слова здесь, конечно же, не обязательно, — можно было бы просто указать нумерацию столбцов цифровым ключом (в данном случае — числом 214356). Однако слово удобнее, если ключ надо хранить в памяти* (что немаловажно для конспирации). Задачи 1. Подумайте, нужно ли получателю шифровки кроме ключевого слова знать количество строк в кодовой таблице, чтобы разбить шифрограмму на части, соответствующие столбцам этой таблицы. 2. Расшифруйте следующий текст, используя ключевое слово «модель»: метдллеснььсеенуютоизслшмечснояояч жфрпткгщоаменруоероелтоите-аеобпви 3. Используя ключевое слово «пакет», зашифруйте текст (знаки препинания при этом не учитываются): Подлинность документов, полученных через агента Байтик, подтверждаю. Юстас 6.14. Шифрование двумя цифрами Шифр можно еще более усложнить, если дополнительно к описанному выше каждую букву заменять не одним, а двумя или несколькими символами (буквами или числами). Например, расположим буквы русского алфавита в квадратной таблице 6 ´ 6 произвольным образом, скажем, как в табл. 6.3. Таблица 6.3 0 0 1 2 3 4 5 * Своей, а не компьютера J. а м ч ж 1 з т б ю н ш 2 и у в я о щ 3 ы й ф г ъ п 4 р ь к x д 5 с э л ц е
Занимательная информатика 84 Каждую букву будем шифровать парой цифр: первая цифра — номер строки, в которой стоит данная буква, а вторая — номер столбца. Например, букве «б» соответствует обозначение «21», а слову «шифр» — обозначение «51022304». Задачи 1. Расшифруйте следующий текст, зашифрованный с использованием табл. 6.3: 22051104454010534504454142050211053241 10414542530445444525454141031305044224 2. Используя табл. 6.3, зашифруйте текст (знаки препинания при этом пропускаются): «Срочно приезжай. Ангел». 6.15. Шифр Тритемиуса Еще большие трудности для криптоанализа (расшифровки) представляет шифр, связываемый с именем Тритемиуса — ученого аббата из Вюрцбурга, которого к занятиям криптографией побуждало, быть может, не только монастырское уединение, но и потребность сохранять от огласки некоторые духовные тайны. Этот шифр тоже является развитием описанного ранее шифра Цезаря и состоит в следующем. Буквы алфавита нумеруются по порядку числами 0, 1, …, 30 (см. табл. 6.1). При шифровании некоторое ключевое слово (или номера его букв) подписывается под сообщением с повторениями, как показано ниже: в з с а в я п и с з с а о з п и д с ж е с ь н и е м о з а п и с т ь о з в и п и о з п и в с р ь з с и ь д а а щ е н и я з а п и с ь д з а ь в ш и м с з а п и с г с а ь я п ь з е м с р з а п и о м о й р а п и с ь о с о а л о п и к и ь з в а а м з а й з а п и с Далее каждая буква сообщения «сдвигается» вдоль алфавита по следующему правилу: буква с номером m (согласно нумерации в табл. 6.1), под которой стоит буква ключевого слова с номером k, заменяется на букву с номером l = m + k (если m + k < 31) или на букву с номером l = m + k – 31 (если m + k > 31). Например, первая буква «в» сдвигается на 7 позиций и заменяется буквой «и»; следующая буква «с» остается без изменения и т. д. Таким образом, номер l кодирующей буквы вычисляется по формуле: l = (m + k) mod 31, где mod — операция определения остатка от деления.
6. Пляшущие человечки и лысина раба 85 В цифровых обозначениях исходное сообщение и повторяемое ключевое слово могут быть записаны в следующем виде (табл. 6.4). Таблица 6.4 Сообщение Ключ Сообщение Ключ Сообщение Ключ Сообщение Ключ Сообщение Ключ 2 7 24 0 5 15 16 8 8 17 17 0 8 15 12 8 14 17 30 27 2 15 12 8 14 17 10 27 4 7 30 8 17 17 18 27 8 7 14 0 7 17 30 27 14 7 2 0 12 15 8 27 15 7 4 0 14 15 14 8 17 7 14 0 2 15 7 8 9 17 17 0 11 15 8 8 2 17 16 27 14 15 14 8 3 17 16 27 0 7 7 8 6 17 0 27 0 7 12 0 4 17 5 27 5 7 25 0 7 15 0 27 13 7 12 0 5 15 0 8 2 7 8 0 17 15 13 8 9 17 После суммирования верхней и нижней строк по модулю 31 мы получим последовательность чисел: 9, 17, 17, 7, 24, 4, 24, 17, 29, 15, 21, 27, 9, 24, 23, 20, 3, 26, 22, 14, 26, 22, 23, 1, 20, 8, 20, 20, 0, 14, 21, 4, 17, 16, 20, 27, 12, 12, 1, 24, 0, 6, 15, 2, 29, 15, 19, 12, 7, 25, 20, 21, 25, 26, 11, 14, 27, 22, 26, 12, 7, 12, 22, 8, 26. Наконец, заменяя эти числа на буквы, получим закодированный текст: йссзшдшсюпхьйшчфгыцоыцчбфиффаохдсрфьммбшаж пвюпумзщфхщылоьцымзмциы Если ключевое слово известно, то дешифровка такого текста производится без всякого труда на основе равенства: m = (l – k) mod 31. Расшифровать же подобный текст, если ключ неизвестен, чрезвычайно трудно, хотя в истории криптографии были случаи, когда такие тексты удавалось «разгадать». Задачи 1. Расшифруйте текст, зашифрованный шифром Тритемиуса, если ключевое слово — «Бейсик»: 5, 19, 19, 5, 20, 15, 14, 23, 4, 31, 22, 21, 20, 28, 17, 28, 23, 26, 15, 25, 14, 33, 25, 24, 17 2. Используя ключевое слово «байт», зашифруйте шифром Тритемиуса текст (знаки препинания при этом не учитываются): Срочно приезжай. Ангел
Занимательная информатика 86 6.16. Три письма Разведчик направил своему агенту три письма. В первом письме был листочек с квадратной таблицей (рис. 6.5), а в третьем — листочек с другой таблицей (рис. 6.6). Второе письмо, содержавшее пояснения по использованию этих двух таблиц, потерялось. Помогите агенту прочитать послание шефа. Рис. 6.5 Рис. 6.6 6.17. Шифрование текста с помощью таблиц Если вас заинтересовал способ шифрования текста, использованный в предыдущей задаче, то давайте обсудим вопрос о том, как изготовить вспомогательную таблицу, в частности как сделать, чтобы при поворотах окошечко не попадало повторно на уже прочитанную клетку, а все клетки зашифрованного сообщения были просмотрены. Пусть, например, необходимо зашифровать текст, содержащий k букв, где k = m. Заменим m на ближайшее к нему целое четное число, не меньшее k. Возьмем квадратную таблицу порядка m (m строк ´ m столбцов), в которой по определенному правилу будем вырезать квадраты-«окошки». В качестве примера зашифруем фразу: Тарабарская грамота — несложный шифр В ней 31 буква. 31 = 5,6. Значит, m = 6, т. е. наша таблица будет содержать 6 строк и 6 столбцов. Разделим эту квадратную таблицу на четыре равных квадрата и обозначим их как А, В, С, D (рис. 6.7). A C B D Рис. 6.7
6. Пляшущие человечки и лысина раба 87 При этом каждый из квадратов содержит m/2 строк. Заполним квадрат А последовательно числами от 1 до (m/2)2. Для m = 6 получим таблицу,показанную на рис. 6.8. 1 2 3 4 5 6 7 8 9 Рис. 6.8 При повороте квадрата А на 90° по часовой стрелке мы получим квадрат В, при этом числа квадрата А тоже будут «повернуты» (рис. 6.9). 7 4 1 8 5 2 9 6 3 Рис. 6.9 Точно так же заполним числами квадраты С (поворот квадрата А на 90° против часовой стрелки) и D (поворот квадрата А на 180°). Тогда таблица примет вид, показанный на рис. 6.10. 1 2 3 7 4 1 4 5 6 8 5 2 7 8 9 9 6 3 3 6 9 9 8 7 2 5 8 6 5 4 1 4 7 3 2 1 Рис. 6.10 Теперь остается вырезать в ней 9 «окошек» (всего клеток в таблице 6 ´ 6 = 36, поворотов — 4, значит, окошек должно быть 36/4 = 9). Для этого выделяем по одному числу от 1 до 9 в любом квадрате (например, такие, как на рис. 6.11). Тогда окончательный вид вспомогательной таблицы-трафарета будет таким, как показано на рис. 6.12 (ячейки, закрашенные серым цветом, нужно вырезать).
Занимательная информатика 88 1 2 3 7 4 1 4 5 6 8 5 2 7 8 9 9 6 3 3 6 9 9 8 7 2 5 8 6 5 4 1 4 7 3 2 1 Рис. 6.11 Рис. 6.12 Чтобы зашифровать текст, будем вписывать в окошки построчно исходный текст (без пробелов; допустимая длина текста — до 36 букв), поворачивая вспомогательную таблицу по мере заполнения ее ячеек. Так как букв в нашем тексте всего 31, а клеток — 36, то 5 оставшихся клеток заполним последовательными буквами алфавита: «а», «б», «в», «г», «д» (рис. 6.13). н ш т и a ф р a е я с р л a г о a р б a б в ж a н р г с а м о ы т й a к Рис. 6.13 Для расшифровки получателю послания необходимо будет воспользоваться точно такой же вспомогательной таблицей: четырежды повернуть ее и прочитать текст. Вариантов вспомогательных таблиц размера 6 ´ 6 может быть очень много. В нашем примере окно под номером 1 мы взяли из квадрата С, хотя возможных вариантов выбора номера 1 возможно 4 (из квадратов А, В, С или D). Точно так же число 2 можно взять не из квадрата В, а из любого из четырех квадратов. Значит, существует 4 ´ 4 = 42 = 16 способов выбрать два окна. Рассуждая аналогично, можно прийти к выводу, что существует 49 = 262 144 различных комбинаций для таблицы размера 6 ´ 6. Так что вероятность подобрать таблицу для расшифровки крайне мала. Как только что говорилось, для последующей расшифровки второй участник секретной переписки должен иметь точно такую же вспомогательную таблицу, т. е. вместе с сообщением необхо-
6. Пляшущие человечки и лысина раба 89 димо передавать и матрицу, — а тогда она может попасть в руки тому, кто попытается перехватить зашифрованное сообщение. Вот если бы можно было и ее закодировать! Один из вариантов решения такой задачи заключается в том, чтобы «окошечки» обозначить единицей, а «невырезанные» клетки — нулем. Тогда каждой строке вспомогательной таблицы таблицы можно будет сопоставить некоторое двоичное число и далее перевести полученные двоичные числа в десятичные. В результате такого шифрования приведенной выше вспомогательной матрице будут соответствовать числа: l строка 1: 0010102 = 10102 = 1010; l строка 2: 0000012 = 12 = 110; l строка 3: 0100002 = 100002 = 1610; l строка 4: 0010012 = 10012 = 910; l строка 5: 0101002 = 101002 = 2010; l строка 6: 0000012 = 12 = 110. Теперь достаточно будет передать вместе с зашифрованным сообщением полученные числа (в нашем случае это 10, 1, 16, 9, 20, 1; количество таких чисел определяется размером матрицы). После перевода этих десятичных чисел в двоичные таблица определяется однозначно. Задачи 1. Расшифруйте сообщение: АЬИЛПППТИООСОЗСДЬЬПРМГОВРААРМО ВМЛУРЯЕЮОТЧИЕТТДААПКРЦТБАЬЕВУ К И Д Р Ю 2, 69,16, 66, 149, 32, 4, 164 2. Зашифруйте рассмотренным методом текст (пробелы при этом не учитываются): ВСЕ ИДЕТ ПО ПЛАНУ Для проверки правильности решения этой задачи выполните обратную расшифровку полученного текста. 6.18. Игра в прятки, или Что такое стеганография Наверняка у вас, уважаемый читатель, есть секреты, разглашение которых вы явно не приветствуете. Пытаясь скрыть секретную информацию, можно, конечно, использовать шифрование. Но лучше (надежнее) применить другое средство — стеганографию — метод организации связи, который, собственно, скрывает само наличие связи. Непонятно? Тогда представьте, что вам нужно передать приятелю некоторый текст, который не должен быть
90 Занимательная информатика никем прочитан. Этот текст можно записать в зашифрованном виде, используя, например, шифр Цезаря. После шифрования текст будет иметь вид «КВУ ЫФ ЛГНЕОЛК...». Но если файл попадет в руки посторонних, то сразу станет ясно, что текст зашифрован, и возникнет вопрос: «А что это вы там скрываете?» J. Стеганография же позволяет сделать так, чтобы невозможно было даже заподозрить существование тайного послания — посторонний увидит, например, фотографию известного футболиста Андрея Аршавина, не подозревая о том, что в нее встроен секретный текст. Слово «стеганография»* в переводе с греческого буквально и означает то, о чем шла речь выше, — «тайнопись» (steganos — «секрет», «тайна»; graphо — «запись»). К этой области относится огромное множество секретных средств связи, таких, как невидимые чернила, микрофотоснимки, условное расположение знаков и т. д. История стеганографии — это сама история развития человечества. Местом зарождения стеганографии многие считают Египет, хотя можно предположить, что еще в каменном веке, задолго до появления первых шифров, люди могли договориться и особым образом поворачивать булыжник у входа в пещеру, тем самым подавая тайные условные знаки своим соплеменникам**. Первое упоминание о стеганографических методах в литературе приписывается историку Геродоту. Как вам, наверное, известно из уроков истории, в Древней Греции послания писали остро заточенными палочками на дощечках, покрытых воском. Так вот, у Геродота описано, как Демерату необходимо было послать в Спарту сообщение об угрозе нападения. Он соскоблил воск с дощечки и, написав послание на дереве, затем снова покрыл дощечку воском. Конечно же, эта дощечка успешно прошла досмотр римских центурионов — ведь она выглядела абсолютно чистой! Другой эпизод, который относят к тем же временам, — передача послания с использованием раба. Для передачи тайного сообщения рабу наголо брили голову, писали на коже требуемое послание, а когда волосы вновь отрастали, отправляли раба с этим «посланием» к адресату. Тот опять брил рабу голову, — и... сообщение доставлено! * ** Пожалуйста, не путайте это понятие со словом «стенография». Стенография — это система средств (знаков) и правил (приемов) быстрой записи устной речи. Быстрота записи здесь достигается за счет замены букв обычного письма (главным образом, согласных) специальными «буквами стенографии», которые выглядят проще (плавные кривые, без прямых и полных закруглений), а также за счет множества сокращений. Стенография ускоряет запись по сравнению с обычным письмом в 3–4 раза, до 50–60 слов в минуту. Здесь можно также вспомнить эпизод с цветком в окне из телевизионного фильма «Семнадцать мгновений весны».
6. Пляшущие человечки и лысина раба 91 «Темное средневековье» породило не только инквизицию: усиление слежки привело к развитию как криптографии, так и стеганографии. Именно в средние века впервые было применено совместное использование шифров и стеганографических методов. В XV в. аббат Тритемиус (см. задачу 6.15) описал много различных методов скрытой передачи сообщений. Позже, в 1499 г., эти записи были объединены в книгу «Steganographia». XVII–XVIII вв. известны как «эра черных кабинетов» — специальных государственных органов по перехвату, перлюстрации (просмотру) и дешифровке переписки. В штат таких «черных кабинетов», кроме криптографов и дешифровальщиков, входили и другие специалисты, в том числе химики. Наличие специалистовхимиков было необходимо из-за активного использования так называемых «невидимых чернил». Примером может служить любопытный исторический эпизод: восставшими дворянами в Бордо был арестован францисканский монах Берто, являвшийся агентом кардинала Мазарини. Восставшие разрешили Берто написать письмо знакомому священнику в город Блэй. Однако в конце этого письма религиозного содержания монах сделал приписку, на которую никто не обратил внимание: «Посылаю Вам глазную мазь; натрите ею глаза, и Вы будете лучше видеть». Так он сумел переслать не только скрытое сообщение, но и указал способ его обнаружения. В результате монах Берто был спасен. Стеганографические методы активно использовалась и в годы гражданской войны в США между Югом и Севером. Так, в 1779 г. два агента северян — Сэмюэль Вудхулл и Роберт Тоунсенд — передавали информацию Джорджу Вашингтону, используя специальные чернила. Различные «симпатические» («невидимые») чернила использовали и русские революционеры в начале ХХ в., что нашло отражение в литературе: А. Куканов в своей повести «У истоков грядущего» описывает применение молока в качестве чернил для написания тайных сообщений (рис. 6.14). Впрочем, царская охранка тоже Рис. 6.14 знала об этом методе (в архиве хранится документ, в котором описан способ использования таких «симпатических» чернил и текст перехваченного тайного сообщения). Особое место в истории стеганографии занимают фотографические микроточки. Во время Второй мировой войны они сводили
92 Занимательная информатика с ума спецслужбы США. Однако микроточки появились намного раньше, сразу после изобретения Дагером фотографического процесса, и впервые были использованы в военном деле еще во времена франко-прусской войны (в 1870 г.). Ну, а в наше время с самыми разными стеганографическими методами очень хорошо знакомы школьники, студенты и их учителя, — ну конечно же, это вездесущие шпаргалки! J Если теперь основные идеи стеганографии стали вам понятны, то перейдем к стеганографии компьютерной — криптографическому методу, связанному с размещением зашифрованного текста в различных компьютерных объектах. Где же в компьютере находится тот самый «стог сена», в котором можно спрятать иголку? Есть такие места, и не одно! Для начала придется немного углубиться в принципы работы файловых систем. Для удобства адресации каждый файл всегда занимает целое количество секторов. Из-за этого, например, файл размером в 1 байт может занимать на диске несколько килобайт. Несложно догадаться, что на самом деле при этом занят лишь 1 байт, а остальное пространство не используется. Именно туда можно вписать нужную нам информацию. Также можно записать данные на неиспользуемые области накопителей (например, в нулевую дорожку). Однако большой объем информации, к сожалению, так спрятать не удастся. На дисках компьютера существуют и другие места для скрытия данных. Исполняемые файлы (типа *.ехе и *.соm) в операционной системе Windows представлены в формате РЕ (Portable Executable). Этот формат подразумевает наличие в файлах не только исполняемого кода программы, но и другой информации. Поскольку некоторые данные не занимают всего выделенного под них пространства, в образовавшихся «пустотах» исполняемого файла можно размещать свои данные. (Кстати, эту особенность используют некоторые вирусы — их называют файловыми.) Далее, почти все мультимедийные форматы имеют поля расширения. Если в них не записана какая-либо нужная служебная информация, то они могут быть использованы для записи «секретов». Но и этот способ не дает возможность сохранить значительный объем информации. И вcе же, хотя контейнерами* могут быть различные файлы, чаще всего в этой роли выступают именно звуковые файлы или графика. Кроме того, что их легко пересылать, не вызывая подозрений, у звука и картинок есть уникальная особенность — они * «Контейнером» в стеганографии называют любую «явную» информацию, предназначенную для сокрытия в ней тайных сообщений.
6. Пляшущие человечки и лысина раба 93 позволяют прятать в себя информацию, совершенно не увеличиваясь в размерах и почти не меняясь внешне. Например, с помощью простейшей утилиты можно вставить 10 килобайт текста в 100-килобайтную картинку так, что на глаз она будет неотличима от прежней, а ее размер не изменится ни на один бит (рис. 6.15). Рис. 6.15 Дадим объяснение этому «фокусу», поскольку его используют примерно девять стеганографических программ из десяти. Представим себе простейшую черно-белую картинку, в которой каждый пиксель описывается одним байтом. Этот байт кодирует цвет пикселя: нуль — черный, 255 — белый, а все остальное — градации серого. Если мы изменим любой байт нашего файла (или, что то же самое, отдельные биты этого байта), то соответствующий ему пиксель изменит цвет. Но при этом оказывается, что изменение разных битов влияет на цвет пикселя по-разному: изменение первого слева — очень сильно, второго — слабее, а изменение последнего, восьмого, бита может добавить к байту (а значит, и к пикселю) только единицу (или отнять ее). Заметит ли нормальный человек изменение оттенка серой точки нa всего одну градацию (на 1/256) серого? Конечно, нет! А значит, для нашей картинки практически не важно, каковы последние биты ее байтов. И что бы мы с ними ни делали — обнуляли, переставляли, заменяли на случайные, — картинка будет казаться одинаковой. Также не будет меняться и размер картинки — ведь количество байтов в ней мы не меняем. Поэтому для размещения в картинке тайного сообщения достаточно превратить его в цепочку битов и записать их на место последних битов в файле картинки.
94 Занимательная информатика Однако этим способом, при всей его элегантности, нельзя спрятать слишком много: алгоритм требует, чтобы соотношение скрываемой информации и файла-контейнера было не более 1:8. Если же мы попытаемся изменять не только восьмые, но и седьмые или шестые биты, то картинка сильно (и подозрительно J) исказится. По правде говоря, даже изменение последних битов бывает заметным на больших однотонных участках. Поэтому хорошие стеганографические программы делают вставки только в отдельные участки картинки. В результате для скрытой передачи текста среднего объема (скажем, 300 Кб) надо использовать огромное письмо-контейнер объемом 3 Мб. Информацию можно прятать и в звуковых файлах (как уже было сказано ранее). И в большинстве случаев это даже эффективнее: только одна секунда оцифрованного звука при частоте дискретизации 44,1 кГц и разрядности записи 8 бит в стереорежиме позволяет скрыть до 12 Кб информации! Искажение звука при этом, конечно, происходит, но незначительное и прежде всего в басовом диапазоне. Одним словом, опять нормальный человек ничего не заметит... Интересно, что со стеганографией тесно связано такое понятие, как авторское право. Если на бумажную информацию доказать свои права достаточно сложно, то дела с цифровыми объектами обстоят намного лучше. Один знакомый автора, который прекрасно рисует в Photoshop, «прогуливаясь» по Интернету, часто замечал на других сайтах свои работы. Что, как несложно догадаться, вовсе его не радовало. Такая ситуация может произойти и с каждым из нас, если не принять меры. Но тут нам на помощь может прийти стеганография! Нарисовали вы, к примеру, классный баннер. А его взяли да и украли. Как доказать в суде свое авторство? А что мешает вам тайно внедрить в графический файл текстовую информацию примерно такого содержания: «Copyright by Петя Иванов». Достав потом на суде из файла этот фрагмент, вы заставите судей принять единственно правильное решение J. В Интернете можно найти десятки программ для компьютерной тайнописи: от больших и дорогих пакетов до маленьких бесплатных утилит. Некоторые из них используют очень причудливые алгоритмы, но всегда неизменной остается их суть: для скрытой передачи сообщения нужен подходящий носитель — «контейнер», который, во-первых, безобидно выглядит, а во-вторых, по размеру значительно больше скрытого сообщения (в пересчете на килобайты). Оба этих требования очевидны, и им подчиняются все программы. Как правило, обычные «пряталки» делают секретные вставки в 10–12% объема «контейне-
6. Пляшущие человечки и лысина раба 95 ра», но в одном из компьютерных журналов* была описана программа, умеющая вставлять в несжатую картинку любой файл размером в 2/3 картинки. Вдумайтесь в эти цифры! В обои рабочего стола Windows с разрешением 1024 ´ 768 и размером (в формате TrueColor) 2,25 Мб можно спрятать архив в полтора мегабайта — больше, чем на дискету! При этом обои визуально не изменятся, и на вашем мониторе по-прежнему будет красоваться фотография… Чья там у вас сейчас красуется? J Задача Предложите способ, которым в текстовом документе редактора Microsoft Word в обычном тексте можно спрятать секретный текст (который не сможет увидеть человек, не знающий, что в данном документе что-то спрятано). Арифмометр Однера С помощью арифмометра можно быстро перемножать многозначные числа (результат может быть 13-значным!). Арифмометр, показанный на фото, был изобретен в России в 80-х гг. XIX века В. Т. Однером. Арифмометры Однера до 1970-х гг. были основными математическими машинами, которые широко применялись во многих областях деятельности человека. Папа-программист читает сыну сказку: — И стал старик кликать золотую рыбку. — Папа, а почему он кликал рыбку? — Потому что мышек тогда еще не было. * Журнал «Компьютерра», ¹ 14–15 за 2003 г. (www.computerra.ru/offline/ 2003/489/26122/page2.html).
7 Числовые ребусы и кросснамберы ам, наверное, уже приходилось решать числовые ребусы, в которых некоторые (или даже все) цифры в числах заВ шифрованы буквами или звездочками. А теперь вам предлагается сделать то же самое с числами, записанными в других (не десятичной) системах счисления. Как обычно принято в таких головоломках, одинаковые цифры представлены одинаковыми буквами*, а различные — разными. Звездочка может обозначать любую цифру. Попробуйте также решить так называемые «кросснамберы» — головоломки, похожие на кроссворды, в которые вместо слов записываются числа. 7.1. Ребусы со звездочками В приведенных ниже ребусах зашифрованы числа, записанные в двоичной системе счисления. * Это правило действует только в рамках одного примера (ребуса). В разных ребусах одна и та же цифра не обязательно обозначается одной и той же буквой. — Прим. ред.
7. Числовые ребусы и кросснамберы 1. 97 * * * * 14. - * * * * * * 2. + * * * * * * 15. - * 1 * * * * * 3. + * 1 * * * 0 * 16. - * * * * * * 1 4. + 17. - * * * * * * * 1 5. + * 1 * * * * * * 18. - * * * * 1 * * * 6. + * * * * * * * 1 * 19. - * * 1 0 * 0 * * * 1 7. + 20. - * * 1 0 * * 1 * 0 * 8. + 21. - * * 1 * * * * * * 9. + * * 1 * 1 * * 0 * * 22. - * * 1 * * * * * * 10. + * 1 * * * * * 0 * 0 23. - * * 1 * * 0 * * 0 * + * * * * * 1 * * 0 * * * 1 * * 1 0 * 0 * * 0 * * * 1 * 11. + * 1 * * * * * * * * 0 24. - * 0 * * * 1 * * 0 * 12. + * 1 * * * 0 * * * 1 * * 25. - * 0 * * * 0 * * 1 * 26. - * 0 * 0 * * * * 1 * 13. - * * * * *
Занимательная информатика 98 27. - * 0 * 0 * 1 * * * * 29. - * * * 0 * 1 * * * * * 28. - * * * 0 * * * * * 1 * 30. - * * 1 * * * * 0 * * * * 7.2. Ребусы в четверичной системе счисления Буквами зашифрованы цифры четверичной системы счисления (с основанием 4). Определите все эти цифры. 1. + A A B 6. + X X Y2 11. + AA A BCD 16. + Q2 D QQ 2. + N N M0 7. + 3 B BE 12. + BB M D0 17. + XW W VV 3. + C 2 ED 8. + A 3 BC 13. + SS P PQ 18. + MN N MM 4. + 3 S PP 9. + XX X XZ 14. + MM N NSS 19. + SK K KS 5. + C 2 DD 10. + EE E DF 15. + KK L MNM 20. + AB A DC 7.3. Числовой ребус в шестеричной системе счисления Решите числовой ребус в шестеричной системе счисления: ММУУ = УУ ´ УУ. Как обычно, одинаковыми буквами зашифрованы одинаковые цифры, разными буквами — разные цифры. Указания по выполнению. Составьте таблицу умножения в шестеричной системе счисления и проанализируйте ее.
7. Числовые ребусы и кросснамберы 99 7.4. Числовые ребусы в двенадцатеричной системе счисления В приведенных ниже четырех ребусах зашифрованы числа в двенадцатеричной системе счисления. Ребус ¹ 1 - И Г Р Т Р И - С К С Т - Г Г Е К - Ч Е Т Ч Р А - А З Ы Ы Ы З А Е З З Т Р И Т Р И Е Е Е К Е К 0 Ребус ¹ 2 Р Е З Е Т З Е Т Р Т Б Е Б Е 0 Ребус ¹ 3 - * * * И К С - * * Т Р - * П * * * * * * И * * * Я Т Ь - * * Д В - * * * * К * А * * * * О Т И К С П И Я В К А
Занимательная информатика 100 Ребус ¹ 4 - Т Ы С Л Ю К - Т Л Т Я - Ю Ю Я С Т И Р Р Ч А И К С И К С Ч А Ч А Ч А 0 Чтобы вам легче было решать эти ребусы, приведу таблицы умножения и сложения в двенадцатеричной системе счисления (табл. 7.1 и 7.2.). Дополнительные цифры (1010 и 1110) обозначены, соответственно, как А и В. Таблица 7.1 1 2 3 4 5 6 7 8 9 А В 1 1 2 3 4 5 6 7 8 9 А В 2 2 4 6 8 А 10 12 14 16 18 1А 3 3 6 9 10 13 16 19 20 23 26 29 4 4 8 10 14 18 20 24 28 30 34 38 5 5 А 13 18 21 26 2В 34 39 42 47 6 6 10 16 20 26 30 36 40 46 50 56 7 7 12 19 24 2В 36 41 48 53 5А 65 8 8 14 20 28 34 40 48 54 60 68 74 9 9 16 23 30 39 46 53 60 69 76 83 А А 18 26 34 42 50 5А 68 76 84 92 В В 1А 29 38 47 56 65 74 83 92 А1 Таблица 7.2 + 1 2 3 4 5 6 7 8 9 А В 1 2 3 4 5 6 7 8 9 А В 10 2 3 4 5 6 7 8 9 А В 10 11 3 4 5 6 7 8 9 А В 10 11 12 4 5 6 7 8 9 А В 10 11 12 13 5 6 7 8 9 А В 10 11 12 13 14 6 7 8 9 А В 10 11 12 13 14 15 7 8 9 А В 10 11 12 13 14 15 16 8 9 А В 10 11 12 13 14 15 16 17 9 А В 10 11 12 13 14 15 16 17 18 А В 10 11 12 13 14 15 16 17 18 19 В 10 11 12 13 14 15 16 17 18 19 1А
7. Числовые ребусы и кросснамберы 101 7.5. Числовой ребус в системе счисления с неизвестным основанием При каком основании системы счисления имеет решение (и какое) следующий числовой ребус: + К И Т О К И О Т О Т О К И О 7.6. Кросснамберы Кросснамбер ¹ 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 19 22 23 24 25 По горизонтали: 1. Число, образованное первыми четырьмя цифрами в количестве отображаемых цветов при глубине цвета 16 (режим High Color). 3. Количество битов в 153 байтах.
102 Занимательная информатика 6. Значение суммы 12753089 + 25436079 в девятеричной системе счисления. 7. Основание системы счисления, числа в которой записываются с символом «$» или «H» в конце числа. 8. Совершенное число (совершенными называются числа, равные сумме всех своих делителей). 9. Десятичное число — эквивалент числа 445016. 11. Это число используется в двух различных записях разрешающей способности монитора. 14. Десятичное число 1261 в системе счисления, используемой в компьютере. 17. Одна из версий операционной системы Windows. 18. Год рождения автора книги. 20. Основание общепринятой системы счисления. 22. Этому десятичному числу в шестнадцатеричной системе счисления соответствует цифра F. 23. Значение суммы 27305648 + 16413648 в восьмеричной системе счисления. 24. Год выпуска первой в мире ЭВМ «ENIAC». 25. Число, одинаковое при его прочтении в «нормальном» виде и «вверх тормашками». По вертикали: 1. Максимальное 6-значное семеричное число. 2. Десятичное число — эквивалент числа 64866089. 3. Разность двоичных чисел 11011010 и 1100011. 4. Количество байтов в 1101010102 килобайтах. 5. Количество байтов в одном килобайте. 10. Двести тысяч дюжин. 12. Сумма пятеричных чисел 232321 и 1422433, записанная в пятеричной системе счисления. 13. Количество битов в 6 килобайтах. 15. Количество байтов в одном мегабайте. 16. Десятичное число — эквивалент числа 126463627. 17. Десятичное число 574 в троичной системе счисления. 19. Десятичное число — эквивалент числа 33377278. 21. Количество различных символов, которое можно закодировать, используя 7-битную кодировку.
7. Числовые ребусы и кросснамберы 103 Кросснамбер ¹ 2 1 3 7 2 4 8 5 9 10 12 6 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 37 38 31 35 32 36 39 40 По горизонтали: 3. Десятичное число 23 в двоичной системе счисления. 5. Максимальное 5-значное число в четверичной системе счисления. 7. Количество битов в одном килобайте. 9. Глубина цвета в режиме True Color. 10. Количество байтов в 200 битах. 11. Количество байтов в сумме 3 Кб + 189 байт. 12. Количество лет в 100 веках. 13. Значение суммы 31145 + 331345 в пятеричной системе счисления. 18. Разность восьмеричных чисел 3000 и 761. 19. Год начала публикации в газете «Информатика» раздела для учащихся «В мир информатики». 20. Количество байтов в 1/2 Гб. 21. Значение члена последовательности Фибоначчи с номером 24. 22. Сумма первых ... (см. п. 2 по вертикали) членов арифметической прогрессии, первый член которой равен 2, а разность равна 4.
104 Занимательная информатика 23. Количество битов в 41 Mб. 27. Разность двоичных чисел 1101 и 11. 28. Количество секунд в одном часе. 29. Значение 10110 в троичной системе счисления. 31. Десятичное значение числа 1003111134. 33. Это десятичное число обозначается приставкой «кило». 34. Столько мгновений весны фигурирует в названии известного телесериала по роману Юлиана Семенова. 35. Десять диаметров дискет (округленное значение в дюймах). 36. Десятичное значение числа 1100111001102. 37. Десятичное число, равное MMMCMXLVII · 1010 + 710 (первый сомножитель — число, записанное римскими цифрами). 39. Десятичное значение произведения 1А7F16 · 1010. По вертикали: 1. Десятичное число, которому в шестнадцатеричной системе счисления соответствует цифра В. 2. «Чертова дюжина». 3. Разность двоичных чисел 110010 и 11101 (в двоичной системе счисления). 4. Количество байтов в 10 килобайтах. 5. Значение числа 407810 в шестеричной системе счисления. 6. Десятичное значение числа 8В4F16. 8. Значение числа 6982110 в восьмеричной системе счисления. 11. Значение суммы 1311234 + 1212334 в четверичной системе счисления. 14. Количество байтов в сумме 2 Мб + 187 Кб + 975 байт. 15. Количество символов (и, соответственно, их кодов) в стандартном наборе системы кодировки ASCII. 16. Десятичное число, которому в римской системе счисления соответствует цифра C. 17. Количество битов в одном мегабайте. 23. Общее количество пикселей при разрешении экрана 640 ´ 480. 24. Десятичное число, которое римскими цифрами записывается в виде CMXLIX. 25. Количество гигабайтов в 248 034 361 344 байтах. 26. Значение числа 205939510 в двенадцатеричной системе счисления. 29. Значение числа 1100001112 в четверичной системе счисления. 30. Количество байтов в 200856 битах. 31. Количество различных символов, которые можно закодировать, используя двухбайтную кодировку.
7. Числовые ребусы и кросснамберы 105 32. Десятичное число 26 в двоичном виде. 38. Это число при игре в лото называют «стульчики». 40. Умноженное на высшую школьную оценку основание системы счисления, в которой, кроме десяти десятичных цифр, используются также цифры А, В, С, D, E и F. Кросснамбер «Римская система счисления» 1 2 3 5 4 6 7 8 9 10 11 12 13 14 15 16 17 18 20 22 23 19 21 24 25 26 27 28 29 30 31 32 По горизонтали: 1. 3. 5. 7. 8. 9. 10. 11. 13. 15. 16. 80 750 510 15 39 1001 40 94 26 109 201 18. 20. 22. 24. 26. 27. 28. 29. 30. 31. 32. По вертикали: 2001 3000 2400 209 900 150 870 90 9 800 8 1. 2. 3. 4. 6. 12. 14. 79 34 630 81 1026 300 7 17. 19. 21. 22. 23. 24. 25. 190 2100 1705 3400 790 175 97 Примечание. В первом и в третьем столбцах указаны порядковые номера чисел, а во втором и четвертом столбцах — десятичные числа, которые нужно записать в кросснамбер в римской системе счисления.
Занимательная информатика 106 Кросснамбер «Двоичная система счисления» 1 2 3 4 5 6 7 8 11 9 12 14 10 13 15 16 17 18 19 20 По горизонтали: 1. Десятичное значение числа 101101101012. 3. «Чертова дюжина» в двоичной системе счисления. 6. Значение числа 9110 в двоичной системе счисления. 7. Значение суммы 1112 + 1012 в двоичной системе счисления. 9. Значение частного 1100102 / 1012 в двоичной системе счисления. 11. Количество байтов в сумме 1/4 Кб + 1/8 Кб + 2 байта в двоичной системе счисления. 14. Десятичное число, которое при игре в лото называют «барабанные палочки», записанное в двоичной системе счисления. 16. Значение частного 3010 / 102 в двоичной системе счисления. 18. Двоичное число, которому соответствует десятичное число, читающееся одинаково и в «нормальном» виде, и «вверх тормашками». 19. Десятичное значение числа 11111010012. 20. Десятичное значение числа 100010011002. По вертикали: 1. Значение числа 2110 в двоичной системе счисления. 2. Значение произведения 10012 · 210 в двоичной системе счисления. 3. Значение разности 111002 – 1112 в двоичной системе счисления. 4. Полтора пуда в двоичной системе счисления.
7. Числовые ребусы и кросснамберы 107 5. Значение числа 161710 в двоичной системе счисления. 8. Значение частного 1000012 / 11012 в двоичной системе счисления. 10. Один век в десятичной системе счисления. 12. Высшая школьная оценка, записанная в …-й системе счисления. 13. Максимальное трехзначное двоичное число. 14. Значение частного 1112 / 112 в двоичной системе счисления. 15. Значение числа (52)10 в двоичной системе счисления. 16. Значение суммы 11102 + 11012 в двоичной системе счисления. 17. Значение числа 1810 в двоичной системе счисления. Счислитель Куммера Одной из особенностей вычислений на счетах является необходимость особых действий, когда при сложении происходит перенос единицы в старший разряд или когда при вычитании требуется заимствование единицы из старшего разряда. В 1846 г. петербургский учитель музыки Куммер представил Академии наук проект изобретенного им устройства, в котором перенос и стержень для заимствование единицы происходят «ввода» чисел автоматически. «Современный» вариант этого устройства — так называемого «счислителя Куммера» — показан на рисунке. Для прибавления числа к уже отображенному на шкале надо, вставив стержень в отверстие соответствующей знаковой позиции напротив требуемой цифры, протащить стержнем зацепленный «ползунок» вниз до упора, а если на «ползунке» появились цветные точки (признак переноса единицы), то двигать стержень вверх и завести его кончик по округлому краю над «ползунком» вверх, влево и вниз, чтобы выполнился перенос единицы в старший разряд. Аналогично при необходимости выполнялось и заимствование единицы из старшего разряда при вычитании (в нижней половине вычислителя).
8 На пальцах и в уме огда 9-летнему Карлу Гауссу учитель предложил найти сумму всех целых чисел от 1 до 100, будущий великий матемаК тик, подумав всего несколько секунд, правильно назвал результат — 5050. Карл сумел заметить, что суммы первого и последнего, второго и предпоследнего и т. д. чисел одинаковы и равны 101. Умножив в уме эту сумму на общее количество таких пар чисел (50), он и получил искомое значение. В прошлом веке в цирке и на эстраде выступали артисты, поражавшие публику своими феноменальными способностями, — они достаточно быстро перемножали в уме многозначные числа, извлекали корни и т. п. Конечно, автор не предлагает каждому читателю стать таким «фокусником», но все же многие из приведенных в данной главе приемов могут оказаться полезными — ведь не всегда под рукой имеется калькулятор, а тем более компьютер… 8.1. Рука человека как счетная машина Знаете ли вы, что ваши руки представляют собой простейшую счетную машину, которую можно использовать для вычислений?
8. На пальцах и в уме 109 1. Положите обе руки рядом на стол и распрямите пальцы. Пусть каждый палец по порядку обозначает соответствующее число: первый слева — 1, второй за ним — 2, третий — 3 и т. д. до десятого, который обозначает 10. Пусть теперь требуется умножить любое из первых десяти натуральных чисел на 9. Для этого достаточно приподнять вверх (или загнуть) палец, который обозначает умножаемое число. Тогда остальные пальцы, оказавшиеся слева от поднятого, покажут число десятков, а количество пальцев справа покажет число единиц искомого произведения. Например, пусть надо умножить 8 на 9. Положите обе руки на стол и поднимите (или загните) восьмой палец. Слева от него — 7 пальцев, справа — 2. Значит, результат умножения 8 на 9 равен 72 (рис. 8.1). Так что если ваш младший брат (или младшая сестра) жалуется, что ему (ей) трудно запомнить таблицу умножения на 9, то научите его (ее) пользоваться простейшей вычислительной машиной — руками. Рис. 8.1 Ответьте на вопрос: в чем секрет работы такой «машины»? 2. С помощью рук можно также вычислять произведение любых однозначных чисел, больших 5. Пусть, например, нам надо умножить 7 на 8. Для этого загнем на левой руке столько пальцев, на сколько первый сомножитель превышает 5, а на правой руке — столько пальцев, на сколько второй сомножитель превышает 5 (рис. 8.2). Затем количество загнутых пальцев на обеих руках умножим на десять и прибавим произведение количества распрямленных пальцев правой руки на количество распрямленных пальцев левой: 5 ´ 10 + 2 ´ 3 = 56. Проверьте вычисления для других сомножителях. Почему этот способ умножения всегда дает правильный результат?
Занимательная информатика 110 Рис. 8.2 3. Еще один пример использования рук в качестве «вычислительной машины» предложил в 1983 г. бывший тогда семиклассником Миша Перваков из г. Егорьевска Московской области. Пальцы рук можно использовать для запоминания значений и знаков синуса и косинуса основных углов. Посмотрим на ладонь левой руки и пронумеруем пальцы так: мизинец — 0, безымянный — 1, средний — 2, указательный — 3, большой — 4. Тогда при широко расставленных пальцах они примерно соответствуют «основным» углам первого квадранта: 0°, 30°, 45°, 60°, 90° (рис. 8.3). Синусы же этих углов будут равны половине квадратного корня из присвоенного пальцу номера. Пример: sin45 o = 1 1 номер среднего пальца = 2. 2 2 Рис. 8.3
8. На пальцах и в уме 111 Значение косинуса определяется аналогично, только пальцы для этого нужно пронумеровать в обратном порядке: большой — 0, ..., мизинец — 4. Все эти значения можно свести в легко запоминающуюся таблицу (табл. 8.1). Таблица 8.1 sin a cos a 0° 0 /2 4/2 30° 1/2 3 /2 45° 2 /2 2 /2 60° 3 /2 1/2 90° 4/2 0 /2 8.2. Возведение двузначных чисел в квадрат Хотите удивить своих друзей способностью в уме возводить в квадрат двузначные числа? Тогда разберитесь в следующих примерах: 512 = 2601; 522 = 2704; 562 = 3136; 592 = 3481. Вы, наверное, уже заметили закономерности при вычислении результата — квадрат числа n представляет собой четырехзначное число, у которого: 1) число, образуемое двумя последними цифрами, равно квадрату второй цифры числа n; 2) число, образуемое двумя первыми цифрами, равно сумме 25 и второй цифры заданного числа. Правда, хочу сразу вас разочаровать — это правило справедливо только для чисел шестого десятка (50, 51, 52, …, 59). Однако для чисел пятого десятка тоже есть свой, несколько более сложный алгоритм. Чтобы возвести в квадрат число пятого десятка (41, 42, …, 49), надо к количеству единиц прибавить число 15, а затем к полученной сумме приписать квадрат дополнения количества единиц до 10 (если этот квадрат — однозначное число, то перед ним приписывается 0). Примеры: 432 = (15 + 3) · 100 + 72 = 1849; 482 = (15 + 8) · 100 + 22 = 2304. Задания 1. Докажите с помощью формул справедливость приведенных выше правил. 2. Установите правило, по которому можно быстро возводить в квадрат числа первого десятка шестой сотни (501, 502, ..., 509).
Занимательная информатика 112 8.3. Еще восемь приемов быстрого счета 8.3.1. Быстрое возведение в квадрат Существует очень простой прием быстрого возведения в квадрат двузначных чисел, оканчивающихся на 5. Для этого нужно цифру десятков умножить на ближайшее большее целое число, а затем к произведению приписать 25. Примеры: 352 = 1225, т. е. 25 приписано к произведению 3 на 4; 852 = 7225, т. е. 25 приписано к произведению 8 на 9 и т. п. 8.3.2. Квадраты чисел, состоящих из единиц Очень легко запомнить квадраты таких чисел, как 11, 111, 1111 и т. д.: 1112 = 12321; 11112 = 1234321 и т. д. 112 = 121; 8.3.3. Другие степени числа 11 Если вам понадобится вычислить другие (кроме квадрата) степени числа 11, то для этого может быть использован так называемый «треугольник Паскаля» — схема расположения чисел в виде треугольника, в котором все числа на «правой» и «левой» сторонах равны 1, а все остальные числа равны суммам двух чисел, находящихся в вышерасположенной строке над тем или иным числом правее и левее (см. рис 8.4). Рис. 8.4 Нетрудно заметить, что цифры, расположенные в третьей, четвертой и пятой строках, образуют числа, представляющие собой вторую, третью и четвертую степени числа 11. Следовательно, для нахождения искомой степени следует нарисовать треугольник Паскаля с соответствующим количеством строк, что сделать совсем не сложно.
8. На пальцах и в уме 113 8.3.4. Произведение двух «особых» чисел Чтобы найти произведение двух чисел, количество десятков в которых одно и то же, а сумма единиц равна 10, необходимо цифру десятков умножить на последующее число (большее на 1) и к полученному результату приписать произведение единиц (если одно из чисел однозначно, то перед ним приписывается 0). Примеры: 48 ´ 42 Þ 4 ´ 5 = 20; 8 ´ 2 = 16 Þ 48 ´ 42 = 2016; 99 ´ 91 Þ 9 ´ 10 = 90; 9 ´ 1 = 09 Þ 99 ´ 91 = 9009; 102 ´ 108 Þ 10 ´ 11 = 110; 2 ´ 8 = 16 Þ 102 ´ 108 = 11016. 8.3.5. Умножение числа 37 Число 37 обладает многими любопытными свойствами. Одно из них состоит в том, что при умножении этого числа на 3 и на числа, кратные трем (до 27 включительно), получаются произведения, состоящие из трех одинаковых цифр: 37 37 37 37 37 37 37 37 37 ´ ´ ´ ´ ´ ´ ´ ´ ´ 3 6 9 12 15 18 21 24 27 = = = = = = = = = 111; 222; 333; 444; 555; 666; 777; 888; 999. Как можно легко запомнить эту таблицу результатов? 8.3.6. Особенные случаи умножения на 9 Вот несколько интересных примеров умножения на 9: 12 123 1 234 12 345 123 456 1 234 567 12 345 678 123 456 789 ´ 9 = 108; ´ 9 = 1 107; ´ 9 = 11 106; ´ 9 = 111 105; ´ 9 = 1 111 104; ´ 9 = 11 111 103; ´ 9 = 111 111 102; ´ 9 = 1 111 111 101; 21 321 4 321 54 321 654 321 7 654 321 87 654 321 987 654 321 ´ 9 = 189; ´ 9 = 2 889; ´ 9 = 38 889; ´ 9 = 488 889; ´ 9 = 5 888 889; ´ 9 = 68 888 889; ´ 9 = 788 888 889; ´ 9 = 8 888 888 889.
Занимательная информатика 114 Из приведенных здесь равенств выведите правила умножения на 9: 1) для чисел, являющихся последовательностью подряд идущих цифр от 1 до n (2 „ n „ 9); 2) для чисел, являющихся последовательностью подряд идущих цифр от n до 1 (2 „ n „ 9). 8.3.7. Особенные случаи деления на 9 Рассмотрим несколько примеров на деление: 117 1 116 11 115 111 114 1 111 113 11 111 112 111 111 112 :9 :9 :9 :9 :9 :9 :9 = 13; = 124; = 1 235; = 12 346; = 123 457; = 1 234 568; = 1 234 5679. Выведите правило определения частного от деления на 9 для чисел, составленных из единиц и одной из цифр 2, 3, …, 7 и заведомо делящихся на 9 (напомним, что на 9 делятся числа, сумма цифр которых кратна девяти). 8.3.8. Деление на число без восьмерки Возьмем число 12 345 679 (оно содержит последовательно все цифры от 1 до 9, кроме цифры 8). Найдем частные от деления чисел 1, 2, ..., 9 на это число: 1 : 12 345 679 2 : 12 345 679 3 : 12 345 679 4 : 12 345 679 5 : 12 345 679 6 : 12 345 679 7 : 12 345 679 8 : 12 345 679 9 : 12 345 679 = = = = = = = = = 0,(000000081); 0,(000000162); 0,(000000243); 0,(000000324); 0,(000000405); 0,(000000486); 0,(000000567); 0,(000000648); 0,(000000729). Выведите правило определения частного для рассмотренных примеров.
8. На пальцах и в уме 115 Задания 1. Докажите с помощью формул справедливость приведенного в пункте 8.3.1 правила для трехзначных, четырехзначных и т. д. числам. 2. Проверьте, можно ли с помощью треугольника Паскаля вычислить пятую и более высокие степени числа 11. 3. Докажите с помощью формул справедливость правила, приведенного в пункте 8.3.4. 8.4. Извлечение корня — не на пальцах и не в уме Конечно, вы наверняка умеете умножать «в столбик» и делить числа на бумаге. А умеете ли вы аналогичным образом извлекать квадратные и кубические корни? Ниже приводится простой и легко запоминающийся метод таких вычислений, который был описан древнегреческим ученым Героном примерно 2000 лет назад*. Прежде чем рассказать о нем, заметим, что речь будет идти о приближенных вычислениях и что при извлечении корня любой степени результат будет иметь по меньшей мере столько верных цифр, сколько их было в подкоренном числе. Например, извлекая квадратный корень из приближенного числа 40,00, можно получить четыре верных цифры ( 40,00 » 6,324). 8.4.1. Правило извлечения квадратного корня Чтобы извлечь квадратный корень, надо взять «на глазок» первое приближение и далее поступить следующим образом: 1) разделить подкоренное число на первое приближение корня; если окажется, что полученное частное отличается от этого первого приближения на величину, не превышающую допустимую погрешность, то можно считать, что задача решена — корень извлечен; 2) в противном случае — найти среднее арифметическое делителя и частного. Оно дает гораздо более точное значение (второе приближение) корня. При более или менее близком к точному выборе первого приближения это второе приближение дает 3 верные цифры (а обычно — не менее четырех верных цифр). Вообще же в каждом новом приближении количество верных цифр удваивается по сравнению с предыдущим; 3) подвергнуть второе приближение такому же испытанию, как и первое, т. е. разделить подкоренное число на второе приближение. Если окажется, что точность результата недостаточна, то найти третье приближение тем же способом, каким нашли второе, и т. д. * Герон пользовался простыми дробями; мы же будем использовать десятичные дроби.
116 Занимательная информатика Примечание. Изложенный способ «не боится ошибок» — он автоматически исправляет арифметическую ошибку, если она допущена на предыдущем этапе. Единственным вредным последствием такой ошибки будет замедление выкладок. Пример 1. 40,00. Подкоренное число имеет четыре верные цифры, поэтому нет смысла вычислять более четырех цифр корня. За первое приближение надо принять какое-нибудь число, заключенное между 6 и 7, так как 62 = 36 меньше подкоренного числа, а 72 = 49 — больше. В этих границах можно взять любое число, но лучше взять число, меньшее чем 6,5 (так как подкоренное число значительно ближе к 62, чем к 72). Возьмем, например, 6,4*. Далее поступаем так. 1. Делим (на бумаге, «в столбик») подкоренное число 40,00 на первое приближение 6,4: 40,00/6,4 = 6,25. Частное 6,25 отличается от делимого 6,4 уже во второй цифре, значит, точность результата недостаточна. 2. В качестве второго приближения берем среднее арифметическое значение делимого 6,40 и частного 6,25: (6,40 + 6,25) / 2 = = 6,325. Можно ожидать, что в этом втором приближении верны если не все четыре, то по крайней мере первые три цифры. 3. Для проверки делим подкоренное число 40,00 на второе приближение 6,325 (доводя деление до четвертой цифры): 40,00 / 6,325 » 6,324. Полученное частное 6,324 отличается от делителя 6,325 лишь на единицу в четвертом знаке. Отсюда следует, что корень с требуемой степенью точности найден. Действительно, если возвести число 6,324 в квадрат, т. е. умножить его на 6,324, то мы получим число, меньшее чем произведение 6,324 · 6,325, которое приближенно составляет 40,00. Если же возвести в квадрат число 6,325, то получится число, большее чем 6,325 · 6,324 » 40,00. Следовательно, искомый квадратный корень лежит между 6,324 и 6,325, т. е. он отличается от 6,324 (или от 6,325) меньше чем на единицу четвертого знака. Ответ: 40,00 » 6,324 (все 4 знака верны). Пример 2. 23,5. Искомый корень заключается между 4 и 5 и лежит гораздо ближе к 5, чем к 4 (так как 23,5 гораздо ближе к 25, чем к 16). Тогда возьмем за первое приближение круглое число 5,0. * Можно взять число 6,3 или 6,2, но брать 6,1 нет смысла, так как 6,1 слишком близко к 6.
8. На пальцах и в уме 117 1. Разделим подкоренное число 23,5 на первое приближение 5,00 (доводя частное до третьей цифры): 23,5 / 5,0 = 4,70. 2. В качестве второго приближения возьмем среднее арифметическое (5,00 + 4,70) / 2 = 4,85. Можно ожидать, что в нем все три цифры верны. 3. Для контроля разделим подкоренное число 23,5 на второе приближение 4,85: 23,5 / 4,85 = 4,85. Так как частное равно (с точностью до третьего знака) делителю, то корень с максимально возможной степенью точности извлечен. Ответ: 23,5 » 4,85. Замечание. Если подкоренное число представляет собой десятичную дробь, имеющую в целой части одну значащую цифру или нуль, то для получения первого приближения рекомендуется перенести запятую вправо на две, четыре, шесть и т. д. цифр с таким расчетом, чтобы в целой части оказалось небольшое количество знаков. Далее надо поступить так же, как в примерах 1 и 2, а в окончательном результате перенести запятую в обратном направлении (влево) на одну, две, три и т. д. цифры. Аналогично можно поступить и тогда, когда подкоренное число имеет многозначную целую часть; в этом случае запятую вначале надо перенести влево на две, четыре, шесть и т. д. цифр. Вообще же в подкоренном числе запятую можно переносить только на четное количество цифр. Пример 3. 0,008732. Переносим запятую на 4 знака вправо и получаем число 87,32. При выборе первого приближения будем учитывать только его целую часть и примем за первое приближение, например, число 9,3. 1. Делим 87,32 на 9,3. Продолжая деление до четвертой значащей цифры, получим: 87,32 / 9,3 » 9,389. 2. Находим среднее арифметическое: (9,300 + 9,389) / 2 » 9,344. 3. Для контроля выполняем деление: 87,32 / 9,344 » 9,345. Значит, в любом из чисел 9,344 или 9,345 все четыре знака — верные (первое дает недостаточное приближение, второе — избыточное). 4. Так как вначале мы перенесли запятую вправо на 4 знака, то в обратном направлении (т. е. влево) запятую надо перенести на 2 знака. Получаем ответ: 0,008732 » 0,09344. Пример 4. 8732000. Переносим запятую влево на 6 цифр и получаем число 8,732 (если перенести запятую на 4 цифры, то получится 873,2, но не 87,32, как в предыдущем примере !). За первое приближение примем число 3.
Занимательная информатика 118 1. Делим: 8,732 / 3 = 2,911. 2. Вычисляем среднее арифметическое: (3,000 + 2,911) / 2 = = 2,955. Понятно, что в первом приближении (3,000) были две верные цифры. Поэтому надо ожидать, что во втором приближении будут верны 4 цифры. Контроль подтверждает это. 3. Так как вначале мы перенесли запятую влево на 6 знаков, то теперь переносим ее в обратном направлении (вправо) на 3 знака. Ответ: 8732000 » 2955. Задание Найдите приближенные 0,002582, 1294000. значения корней: 70,00, 41,2, 8.4.2. Правило извлечения кубического корня Чтобы извлечь кубический корень, надо взять «на глазок» первое приближение, а затем поступить так. 1. Деление на это первое приближение выполняется дважды: сначала делимым служит подкоренное число, а затем — число, полученное в результате первого деления. Если частное, полученное после второго деления, отличается от первого приближения (т. е. от делителя) на величину, не превышающую допустимой погрешности, то задача решена — корень извлечен. 2. В противном случае надо найти среднее арифметическое трех чисел — частного (после двух делений) и дважды взятого делителя*. Получим второе приближение, в котором (при более или менее близком к истине выборе первого приближения) три цифры будут верными, а четвертая в худшем случае потребует исправления на 1. 3. Второе приближение можно подвергнуть такому же испытанию, как и первое, но этот контроль довольно утомителен. Пример 1. 3 785,0. Искомый корень заключен между 9 и 10. За первое приближение возьмем 9,2 (так как подкоренное число примерно в 4 раза ближе к 93, чем к 103). 1. Надо разделить на 9,2 сначала подкоренное число 785,0, а затем — получившееся частное: 785,0 / 9,2 / 9,2. Вместо этого можно разделить 785 на 9,22 = 84,64. Получаем: 785,0 / 9,2 / 9,2 = = 785,0 / 84,64 » 9,275. * Почему именно так, будет понятно при решении примера 1.
8. На пальцах и в уме 119 2. Как видим, первое приближение имеет две верные цифры. Чтобы наилучшим образом найти второе приближение, учтем, что подкоренное число 785,0 оказалось произведением трех неравных сомножителей: 785,0 = 9,2 · 9,2 · 9,275, а нам надо представить его в виде произведения трех равных сомножителей: 785,0 = х · х · х (где х = 3 785,0). Естественно предположить, что каждый из этих равных сомножителей должен примерно равняться среднему арифметическому сомножителей 9,2, 9,2 и 9,275. Поэтому в качестве второго приближения мы берем среднее арифметическое: (9,275 + 9,200 + 9,200) / 3 = 9,225. 3. Для контроля можно разделить подкоренное число 785,0 на второе приближение 9,225, а результат — еще раз разделить на 9,225 (или разделить подкоренное число на 9,2252 » 85,09). Получим значение 9,225 (если же при вычислениях не сохранять «запасную» цифру, то получится 9,224). Ответ: 3 785,0 » 9,225 (все 4 цифры верны). Замечание. При определении первого приближения бывает полезно перенести запятую в подкоренном числе вправо (или влево) на 3, 6, 9 и т. д. цифр. Тогда в окончательном результате надо перенести запятую в обратном направлении на 1, 2, 3 и т. д. цифры. Переносить запятую в исходном числе можно только через такое число цифр, которое делится на 3. Пример 2. 3 18350. В подкоренном числе 18350 переносим запятую (подразумеваемую после цифры единиц) влево на три цифры и получаем число 18,35. Оно находится примерно посредине между 23 = 8 и 33 = 27, поэтому за первое приближение мы принимаем число 2,5. 1. Надо дважды выполнить деление на 2,5 (или, что то же самое, один раз разделить число 18,35 на 2,52): 18,35 / 2,5 / 2,5 = = 18,35 / 6,25 » 2,94. 2. Как видим, в первом приближении верна только одна цифра. Значит, можно ожидать, что во втором приближении будет лишь две верные цифры. Поэтому в следующем действии мы ведем вычисления только для двух знаков, а в качестве второго приближения берем среднее арифметическое (2,5 + 2,5 + 2,9) / 3 » 2,6. 3. Чтобы уточнить результат, надо дважды выполнить деление на 2,6: 18,35 / 2,6 / 2,6 = 18,35 / 6,76 » 2,715. 4. Как видим, второе приближение имеет две верных цифры. Значит, третье, вероятно, будет иметь 4 верных цифры. 5. В качестве третьего приближения берем среднее арифметическое: (2,715 + 2,600 + 2,600) / 3 = 2,638.
Занимательная информатика 120 6. Контроль (который мы здесь не приводим) показал бы, что в полученном результате все четыре цифры верны. Осталось лишь сместить запятую на один знак вправо. Ответ: 3 18350 » 26,38. Задание Найдите приближенные значения корней: 3 285,0, 3 51830. 8.5. Извлечение кубического корня в уме У внимательного читателя, конечно, уже возник вопрос: если можно извлечь корень в уме, то зачем нужно было в предыдущем параграфе описывать метод, который изобрел Герон? Дело в том, что далее будет описана методика извлечения кубического корня из целых чисел, являющихся точными кубами. Особенно эффектно она выглядит при показе математических фокусов (видите — все таки мы не обошлись без фокусов! J). Такой фокус заключается в том, что зритель (возведя некоторое число в куб, — скажем, на калькуляторе) объявляет результат, а вы, немного подумав, называете кубический корень из него. Для этого прежде всего нужно выучить кубы чисел от 1 до 10 (табл. 8.2). Таблица 8.2 Число Его куб 1 1 2 8 3 27 4 64 5 125 6 216 7 343 8 512 9 729 10 1000 При изучении этой таблицы обнаруживается, что все цифры, на которые оканчиваются кубы, различны, но во всех случаях (за исключением 2 и 3, а также 7 и 8) последняя цифра куба совпадает с самим числом, возводимым в куб. В «исключительных» же случаях (для чисел 2, 3, 7 и 8) последняя цифра куба равна разности между 10 и числом, возводимым в куб. Эти обстоятельства и используются для быстрого извлечения кубического корня. Пусть зритель сообщил вам, например, число 250047. Последняя цифра этого числа — 7, из чего немедленно следует, что последней цифрой кубического корня должна быть 3. Первую же цифру кубического корня мы находим следующим образом. Зачеркнем последние три цифры куба (независимо от количества его цифр) и рассмотрим цифры, стоящие впереди, — в нашем случае это 250. Число 250 располагается в таблице кубов между кубами шестерки и семерки. Меньшая из этих цифр (в нашем случае — 6) и будет первой цифрой кубического корня. Поэтому правильный ответ — число 63.
8. На пальцах и в уме 121 Чтобы лучше понять суть дела, приведем еще один пример. Пусть названо число 19683. Его последняя цифра 3 указывает, что последней цифрой кубического корня будет 7. Зачеркивая последние три цифры, получаем число 19, которое лежит между кубом двойки и кубом тройки. Меньшим из этих чисел будет 2, поэтому искомый кубический корень — это число 27. Задание Найдите кубический корень из следующих чисел, являющихся точным кубом: 21952; 11649; 941192; 14706125. 8.6. Сокращенное вычисление среднего арифметического Вы, конечно, знаете, что средним арифметическим нескольких чисел называют частное от деления суммы этих чисел на их количество. Числа, для которых вычисляется среднее арифметическое, обычно мало отличаются друг от друга (например, при вычислении среднего роста учеников в классе). В таких случаях расчет среднего арифметического можно значительно облегчить с помощью следующего приема. 1. Выбираем произвольно какое-либо число, близкое к заданным числам. Если эти числа отличаются друг от друга только в последней цифре, то в выбираемом числе предпочтительно взять за последнюю цифру 0; если исходные числа отличаются друг от друга в двух последних цифрах, то удобно взять число с двумя нулями и т. д. 2. Вычитаем это число по очереди из всех заданных чисел*. 3. Находим среднее арифметическое найденных разностей. 4. Прибавляем это среднее арифметическое к взятому числу. Пример. Пусть измеряется расстояние между двумя точками на местности с помощью 10-метровой рулетки с сантиметровыми делениями. Сделано 10 замеров. Их результаты (в метрах): 62,36; 62,30; 62,32; 62,31; 62,36; 62,35; 62,33; 62,32; 62,38; 62,37 (различие результатов объясняется случайными неточностями измерения). Требуется вычислить среднее арифметическое найденных значений. Решение 1. Выбираем из заданных чисел число 62,30. * При этом могут получаться как положительные, так и отрицательные числа. Если это нежелательно, то нужно взять число, меньшее всех данных чисел. Но вычисления будут несколько легче, если взять какое-либо среднее значение между заданными числами.
122 Занимательная информатика 2. Вычитаем 62,30 из всех заданных чисел — получим разности (цифры сотых долей) 6; 0; 2; 1; 6; 5; 3; 2; 8; 7. 3. Берем среднее арифметическое этих разностей — получаем число 0,04. 4. Прибавляем 0,04 к 62,30 — получаем число 62,34. Это и есть искомое среднее арифметическое. Задание Вычислите среднее арифметическое значений роста десяти своих одноклассников. Перфоленты и перфокарты Носителями информации в электронно-вычислительных машинах первых поколений были перфокарты (перфорированные картонные карточки) и перфоленты. Информация на них представлялась наличием или отсутствием отверстий в определенных позициях карты или ленты. Программисту нужно попасть на двенадцатый этаж. Он заходит в лифт, нажимает кнопку «1», затем «2» и ищет кнопку с надписью Enter.
9 Семь полезных программ, и не только Когда человек хочет передвинуть гору, он начинает с того, что убирает маленькие камни. сли вы хотите стать хорошим программистом, то учтите, что одним из важных условий этого является большой опыт решеЕ ния различных задач по программированию. А потому решайте побольше разных задач — абстрактных и содержательных, «на 5 минут» и «на день работы». Все это обязательно вам пригодится, как наверняка пригодятся задачи, приведенные в этой главе... 9.1. Превратим компьютер в будильник Прежде чем сделать это, давайте разработаем программу, показывающую на экране текущее время. В большинстве современных языков программирования предусмотрена стандартная процедура (или функция), возвращающая текущее время, которое отслеживается в компьютере и хранится в специальной энергонезависимой памяти. В Бейсике это функция TIME$, а в Паскале — процедура GetTime.
124 Занимательная информатика Начнем с Бейсика (ведь этот язык программирования появился раньше, чем язык Паскаль J). В нем функция TIME$ возвращает значение времени в виде восьмисимвольной строки в формате ЧЧ:ММ:СС, где ЧЧ — час (значения от 00 до 23), ММ — минута (от 00 до 59), СС — секунда (от 00 до 59), а символы двоеточия играют роль разделителей. Простейшая программа на Бейсике, выводящая текущее время в середине экрана, имеет вид: CLS DO LOCATE 13, 36 PRINT TIME$ LOOP UNTIL INKEY$ <> "" Чтобы прекратить работу этой программы, достаточно нажать любую клавишу. На языке Паскаль соответствующая программа выглядит так: Uses CRT, DOS; Var hour, minute, second, sec100: word; BEGIN Repeat Clrscr; GetTime(hour, minute, second, sec100); GotoXY(36, 13); Write(hour,':', minute,':', second,':', sec100)} Until Keypressed; END. Здесь процедура GetTime возвращает четыре значения: hour — час (в диапазоне от 0 до 23); minute — минута (в диапазоне от 0 до 59); second — секунда (в диапазоне от 0 до 59); sec100 — сотые доли секунды (в диапазоне от 0 до 99). Для выхода из этой программы также необходимо нажать любую клавишу. Как теперь нужно изменить эти программы, чтобы компьютер работал как будильник, — вы, наверное, уже поняли: 1) для условия окончания оператора цикла с постусловием следует использовать условие со значением необходимого времени «срабатывания будильника»; 2) после завершающего оператора цикла необходимо записать какой-либо оператор, вызывающий звуковой сигнал. Например, чтобы звуковой сигнал прозвучал в 10 часов утра, эти программы надо оформить следующим образом:
9. Семь полезных программ, и не только 125 Бейсик: CLS DO LOCATE 13, 36 PRINT TIME$ LOOP UNTIL VAL(LEFT$(TIME$, 2)) = 10 DO BEEP LOOP UNTIL INKEY$ <> "" Паскаль: Uses CRT, DOS; Var hour, minute, second, sec100: word; BEGIN Repeat Clrscr; GetTime(hour, minute, second, sec100); GotoXY(36, 13); Write(hour,':', minute,':', second,':', sec100)} Until hour = 10; Repeat Sound(2000) Until Keypressed; Nosound END. Задание Измените программу (на том языке программирования, которым вы владеете) так, чтобы «будильник» срабатывал при заданных произвольных значениях часов и минут. 9.2. Как установить на программу пароль Наверняка у вас, уважаемый читатель, иногда возникает желание (или необходимость) оформить какую-то программу так, чтобы ею никто не мог пользоваться, кроме вас. Для этого можно добавить в программу (в ее начале) следующий фрагмент: Бейсик: INPUT "Введите пароль ", pass$; Паскаль: Write(’Введите пароль ’); Readln(pass);
126 Занимательная информатика Здесь pass — имя текстовой переменной, которая будет хранить значение пароля. Кроме того, нужно предусмотреть многократный повтор указанных операторов до тех пор, пока не будет введен правильный пароль, либо какие-то другие действия (например, завершение работы программы при вводе неправильного пароля). Однако такой вариант не является абсолютно надежным. Кто-то посторонний может издалека увидеть набранный вами пароль на экране. Безопаснее оформить программу так, чтобы вводимый пароль не отображался на экране. Проиллюстрируем такую возможность на примере пароля «Волга». В программе на Бейсике для этого может быть применена функция INPUT$. Она имеет синтаксис: INPUT$(n), где n — целое число, и возвращает символьную строку, состоящую из n символов, клавиши которых нажимал пользователь. При этом вводимые символы не дублируются на экране (такой способ ввода называют «вводом без эхо-повтора»). Соответствующий фрагмент программы тогда может иметь вид: CLS DO PRINT "Введите пароль "; pass$ = INPUT$(5) IF pass$ <> "Волга" THEN PRINT "Неправильный пароль!" END IF LOOP UNTIL pass$ = "Волга" CLS LOCATE 13, 27 PRINT "Добро пожаловать в программу!" REM Приостановка программы REM до нажатия любой клавиши DO LOOP UNTIL INKEY$ <> "" REM Продолжение программы ... Здесь величина pass$ принимает значение, введенное пользователем, а в случае ввода неправильного пароля на экран выдается соответствующее сообщение и вновь предлагается ввести пароль (используется оператор цикла с постусловием).
9. Семь полезных программ, и не только 127 В программе на Паскале для «скрытия» пароля может использоваться функция Readkey. Она приостанавливает работу программы, пока не будет нажата какая-либо клавиша, и возвращает ее символ, поэтому в программе эта функция вызывается 5 раз (в теле оператора цикла с параметром): Uses CRT; Var pass: string[5]; i: byte; s: char; BEGIN Clrscr; Repeat pass := ''; Write('Введите пароль '); For i := 1 To 5 Do Begin {Читаем очередной символ} s := Readkey; {Добавляем его к уже введенным ранее} pass := pass + s End; If pass <> 'Волга' Then Writeln('Неправильный пароль!') Until pass = 'Волга'; Clrscr; Writeln; Gotoxy(27, 13); Write('Добро пожаловать в программу!'); {Приостановка программы до нажатия любой клавиши} Repeat Until KeyPressed; {Продолжение программы} ... END. Здесь тоже используется оператор цикла с постусловием — при вводе неправильного пароля на экран выводится соответствующее сообщение и вновь предлагается ввести пароль. В заключение заметим, что, конечно, ваша программа обязательно должна быть откомпилирована (переведена с языка программирования высокого уровня на машинный язык), поскольку в ее исходном тексте (в файле типа *.bas или *.pas) любой посторонний может найти требуемый пароль.
128 Занимательная информатика Задание Измените приведенную выше программу (на языке программирования, с которым вы знакомы) так, чтобы количество попыток для ввода пароля было ограничено (например, чтобы программа допускала три таких попытки). 9.3. Каким днем недели был день вашего рождения Разработаем программу, с помощью которой можно определить, каким днем недели (понедельник, вторник и т. д.) была или будет некоторая дата. При этом мы будем использовать так называемый «школьный алгоритмический язык». Русский синтаксис этого языка делает программы максимально понятными, так что вы легко сможете разработать аналогичные программы на любом известном вам языке программирования. Обозначим величины, соответствующие заданной дате, как день, месяц и год. Введем также следующие обозначения: 1) прив_месяц — «приведенный» номер месяца, определяемый как (месяц – 2), если месяц > 2, или месяц + 10, если месяц „ 2; т. е. прив_месяц = 1 соответствует марту, прив_месяц = 2 — апрелю и т. д., а январь и февраль считаются 11-м и 12-м месяцами «предыдущего» года; 2) прив_год — «приведенный» номер года, рассчитываемый как год, если месяц > 2, или (год – 1), если месяц „ 2; 3) число100 — полное число столетий, прошедших к заданной дате; 4) год_века — номер года в заданной дате в пределах текущего столетия. Например, для 12 апреля 1961 г., когда был осуществлен полет первого космонавта Земли Ю. А. Гагарина в космос, значения указанных переменных будут следующими: день = 12, месяц = 4, год = 1961, прив_месяц = 2, прив_год = 1961, число100 = 19; год_века = 61. Закодируем дни недели при помощи чисел следующим образом: 0 — воскресенье, 1 — понедельник, 2 — вторник, ..., 6 — суббота. В книге [18] показано, что номер дня недели (в соответствии с этой «кодировкой») определяется как остаток от деления на 7 числа N, равного: N = день + [(13 · прив_месяц – 1)/5] + год_века + + [год_века/4] + [число100/4] – 2 · число100, где квадратные скобки обозначают взятие целой части числа.
9. Семь полезных программ, и не только 129 С учетом всего сказанного выше, требуемая нам программа на школьном алгоритмическом языке может быть оформлена так: алг Определение_дня_недели_по_дате нач цел день, месяц, год, прив_месяц, прив_год, число100, год_века, N, номер_дня_недели, лит название_дня |Ввод исходных данных вывод нс, "Введите номер дня" ввод день вывод нс, "Введите номер месяца" ввод месяц вывод нс, "Введите номер года" ввод год |Определение значений вспомогательных величин если месяц > 2 то прив_месяц := месяц - 2 иначе прив_месяц := месяц + 10 все если месяц > 2 то прив_год := год иначе прив_год := год - 1 все число100 := div(прив_год, 100) год_века := mod(прив_год, 100) |Расчет числа N N := день + div((13 * прив_месяц - 1), 5) + год_века + + div(год_века, 4) + div(число100, 4) – 2 * число100 |Определение номера дня недели номер_дня_недели := mod(N, 7) |Определение названия дня недели выбор при номер_дня_недели = 0: название_дня := "воскресенье" при номер_дня_недели = 1: название_дня := "понедельник" ... при номер_дня_недели = 6: название_дня := "суббота" все |Вывод ответа вывод нс, "Введенной Вами дате соответствует ", название_дня кон
130 Занимательная информатика Здесь div — функция, возвращающая целую часть частного от деления первого ее аргумента на второй, а mod — функция, определяющая остаток (в других языках программирования используются не функции, а соответствующие операции). Задание Напишите программу на известном вам языке программирования и с ее помощью определите, каким днем недели был день вашего рождения. 9.4. «Звездное небо» Рассмотрим программу, которую можно назвать «Звездное небо». В ней на экран многократно выводится символ «*», а место его вывода и цвет выбираются случайно. На школьном алгоритмическом языке такая программа выглядит следующим образом: алг Звездное_небо нач цел x, y, цвет ОчисткаЭкрана нц 50000 раз y := 1 + rnd(MaxY) x := 1 + rnd(MaxX) цвет := rnd(16) МестоВывода(x, y) ЦветТекста(цвет) вывод "*" Пауза кц кон Здесь: l ОчисткаЭкрана — процедура очистки экрана; l x и y — номера позиции (столбца) и строки, в которых будет выводиться очередной символ «*»; l MaxX, MaxY — максимально возможные значения x и y; l цвет — номер цвета, которым будет выводиться очередной символ «*»; l МестоВывода — оператор установки места вывода на экран; l ЦветТекста — оператор установки цвета текста, выводимого на экран. Именем Пауза обозначен фрагмент программы, обеспечивающий некоторую паузу при выводе на экран очередного символа (это может быть стандартная процедура, имеющаяся в языке про-
9. Семь полезных программ, и не только 131 граммирования и решающая указанную задачу, либо так называемый «пустой цикл»). Задание Самостоятельно разработайте вариант программы, в котором не будет происходить так называемая «прокрутка экрана» (которая имеет место при x = MaxX и y = MaxY). 9.5. Проверка скорости реакции человека Составим программу, которая определяет скорость реакции человека. Идея такой проверки заключается в следующем. «Испытуемый» сидит перед компьютером, положив обе руки на край стола. На экране появляется надпись «Старт!», после чего он должен нажать любую символьную клавишу. При этом определяется время его реакции, которое после нескольких попыток усредняется. В программе используем следующие переменные: l n — количество попыток; l старт — момент времени, когда на экране появляется надпись «Старт!»; он характеризуется значением, которое возвращает функция время — количество сотых долей секунды, прошедших с начала суток; l финиш — момент времени, когда участник нажимает клавишу; здесь также можно применить функцию время; l время_реакции — промежуток времени между двумя указанными выше моментами; l общее_время — сумма значений время_реакции для всех попыток. Кроме того, в программе промежуток времени до появления на экране очередной надписи «Старт!» задается случайным образом, а для проверки факта нажатия клавиши применяется функция inkey (аналогичная функция имеется и в других языках программирования). алг Определение_времени_реакции нач цел n, старт, финиш, i, j, k, вещ время_реакции, общее_время вывод нс, "Задайте количество попыток" ввод n общее_время := 0 нц для i от 1 до n |Пауза разной продолжительности
132 Занимательная информатика нц для j от 1 до 10* нц для k от 1 до int(rnd(30000)) | кц кц вывод нс, "Старт!" старт := время |Ждем нажатия любой клавиши нц кц_при inkey <> "" финиш := время время_реакции := (финиш - старт)/100 общее_время := общее_время + время_реакции кц вывод нс, "Среднее время реакции: " вывод общее_время/n, " сек" кон Однако эта программа позволяет «испытуемому» нажать любую клавишу еще до появления очередной надписи «Старт!» (не выдержали нервы? попытка перехитрить машину?), в результате чего время реакции будет необоснованно уменьшено. За это можно «наказывать» своего рода штрафом, — например, за каждое такое неправильное нажатие добавлять 0,2 секунды**. Соответствующий фрагмент программы может иметь вид: ... общее_время := 0 штраф := 0 нц для i от 1 до n если inkey <> "" то |Клавиша нажата раньше времени штраф := штраф + 0.2 все |Пауза разной продолжительности ... * ** В программах на школьном алгоритмическом языке максимально возможное количество повторений цикла с параметром ограничено, поэтому приходится использовать вложенный цикл («цикл в цикле»). В программах же на других языках программирования для задания интервала времени до появления на экране очередной надписи «Старт!» может быть использован обычный оператор цикла с параметром. Подберите для своего компьютера соответствующее значение с учетом скорости его (компьютера) работы.
9. Семь полезных программ, и не только 133 Вывод же результатов «испытаний» тогда может быть оформлен следующим образом: ... общее_время := общее_время + время_реакции вывод нс, "Среднее время реакции: " вывод общее_время/n, " сек" вывод нс, "Штраф: ", штраф, " сек" вывод нс, "Среднее время реакции с учетом 'штрафа': " вывод общее_время/n + штраф, " сек" кон Можно усовершенствовать программу — вместо слова «Старт!» выводить на экран одну из цифр: 0, 1, …, 9, а «испытуемый» тогда должен нажать соответствующую клавишу. Какие изменения необходимо внести в программу в этом случае кроме описания новых величин (цифра — число, появляющееся на экране, и с — символ, который нажмет «испытуемый»)? Таких изменений — два: 1) при каждой попытке необходимо случайным образом выбрать цифру и вывести ее на экран; 2) вместо функции inkey надо использовать функцию getkey — это позволит определить, нажал ли «испытуемый» соответствующую клавишу (проверив код нажатой клавиши). Измененный фрагмент листинга (вместо фрагмента, начинающегося с оператора, который выводит на экран слово «Старт!») имеет вид: ... цифра := rnd(10) вывод нс, цифра старт := время нц с := getkey кц_при цел(с) - 48 = цифра |Далее текст программы остается без изменений финиш := время ... Здесь функция цел возвращает ASCII-код символа, являющегося ее аргументом, а 48 — это ASCII-код цифры 0. Задание На известном вам языке программирования разработайте оба описанных выше варианта программы, а также программу, в которой проверяется скорость реакции при нажатии на ту или иную буквенную клавишу, выбираемую случайным образом.
Занимательная информатика 134 9.6. Биологические ритмы В жизни человека бывают дни творческие и бесплодные, счастливые и несчастливые, дни, когда он бывает в приподнятом или в подавленном настроении. Замечено, что возможности нашего организма изменяются периодически: по прошествии определенного числа дней (периода) организм возвращается в то же самое состояние. Часто биологические ритмы вычисляют, основываясь на гипотезе, что существует три цикла: физический (его период равен 23 дням), эмоциональный (период — 28 дней) и интеллектуальный (период — 33 дня). Кривые таких биологических ритмов могут быть представлены в виде синусоид (рис. 9.1), где начало всех трех кривых соответствует дню рождения. В первой половине каждого периода значения синусоид положительны — это дни рабочего, приподнятого настроения, а вот во второй части периода (когда значения какой-либо синусоиды отрицательны) человек находится в пассивном, плохом настроении. В самом начале (сразу после дня рождения) все биологические ритмы попадают в положительную часть периодов. Рис. 9.1 Действительно ли циклы биологических ритмов бывают такими и одинаково ли они подходят для каждого человека, пока окончательно не установлено. Несмотря на это, разработаем программу, которая будет печатать календарь на один месяц биологических ритмов для пользователя с заданной датой рождения. Прежде всего надо вычислить количество дней, прошедших со дня рождения человека до начала рассматриваемого месяца. Нетрудно убедиться, что это значение равно сумме четырех величин: 1) количества дней, прошедших от дня рождения до конца месяца рождения (назовем эту величину д1); 2) количества дней, прошедших с начала месяца, следующего за месяцем рождения, до конца года, в котором человек родился (д2);
9. Семь полезных программ, и не только 135 3) количества дней, прошедших с начала года, следующего за годом рождения, до начала года, для которого строится календарь (д3); 4) количества дней, прошедших с начала года до начала месяца, для которого строится календарь (д4). Ясно, что при таких расчетах нам придется часто определять количество дней в том или ином месяце года. Для этого удобно предусмотреть следующую функцию: алг цел Число_дней_в_месяце(арг цел нм, нг) нач выбор при нм = 1 или нм = 3 или нм = 5 или нм = 7 или нм = 8 или нм = 10 или нм = 12: знач := 31 |Значение функции при нм = 4 или нм = 6 или нм = 9 или нм = 11: знач := 30 иначе |месяц - февраль если mod(нг, 4) = 0 то |год - високосный знач := 29 иначе знач := 28 все все кон Аргументы этой функции — номер месяца нм и номер года нг. Строго говоря, проверка факта, является ли год, для которого функция возвращает значение, високосным, здесь проведена не совсем правильно. Как известно, год является високосным, если его номер делится на 4, но последний год любого столетия считается високосным только в том случае, если его номер делится на 400 (например, это годы 1600-й и 2000-й), а 1900-й и 2100-й годы — не високосные (см. 18.7). Однако учитывая, что мы будем оперировать периодом времени на границе XX и XXI вв., и принимая во внимание, что 2000-й год является високосным, мы вполне можем для простоты использовать приведенное условие («величина нг кратна четырем»). После нахождения количество дней, прошедших со дня рождения человека до начала рассматриваемого месяца, мы должны рассмотреть каждый день этого месяца и определить, в какую фазу каждого цикла он попадает. Дни, в которых значения синусоид незначительно отличаются от нуля, мы будем считать «нейтральными», а все остальные (в зависимости от значений синусо-
Занимательная информатика 136 иды) — либо «положительными» («благоприятными»), либо «отрицательными» («неблагоприятными»). Распределение циклов по таким дням показано в табл. 9.1. Таблица 9.1 Вид цикла Физический Эмоциональный Интеллектуальный Номер дня цикла «Благо«Нейтральные» приятные» дни дни 1–2, 10–14, 22–23 3–9 1–3, 12–17, 26–28 4–11 1–3, 14–20, 31–33 4–13 «Неблагоприятные» дни 15–21 18–25 21–30 Перейдем теперь к разработке самой программы. Исходными величинами в ней являются: l др, мр и гр — соответственно день, месяц и год рождения человека, для которого строится календарь биоритмов; l месяц и год — соответственно месяц и год, для которых строится календарь. Вспомогательные величины: l д1, д2, д3, д4 — были описаны выше; l д_общее — сумма указанных значений (смысл величины д_общее также описан выше); l тек_месяц, тек_год — соответственно месяц и год, для которых рассчитываются значения д2, д3, д4; l д_физ, д_эм, д_инт — номер дня в каждом из трех циклов, которому соответствует тот или иной день исследуемого месяца. Если какой-то день оказывается «благоприятным», в календаре мы будем отмечать его знаком «+», «неблагоприятные» дни будем отмечать знаком «–», а «нейтральные» — символом «0». Вся программа тогда имеет вид: алг Биоритмы нач цел др, мр, гр, месяц, год, д1, д2, д3, д4, д_общее, тек_месяц, тек_год, i, д_физ, д_эм, д_инт |Задаем исходные данные вывод нс, "Задайте день, номер месяца и " вывод "номер года Вашего рождения" ввод др, мр, гр вывод нс, "Задайте год и номер месяца, " вывод "для которого определяются биоритмы" ввод год, месяц
9. Семь полезных программ, и не только |Определяем число дней, |прошедших от дня рождения до |конца месяца рождения д1 := Число_дней_в_месяце(мр, гр) - др |Определяем число дней, прошедших от начала |месяца, следующего за месяцем рождения, |до конца года рождения |Считаем что человеку больше 1 года J д2 := 0 тек_месяц := мр + 1 нц пока тек_месяц <= 12 |Учитываем число дней в текущем месяце д2 := д2 + Число_дней_в_месяце(тек_месяц, гр) |Переходим к следующему месяцу тек_месяц := тек_месяц + 1 кц |Определяем число дней, прошедших |от начала года, следующего за годом рождения, |до начала года, для которого строится календарь д3 := 0 тек_год := гр + 1 нц пока тек_год <= год - 1 |Учитываем число дней в текущем году если mod(гр, 4) = 0 то |текущий год - високосный д3 := д3 + 366 иначе д3 := д3 + 365 все |Переходим к следующему году тек_год := тек_год + 1 кц |Определяем число дней, прошедших с начала года |до начала месяца, для которого строится календарь д4 := 0 тек_месяц := 1 нц пока тек_месяц <= месяц - 1 |Учитываем число дней в текущем месяце д4 := д4 + Число_дней_в_месяце(тек_месяц, год) |Переходим к следующему месяцу тек_месяц := тек_месяц + 1 кц д_общее := д1 + д2 + д3 + д4 137
138 Занимательная информатика |Выводим календарь вывод нс, "Календарь биоритмов на указанный месяц" |Физическое состояние вывод нс, "Физическое состояние: " вывод нс нц для i от д_общее + 1 до д_общее + Число_дней_в_месяце(месяц, год) д_физ := mod(i, 23) |Учитываем табл. 9.1 если д_физ >= 0 и д_физ <= 2 или д_физ = 22 или д_физ >= 10 и д_физ <= 14 то |Нейтральный день вывод "0" иначе если д_физ >= 3 и д_физ <= 9 то |Благоприятный день вывод "+" иначе |Неблагоприятный день вывод "-" все все кц |Эмоциональное состояние вывод нс, "Эмоциональное состояние: " вывод нс нц для i от д_общее + 1 до д_общее + Число_дней_в_месяце(месяц, год) д_эм := mod(i, 28) |Учитываем табл. 9.1 если д_эм >= 0 и д_эм <= 3 или д_эм = 26 или д_эм = 27 или д_эм >= 12 и д_эм <= 17 то |Нейтральный день вывод "0" иначе если д_эм >= 4 и д_эм <= 11 то |Благоприятный день вывод "+" иначе |Неблагоприятный день вывод "-" все все кц
9. Семь полезных программ, и не только 139 |Интеллекутальное состояние вывод нс, "Интеллектуальное состояние:" вывод нс нц для i от д_общее + 1 до д_общее + Число_дней_в_месяце(месяц, год) д_инт := mod(i, 33) |Учитываем табл. 9.1 если д_инт >= 0 и д_инт <= 3 или д_инт = 31 или д_инт = 32 или д_инт >= 14 и д_инт <= 20 то |Нейтральное состояние вывод "0" иначе если д_инт >= 4 и д_инт <= 13 то |Благоприятный день вывод "+" иначе |Неблагоприятный день вывод "-" все все кц кон Задание Разработайте соответствующую программу на известном вам языке программирования. Дополните ее фрагментом, в котором определяются и выводятся на экран «суперблагоприятные» дни (когда по всем трем показателям состояние человека положительное) и «супернеблагоприятные» дни (когда все показатели — отрицательные). 9.7. Обмен значениями между переменными Рассмотрим задачу, которая часто встречается при разработке различных программ. Даны значения двух переменных величин a и b. Требуется произвести обмен их значений. Очевидно, что решение, что называется, «в лоб»: a := b b := a или b := a a := b требуемого результата не дает. (Самостоятельно ответьте на вопрос: почему?) Как же быть? А так, как мы меняем местами содержимое двух чашек, в одной из которых находится молоко, а в дру-
140 Занимательная информатика гой — чай. Нужна третья чашка!* То есть в нашей задаче для ее решения потребуется третья, вспомогательная, переменная. Тогда обмен значений переменных а и b может быть произведен так: с := a |Запоминаем значение величины а a := b |Величине а присваиваем значение величины b b := c |Величине b присваиваем "старое" значение |величины а или c := b b := a a := c Но оказывается, что обменять значения двух переменных можно и без использования вспомогательной переменной. Не может быть! — скажете вы. Может! — и сделать это можно даже несколькими способами. Вот один из них: а := а + b b := a - b a := а – b Красиво, не правда ли? С молоком так не сделаешь! J Остальные способы решения (а их, по крайней мере, еще 7) найдите самостоятельно. А заодно решите следующую задачу. Даны значения трех переменных величин a, b и с. Требуется составить программу, после выполнения которой величина b будет иметь значение величины а, величина с — значение величины b, величина а — значение величины с. Дополнительные переменные использовать нельзя. Интересно, сколько способов решения этой задачи вы найдете? 9.8. Рекурсия Схватив себя за косичку своего парика, я изо всех сил дернул вверх и без большого труда вытащил из болота и себя, и своего коня… Если вы думаете, что это легко, попробуйте проделать это сами. Барон Мюнхгаузен** В программировании широко используется прием, называемый рекурсией (от латинского recursio — «возвращение»). Так называют ситуацию в программе, когда какая-либо процедура или * ** Можно, конечно, при этом использовать и две дополнительные чашки, но это уже излишество J. Надеюсь, вам известен этот персонаж?
9. Семь полезных программ, и не только 141 функция вызывает саму себя. Суть такого приема наглядно иллюстрируют рис. 9.2 и 9.3, а также стихотворение: В некий день один поэт с мозгами набекрень поэму сел писать, начавши: «В некий день один поэт с мозгами набекрень поэму сел писать, начавши: «В некий день ... Рис. 9.2. «Рисующие руки» (литография М. Эшера, 1948 г.) Рис. 9.3. Мальчик с зеркалом Для примера опишем функцию с рекурсией (такие функции называются рекурсивными) для расчета факториала натурального числа n (факториал числа n, обозначаемый как n!, равен 1 · 2 · 3 ´ ´ ... · n). Такую функцию можно создать, зная, что n! = (n – 1)! · n. алг цел Факториал(арг цел n) нач знач := Факториал(n - 1) * n |Рекурсивный вызов |функции Факториал кон Читатели, имеющие опыт программирования, конечно же, заметили, что эта функция оформлена не по правилам (и при выполнении программы появится сообщение об ошибке)*. Вот правильный вариант функции Факториал: * А читателям, не имеющим такого опыта, предлагается подумать, в чем заключается ошибочность приведенного варианта.
142 Занимательная информатика алг цел Факториал(арг цел n) нач если n > 1 то |Рекурсивный вызов функции Факториал знач := Факториал(n - 1) * n иначе знач := 1 все кон На основе этого примера сформулируем важное правило: необходимо так оформлять процедуры (функции) с рекурсией, чтобы рекурсивные вызовы осуществлялись по условию, которое в какой-то момент станет ложным. Задания 1. Составьте программу, в результате выполнения которой на экран 10 раз выводится текст всем известной истории о попе и его собаке («У попа была собака...»). В программе должна использоваться рекурсивная процедура, обеспечивающая вывод этого текста любое заданное число раз. Указания по выполнению. Чтобы наблюдать вывод каждой новой истории, предусмотрите в процедуре небольшую паузу в выполнении программы. 2. Разработайте рекурсивную функцию для расчета значения an для заданных значений а и n (n — вещественное число, n — натуральное). 3. Разработайте рекурсивную функцию для расчета k-го члена последовательности Фибоначчи (последовательность Фибоначчи образуют числа 1, 1, 2, 3, 5, 8, 13, ...). Познакомился «интернетчик» с девушкой. Погуляли. Он спрашивает: — Как бы нам еще встретиться? Она ему на бумажке телефон написала и уехала. Он смотрит на бумажку: «Странно… на ICQ не похоже… На IP-адрес тоже…» Так и не состоялась любовь...
10 Ваш помощник — калькулятор егодня калькулятор можно найти в портфеле почти каждого школьника (в том числе это и встроенные калькуляторы в соС товых телефонах и даже в наручных часах). А представьте себе в своем портфеле калькулятор весом более 10 кг и размером в несколько десятков сантиметров. Именно такими были самые первые калькуляторы, — причем на них можно было производить только четыре арифметических действия. Первый в мире полностью электронный калькулятор «Anita MK 8» был продемонстрирован в 1961 г. на выставке промышленных достижений в Англии. По окончании этой выставки в СССР было принято решение о создании аналогичного отечественного калькулятора. Начиная с 1961 г., группа научных сотрудников Ленинградского отделения Центрального экономико-математического института Академии наук СССР — В. Б. Мараховский, Е. А. Каневский и Г. И. Мендерская — разрабатывала первый советский электронный калькулятор, который получил название «Вега» (рис. 10.1). В ноябре 1962 г. этот калькулятор заработал. На испытания Государственной комиссии были представлены три одновременно созданных калькулятора под названиями «Вега», «Лада» и «Вятка-Э». На проведенных испытаниях победила «Вега», которую и решено было производить серийно.
Занимательная информатика 144 Рис. 10.1 10.1. Вычисление процентов Почти на всех калькуляторах есть клавиша «%». С ее помощью можно проводить вычисление процентов от числа, а также вычислять процентные увеличения и уменьшения. Прежде чем описывать методику проведения таких вычислений, заметим, что на вашем калькуляторе она может несколько отличаться от указанной ниже. 1. Для вычисления процентов от какого-либо числа нужно ввести это число в калькулятор, умножить его на искомое количество процентов и нажать клавишу «%»: 4 ´ 0 2 5 Þ % 2. Увеличение числа (например, 15) на 10%: 1 5 + 1 0 Þ % 3. Уменьшение числа (например, 15) на 10%: 1 5 – 1 0 Þ % 4. Нахождение числа по заданному проценту (например, числа N, если известно, что число 12 составляет 8% от этого числа): 1 ¸ 2 8 Þ % 5. Чтобы определить, сколько процентов от числа А составляет число В, необходимо ввести в калькулятор число А, разделить его на число В и нажать клавишу«%». Аналогично можно перевести в проценты и простую дробь (тогда роль числа А играет числитель дроби, а числа В — ее знаменатель): 1 2 ¸ 1 5 % Þ
10. Ваш помощник — калькулятор 145 Задания 1. 1500 жителей острова Бригг решили переехать на другой остров. Определите: 1.1) общую численность населения острова Бригг, если указанное количество жителей составляет 20% от общего числа жителей; 1.2) сколько жителей останется на этом острове после переезда. 2. Некто выиграл в лотерею. Свой выигрыш он может получить любым из двух способов: l получить в первый год 1000 рублей; на следующий год — на 10% меньше; на следующий — еще на 10% меньше и т. д., всего — в течение 10 лет; l получить в первый год 150 рублей; на следующий год — на 50% больше; на следующий — еще на 50% больше и т. д., всего — в течение 10 лет. Какой способ выгоднее? 3. Исследуйте особенности использования клавиши «%» в программе Калькулятор — стандартном приложении операционной системы Windows. 10.2. Память калькулятора При расчетах на калькуляторе часто приходится запоминать или записывать промежуточные результаты, чтобы использовать их в дальнейших вычислениях. У большинства калькуляторов для этого имеется специальное запоминающее устройство — регистр памяти, в котором можно хранить различные числа. Операции с регистром памяти производятся, как правило, с помощью следующих клавиш: М+ — в регистр памяти вводится число, отображаемое в данный момент на индикаторе калькулятора; если в памяти уже было какое-то число, то новое прибавляется к нему; М– — число, отображаемое на индикаторе калькулятора, вычитается из числа, уже хранящегося в регистре памяти; МR — («Memory Recall» — «из памяти») — число, хранящееся в регистре памяти, высвечивается на индикаторе калькулятора. Если перед этим была нажата клавиша какоголибо действия, то число из памяти станет вторым операндом для этого действия (результат вычисляется при нажатии клавиши «=»);
Занимательная информатика 146 МС — клавиша сброса (стирания) числа из регистра памяти («Memory Clear»). У некоторых калькуляторов ее нет, а чтобы очистить регистр памяти, нажимают последовательно клавиши «MR» и «M–». Иногда клавиши «МR» R и «МС» объединены в одну, тогда на ней написано «M ». C Первое нажатие на эту клавишу соответствует нажатию на «МR», второе — на «МС». Прежде чем предлагать вам задачи, дам несколько рекомендаций по проведению расчетов с использованием регистра памяти калькулятора. 1. Помните, что в регистре памяти может храниться только одно число, поэтому тщательно продумывайте последовательность своих действий. 2. При вычислении дробей со сложными выражениями в числителе и знаменателе сначала вычисляют знаменатель и вводят результат в регистр памяти. Затем рассчитывают числитель и делят полученный результат на число, хранящееся в памяти. 3. Перед началом новых вычислений регистр памяти калькулятора надо обязательно очистить от старых значений. Задания 3,4 + 25,9 . 10,5 - 6,1 2. Получите таблицу умножения на 16 (внеся число 16 в регистр памяти): 1 ´ 16 = 2 ´ 16 = ... 10 ´ 16 = 3. Вычислите значение выражения: 93,1 – (4,3 ´ 6,8) – (15,2 – 3,4). 4. Что лучше занести в регистр памяти при решении следующих групп примеров: а) 1 ´ 9 + 2 = 12 ´ 9 + 3 = 123 ´ 9 + 4 = 1234 ´ 9 + 5 = 1. Вычислите на калькуляторе значение выражения: б) 143 143 143 143 143 ´ ´ ´ ´ ´ 2 3 4 5 6 ´ ´ ´ ´ ´ 7 7 7 7 7 = = = = =
10. Ваш помощник — калькулятор 147 5. Переведите в мили расстояния: 85 км; 100 км; 115 км; 32 км; 270 км, если 1 километр = 5/8 мили. 6. Задача «Турпоход». Предположим, что вы идете в туристический поход. Ваш рюкзак вместе с палаткой и спальным мешком весит 6,75 кг. Еще вам нужно положить в рюкзак: спиртовку, кружку и ложку (все вместе весит 2 кг), два пакета с рисом (по 430 г каждый), семь пакетов суповых концентратов (по 85 г каждый), три пачки чая (по 113 г каждая) и пять пакетиков с сухим молоком (по 21 г каждый). Еще нужно взять с собой шоколад. Каждая плитка весит 103 г. С помощью калькулятора, не записывая результаты промежуточных вычислений на бумаге, определите, сколько плиток шоколада вы можете взять с собой, если общий вес рюкзака не должен быть больше 12 кг. 7. Исследуйте особенности использования клавиш для работы с регистром памяти в программе Калькулятор — стандартном приложении операционной системы Windows. 10.3. Автоматическая память Многие калькуляторы, даже простые, кроме регистра памяти, куда число заносится при нажатии специальной клавиши, снабжены памятью иного рода, которая называется автоматической (или константной). Эта память позволяет повторить последнее выполненное в результате нажатия клавиши «=» действие, а для использования содержимого этой памяти не нужно нажимать на какую-то специальную клавишу. Чтобы узнать, обеспечивает ли ваш калькулятор возможность использования автоматической памяти, выполните следующие действия: 1) введите, например, число 11; 2) нажмите клавишу «+»; 3) несколько раз нажмите клавишу «=». Если при каждом нажатии на клавишу «=» изображенное на индикаторе число будет увеличиваться на 11, то в вашем калькуляторе встроенная автоматическая память есть! В большинстве калькуляторов константой (числом, занесенным в автоматическую память) становится: при делении — делитель; при вычитании — вычитаемое; при сложении — второе слагаемое; при умножении — второй множитель. Скажем, если необходимо вычесть 38 из чисел 81, 113, 225 и 1200, то после нажатия клавиш 8 1 – 3 8 = значение –38 «отправляется на хранение» в константную память, после чего для вычитания 38 из других чисел после ввода каждого из них достаточно нажимать на клавишу «=».
Занимательная информатика 148 Использовать константу можно до тех пор, пока не будет очищен индикатор калькулятора или пока в автоматическую память не будет занесено другое число. Если после выполнения повторяющихся действий вам необходимо сделать что-то другое с числом, изображенным на индикаторе, то надо просто нажать клавишу требуемого арифметического действия, как будто это число только что введено. На некоторых калькуляторах константа может не запоминаться в памяти автоматически, как это было в описанных выше случаях. На так называемых «инженерных» калькуляторах (их называют также «калькуляторами для научных расчетов») для этого нужно нажимать на особую клавишу «K». Чтобы ввести в константную память какое-либо действие и число, необходимо сначала ввести их (они отобразятся на индикаторе), а затем нажать клавишу «K». После этого можно уже пользоваться константой, как в следующем примере: – 2 K 5 = Þ 9 = Þ Если на вашем калькуляторе нет клавиши «K», то для выполнения операций с константой попробуйте дважды нажать на клавишу операции, как показано ниже: 2 – – 5 = Þ 9 = Þ Если же ничего не получается, то ознакомьтесь с руководством по эксплуатации вашего калькулятора и узнайте, как на нем нужно работать с константой (и обеспечивается ли работа с ней) J. Задания* 1. Вычислите значения выражений: 1235 + 1235 = 12355 + 1235 + 1235 = 1235 + 1235 + 1235 + 1235 = 1235 + 1235 + 1235 + 1235 + 1235 = Примечание. Операцию умножения использовать нельзя. * Все эти задания надо выполнить на калькуляторе, используя автоматическую память.
10. Ваш помощник — калькулятор 149 2. Вычислите первый, второй, третий, …, десятый члены прогрессий: 1) арифметической, в которой первый член и разность соответственно равны 10,7 и 2,7; 2) геометрической, в которой первый член и знаменатель соответственно равны 1,8 и 2,1; 3) арифметической, в которой первый член и разность соответственно равны 128,5 и 12,1; 4) геометрической, в которой первый член и знаменатель соответственно равны 431,8 и 1/3. 3. Вычислите значения 210 и 220. 4. Когда растение посадили в горшок, его высота от поверхности земли в горшке составляла 1 см. Какова будет высота растения через 7 дней, если за один день она удваивается? В заключение дам полезный совет по использованию константной памяти. Если вам нужно пересчитать много различных предметов, то для этого удобно ввести в калькулятор операцию «+ 1» (нажав клавиши «+» и «1»), а затем для каждого предмета нажимать клавишу «=». 10.4. Использование клавиши обратного числа Как вы, конечно, знаете, в математике результат деления единицы на какое-либо число называют обратным числом. Например, числом, обратным к 2, является 0,5. На некоторых калькуляторах есть специальная клавиша для получения обратного числа — 1/х , при нажатии на которую выдается число, обратное имевшемуся на индикаторе. На калькуляторах же без такой клавиши обратные числа можно находить при помощи автоматической константы (см. выше): 2 ¸ = Нажав указанные клавиши, вы можете проверить, как работает ваш калькулятор: если получилось значение 0,5, то автоматическая константа вашего калькулятора дает обратное число, а если 1, то автоматическая константа дает не обратное число, а всего лишь результат деления числа на него самого. Задания 1. Интересно, что все числа, обратные 11 и числам, кратным 11 (22, 33 и др.), содержат две повторяющиеся цифры. Правда, из этого правила есть несколько исключений. Используя калькулятор, найдите такие числа, не превышающие 220.
Занимательная информатика 150 2. Возможность определения обратного числа позволяет оптимиA зировать расчеты на калькуляторе выражений вида . B +C 7 Предложите алгоритм расчета значения с минималь1,1 + 2,5 но возможным количеством нажатий клавиш. При этом вычислять знаменатель дроби без калькулятора нельзя. 10.5. Калькулятор-«переводчик» Если вычислить на калькуляторе выражение 170 × 1232 - 122 × 91 + 84, то получится число 7734. Если теперь перевернуть калькулятор «вверх ногами» (на 180°), то можно увидеть символы, похожие по начертанию на латинские буквы H, E, L и L (немецкое слово «hell» означает «светлый», «ясный», а английское «hell», наоборот, означает «ад», «преисподняя»). Для различных десятичных цифр такое соответствие между ними и буквами показано на рис. 10.2. Рис. 10.2 Задания Используя соответствие между цифрами на калькуляторе и буквами латинского алфавита, найдите русский перевод слов, «полученных» в результате расчета приведенных ниже выражений. 1. На английском языке: 1.1) 1522 + 3022 - 82 ; 1.2) 312 – 192 + 259,2 ×1.25; æ 12345 ö 1.3) ç + 2 ÷ ×1,5 + 262 – 2 3 ; ç 6,25 ÷ è ø 1.4) (85,2 · 45,5 + 1 : 2,5) · 1,85 – 1289 : 20;
10. Ваш помощник — калькулятор 151 1.5) 1.6) 1.7) 1.8) (458 · 0,85 + 0,7) · 1,5 + 31,2 · 2,5; 0,875 · 400 + 0,35 · 760; (222 · 355 + 1190) · 4,5 + 25,6 · 649,0625; 163 · 32 + 5 · 35 – 3; 22 368 130,9 1.9) ; + + 0,16 0,64 1,4 1.10) (544 · 6,25 +56,5 · 32) · 6,75 – 4 · 37; 1.11) (8,125 · 4,4 + 0,25)2 + 298,4 · 16,25 + 116 · 10,25; 724,5 . 1.12) (50,252 – 1: 16) × 2,8 + 1,265625 2. На немецком языке: 2.1) 1532 + 1552 + 1572 + 17 · 103; 2.2) 1248 · 84,21 – 1 : 12,5 – 1712 – 211 – 1; 2.3) 22 · 32 · (332 – 2 · 52); 2.4) (35 + 55 + 75) : 3,75 + 1,5 · 1172; 2.5) 12,5 · (1 : 3,125 + 6,5 · 464); 2.6) 6,25 · (4,4 · 152 – 3 · 143,12); 2.7) (1 : 0,03125 + 1 : 0,008) · 14, 85 + 5 · (312 – 0,72); 2.8) 8762 + 792 + 192 – 20164; 2.9) 26•( 240100 + 242064 + 246016 + 248004 ); 2.10) ((101 : 0,015625 – 3) · 9 + 0,76) · 6,25; 2.11) 33 3 + 142 + (3,86•1,25 - 1825) × 3; 2.12) 113 + 3,53 + 33 · 0,125. 3. На французском языке: 3.1) 29•1300 + 22,52 - 13,52 ; 3.2) 7 3 + 84,5 × 52 - 6,25 × 507,04 ; 3.3) 6,2 · 72 + 4,96 · 1,25; 3.4) 23 · (54,5 · 28 – 555 · 1,6) + 4; 3.5) 152 + 162 + 172 – 108,5 : 1,75; 3.6) 18,75 · 211 – 0,75 · 25; 3.7) 18,75•2030,72 + 1,83 – 4,57•1,3 - 2,5921; 3.8) 151,3 · 673,4 + 212 · 252 + 12,5 · 64,2864; 3.9) 7,13 + 3 · 4,363; 3.10) 23 · (112 · 13 + 6). Примечание. В некоторых случаях следует рассматривать целую часть от полученного результата.
Занимательная информатика 152 10.6. Фокус с датой рождения С использованием калькулятора можно продемонстрировать фокус, в котором вы всегда можете «отгадать» дату рождения любого человека. Попросите кого-нибудь из своих друзей или знакомых ввести в калькулятор число, соответствующее дате его рождения. Допустим, он родился 7 сентября 1995 г. Значит, будет введено число 7. Затем предложите ему умножить это число на 20, прибавить к результату 3, а полученную сумму умножить на 5. Затем попросите его прибавить к результату число, обозначающее месяц, в котором он родился, и снова умножить полученную сумму на 20, прибавить к результату 3 и умножить на 5. В заключение попросите его прибавить к полученному результату число, состоящее из двух последних цифр года, в котором он родился. Теперь возьмите этот калькулятор и вычтите из числа, показанного на индикаторе, значение 1515. Тогда полученное число и будет день, месяц и год рождения вашего друга, если читать его слева направо (если все сделано правильно, то в приведенном выше примере должно получиться число 70995). (Компьютерная программа для демонстрации этого фокуса описана в главе 11.) Первый манипулятор для управления курсором придумал американец Даг Энгельбарт. Он же назвал это устройство «мышью». Программист перед сном ставит себе на тумбочку два стакана. Один с водой — на случай, если захочет ночью пить, а второй пустой — на случай, если не захочет.
11 Компьютерные фокусы стать фокусником и удивить своих товарищей демонХ отите страцией компьютерных фокусов? Тогда эта глава — для вас J. 11.1. Компьютер отгадывает день рождения В этом компьютерном фокусе задача — «отгадать» день рождения любого человека, который отвечает на вопросы, задаваемые ему при выполнении программы. Соответствующая программа на школьном алгоритмическом языке имеет вид: алг Отгадывание_дня_рождения нач цел день, произведение, частное вывод нс, "Сейчас я отгадаю день Вашего рождения" |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> "" вывод нс, "Умножьте день своего рождения на 3" |Приостановка программы до нажатия любой клавиши ...
154 Занимательная информатика вывод нс, "Полученное произведение разделите нацело на 9" вывод нс, "и запомните или запишите частное и остаток" |Приостановка программы до нажатия любой клавиши ... вывод нс, "Частное умножьте на 3" |Приостановка программы до нажатия любой клавиши ... вывод нс, "Сколько получилось?" ввод произведение вывод нс, "Остаток разделите на 3" |Приостановка программы до нажатия любой клавиши ... вывод нс, "Сколько получилось?" ввод частное день := произведение + частное ОчисткаЭкрана вывод нс, "Вы родились ", день, "-го числа" кон (Здесь ОчисткаЭкрана — это стандартная процедура очистки экрана.) Для приостановки программы до нажатия любой клавиши в программах на других языках программирования можно использовать оператор цикла с постусловием: на Паскале: Repeat Until KeyPressed; на Бейсике: DO LOOP UNTIL INKEY$ <> "" 11.2. Компьютер отгадывает дату рождения Программа, представленная ниже, «отгадывает» не только день, но также и месяц и год рождения человека. (Суть этого фокуса описана в задаче 10.6 «Фокус с датой рождения» в главе 10.) алг Отгадывание_даты_рождения нач цел результат, день, месяц, год, разность, год_рожд, лит название_месяца вывод нс, "Сейчас я отгадаю дату " вывод "(день, месяц и год) Вашего рождения" |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> ""
11. Компьютерные фокусы 155 вывод нс, "Умножьте день своего рождения на 20" |Приостановка программы до нажатия любой клавиши ... вывод нс, "К полученному произведению прибавьте 3" |Приостановка программы до нажатия любой клавиши ... вывод нс, "Сумму умножьте на 5" |Приостановка программы до нажатия любой клавиши ... вывод нс, "К полученному произведению прибавьте " вывод нс, "номер месяца, в котором Вы родились" |Приостановка программы до нажатия любой клавиши ... вывод нс, "Умножьте полученное число на 20" |Приостановка программы до нажатия любой клавиши ... вывод нс, "К полученному произведению прибавьте 3" |Приостановка программы до нажатия любой клавиши ... вывод нс, "Сумму умножьте на 5" |Приостановка программы до нажатия любой клавиши ... вывод нс, "К полученному произведению прибавьте " вывод "число, образованное двумя последними цифрами " вывод "года, в котором Вы родились" вывод нс, "Сколько получилось?" ввод результат разность := результат - 1515 день := div(разность, 10000) месяц := div(mod(разность, 10000), 100) год := mod(разность, 100) |Определяем название месяца выбор при месяц = 1: название_месяца := " января " при месяц = 2: название_месяца := " февраля " ... при месяц = 12: название_месяца := " декабря " все |Определяем 4-значное значение года рождения год_рожд := 1900 + год |Считаем, что человек родился в ХХ веке
156 Занимательная информатика |Выводим ответ ОчисткаЭкрана вывод нс, "Вы родились ", день, название_месяца, год_рожд, " года" кон (ОчисткаЭкрана — стандартная процедура очистки экрана.) 11.3. Компьютерные фокусы на отгадывание чисел 11.3.1. Фокус ¹ 1 Предложите кому-нибудь задумать число, прибавить* к нему 3, умножить полученную сумму на 6, вычесть из этого произведения задуманное число, затем вычесть еще 8 и, наконец, разделить все это на 5. После этого компьютер легко определит задуманное число. Соответствующая программа: алг Фокус_1 нач цел x, n вывод нс, "Задумайте целое число, которое я отгадаю" |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> "" вывод нс, "Прибавьте к нему 3" |Далее фрагмент программы, относящийся к ее |приостановке, будет показан в виде многоточия (...) ... вывод нс, "Полученную сумму умножьте на 6" ... вывод нс, "Из полученного произведения вычтите задуманное число" ... вывод нс, "Из результата вычтите число 8" ... вывод нс, "И, наконец, разделите все это на 5" ... вывод нс, "Сколько получилось?" ... * Можно воспользоваться калькулятором.
11. Компьютерные фокусы 157 вывод нс, "Введем полученный результат" ввод n x := n - 2 ОчисткаЭкрана вывод нс, "Вы задумали число", x ... кон Этот фокус можно демонстрировать и без использования компьютера. Когда ваш товарищ назовет полученный результат (n), вы можете сразу же назвать задуманное им число (оно равно n – 2). Конечно, уже после нескольких демонстраций этого фокуса вас могут «раскусить» (или «расфокусить» J) — слишком уж очевиден его секрет. При демонстрации же следующего фокуса это сделать труднее... 11.3.2. Фокус ¹ 2 алг Фокус_2 нач цел x, y, n вывод нс, "Задумайте два целых числа (каждое " вывод "не более 99), которые я отгадаю" ... |Ожидание нажатия клавиши вывод нс, "Первое из них умножьте на 2" ... вывод нс, "К полученному произведению прибавьте 5" ... вывод нс, "Результат умножьте на 50" ... вывод нс, "К произведению прибавьте второе число" ... вывод нс, "И наконец, вычтите из результата " вывод "количество дней в году (невисокосном)" вывод нс, "Сколько получилось?" ... вывод нс, "Введем полученный результат" ввод n x := div(n + 115, 100) y := mod(n + 115, 100) вывод нс, "Вы задумали числа ", x , " и ", y кон Следующие фокусы будут связаны с отгадыванием не исходного числа, а результата расчетов. Для каждого из них приведен перечень сообщений, выводимых на экран монитора. Подумайте над тем, в чем заключается секрет каждого из этих фокусов.
Занимательная информатика 158 11.3.3. Фокус ¹ 3 1. 2. 3. 4. 5. 6. Задумайте число. Умножьте его на 2. Прибавьте 48. Разделите на 2. Вычтите задуманное число. У вас получилось 24. 11.3.4. Фокус ¹ 4 1. 2. 3. 4. 5. 6. Задумайте однозначное число. Умножьте его на 3. Прибавьте 3. Умножьте на 3. Найдите сумму цифр полученного числа. У вас получилось 9. 11.3.5. Фокус ¹ 5 1. 2. 3. 4. 5. Задумайте трехзначное число. Припишите к нему справа это же самое число. Полученное шестизначное число разделите на 11. Результат разделите на задуманное число. У вас получилось 91. 11.3.6. Фокус ¹ 6 1. 2. 3. 4. 5. 6. 7. 8. Задумайте число. Умножьте его на 6. Прибавьте 50. Разделите на 2. Вычтите 4. Разделите на 3. Вычтите задуманное число. У вас получилось 7. 11.3.7. Фокус ¹ 7 1. 2. 3. 4. 5. 6. 7. Задумайте число. Умножьте его на 2. Прибавьте 12. Разделите на 2. Вычтите 5. Вычтите задуманное число. У вас получилось 1.
11. Компьютерные фокусы 11.3.8. Фокус ¹ 8 1. 2. 3. 4. 5. 6. 7. 8. Задумайте число. Умножьте его на 6. Прибавьте 22. Разделите на 2. Вычтите 2. Разделите на 3. Вычтите задуманное число. У вас получилось 3. 11.3.9. Фокус ¹ 9 1. 2. 3. 4. 5. 6. 7. Задумайте число. Умножьте его на 2. Прибавьте 14. Разделите на 2. Вычтите 4. Вычтите задуманное число. У вас получилось 3. 11.3.10. Фокус ¹ 10 1. 2. 3. 4. 5. Задумайте трехзначное число. Припишите к нему справа это же самое число. Полученное шестизначное число разделите на 13. Результат разделите на задуманное число. У вас получилось 77. 11.3.11. Фокус ¹ 11 1. 2. 3. 4. 5. 6. 7. Задумайте число. Умножьте его на 2. Прибавьте 36. Разделите на 2. Вычтите 8. Вычтите задуманное число. У вас получилось 10. 11.3.12. Фокус ¹ 12 1. 2. 3. 4. Задумайте число. Умножьте его на 6. Прибавьте 46. Разделите на 2. 159
Занимательная информатика 160 5. 6. 7. 8. Вычтите 5. Разделите на 3. Вычтите задуманное число. У вас получилось 6. Программы для демонстрации этих фокусов разработайте самостоятельно. Учитывая, что в них будут повторяться одни и те же фразы («Задумайте число», «Задумайте трехзначное число», «Умножьте на …», «У вас получилось …» и т. п.), желательно: 1) описать эти фразы как глобальные константы: лит Задум, Задум3, Умн, Разд, Разд6, Приб, Выч, ВычЗадум, Припис, НайдСум, Получ Задум := "Задумайте число" Задум3 := "Задумайте трехзначное число" Умн := "Умножьте на " Разд := "Разделите на " Разд6 := "Полученное шестизначное число разделите на " Приб := "Прибавьте " Выч := "Вычтите " ВычЗадум := "Вычтите задуманное число" Припис := "Припишите к нему справа то же самое число" НайдСум := "Найдите сумму цифр полученного числа" Получ := "У вас получилось " 2) оформить каждый фокус в виде отдельной процедуры. Например, для фокуса ¹ 3 соответствующая процедура будет иметь вид: алг Фокус_3 нач вывод нс, Задум ... |Ожидание нажатия клавиши вывод нс, Умн, 2 ... вывод нс, Приб, 48 ... вывод нс, Разд, 2 ... вывод нс, Выч, 6 ... вывод нс, ВычЗадум ... вывод нс, Получ, 18 ... кон
11. Компьютерные фокусы 161 3) предусмотреть в главной части программы случайный выбор того или иного фокуса, а затем вызывать соответствующую процедуру, используя оператор варианта (выбора). Вся программа при этом может иметь вид: |Глобальные константы литерного (строкового) типа лит Задум, Задум3, Умн, Разд, Разд6, Приб, Выч, ВычЗадум, Припис, НайдСум, Получ Задум := "Задумайте число" ... алг Фокусы |Главная часть программы нач цел нф |номер фокуса вывод нс, "Выберем фокус" |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> "" |Получаем случайное число в интервале от 3 до 12 нф := 3 + rnd(10) выбор при нф = 3: Фокус_3 при нф = 4: Фокус_4 ... при нф = 12: Фокус_12 все |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> "" кон алг Фокус_3 нач ... 11.4. Компьютерный фокус «Отгадай число» В основе этого фокуса лежит известная игра с таким же названием. Напомню ее правила. Один из участников игры (ведущий) загадывает целое число (например, меньшее 100). Второй участник должен отгадать это число, делая несколько попыток и называя свое число. При несовпадении названного и задуманного чисел ведущий сообщает, какое из них больше, после чего делается следующая попытка и т. д. до отгадывания. Вы, конечно, уже догадались, как должен действовать отгадывающий — при первой попытке он должен назвать число 50; потом, в зависимости от от-
162 Занимательная информатика вета, — 25 или 75 и т. п. Такой принцип, позволяющий отгадать число за минимально возможное количество попыток, называется методом бинарного поиска (деления отрезка пополам). Компьютерный фокус состоит в следующем. Фокусник — вы, сидящий у компьютера, — просит зрителей задумать любое целое число. Компьютер должен это число отгадать, выдавая на экран свои предположения. Зрители, глядя на эти предположения, называют любые слова (например, свои имена), которые вы вводите в компьютер с клавиатуры. Компьютер же отгадывает число, причем делает это методом бинарного поиска, т. е. за минимально возможное количество попыток. Секрет фокуса: набирая на компьютере очередное названное слово, вы незаметно для зрителей вводите в компьютер информацию о том, справа или слева в числовом ряду находится задуманное число относительно последнего предположения машины. Передать эту информацию в программу можно различными способами. В нашей программе это делается с помощью пробела, который вводится (или не вводится) в конце слова. Основные величины, используемые в программе: l мин и макс — левая и правая границы интервала, в котором расположено искомое число; l серед — середина этого интервала; l номер_попытки — номер попытки угадывания числа; l имя — имя одного из зрителей; l отгадал — имеет значение «у» (латинская буква), если число угадано; иначе — «n». Программа для угадывания чисел: алг Фокус нач цел мин, макс, серед, номер_попытки, лит имя, отгадал вывод нс, "Задумайте целое число в интервале от 1 до 99" вывод нс, "Сейчас я отгадаю его за несколько попыток!" |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> "" мин := 1; макс := 99 номер_попытки := 0 нц |Цикл "угадывания" числа |Очередная попытка номер_попытки := номер_попытки + 1 серед := (мин + макс)/2
11. Компьютерные фокусы 163 вывод нс вывод нс, номер_попытки, вывод нс, "-я попытка. Вы задумали число ", серед вывод нс, "Я прав?" нц отгадал := getkey()| Ждем нажатия клавиш "y" или "n" кц_при отгадал = "y" или отгадал = "n" если отгадал = "y" то вывод нс, "ДА!" иначе вывод нс, "НЕТ!" все |Приостановка программы до нажатия любой клавиши ... если отгадал = "n" |Если ответ неверный то вывод нс, "Кто это сказал? Как Вас зовут?" |Вводим имя зрителя ввод имя |Меняем границы интервала поиска если имя[длин(имя)] = " " |Если последний символ имени - пробел то мин := серед иначе макс := серед все все кц_при отгадал = "y" вывод нс, "Число отгадано!" вывод нс, "Количество попыток - ", номер_попытки вывод нс, "Какой я умный! " |Приостановка программы до нажатия любой клавиши ... кон Примечания 1. Функция getkey() возвращает символ нажатой клавиши. В языке Паскаль ее аналогом является функция readkey, в Бейсике — INKEY$, а в Си — getch(). 2. Чтобы при определении задуманного числа увеличить значение мин, в конце имени зрителя необходимо ввести пробел; для уменьшения значения макс пробел вводить не нужно.
Занимательная информатика 164 Впрочем, не исключено, что при таком способе передачи информации в программу вас могут уличить в «подсказке». Более эффектным является другой способ, который заключается в выдерживании различных пауз между вводом, например, первого и второго символов имени зрителя. Для ввода имени при этом следует использовать программные средства, контролирующие нажатие одной клавиши (соответствующие функции перечислены выше в примечании 1), а также функции и процедуры, отслеживающие время. В представленной далее программе используются следующие основные величины (кроме мин, макс, серед, отгадал и номер_попытки, применявшихся в первом варианте программы): l l l l l i — порядковый номер символа в имени зрителя; время1 — время в момент ввода первого символа; время2 — время в момент ввода второго символа; время — промежуток времени между вводом первого и второго символов; предельное_время — предельное значение промежутка времени между вводом первого и второго символов, в зависимости от которого происходит изменение границ интервала поиска мин и макс. Это значение подбирается экспериментально. Передачу в программу информации, в зависимости от которой происходит изменение значений мин и макс, можно проводить по следующему правилу: если время > предельное_время, то задуманное число больше последнего предположения компьютера (т. е. нужно увеличить значение мин), в противном случае — оно меньше (нужно уменьшить значение макс). Обратим также внимание на то, что результатом функции getkey() является литерная (строковая) величина, значением которой может быть и символьное значение специальных клавиш (Enter, функциональных, клавиш перемещения курсора и др.). В программе имя этой величины — с. алг Фокус нач цел мин, макс, серед, номер_попытки, время1, время2, время, предельное_время, i, лит отгадал, с вывод нс, "Задумайте целое число в интервале от 1 до 99" вывод нс, "Сейчас я отгадаю его за несколько попыток!" |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> ""
11. Компьютерные фокусы мин := 1; макс := 99 предельное_время := 2000 165 |Значение подбирается |экспериментально номер_попытки := 0 нц |Цикл "угадывания" числа |Очередная попытка номер_попытки := номер_попытки + 1 серед := (мин + макс)/2 вывод нс вывод нс, номер_попытки, вывод нс, "-я попытка. Вы задумали число ", серед вывод нс, "Я прав?" нц отгадал := getkey() |Ждем нажатия клавиш "y" или "n" кц_при отгадал = "y" или отгадал = "n" если отгадал = y" то вывод нс, "ДА!" иначе вывод нс, "НЕТ!" все |Приостановка программы до нажатия любой клавиши ... если отгадал = "n" |Если ответ неверный то вывод нс, "Кто это сказал? Как Вас зовут?" вывод нс i := 0 нц |Цикл ввода символов имени i := i + 1 c := getkey() |Ждем нажатия клавиши если с <> "Enter" |Если ввод символов имени |не окончен то вывод с |Повторяем символ на экране все выбор при i = 1: время1 := время |Нас интересуют |только первый при i = 2: время2 := время |и второй символ |имени время := время2 - время1 все кц_при с = "Enter"
166 Занимательная информатика |Меняем границы интервала поиска если время > предельное_время то мин := серед иначе макс := серед все все кц_при отгадал = "y" вывод нс, "Число отгадано!" вывод нс, "Количество попыток - ", номер_попытки вывод нс, "Какой я умный!" |Приостановка программы до нажатия любой клавиши ... кон В заключение дам несколько подсказок по разработке аналогичных программ на других языках программирования. 1. В программе на Паскале проконтролировать, нажата ли клавиша Enter, можно следующим образом: c := readkey; if c <> #13 then ... На языке Бейсик такой контроль выполняется при помощи фрагмента программы: c$ = INKEY$ IF c$ <> CHR$(13) THEN ... 2. Для определения значений времени в момент ввода первого и второго символов в Паскале используется процедура GetTime, а в Бейсике — функция TIMER. 11.5. Фокус «Отгадывание названий» Суть фокуса — следующая. На экране монитора показывается картинка, изображенная на рис. 11.1. Вы приглашаете к монитору одного из зрителей и предлагаете ему: «Я сейчас отвернусь, а вы нажмите клавишу с цифрой 1. В прямоугольниках появятся названия рыб. Загадайте, какую рыбу я должен поймать, напишите ее название на листе бумаги, после чего нажмите клавишу с цифрой 2».
11. Компьютерные фокусы 167 Рис. 11.1 Играющий нажимает клавишу с цифрой 1, и экран приобретает вид, показанный на рис. 11.2. Рис. 11.2 Играющий загадывает одно из слов, записывая его на бумаге, и нажимает клавишу с цифрой 2, — на экране восстанавливается первоначальная картинка. После этого вы поворачиваетесь к экрану и говорите: «Сейчас я поймаю вашу рыбку. Будьте внимательны. Я буду дотрагиваться волшебной палочкой* до букв, а вы про себя произносите буквы задуманного вами слова. На каждое мое касание мысленно произносите одну букву, начиная с первой. Как только вы произнесете последнюю букву вашего слова, скажите вслух «Cтоп». Итак, начали...». Вы дотрагиваетесь до прямоугольников, и как только загадавший скажет «стоп», предложите ему снова нажать клавишу с цифрой 1 (вы при этом палочку от экрана не отнимаете). При нажатии клавиши с цифрой 1 в прямоугольниках вновь появляются слова и оказывается, что волшебная палочка указывает как раз на задуманную играющим рыбу J! Ваша задача крайне проста: нужно первые два касания выполнить в произвольном порядке, а затем касаться букв в прямоугольниках так, чтобы из этих букв составлялось слово ФОКУСЫ. Все остальное получится само собой — на какой букве играющий прервет ваши касания, там обязательно и будет задуманное им слово. * Ее надо подготовить заранее.
168 Занимательная информатика Секрет фокуса — в том, что названия рыб расположены по порядку касаний так, что каждое последующее название на одну букву длиннее предыдущего. Поэтому, произнося задуманное слово побуквенно, загадывающий слово сам отсчитывает нужное вам количество шагов. Буквы же слова ФОКУСЫ нужны для того, чтобы указать вам порядок касаний. Кроме того, они запутывают зрителей, мешая им разгадать секрет фокуса. Слова для фокуса можно подбирать любые, лишь бы в них было необходимое количество букв. Это могут быть названия птиц, зверей, домашних животных и т. д. Программа, используемая во время демонстрации фокуса, выглядит следующим образом: алг Фокус нач сим с ОчисткаЭкрана Буквы нц с := getkey() кц_при с = "1" ОчисткаЭкрана Названия нц с := getkey() кц_при с = "2" ОчисткаЭкрана Буквы нц с := getkey() кц_при с = "1" Очистка экрана Названия кон |Ждем нажатия клавиши с цифрой 1 |Ждем нажатия клавиши с цифрой 2 |Ждем нажатия клавиши с цифрой 1 Здесь ОчисткаЭкрана — стандартная процедура очистки экрана, Буквы — вспомогательная процедура*, изображающая на экране буквы в прямоугольниках (см. рис. 11.1), Названия — вспомогательная процедура, изображающая названия рыб в прямоугольниках (см. рис. 11.2), getkey() — функция, возвращающая символ на нажатой клавише. (Как отмечалось в задаче 11.4, в языке программирования Паскаль ее аналогом является функция readkey, а в Бейсике — INKEY$.) * Если вы не знакомы с правилами оформления собственных процедур, то вместо процедур Буквы и Названия можно просто включить в программу операторы, печатающие на экране буквы и названия рыб в прямоугольниках.
11. Компьютерные фокусы 169 11.6. Варианты фокуса «Отгадывание названий» Рассмотрим еще несколько вариантов предыдущего фокуса. 11.6.1. Первый фокус отличается тем, что: 1) в нем используется восемь названий животных, расположенных, как показано на рис. 11.3; Рис. 11.3 2) перед началом демонстрации фокуса перед играющим появляются восемь «пустых» прямоугольников (в предыдущем фокусе в прямоугольниках были записаны буквы слова ФОКУСЫ, помогающие вам перемещать «волшебную палочку» от одного прямоугольника к другому); 3) перемещение по прямоугольникам здесь осуществляется так: два первых касания вы делаете в произвольном порядке, а затем движетесь от левого нижнего прямоугольника (со словом «лев») по линиям «магической звезды» — перепрыгивая через два прямоугольника против часовой стрелки («лев» — «слон» — «олень» и т. д.). Ясно, что эти линии на экран не выводятся, играющий и зрители о них, конечно, не подозревают, а поскольку первые касания фокусник каждый раз может делать иначе, то заподозрить систему в его движениях зрители, как правило, не могут. Программа, используемая во время демонстрации этого фокуса, имеет вид: алг Фокус1 нач сим с ОчисткаЭкрана Названия |Играющий задумывает название
170 Занимательная информатика нц с := getkey() кц_при с = "2" |Ждем нажатия клавиши с цифрой 2 ОчисткаЭкрана Прямоугольники |Фокусник дотрагивается до прямоугольников нц с := getkey() кц_при с = "1" |Ждем нажатия клавиши с цифрой 1 ОчисткаЭкрана Названия |"Волшебная палочка" фокусника |указывает на задуманное слово кон Здесь ОчисткаЭкрана, Названия и Прямоугольники — процедуры, описанные в предыдущем фокусе; getkey() — функция, возвращающая символ нажатой клавиши (также см. предыдущий фокус). 11.6.2. Второй фокус аналогичен только что описанному, с той разницей, что названия в прямоугольниках выбираются случайным образом из шести различных наборов: 1) лев, слон, олень, барсук, носорог, обезьяна, горностай, землеройка; 2) сиг, карп, угорь, лосось, корюшка, скумбрия, нототения, барабулька; 3) сыч, грач, цапля, ворона, соловей, ласточка, коростель, трясогузка; 4) жук, муха, пчела, короед, бабочка, стрекоза, светлячок, долгоносик; 5) дом, изба, сарай, здание, строение, постройка, небоскреб, сооружение; 6) нож, стол, вилка, стакан, тарелка, половник, мясорубка, сковородка. В приведенной ниже программе для вывода каждого из этих наборов используется отдельная процедура, а выбор набора, выводимого на экран, осуществляется случайным образом. алг Фокус2 нач сим с, цел n ОчисткаЭкрана |Определяем номер набора названий n := rnd(6) + 1
11. Компьютерные фокусы 171 выбор |Выводим соответствующий набор при n = 1: НазванияЖивотных при n = 2: НазванияРыб при n = 3: НазванияПтиц при n = 4: НазванияНасекомых при n = 5: НазванияСтроений иначе: НазванияКухоннойУтвари все |Играющий задумывает название нц с := getkey() кц_при с = "2" |Ждем нажатия клавиши с цифрой 2 ОчисткаЭкрана Прямоугольники |Фокусник дотрагивается до прямоугольников нц с := getkey() кц_при с = "1" |Ждем нажатия клавиши с цифрой 1 Очистка экрана выбор при n = 1: НазванияЖивотных ... при n = 5: НазванияСтроений иначе: НазванияКухоннойУтвари все |"Волшебная палочка" фокусника |указывает на задуманное слово кон 11.6.3. Третий фокус — самый эффектный. Фокусник делает так, чтобы играющий втайне от него выбирал еще и слова для заполнения прямоугольников. Для этого на экран сначала выводится перечень тематических групп, например: Выберите номер группы: 1. Животные. 2. Рыбы. 3. Птицы. 4. Насекомые. 5. Строения. 6. Кухонная утварь. Ваш выбор:
Занимательная информатика 172 Когда группа выбрана, прямоугольники на экране заполняются соответствующими словами. Играющему будет казаться, что он совсем «запутал» фокусника, но это добавление нисколько не усложнит его задачу: ведь в каждый прямоугольник, находящийся на одной и той же позиции, всякий раз будут вписываться слова с одним и тем же количеством букв, и «магическая звезда» будет действовать точно так же, как и ранее («волшебная палочка» обязательно остановится на задуманном названии). 11.7. Игра-упражнение «Поймай слово» Описанные в предыдущих разделах фокусы можно положить в основу компьютерной программы-игры, проверяющей правописание редких слов с двойными согласными. Суть этой игры состоит в следующем. Сначала на экране появляется картинка, показанная на рис. 11.4. Рис. 11.4 Вы называете одно из слов, показанных в прямоугольниках, и предлагаете кому-либо из играющих определить его правильное написание. Для этого вы нажимаете клавишу с цифрой 2, и на экране появляются пустые прямоугольники. Теперь вы каждый раз спрашиваете играющего «Идем дальше?», а играющий должен отсчитывать (мысленно или на бумаге) каждую букву названного слова и при необходимости отвечать «Да». Когда, по его мнению, все буквы слова будут отсчитаны, он должен ответить «Нет». На ответы «Да» вы, как и раньше, сначала два раза касаетесь прямоугольников в произвольном порядке, затем — нижнего левого прямоугольника, а потом — прямоугольников по линиям «магической звезды». После прекращения перемещений вы на-
11. Компьютерные фокусы 173 жатием клавиши с цифрой 1 вызываете на экран исходную картинку (см. рис. 11.4). При правильном решении «волшебная палочка» должна указывать на объявленное вами слово. Иначе палочка остановится на другом слове. Вы можете также показать заранее подготовленную табличку с правильным написанием объявленного слова* (см. рис. 11.5). Затем игра повторяется для другого слова. Рис. 11.5 Программа, используемая во время демонстрации этой игрыупражнения, имеет следующий вид: алг Игра-упражнение нач сим с ОчисткаЭкрана Названия нц с := getkey() кц_при с = "2" |Ждем нажатия клавиши с цифрой 2 ОчисткаЭкрана Прямоугольники |Ведущий спрашивает играющего |и дотрагивается до прямоугольников нц с := getkey() кц_при с = "1" |Ждем нажатия клавиши с цифрой 1 * Выводить на экран правильное написание всех слов (см. рис. 11.5) нецелесообразно, так как при этом участники игры увидят правильное написание и других слов. Подумайте, как можно было бы модифицировать приведенную здесь программу, чтобы на экран выводилось правильное написание только нужного слова.
174 Занимательная информатика Очистка экрана Названия |При правильном решении |"волшебная палочка" играющего |указывает на объявленное слово кон Другие наборы слов для этой игры: 1. Сэ(р,рр), а(л,лл)оэ, та(л,лл)ер, ску(т,тт)ер, ко(р,рр)ида, опере(т,тт)а, ко(р,рр)ектор, кастанье(т,тт)ы (ответы: сэр, алоэ, талер, скутер, коррида, оперетта, корректор, кастаньеты); 2. Мэ(р,рр), му(с,сс), пре(с,сс), стре(с,сс), ми(л,лл)ион, фо(р,рр)ейтор, апе(л,лл)яция, а(к,кк)редитив (ответы: мэр, мусс, пресс, стресс, миллион, форейтор, апелляция, аккредитив); 3. Пэ(р,рр), ва(т,тт), а(л,лл)юр, а(к,кк)орд, ба(с,сс)ейн, а(н,нн)аконда, ба(р,рр)икады, а(п,пп)ликация (ответы: пэр, ватт, аллюр, аккорд, бассейн, анаконда, баррикады, аппликация). Заметим, что в описанных выше игре и фокусах не обязательно начинать движения по буквам слова ФОКУСЫ или по линиям «магической звезды» после двух произвольных касаний — количество предварительных касаний можно увеличивать. Это позволит соответственно увеличить количество букв для кратчайшего слова. 11.8. «Отгадыватель мыслей» В заключение «научим» компьютер отгадывать не числа, слова или даты, а… мысли. Не верите? Тогда зайдите на сайт http://chess-school20080.narod.ru/Raznoe/Misli/Misli.htm и в разделе «Разное» выберите второй пункт. Вам нужно загадать двузначное число, вычесть из него сумму его цифр, найти полученную разность в имеющейся таблице и запомнить символ рядом с этой разностью. Затем нужно щелкнуть на прямоугольной кнопочке и... — впрочем, вы всё увидите сами. Секрет этого фокуса я раскрывать не буду*, а сразу приведу программу, которая демонстрирует такой фокус. В ней используется двумерный массив т строкового типа из 9 строк и 20 столбцов. В каждом нечетном столбце мы запишем числа от 5 до 94 (по возрастанию, расположив эти числа по строкам), а в каждом четном столбце — символы (генерируя случайным образом коды этих символов). Другие особенности программы описаны в комментариях к ней. * Желающие могут сами сделать это, проанализировав приведенную далее программу.
11. Компьютерные фокусы 175 алг Отгадыватель_мыслей нач лит таб т[1:9, 1:20], цел i, j, код, сим свой ОчисткаЭкрана |Выводим на экран информацию о порядке действий вывод нс, "Задумайте 2-значное число." вывод нс, "Вычтите из него сумму его цифр." вывод нс, "Разность запомните. Если Вы готовы -" вывод нс, "нажмите любую клавишу, найдите эту" вывод нс, "разность в появившейся таблице" вывод нс, "и запомните символ справа от нее." |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> "" |Заполняем массив |Записываем в него числа, нц для i от 1 до 9 нц для j от 1 до 10 т[i, 2 * j - 1]:= лит(10 * (i - 1) + (j - 1) + 5) кц кц |а затем символы нц для i от 1 до 9 нц для j от 1 до 10 |Рассчитываем код код := 150 + rnd(105) |Записываем соответствующий символ т[i, 2 * j] := сим(код) кц кц |Определяем (случайным образом) "свой" символ |и записываем его в массив на "соответствующие" места код := 150 + rnd(105) свой := сим(код) нц для i от 1 до 9 нц для j от 1 до 10 если mod(цел(т[i, 2 * j - 1]), 9) = 0 то т[i, 2 * j] := свой все кц кц |Выводим весь массив ОчисткаЭкрана
Занимательная информатика 176 вывод нс, т вывод нс, "Если Вы нашли нужный символ," вывод нс, "нажмите любую клавишу" |Приостановка программы до нажатия любой клавиши нц кц_при inkey() <> "" ОчисткаЭкрана вывод нс, "Вы нашли символ ", свой, " - Невероятно!" кон Примечание. Функция лит возвращает строковое представления числа (ее аргумента), функция сим возвращает символ, код которого равен числу, указанному в качестве ее аргумента, а функция цел — числовое представление строки цифр. Аналоги этих функций в языках программирования Паскаль и Бейсик приведены в табл. 11.1. Таблица 11.1 Функция Язык Паскаль Язык Бейсик лит Процедура STR Функция STR$ сим Функция CHR Функция CHR$ цел Процедура VAL Функция VAL Напомним также, что в Бейсике нумерация строк и столбцов двумерного массива начинается с нуля. У программиста спрашивают: — Не помнишь, сколько будет два в четвертой степени? — (Без запинки) Шестнадцать. А два в шестнадцатой? — (Без запинки) Шестьдесят пять тысяч пятьсот тридцать шесть. — Вот голова, ну ты даешь! Ну, а три в четвертой? — (После паузы) Не помню точно. Кажется, дробное число получается.
12 Моделирование простейших игр на компьютере Кто сам пилит свои дрова, тот согревается дважды (Французская поговорка) Кто сам программирует свои компьютерные игры, тот наслаждается дважды (Из книги Ж. Арсака «Программирование игр и головоломок» — М.: Наука, 1985) втор уверен, что вы, реализовав на компьютере описанные в этой главе несложные игры, наверняка согласитесь со втоА рым эпиграфом... 12.1. Игра «Чет или нечет»? 12.1.1. Программа на школьном алгоритмическом языке Правила игры. Играющий в ответ на появляющийся на экране вопрос «Чет (2) или нечет (1)?» вводит одно из двух чисел — 1 или 2, после чего компьютер случайным образом генерирует одно
178 Занимательная информатика из них. Результат сравнения введенного числа с фактическим выводится на экран. Цель игры — угадать их совпадение. Простейший вариант программы «Чет или нечет?» имеет вид: алг Чет_или_нечет? нач цел число_компьютера, ответ нц вывод нс, "Чет (2) или нечет (1)?" ввод ответ если ответ <> 1 и ответ <> 2 то вывод нс, "Надо вводить 1 или 2!" вывод нс, "Попробуйте еще раз" все кц_при ответ = 1 или ответ = 2 число_компьютера := 1 + rnd(2) вывод нс, "Число компьютера: ", число_компьютера вывод нс, "То есть Вы " если число_компьютера = ответ то вывод "выиграли!" иначе вывод "проиграли!" все кон Комментарии к программе: 1) используются переменные число_компьютера (число, генерируемое компьютером) и ответ (число, введенное играющим); 2) производится проверка корректности введенного значения ответ; в случае ошибочного значения (не 1 и не 2) предлагается ввести число повторно (использован оператор цикла с постусловием); 3) для получения случайного числа, равного 1 или 2, используется функция rnd (аналогичная функция имеется и в других языках программирования). Можно повторять вопрос и ввод ответа несколько раз. В таком варианте игры необходимо вести подсчет правильных ответов, а затем определять общий результат игры. В приведенной ниже программе переменная, хранящая количество правильных ответов, имеет имя прав.
12. Моделирование простейших игр на компьютере 179 цел n n := 11 |Количество вопросов алг Чет_или_нечет? нач цел число_компьютера, ответ, прав, i прав := 0 |Количество правильных ответов нц для i от 1 до n нц вывод нс, "Чет (2) или нечет (1)?" ввод ответ если ответ <> 1 и ответ <> 2 то вывод нс, "Надо вводить 1 или 2!" вывод нс, "Попробуйте еще раз" все кц_при ответ = 1 или ответ = 2 число_компьютера : = 1 + rnd(2) вывод нс, "Число компьютера: ", число_компьютера если число_компьютера = ответ то прав := прав + 1 все кц вывод нс, "Количество правильных ответов:", прав вывод нс, "Количество неправильных ответов:", n - прав если прав > n - прав то вывод нс, "То есть Вы выиграли!" иначе вывод нс, "То есть Вы проиграли!" все кон Самостоятельно разработайте вариант программы, в которой все 11 чисел, генерируемых компьютером, выводятся на экран одновременно после ввода играющим «своих» 11 чисел. Для хранения чисел, введенных играющим и сгенерированных компьютером, используйте два массива. 12.1.2. Игра в среде Microsoft Excel Вариант 1 Правила игры. Играющий в ответ на имеющийся вопрос «Чет (2) или нечет (1)?» (рис. 12.1) вводит число 1 или 2.
Занимательная информатика 180 1 2 3 4 A Игра «Чет или нечет?» Чет (2) или нечет (1)? -> Число компьютера: B С Рис. 12.1 После ввода ответа в ячейку В2 программа Excel случайным образом генерирует в ячейке В3 число 1 или 2 и определяет результат («Верно» или «Неверно»). Для реализации этих действий в ячейку В3 надо ввести формулу: =1 + ЦЕЛОЕ(СЛЧИС() * 2) а в ячейку В4 — формулу: =ЕСЛИ(B2 = B3; "Верно"; "Неверно") Однако при таком заполнении листа Excel еще до ввода ответа играющего в ячейку В2 проявятся два недостатка: 1) в ячейке В3 будет уже выведено какое-то «предыдущее» число. И хотя «верить» этому значению играющий не может (так как после ввода числа в ячейку В2 значение в ячейке В3 может измениться), все равно лучше было бы сделать так, чтобы в ячейке В3 случайное число появлялось только после ввода значения в ячейку В2. Это можно сделать, используя функцию ЕПУСТО*: =ЕСЛИ(ЕПУСТО(В2); ""; 1 + ЦЕЛОЕ(СЛЧИС() * 2) 2) в ячейке В4 изначально будет выведен ответ «Неверно», что не совсем корректно. Чтобы устранить этот недостаток, здесь тоже следует применить функцию ЕПУСТО. При этом формула в ячейке В4 будет выглядеть несколько громоздко: =ЕСЛИ(ЕПУСТО(B2); ""; ЕСЛИ(B2 = B3; "Верно"; "Неверно")) но зато ответы в ячейке В4 будут появляться только при наличии числа в ячейке В2. Вариант 2 Правила игры. Играющий должен ввести 11 случайных чисел 1 или 2 (ячейки В3:В13), после чего в ячейках С3:С13 появляются числа, сгенерированные компьютером, а также определяется результат игры (рис. 12.2). * С особенностями этой функции ознакомьтесь самостоятельно.
12. Моделирование простейших игр на компьютере 1 2 3 4 ... 13 14 15 16 17 18 19 A B Игра «Чет или нечет?» Номер числа Ваше мнение: чет (2) или нечет (1)? 1 2 2 1 ... ... 11 1 181 C D Число компьютера 2 2 ... 1 Результат: правильных ответов: неправильных ответов: Итог Рис. 12.2 В ячейке В18 должен быть выведен текст «Вы выиграли» или «Выиграл компьютер» (ничьей быть не может!). Текст в ячейках А15:A18 и В16:В18 должен выводиться только после заполнения играющим ячейки В13 и исчезать после ее очистки. Определение количества правильных и неправильных ответов: 1) в одном из столбцов, которые играющий не видит (например, в столбце М за пределами экрана или в скрытом столбце), можно получить ответы на вопрос о том, отгадано ли каждое из 11 чисел (рис. 12.3). Это можно сделать с помощью функции ЕСЛИ; ... 1 2 3 4 ... 13 14 M да нет ... да Рис. 12.3 N
182 Занимательная информатика 2) количество правильных и неправильных ответов теперь определяется с использованием функции СЧЕТЕСЛИ* применительно к значениям в диапазоне М3:М13. Необходимые формулы запишите самостоятельно. 12.2. Игра «Отгадай число» Условия игры. Компьютер генерирует случайное целое число, меньшее 100. Играющий пытается отгадать это число, делая несколько попыток, при каждой из которых он вводит свое число. При несовпадении «задуманного» числа и числа-ответа компьютер сообщает, какое из этих чисел больше, после чего играющий вновь вводит число, и т. д. до отгадывания. В приведенной ниже программе на школьном алгоритмическом языке использованы следующие переменные: l число_компьютера — число, генерируемое компьютером; l ответ — число, вводимое играющим; l n — количество попыток (введенных чисел, включая отгаданное число). алг Отгадай_число нач цел х, у, n число_компьютера := rnd(100) вывод "Компьютер ’загадал’ число в интервале от 0 до 99" |Отгадывание n := 0 |Число попыток нц n := n + 1 |Очередная попытка вывод нс, "Наберите свое число." ввод ответ если число_компьютера > ответ то вывод нс, "Загаданное число больше." все если число_компьютера < ответ то вывод нс, "Загаданное число меньше." все кц при число_компьютера = ответ вывод нс, "Правильно!" вывод нс, "Число попыток до отгадывания = ", n кон * С тем, как работает функция СЧЕТЕСЛИ, ознакомьтесь самостоятельно.
12. Моделирование простейших игр на компьютере 183 Предлагаем читателям ответить на вопрос: как должен действовать играющий, чтобы отгадать задуманное число за минимальное количество попыток? 12.3. Игра «Кубик» Эта игра моделирует бросание игрального кубика каждым из двух участников, после чего определяется результат: у кого выпало больше очков. 12.3.1. Программа на школьном алгоритмическом языке алг Кубик нач лит имя1, имя2, цел к1, к2 вывод нс, "Введите имя первого игрока" ввод имя1 вывод нс, "Введите имя первого игрока" ввод имя2 вывод нс, "Для 'бросания' кубика первым игроком" вывод "нажмите любую клавишу" нц кц_при inkey <> "" к1 := 1 + rnd(6) вывод нс, "Выпало: ", к1 вывод нс, "Для 'бросания' кубика вторым игроком" вывод "нажмите любую клавишу" нц кц_при inkey <> "" к2 := 1 + rnd(6) вывод нс, "Выпало: ", к2 если к2 > к1 то вывод нс, "Выиграл(а)", имя2 иначе если к2 < к1 то вывод нс, "Выиграл(а)", имя1 иначе вывод нс, "Ничья!" все все кон
Занимательная информатика 184 12.3.2. Игра в среде Microsoft Excel Требуемый вид листа Excel показан на рис. 12.4. A 1 B C Игра «Кубик» 2 Имя первого игрока: 3 У первого игрока выпало: 4 Имя второго игрока: 5 У второго игрока выпало: 6 Итог 7 Рис. 12.4 Результат игры выводится в ячейке В6 в виде «выиграл Петя» (если имя первого игрока — Петя), «выиграл Вася» (если имя второго игрока — Вася) или «ничья». Смоделировать бросание игрального кубика, т. е. получить одно из случайных целых чисел: 1, 2, ..., 6, можно с помощью функции СЛЧИС(). Число в ячейке В3 и текст в ячейках А3 и А4 должны выводиться только после ввода имени первого игрока, а число в ячейке В5 и текст в ячейках А5, А6 и В6 — только после ввода имени второго игрока. Для этого используется функция ЕПУСТО. Задание Разработайте программы и/или заполните листы электронной таблицы для моделирования следующих вариантов игры «Кубики»: 1) каждый из двух играющих бросает три игральных кубика; выигравшим считается тот, кто набрал наибольшую сумму очков; 2) каждый из двух играющих бросает по одному кубику заданное количество раз; выигравшим считается тот, у кого больше выигрышей в отдельных бросаниях; 3) каждый из двух играющих бросает по одному кубику заданное количество раз (или, что то же самое, заданное количество кубиков один раз); выигравшим считается тот, кто набрал наибольшую сумму очков; 4) каждый из двух играющих бросает по одному кубику до тех пор, пока кто-то из них не наберет заданную сумму очков.
12. Моделирование простейших игр на компьютере 185 12.4. Игра «Карты» Игра моделирует выбор «наугад» каждым из двух играющих по одной карте из полного набора игральных карт, включающего четыре масти («пики», «трефы», «бубны» и «червы») и по 9 достоинств карт в каждой масти («шестерка», «семерка», «восьмерка», «девятка», «десятка», «валет», «дама», «король», «туз») и определение, у кого из игроков выбранная карта «старше». При этом условимся, что приведенный выше перечень мастей и карт одной масти дан в порядке увеличения их «старшинства»: например, любая карта масти «бубны» старше любой карты масти «пики», а «валет червей» старше «десятки червей». При моделировании названиям мастей и названиям достоинств карт присвоены условные номера: масть «пики» — 1, масть «трефы» — 2, масть «бубны» — 3, масть «червы» — 4; «шестерка» — 6, «семерка» — 7, ..., «десятка» — 10, «валет» — 11, «дама» — 12, «король» — 13, «туз» — 14. 12.4.1. Программа на школьном алгоритмическом языке Основные этапы работы программы для этой игры следующие: 1) ввод имен участников; 2) определение (случайным образом) номеров масти и достоинства карты для первого игрока; 3) определение по этим номерам соответствующих названий масти и достоинства карты, а также ее полного названия («Дама пик», «Шестерка бубен» и т. п.); 4) определение номеров масти и достоинства карты для второго игрока; 5) определение соответствующих названий масти и достоинства карты, а также ее полного названия; 6) определение результата игры. Соответствующая программа может иметь вид: алг Карты нач лит имя1, имя2, цел номер_масти1, номер_масти2 цел номер_дост1, номер_дост2 лит масть, дост, карта1, карта2 |Ввод имен участников игры вывод нс, "Введите имя первого игрока" ввод имя1 вывод нс, "Введите имя второго игрока" ввод имя2 |Определение характеристик карты первого игрока номер_масти1 := 1 + rnd(4)
186 Занимательная информатика номер_дост1 := 6 + rnd(9) |Определение соответствующего названия масти |(в родительном падеже) выбор при номер_масти1 = 1: масть := "пик" при номер_масти1 = 2: масть := "треф" при номер_масти1 = 3: масть := "бубен" при номер_масти1 = 4: масть := "червей" все |и достоинства карты выбор при номер_дост1 = 6: дост := "шестерка" ... при номер_дост1 = 10: дост := "десятка" при номер_дост1 = 11: дост := "валет" при номер_дост1 = 12: дост := "дама" при номер_дост1 = 13: дост := "король" при номер_дост1 = 14: дост := "туз" все |Формирование полного названия карты карта1 := дост + " " + масть вывод нс, "Карта первого игрока:", карта1 |Определение характеристик карты второго игрока номер_масти2 := 1 + rnd(4) номер_дост2 := 6 + rnd(9) выбор при номер_масти2 = 1: масть := "пик" ... все выбор при номер_дост2 = 6: дост := "шестерка" ... при номер_дост2 = 14: дост := "туз" все карта2 := дост + " " + масть вывод нс, "Карта второго игрока:", карта2 |Определение результата игры если номер_масти1 > номер_масти2 то вывод нс, "Выиграл ", имя1 иначе если номер_масти2 > номер_масти1 то вывод нс, "Выиграл ", имя2
12. Моделирование простейших игр на компьютере 187 иначе |Масти одинаковые если номер_дост1 > номер_дост2 то вывод нс, "Выиграл ", имя1 иначе если номер_дост2 > номер_дост1 то вывод нс, "Выиграл ", имя2 иначе вывод нс, "Ничья!" все все все все кон Примечание. В этой программе допускается, что у обоих играющих может оказаться одна и та же карта. Это не шулерство (J) — можно считать, что карты вынимаются, например, из разных колод. 12.4.2. Игра в среде Microsoft Excel Вид листа Excel для игры показан на рис. 12.5. A 1 B C Игра «Карты» 2 Имя первого игрока -> 3 Карта первого игрока: 4 Имя второго игрока -> 5 Карта первого игрока: 6 Итог 7 Рис. 12.5 Результат игры в ячейке В6 выводится аналогично игре «Кубик» (см. ранее). Аналогичными являются и требования к порядку вывода информации в ячейках A3:A6, B3, B5. Для моделирования выбора «наугад» одним из участников одной карты из полного набора игральных карт необходимо:
Занимательная информатика 188 1) смоделировать выбор «наугад» названия достоинства карты из следующего набора: «шестерка», «семерка», «восьмерка», «девятка», «десятка», «валет», «дама», «король», «туз». Это можно сделать так: l получить случайное число (номер достоинства) из интервала 6, 7, …, 14 и записать его в одну из невидимых для играющего ячеек (например, в столбце М); l по полученному номеру определить соответствующее название достоинства карты. Для этого может быть использована функция ВЫБОР: =ВЫБОР(М3–5;"Шестерка", "Семерка", "Восьмерка", "Девятка", "Десятка", "Валет", "Дама", "Король", "Туз") где М3 — адрес ячейки с значением номера достоинства. Далее нужно записать полученное с помощью функции ВЫБОР название достоинства карты в одну из невидимых ячеек (например, в М4); 2) смоделировать выбор «наугад» названия масти карты из четырех возможных названий, записанных в родительном падеже («пик», «треф», «бубен», «червей»), и записать это название, например, в ячейку М6. Все это можно сделать аналогично моделированию выбора названия достоинства карты; 3) получить полное название карты в виде «Дама пик», «Шестерка бубен» и т. п. Для этого может быть использована функция СЦЕПИТЬ: =СЦЕПИТЬ(М4; " "; M6) Для второго участника игры полное название карты определяется аналогично. Результат игры можно определить по значениям, полученным в столбце М, с помощью функции ЕСЛИ. Задания Разработайте программы и/или заполните листы электронной таблицы для моделирования двух вариантов игры «Карты»: 1) с неоднократным сравнением карт двух игроков (см. вариант 2 игры «Чет или нечет?»); 2) с дополнительным условием о том, что имеется козырная масть (любая карта козырной масти «старше» любой карты некозырной масти). Номер козырной масти выбирается случайным образом, а название этой масти выводится на экран в отдельной строке или, в электронной таблице Microsoft Excel, — в одной из ячеек листа.
12. Моделирование простейших игр на компьютере 189 12.5. Игра «Быки и коровы» Условия игры. Компьютер генерирует четырехзначное число, в котором все цифры различны. Играющий пытается отгадать это число, делая несколько попыток, в каждой из которых он вводит свое число. После каждой такой попытки компьютер проводит анализ ответа и сообщает о степени совпадения введенного числа с задуманным, характеризуемой количеством «коров» и «быков». При этом «бык» — это цифра в ответе, совпадающая по разряду с такой же цифрой отгадываемого числа, а «корова» — цифра введенного играющим числа, имеющаяся в загаданном числе, но не совпадающая с ней по разряду (местоположению в числе). Например, если было загадано число 5391, то число 9345 содержит одного «быка» (цифра 3 в разряде сотен) и две «коровы» (цифры 5 и 9). Для чисел же 4710 и 7148, соответственно, будет нуль «быков» и три «коровы». (Если играющий сдается, то он должен ввести число 0.) В приведенной ниже программе использованы следующие переменные: l х — число, генерируемое компьютером; l у — число, вводимое играющим; l р — количество попыток (вводимых чисел, включая отгаданное число). Действия по «загадыванию» числа компьютером и по подсчету количества «быков» и «коров» в числе, введенном играющим, оформлены в виде отдельных вспомогательных процедур Загадывание_числа и Подсчет_числа_"быков"_и_"коров": алг Загадывание числа(арг рез цел х) нач цел таб а[1:4] нц |Генерируем случайное четырехзначное число x := rnd(9000) + 1000 |Определяем цифры числа х a[l] := div(x, 1000) a[2] := mod(div(x, 100), 10) a[3] := mod(div(x, 10), 10) a[4] := mod(x, 10) |Если все цифры числа x различны, то принимаем |это число кц_при а[1] <> а[2] и а[1] <> а[3] и а[2] <> а[3] и а[2] <> а[4] кон
190 Занимательная информатика алг Подсчет_числа_"быков"_и_"коров"(арг цел х, у) нач цел b, k, i, j, цел таб а[1:4], с[1:4] |Определяем цифры числа, "загаданного" компьютером а[1] := div(x, 1000) а[2] := mod(div(x, 100), 10) а[3] := mod(div(x, 10) , 10) а[4] := mod(x, 10) |Определяем цифры числа, введенного играющим с[1] := div(y, 1000) с[2] := mod(div(y, 100) , 10) с[3] := mod(div(y, 10), 10) с[4] := mod(y, 10) |Рассчитываем количество "быков" (b) b := 0 нц для i от 1 до 4 если a[i] = c[i] | то b := b + l все кц |Рассчитываем количество "коров" (k) k := 0 нц для i от 1 до 4 нц для j от 1 до 4 если a[i] = c[j] и i <> j | то k := k + l все кц кц |Печатаем результаты расчетов вывод нс, "Количество ’быков’ = ", b вывод нс, "’Количество ’коров’ = ", k кон Примечание. В этих процедурах в массиве а хранятся цифры числа, «загаданного» компьютером, а в массиве с — цифры числа, введенного играющим. Основная часть программы при этом может иметь вид: алг Игра нач цел х, у, р Загадывание_числа(х) вывод нс, "Компьютер ’загадал’ четырехзначное число," вывод нс, "в котором все цифры различны." вывод нс, "Наберите это число"
12. Моделирование простейших игр на компьютере 191 |Отгадывание р := 0 |Число попыток нц р := р + 1 ввод у если у = 0 то вывод нс, "Вы сдались!" иначе если х <> у то вывод нс, "Неправильно! " Подсчет_числа_"быков"_и_"коров"(х, у) вывод "Попробуйте еще." иначе вывод нс, "Правильно! " вывод "Число попыток до отгадывания = ", р все все кц_при х = у или у = 0 кон Самостоятельно ответьте на вопрос: какие числовые ответы компьютера (количество «коров» и количество «быков») возможны в этой игре? Заметим, что здесь не все так просто, как кажется с первого взгляда… 12.6. Игра Баше Условия игры. На столе выложено n предметов (спичек, монет, камешков и т. п.). Играют двое. Они поочередно забирают несколько предметов, причем количество забираемых предметов не превышает заранее оговоренного числа k (0 < k „ n). Проигрывает тот, кто в свой очередной ход вынужден забрать последний предмет*. Сразу заметим, что существует выигрышная тактика для игрока, берущего предметы вторым (т. е. тактика, следуя которой, второй игрок обеспечивает себе победу при определенных условиях). Чтобы найти ее, определим, какие ситуации являются проигрышными для игрока, делающего очередной ход. Такой ситуацией, в частности, является положение, когда на столе остался один предмет. Если количество забираемых предметов не пре* Существует и вариант этой игры, в котором, наоборот, выигрывает тот, кто заберет все оставшиеся предметы.
192 Занимательная информатика вышает k, то второй проигрышной ситуацией является наличие на столе (1 + (k + 1)) предметов: действительно, сколько бы предметов при этом ни взял делающий очередной ход, его соперник может свести ситуацию к одному оставшемуся предмету. Проанализировав другие проигрышные ситуации — когда на столе остается (1 + 2(k + 1)), (1 + 3(k + 1)) и т. д. предметов, можно установить, что все они характеризуются следующим свойством: остаток от деления количества имеющихся предметов на (k + 1) равен 1. Следовательно, выигрышная стратегия заключается в том, чтобы всегда на очередном шаге брать столько предметов, что соперник остается в проигрышной ситуации (с количеством предметов, для которого справедливо указанное выше свойство). Ясно также, что если уже изначальное количество предметов обладает этим свойством, то начинающий игру не сможет реализовать описанную выигрышную тактику (если, конечно, его соперник также знает ее). Установим теперь правило, определяющее, сколько предметов надо брать, чтобы оставлять сопернику проигрышную ситуацию (если это вообще можно сделать). Обозначим имеющееся в какой-то момент игры количество предметов как m и напомним, что брать разрешается от 1 до k предметов. Можно рассуждать так. Количество предметов в проигрышной ситуации равно ближайшему меньшему, чем m, числу, кратному (k + 1) и увеличенному на 1. Это количество можно определить следующим образом: если m кратно (k + 1), то брать ((m div (k + 1)) – 1) · (k + 1) + 1 предметов, иначе брать (m div (k + 1)) · (k + 1) + 1 предметов (где div — операция целочисленного деления). Можно упростить это правило: надо всегда оставлять сопернику (m – 1) div (k + 1) · (k + 1) + 1 предметов. Перейдем теперь к разработке программы, которая моделирует игру Баше между компьютером и человеком. В ней кроме указанных величин m и k используются следующие переменные: l n — начальное количество предметов; l b — количество предметов, которое берет делающий очередной ход; l p — величина, принимающая случайное значение 1 или 2 и определяющая участника игры, делающего первый ход; l z — количество предметов, которое надо оставить, чтобы создать для соперника проигрышную ситуацию (см. выше).
12. Моделирование простейших игр на компьютере 193 алг Игра_Баше нач цел n, k, m, p, b, z |Исходные данные n := 15 + rnd(10) вывод нс, "Исходное количество предметов: ", n k := 2 + rnd(4) вывод нс, "Можно брать от 1 до ", k, " предметов" |Определяем, кто начинает игру p := 1 + rnd(2) если p = 1 то вывод нс, "Начинает компьютер" иначе вывод нс, "Начинаете Вы" все m := n нц |Повторение ходов если p = 1 то |Начинает компьютер |Проверяем, можно ли применить выигрышную тактику если mod(m, k + 1) <> 1 то |Можно |Применяем ее |Определяем проигрышную ситуацию z := div(m - 1, k + 1) * (k + 1) + 1 |Берем необходимое количество предметов b := m - z иначе |Выигрышную стратегию применить нельзя |Берем предметы "наугад" b := 1 + rnd(k) все вывод нс, "Компьютер взял", b иначе нц вывод нс, "Сколько берете Вы?" ввод b если b <= 0 или b > k или b > m то вывод нс, "Неправильное значение" все кц_при b > 0 и b <= k и b <= m все
194 Занимательная информатика |Новое значение m m := m - b |Проверяем, не закончилась ли игра если m = 0 то |Игра закончилась |Определяем победителя если p = 2 то вывод нс, "Последний предмет взяли Вы, т. е. " вывод "выиграл компьютер!" иначе вывод нс, "Последний предмет взял компьютер, " вывод "т. е. Вы выиграли - поздравляем!" все иначе |Игра продолжается вывод нс, "Осталось предметов: ", m |Изменяем величину p |(следующий ход делает другой участник игры) если p = 1 то p := 2 иначе p := 1 все все кц_при m = 0 кон Предлагаю читателям исследовать другой вариант игры Баше, в котором игрок, взявший во время своего хода оставшиеся предметы, выигрывает. Определите выигрышную тактику для такой игры и разработайте программу, моделирующую игру компьютера и человека. Приходит программист к окулисту. Тот его усаживает напротив таблицы с буквами, берет указку: — Читайте этот ряд букв! — БНОПНЯ... Доктор, у вас что-то не то с кодировкой!
13 Лабиринты спомним веселую историю*, рассказанную английским писателем Джеромом К. Джеромом в книге «Трое в одной лодке, не считая собаки» (если вы ее еще не читали, то обязательно прочитайте). Сколько читателей смеялось над чудаком Гаррисом, попавшим в Хемптон-Кортский лабиринт! «Мы только зайдем сюда, чтобы ты мог сказать, что побывал в лабиринте, но это совсем не сложно. Даже нелепо называть его лабиринтом. Мы походим здесь минут десять, а потом отправимся завтракать», — уговаривал Гаррис своего родственника. Но увы! Гаррис не только заблудился сам, но и запутал людей, которых взялся избавить от мучительного блуждания по лабиринту. За ним следовало, по крайней мере, человек двадцать и даже одна женщина с ребенком, безуспешно искавшая выход из лабиринта все утро. Следуя своей тактике, Гаррис все время поворачивал направо. Ему казалось, что он вот-вот выберется из лабиринта. Но время шло, и... вся компания во главе с Гаррисом вернулась к тому мес- В * Впрочем, с лабиринтами связаны и трагические истории. Например, в Древнем Египте, чтобы предотвратить расхищение сокровищ из пирамид, в них создавали лабиринты; идя по ним, похитители часто не могли найти выход и умирали там от голода и жажды...
196 Занимательная информатика ту, где они уже были. Половинка печенья, брошенная ребенком и замеченная родственником Гарриса за семь минут до этого, с несомненностью указывала место их недавнего пребывания. Тогда Гаррис предложил вернуться назад и начать всё снова. Предложение начать снова особого энтузиазма не вызвало, но все согласились вернуться. Процессия повернула обратно и потянулась за Гаррисом в противоположном направлении, но через десять минут вся компания очутилась в центре лабиринта. Такой же неудачей закончились и все последующие попытки. В какую бы сторону они ни сворачивали, все пути приводили их в центр лабиринта. Это стало повторяться с такой регулярностью, что некоторые посетители лабиринта просто оставались на месте и ждали, пока остальные прогуляются и вернутся к ним. Наконец отчаявшиеся любители лабиринтов позвали на помощь сторожа, который и вывел их «на свободу». Заметим, что бедному Гаррису не пришлось бы так долго блуждать по лабиринту и мучить людей, если бы он знал алгоритм поиска путей в лабиринте. Таких алгоритмов существует несколько, и один из них описан в двух следующих разделах. 13.1. Нить Ариадны Греческие мифы повествуют о легендарном герое Тезее, который отважился проникнуть в лабиринт на острове Крит, чтобы разыскать в нем чудовищного Минотавра и убить его. Ему помогла выбраться из лабиринта Ариадна, давшая Тезею клубок ниток, один конец которого она держала в руке. Пока Тезей все дальше уходил в лабиринт, клубок разматывался; идя потом вдоль «путеводной» нити, Тезей благополучно вернулся к выходу. Представим себе лабиринт в виде конечной системы площадок, от которых расходятся коридоры. При этом каждый коридор может соединять две площадки (такие площадки мы будем называть смежными), но не исключается и существование таких площадок, из которых можно пройти только в один коридор (такие площадки мы будем называть тупиками). Геометрически лабиринт можно представить в виде системы точек А, В, С, … (изображающих площадки) и совокупности отрезков АВ, ВС, … (изображающих коридоры), которые соединяют некоторые пары этих точек (рис. 13.1). Будем говорить, что площадка Y достижима из площадки X, если существует путь, ведущий от X к Y, в том числе через промежуточные коридоры и площадки. Точнее, это означает, что либо X и Y — смежные площадки, либо существует последовательность таких площадок Х1, Х2, Х3, ..., Хn, что пары площадок
13 . Лабиринты 197 Рис. 13.1 Х и Х 1, Х 1 и Х 2, Х 2 и Х3, ..., Хn и Y смежны. Например, на рис. 13.1 площадка Н достижима из тупика А посредством пути АВ, ВС, СD, DЕ, ЕF, FD, DН, в то время как площадка K недостижима из А. Вместе с тем, если Y вообще достижима из X, то она достижима и посредством простого пути — такого, в котором каждая площадка (а тем более — каждый коридор) проходится лишь один раз. В предыдущем примере путь не был простым, но, «срезав» петлю DЕ, ЕF, FD, мы получаем простой путь АВ, ВС, СD, DН. Наиболее же короткий простой путь будет таким: АВ, ВD, DН. Предположим теперь, что Минотавр находится на одной из площадок лабиринта (обозначим ее как М), а Тезей, отправляясь на его поиски с площадки А (на которой его ждет Ариадна), должен выяснить, достижима М из А или нет*. Если достижима, то нужно добраться до нее по любому пути, но вернуться к Ариадне нужно уже по простому пути. Если же М недостижима, то достаточно вернуться к Ариадне. Различных лабиринтов может быть бесчисленное множество, да и взаимное расположение в данном лабиринте площадок А и М также можно варьировать. Поскольку Тезею заранее ничего не известно об устройстве лабиринта и о местонахождении в нем Минотавра, то решение подобной задачи возможно только в виде общего метода поисков, пригодного при любом лабиринте и при любом расположении в нем площадок А и М. Иными словами — в виде алгоритма, решающего любую из задач данного типа (именно в этом, как известно, заключается такое свойство алгоритма, как массовость!). Алгоритм поиска. Для построения такого алгоритма рассмотрим один специальный метод поисков. В соответствии с ним, на любой стадии процесса поиска потребуется различать коридоры: 1) еще ни разу не пройденные Тезеем (условно назовем их «зелеными»); * Естественно считать, что М ¹ A.
Занимательная информатика 198 2) пройденные один раз («желтые»); 3) пройденные дважды («красные»). Находясь на какой-либо площадке, Тезей может попасть на одну из смежных площадок посредством одного из следующих двух ходов (действий): 1) разматывание нити — проход от данной площадки по любому «зеленому» коридору до смежной площадки; при этом нить Ариадны разматывается вдоль этого коридора, который после его прохождения уже считается «желтым»; 2) сматывание нити — возвращение от данной площадки по последнему пройденному «желтому» коридору до смежной площадки. При этом нить Ариадны, ранее размотанная вдоль этого коридора, сматывается обратно в клубок, а этот коридор уже объявляется «красным». Предполагается, что Тезей делает на стенах какие-то пометки, позволяющие ему впоследствии отличать «зеленые» коридоры от «красных»; «желтые» коридоры отличаются тем, что по ним протянута нить Ариадны*. Выбор же того или иного хода зависит от обстановки, наблюдаемой Тезеем на площадке, на которой он в данный момент находится; эту обстановку можно охарактеризовать одним или несколькими из следующих признаков: 1) Минотавр — на данной площадке обнаружен Минотавр; 2) петля — через данную площадку уже протянута нить Ариадны; иными словами, от площадки расходятся по крайней мере два «желтых» коридора; 3) зеленая улица — на данной площадке есть выход по крайней мере в один «зеленый» коридор; 4) Ариадна — на данной площадке находится Ариадна; 5) «пятый случай» — отсутствие всех предыдущих признаков. Наш метод поиска теперь может быть задан схемой, показанной в табл. 13.1. Таблица 13.1 Признак 1. Минотавр 2. Петля 3. Зеленая улица 4. Ариадна 5. Пятый случай * Ход Остановка Сматывание нити Разматывание нити Остановка Сматывание нити Гаррис — герой книги Джерома К. Джерома — мог бы использовать для пометки различных коридоров кусочки печенья (J).
13 . Лабиринты 199 Находясь на какой-нибудь площадке, Тезей делает очередной ход так: он проверяет по порядку номеров в левом столбце схемы, какой из перечисленных признаков имеет место; обнаружив первый такой признак, он (уже не проверяя остальные признаки), делает соответствующий ход, указанный в правом столбце (или останавливается). Такие ходы делаются до тех пор, пока не наступит остановка. Пригодность предложенного метода непосредственно вытекает из следующих трех утверждений. 1. При любом взаимном расположении А и М в лабиринте после конечного числа ходов обязательно наступит остановка либо на площадке Минотавра, либо на площадке Ариадны. 2. Если остановка наступила на площадке Минотавра, то Минотавр достижим. Более того, в этом случае нить Ариадны оказывается протянутой по простому пути, ведущему от А до М; сматывая нить, Тезей может теперь вернуться по этому пути к Ариадне. 3. Если остановка наступила на площадке Ариадны, то это означает, что Минотавр недостижим. С доказательством этих утверждений можно познакомиться, например, в [22]. А мы рассмотрим на двух примерах, как работает предложенный метод. Пример 1. Пусть с площадки А лабиринта (см. рис. 13.1) начинается поиск Минотавра, который находится в точке F. Процесс поиска, в соответствии с нашим методом, удобно изобразить посредством схемы, представленной в табл. 13.2 (из-за свободы в выборе «зеленого коридора» это лишь одна из возможных таких схем). Таблица 13.2 Порядковый номер хода 1 2 3 4 5 6 7 8 9 10 11 Каким признаком руководствуется Тезей Зеленая улица Зеленая улица Зеленая улица Зеленая улица Зеленая улица Пятый случай Пятый случай Зеленая улица Петля Зеленая улица Минотавр Ход Разматывание Разматывание Разматывание Разматывание Разматывание Сматывание Сматывание Разматывание Сматывание Разматывание Остановка Пройден- «Цвет» коридора после его ный коридор прохождения АВ Желтый ВС Желтый CD Желтый DH Желтый HJ Желтый JH Красный HD Красный DB Желтый BD Красный DF Желтый
Занимательная информатика 200 Мы видим, что в данном случае Минотавр достижим. Выделив же в предпоследнем столбце коридоры, которые остались «желтыми» (в соответствии с записями в последнем столбце), мы получим следующий простой путь, ведущий от А к F: АВ, ВС, CD, DF. Пример 2. Если поиск начинается с площадки K (а Минотавр по-прежнему находится на площадке F), то процесс поиска можно отразить схемой, представленной в табл. 13.3. Таблица 13.3 Порядковый номер хода Каким признаком руководствуется Тезей Ход Пройденный коридор Цвет коридора после его прохождения 1 Зеленая улица Разматывание KN Желтый 2 Зеленая улица Разматывание NL Желтый 3 Зеленая улица Разматывание LM Желтый 4 Зеленая улица Разматывание MN Желтый 5 Петля Сматывание NM Красный 6 Пятый случай Сматывание ML Красный 7 Пятый случай Сматывание LN Красный 8 Пятый случай Сматывание NK Красный 9 Ариадна Остановка Как видим, в этом случае Минотавр недостижим. Заметим, что описанный алгоритм не обладает свойством определенности — с какой-то площадки могут оказаться выходы в несколько зеленых коридоров, а наше предписание не указывает, какой из них выбрать (точнее, оно допускает произвольный выбор одного из них). Чтобы это свойство соблюдалось, необходимо регламентировать, как должен производиться выбор очередного проверяемого коридора в таких ситуациях. Алгоритм, в котором такая регламентация имеется, описан в следующем разделе. Задание Составьте схему выхода из лабиринта (с площадки 1 на площадку 10 — см. рис. 13.2), используя описанный в этой статье алгоритм. При наличии на площадке выходов в несколько зеленых коридоров их выбор должен осуществляться по часовой стрелке. Схемы оформите в виде таблиц, аналогичных табл. 13.2 и 13.3.
13 . Лабиринты 201 Рис. 13.2 13.2. Лабиринт из комнат Имеется лабиринт — система комнат, которые соединены коридорами (рис. 13.3). Рис. 13.3 Комнаты пронумерованы числами от 1 до 16. Будем считать, что посетитель, попавший в любую такую комнату, знает, в комнату с каким номером ведет тот или иной коридор. Предположим также, что у него (как и у Тезея) есть клубок ниток, один конец которого можно закрепить в исходной комнате. Алгоритм нахождения пути из одной комнаты в другую будет следующим. При продвижении вперед надо всегда переходить в новую комнату с возможно меньшим номером (разматывая нить). Если при таком движении мы попадаем в тупик или в комнату, по которой уже прошли ранее, то нужно идти назад в предыдущую комнату (сматывая нить), а оттуда — двигаться в комнату со следующим по величине номером (из числа тех, через которые еще не прошел наш маршрут). Если же это невозможно, то надо вернуться в комнату перед предыдущей, по-прежнему сматывая нить, и т. д.
Занимательная информатика 202 Задание Используя этот алгоритм, найдите путь из комнаты 1 в комнату 16. 13.3. Мышь в лабиринте История о Тезее и Минотавре — миф. А вот и реальность: в 1950 г. американский математик и инженер Клод Шеннон (автор теории информации) изобрел механическую «мышь» (кстати, названную Тезеем J). Эта «мышь» управлялась магнитом и сложной электрической схемой, скрытой под полом лабиринта. Ее помещали в каком-то его месте, а в другом месте ставилась вещь, условно именуемая «куском сала». «Мышь» начинала блуждать по лабиринту, делая при этом петли, пока не находила «сало». Когда же «мышь» запускали повторно с того же самого места, она уже прямо бежала к «салу», не делая петель. Как она могла сделать это? 13.4. Разные лабиринты Попробуйте пройти в центр лабиринта, показанного на рис. 13.4. Вход Рис. 13.4 Прошли? Тогда предлагаю еще один лабиринт (рис. 13.5).
13 . Лабиринты 203 Рис. 13.5 И наконец, еще два самых сложных лабиринта (рис. 13.6 и 13.7). На рис. 13.6 цель показана в виде точки внутри лабиринта, а на рис. 13.7 места входа и выхода указаны стрелками. Рис. 13.6
Занимательная информатика 204 Рис. 13.7 Папа и дочка рисуют. Только дочка рисует в альбоме, а папа — в Photoshop'e. Дочка: «Папа! Папа! Я случайно разлила краску на лист». Папа: «Ты только ничего не трогай, а сразу жми Правка и Отменить». *** — Папа, а что такое ноты? — Это MIDI-файл, но только на бумаге.
14 Софизмы и парадоксы 1 1 a = b, то a = b. 2 2 Тогда, так как полупустой стакан равен полуполному, то пустой стакан равен полному. Так так конечно, знаете, что логика — это наука о формах и закоВ ы, нах мышления. Ее законы отражают в сознании человека свойства, связи и отношения объектов окружающего мира. Свое понимание окружающего мира человек формулирует в форме высказываний (суждений, утверждений). Знаете вы и о том, что на электронных логических элементах основана работа компьютера. Логика — это достаточно сложная наука, а человеческий мозг — не компьютер. Ошибиться очень просто, особенно в запутанных логических формулах. Но очень часто люди допускают и преднамеренные ошибки в своих рассуждениях с целью запутать или ввести в заблуждение собеседника. Такие «ошибки» называют софизмами (от греческого sоphisma — уловка, ухищрение, выдумка, головоломка).
206 Занимательная информатика Кроме софизмов, которые «доказывают» истинность ложных суждений, в логике существуют парадоксы, которые «доказывают» одновременно как истинность, так и ложность некоторого суждения. Многие из них известны еще с древности. Приведу несколько примеров софизмов и логических парадоксов. Найдите ошибки в приведенных для них «доказательствах». 14.1. 4 руб. = 40 000 коп. «Доказательство». Возьмем верное равенство: 2 руб. = 200 коп. и возведем его по частям в квадрат. Получится: 4 руб. = 40 000 коп. 14.2. 2 ´ 2 = 5 «Доказательство». Имеем числовое тождество: 4 : 4 = 5 : 5. Вынесем и в левой, и в правой его части за скобки общий множитель: 4(1 : 1) = 5(1 : 1). Числа в скобках равны — их можно сократить. Получим: 4 = 5. 14.3. 5 = 1 «Доказательство». Вычтем из обеих частей равенства число 3: 5 – 3 = 1 – 3. Получим: 2 = –2. Возведя в квадрат обе части последнего равенства, получим: 4 = 4. Так как данное равенство справедливо, то справедливо и исходное равенство 5 = 1. 14.4. 2 = 3 «Доказательство». Возьмем равенство: 4 – 10 = 9 – 15. Прибавив к обеим его частям значение 61/4, получим: 4 – 10 + 61/4 = 9 – 15 + 61/4. Выполним преобразования: 22 – 2 ´ 2 ´ 5/2 + (5/2)2 = 32 – 2 ´ 3 ´ 5/2 + (5/2)2. Отсюда (2 – 5/2)2 = (3 – 5/2)2. Извлекая из обеих частей этого равенства квадратный корень, получим: 2 – 5/2 = 3 – 5/2. Прибавляя теперь к обеим частям по 5/2, приходим к равенству: 2 = 3. 14.5. 5 = 6 «Доказательство». Возьмем числовое тождество: 35 + 10 – 45 = = 42 + 12 – 54. Вынесем общие множители левой и правой частей за скобки: 5(7 + 2 – 9) = 6(7 + 2 – 9). Разделим обе части этого равенства на общий множитель (в скобках). Получим: 5 = 6.
14. Софизмы и парадоксы 207 14.6. 4 = 8 «Доказательство». Возьмем систему уравнений: ì2х + у = 8; í îх = 2 – у/2. Решим ее способом подстановки. Получим: 4 – у + у = 8, т. е. 4 = 8. 14.7. Все числа равны между собой «Доказательство». Пусть т ¹ п. Возьмем тождество: т2 – 2тп + + п2 = п2 – 2пт + т2. Тогда (т – п)2 = (п – т)2. Отсюда т – п = = п – т, или 2п = 2т. Значит, п = т. 14.8. Любое отличающееся от нуля число равно противоположному ему числу «Доказательство». Возьмем произвольное отличающееся от 0 число а. Обозначим его буквой х: х = а. Обе части этого равенства умножим на –4а. Получим: –4ах = –4а2, или –4ах + 4а2 = 0. К обеим частям этого равенства прибавим х2. Получим: х2 – 4ах + + 4а2 = х2, или (х – 2а)2 = х2. Значит, х – 2а = х. Но х = а, поэтому а – 2а = а, или –а = а. 14.9. Любое число a равно меньшему числу b «Доказательство». Начнем с равенства: a = b + c. Из него следует, что a больше b при c > 0. Умножив обе его части на a – b, получим: a2 – ab = ab + ac – b2 – bc. Перенесем ac в левую часть: a2 – ab – ac = ab – b2 – bc и в обеих частях равенства вынесем общий множитель: a(a – b – c) = b(a – b – c). Разделив обе части этого равенства на (a – b – c), получим, что a = b. 14.10. Любое число равно своей половине «Доказательство». Возьмем два равных числа а и b: a = b. Обе части этого равенства умножим на а и затем вычтем из них по b2. Получим: a2 – b2 = ab – b2, или (a + b)(a – b) = b(a – b). Отсюда a a + b = b, или а + а = а, так как b = а. Значит, 2а = а, или a = . 2
208 Занимательная информатика 14.11. Отрицательное число больше положительного «Доказательство». Возьмем два положительных числа — а и b. a -a Сравним два отношения: и . Они равны, так как каждое из -b b a -a a них равно - . Тогда мы можем составить пропорцию: . Но = -b b b если в пропорции предыдущий член первого отношения больше последующего, то и предыдущий член второго отношения больше своего последующего. В нашем случае а > –b. Следовательно, должно выполняться и неравенство –а > b, т. е. отрицательное число больше положительного. 14.12. Любое число равно числу, в два раза большему его «Доказательство». Пусть а — любое число. Возьмем тождество: а2 – а2 = а2 – а2. В левой его части вынесем а за скобки, а правую часть разложим на множители по формуле разности квадратов. Тогда получим: (а – а)а = (а – а)(а + а). Упростив это тождество, получим, что а = 2а. 14.13. Любое число равно нулю «Доказательство». Каким бы ни было число а, справедливы равенства: (+а)2 = а2 и (–а)2 = а2. Следовательно, (+а)2 = (–а)2. Значит, +а = –а, или а + а = 0. Но тогда 2а = 0, и поэтому а = 0. 14.14. 2 > 3 2 3 æ1ö æ1ö «Доказательство». Очевидно, что ç ÷ > ç ÷ . Логарифмируя è2ø è2ø обе части этого неравенства, получим: 1 1 2 lg > 3 lg . 2 2 1 Деля обе его части на одно и то же значение lg , получим, что 2 2 > 3. 14.15. Вес слона равен весу комара «Доказательство». Обозначим вес слона как с, а вес комара — как k. Запишем равенство: c + k = 2v. (1)
14. Софизмы и парадоксы 209 Действительно, такое число v всегда существует. Например, при условных значениях c = 5000 кг и k = 0,0000001 кг число v равно 2500,00000005 кг. Тогда из равенства (1) можно получить два других: c – 2v = –k и c = 2v – k. Попарно перемножим левые и правые части этих равенств: c2 – 2vс = k2 – 2vk. Добавим к обеим частям только что полученного равенства значение v2: c2 – 2vс + v2 = k2 – 2vk + v2. Тогда мы можем записать: (c – v)2 = (k – v)2. Извлекая квадратный корень из обеих частей этого равенства, получим: c – v = k – v. Отсюда c = k, т. е. вес слона равен весу комара! 14.16. Хитрый хозяин гостиницы В нижеследующем стишке, взятом из одного английского журнала, выходившего в XIX веке, рассказывается о хитром хозяине гостиницы, сумевшем разместить в девяти номерах десять гостей так, что каждому из них досталось по отдельной комнате. Их было десять чудаков, Тех спутников усталых, Что в дверь решили постучать Таверны «Славный малый». — Пусти, хозяин, ночевать, Не будешь ты в убытке, Нам только ночку переспать, Промокли мы до нитки. Хозяин тем гостям был рад, Да вот беда некстати: Лишь девять комнат у него И девять лишь кроватей, — Восьми гостям я предложу Постели честь по чести, А двум придется ночь проспать В одной кровати вместе.
210 Занимательная информатика Лишь он сказал, и сразу крик, От гнева красны лица: Никто из всех десятерых Не хочет потесниться. Как охладить страстей тех пыл, Умерить те волненья? Но старый плут хозяин был И разрешил сомненья. Двух первых путников пока, Чтоб не судили строго, Просил пройти он в номер «А» И подождать немного. Спал третий в «Б», четвертый в «В», В «Г» спал всю ночь наш пятый, В «Д», «Е», «Ж», «3» нашли ночлег С шестого по девятый. Потом, вернувшись снова в «А», Где ждали его двое, Он ключ от «И» вручить был рад Десятому герою. Хоть много лет с тех пор прошло, Неясно никому, Как смог хозяин разместить Гостей по одному? Иль арифметика стара, Иль чудо перед нами, Понять, что, как и почему, Вы постарайтесь сами! 14.17. Парадокс «Куча» Разница между кучей и «не-кучей» — не в одной песчинке. Пусть у нас есть куча (например, песка). Начнем брать из нее каждый раз по одной песчинке — куча останется кучей. Продолжим этот процесс. Если 100 песчинок — куча, то 99 — тоже куча, ..., 10 песчинок — куча, то 9 — тоже куча, ..., 3 песчинки — куча, 2 — куча, 1 — куча (!?). Суть этого парадокса в том, что постепенные количественные изменения (убывание на одну песчинку) в нем не приводят к качественным изменениям. Или, что то же самое, — в постановке вопроса: когда куча перестает быть кучей?
14. Софизмы и парадоксы 211 Задание Сформулируйте парадокс «Лысый», аналогичный парадоксу «Куча». 14.18. Парадокс «Мэр города» Каждый мэр живет или в своем городе, или вне его. Однажды был издан приказ о выделении одного специального города (ну, скажем, столицы J), где жили бы только мэры, не живущие в своем городе. Естественно, у этого города тоже есть свой мэр. Где должен жить мэр этого города? Если он хочет жить в этом «специальном» городе, то он не может этого сделать, так как там живут только мэры, не живущие в своем городе. Если же он не хочет жить в «специальном» (своем!) городе, то, как и все мэры, не живущие в своих городах, он должен жить в «специальном»городе, а это, как сказано выше, не допускается. Поэтому получается, что этот мэр не может жить ни в своем городе, ни вне его. Задание Закончите два следующих парадокса. 14.19. Парадокс «Генерал и брадобрей» Каждый солдат может сам себя брить или бриться у другого солдата. Генерал издал приказ о выделении одного специального солдата-брадобрея, у которого брились бы только те солдаты, которые сами себя не бреют. У кого должен бриться сам этот специально выделенный солдат? Если… 14.20. Парадокс «Каталог всех нормальных каталогов» Книжный каталог (перечень книг и других каталогов) может быть двух видов: 1) такой, который в числе перечисляемых каталогов не упоминает себя («нормальный»); 2) такой, который сам входит в число перечисляемых в нем каталогов («ненормальный»). Библиотекарю дали задание составить каталог всех нормальных и только нормальных каталогов. Должен ли он при составлении своего каталога упомянуть и составленный им каталог? Если…
15 Жаргонизмы Интернета Жаргонизм — жаргонное слово или выражение. Ожегов С. И. Толковый словарь русского языка. В информатике, как и во многих других отраслях науки и техники, есть свои термины-жаргонизмы. Например, винт (винчестер) —жесткий магнитный диск; хард — совокупность аппаратных средств компьютера (hardware); софт — программное обеспечение (software) и др. Есть такие термины и у пользователей Всемирной компьютерной сети Интернет — спам, собака, смайлик и др. 15.1. Откуда пришла «собачка»? Сегодня знак @ является одним из символов всемирного коммуникационного пространства. Какова же история появления этого знака в адресе писем электронной почты — одной из самых распространенных услуг, предоставляемых пользователям сети Интернет?
15. Жаргонизмы Интернета 213 Поиски истоков символа @ уводят нас, по меньшей мере, в XV столетие, а возможно — еще дальше в глубь веков, хотя лингвисты* и палеографы** до сих пор расходятся во мнениях по этому вопросу. Однако сначала обратимся к более близким временам. Точная дата рождения электронной почты неизвестна. Специалисты по истории высоких технологий относят ее примерно к концу 1971 года, когда 30-летний американский компьютерный инженер Рэй Томлинсон реализовал нечто, что сам затем назвал «быстрым захватом» («quick hack»). На самом деле ему удалось послать первое в истории электронное сообщение на адрес (принадлежавший ему же), зарегистрированный на другом компьютере. Томлинсон и был тем самым человеком, который выбрал символ @ в качестве разделителя между именем пользователя и именем компьютера в записи адреса электронной почты. Когда уже в наши дни его спросили, почему он выбрал именно этот значок, он ответил просто: «Я искал на клавиатуре знак, который не мог встретиться ни в одном имени и вызвать путаницу». Однако этот символ уже тогда имел определенное назначение — по крайней мере, в английском языке он использовался как сокращение от at (читается как «эт»). Как же получилось, что знак @ оказался на одном из первых мест на клавиатуре компьютера? Ведь прежде чем Томлинсон отдал ему предпочтение, у него, наверное, было какое-то другое конкретное назначение? Чтобы найти ответ на этот вопрос, нам и придется углубиться в историю. Американский ученый Бертольд Уллман 70 лет назад выдвинул предположение, что знак @ был изобретен средневековыми монахами. Он утверждает, что этот знак понадобился им в качестве сокращения для латинского «ad» — часто употребляемого универсального слова, означающего «на», «в», «в отношении» и т. п. Однако реальные доказательства, подтверждающие эту гипотезу, остаются очень скудными. До недавних пор большинство лингвистов полагали, что знак @ имеет более позднее происхождение и появился на свет в XVIII столетии в качестве символа, указывающего стоимость единицы товара, например «5 яблок @ 10 пенсов» (5 яблок при цене 10 пенсов за 1 яблоко). Французский исследователь Дэнис Музерелли считает, что этот знак появился в результате того, что букву «a» французские и немецкие купцы второпях писали как @. Однако в 2000 году другой специалист по истории языка, * ** Лингвист — специалист по лингвистике (науке о языке). Палеограф — специалист по палеографии — вспомогательной филологической дисциплине, изучающей древние рукописи (преимущественно их внешнюю сторону — способы написания, формы букв, особенности материала, на котором писали, и т. д.) с целью определения времени и места их создания.
214 Занимательная информатика Джорджио Стабиле из Римского университета, обнаружил венецианские коммерческие документы, датированные примерно 1500 годом, в которых символ @ использовался для обозначения меры объема — амфоры. Стабиле также нашел латино-испанский словарь 1492 года, в котором слово «амфора» (anfora) переводилось как «арроба» (arroba) — мера веса, равная примерно 12,5 кг. Это слово, скорее всего, произошло от арабского ar-roub, которое опять же означало некую единицу измерения, а именно «четверть». Все эти исследования показывают, что знак @ существует с XV столетия, как в испано-арабских, так и в греко-романских языках в качестве коммерческого символа, использовавшегося для обозначения единиц измерения товара, хотя в разных регионах он означал разные величины. Это проливает некоторый свет и на появление «коммерческого эт» (@) на клавиатуре первой пишущей машинки — этот значок присутствовал уже на первой модели, выпущенной компанией Underwood в 1885 году. Значку @ удалось «выжить», и 80 лет спустя он был включен в стандартный набор компьютерных символов. Что русским — «собачка», финнам — «кошка» Пожалуй, наибольшее удивление в истории символа @ вызывает то, как в наши дни он произносится и что означает на разных языках. Испанцы и португальцы по-прежнему используют слово «арроба», которое французы у них «одолжили» и переделали в «аробаз» (arobas). Американцы и британцы, конечно же, называют его «знак эт» (at sign). Это же словосочетание в различных вариациях было перенесено в другие языки, например в немецкий (at Zeichen), эстонский (at mдrk) и финский (at merkki), или перешло в более простую форму — «at». Однако в большинстве языков этот символ описывается с помощью всевозможных метафор, взятых из повседневной жизни, и наиболее характерным является упоминание животных. Голландцы, немцы, венгры, поляки и африканцы видят в нем «обезьяний хвост». «Улиткой» (поанглийски — snail) знак @ называют во Франции (escargot) и Италии (chiocciola), а также на иврите, корейском и эсперанто (heliko). Парадоксально, что при этом термин snail mail (буквально «улиточная почта» или «черепашья почта») на компьютерном жаргоне означает как раз традиционную «бумажную» почту как более медленную альтернативу электронной. Датчане и шведы называют этот знак snabel-a («слоновий хобот» с буквой «а» на конце); венгры — «червяком»; норвежцы — «свиным хвостом»; китайцы — «мышонком», а русские — «собакой» (или «собачкой»). Еще одним богатым источником названий для @ является пища. Некоторые шведы предпочитают «булочку с корицей» (kanelbulle). Чехов же воодушевил «селедочный рольмопс»
15. Жаргонизмы Интернета 215 (zavinac), подаваемый в пражских барах. Испанцы иногда называют знак @ словом ensaimada — конфетой, имеющей форму спирали, которую обычно делают на Майорке. А на иврите часто используется слово shtrudel («штрудель»), означающее всем известное кондитерское изделие. Но, наверное, самое «подходящее по внешнему виду» название — это финское слово miukumauku, означающее свернувшуюся калачиком спящую кошку... J И все-таки — почему «собачка»? И все-таки остается вопрос — почему в русском языке символ @ назвали «собачкой»? Одна из версий происхождения этого названия (кроме того, что сам знак напоминает свернутый «бубликом» собачий хвост) такова. Когда-то давно, когда компьютерные дисплеи еще не «умели» воспроизводить графику (были чисто текстовыми), уже создавались первые компьютерные игры. Одна из таких игр заключалась в поисках клада в лабиринте, заполненном множеством врагов и опасностей. При этом картинка на экране представляла собой фрагмент этого лабиринта на «виде сверху», изображенный при помощи символов «!», «–» и «+» для стенок и углов, а различные враги и предметы, как и сам играющий, тоже отображались в виде каких-то символов. Причем у главного персонажа (за которого и предлагалось играть) был помощник — собачка, которую можно было «отправить вперед себя на разведку». Говорят, что эта собачка в данной игре как раз изображалась символом @, и вот именно с тех пор за этим значком осталось его игровое название... 15.2. Что такое «спам» Понятие «спам» знакомо, пожалуй, каждому, кто пользуется электронной почтой. Достаточно пару раз побывать на какомнибудь форуме или указать свой адрес на каком-нибудь webсервере, и в ваш ящик начнут приходить письма «Вам чрезвычайно повезло!», «Хотите заработать много денег?», «Купите наш замечательный продукт!» или «Посетите наш замечательный сайт!». Это и есть спам. Многие думают, что слово «спам» означает мусор. Но это не так. Слово SPAM произошло от «SPiced hAM» — «колбаса (ветчина) со специями». В 30-х годах прошлого века это слово было введено в обиход как торговая марка английской фирмы Hormel, выпускавшей мясные консервы низкого качества. Чтобы продать большое количество скопившегося на ее складе мяса, она в 1937 г. провела массовую рекламную кампанию (ясно, что недобросовестную), распихивая в почтовые ящики (тогда еще не электронные) добропорядочных граждан свои рекламные листов-
Занимательная информатика 216 ки. Консервы были проданы, но слово «спам» вошло в историю и даже было занесено в Оксфордский словарь. 15.3. Смайлики Вы, наверное, знаете, что при общении в Интернете часто используются смешные рожицы — так называемые смайлики (smile — по-английски «улыбка»), или, как их еще называют, эмотиконы. Поэтому вам наверняка будет интересно и/или полезно познакомиться с некоторыми из них (в количестве 93 штук — :-) ) — см. табл. 15.1. Таблица 15.1 :-) или :) :)))) :^) ;-) или ;) :-( или :( Улыбка 3:o[ Клоун или :o) Улыбка до ушей Задорная улыбка Шутливая улыбка @:-) [:-) :-)X Носящий тюрбан В наушниках С галстуком- бабочкой Грустный =) :-| или :| Равнодушный; думающий Панк Саркастическая физиономия То же плюс подмигивание Злодей Шутливый злодей Пытающийся достать языком до носа То же самое, но с другой стороны Разочарованный Лишившийся дара речи; смутившийся Высовывающий язык Непоследовательный, бессвязный Скептик Не решившийся :-% Широко раскрытые («мультяшные») глаза Банкир C=:-) +-:-) Повар Священник +:-) Папа Римский o|-) g-) ::-) Святой Носящий пенсне Четыре глаза B:-) Очки на лбу #:-O :-X Волосы дыбом Рот на замке :-D :-C Громкий смех Лодырь {:-) }:-) Носящий парик Парик дыбом -:-) :-> или :> ;-> или ;> >:-> >;-> :-q :-d :-e :-& :-P :-S :-/ :-\
15. Жаргонизмы Интернета 217 :-7 :-* :-@ |-| |-O Кривая улыбка Поцелуй Орущий Спящий Зевающий |~o :-: :=) Храпящий Мутант Два носа X-( Труп :-~) Замерзший :*) :-| Пьяный Тупица (-| Яйцеголовый ':-) Чуб :-] :-< :-t :-I Болван Печальный Злой Полуулыбка :-[ Ангел Дьявол «Ох-ох» Облизывающий губы «Не ори!» (либо оратор) или сильное удивление Циклоп Просто одноглазый Подмигивающий одноглазый Очень долго таращившийся на экран Носящий солнечные очки Носящий очки Забавно выглядящий нос Маленькая девочка с бантиком С накрашенными губами Встревоженный Валяющий дурака Плачущий от счастья В колпаке Деда Мороза Вампир :-} :-E Клыкастый вампир :_) Потрескавшиеся губы или ухмылка Сломанный нос :-F Он же с обломанным клыком Китаец Не понимающий таких шуток китаец С похмелья :-Q Курящий :-? :-, Курящий трубку Сплевывающий @}-->- Роза O:-) >:-) :-o :-9 :-O o-) .-) ,-) %-) 8-) B-) :n) 8:-) :={} 8-| :=)~ :'-) *:-) <|-) <|-( (8-o Интересно, что в Восточной Азии принят другой стиль написания смайликов, который носит название «каомодзи». Такие смайлики не обязательно «поворачивать набок», чтобы прочитать их, а само «изображение» на смайлике показывает в основ-
Занимательная информатика 218 ном глаза, а не рот «условного персонажа», подобно рисункам в стиле «манга» или «аниме». Вот несколько примеров таких смайликов. ^_^ Улыбка =_= Сонный v_v Грусть ;_; Плачущий >_< Злость x_x Мертвый -_-" Сконфуженность =^_^= Кошка 0_0 Удивление ^}{^ Поцелуй В заключение заметим, что первым идею о небходимости «придумать» какой-нибудь типографский знак, обозначающий улыбку, высказал еще в 1969 году писатель Владимир Набоков в одном из своих интервью, а днем рождения смайлика считается 19 сентября 1982 года. В этот день исследователь фирмы IBM Скотт Фалман впервые вставил в электронное сообщение набор символов :-). Чем отличается программист от простого пользователя? Пользователь думает, что в килобайте 1000 байтов, а программист думает, что в километре 1024 метра. *** Работа программиста и шамана имеет много общего — оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает. *** Переписка двух заядлых «интернетчиков»: — www.zarplaty.net? — www.kak.vsegda.net! — www.kak.zhe.ya.domoy.po.edu? — www.pesh.com!
16 Задачи о шапках Чтобы человек узнал некоторую информацию о себе, не обязательно сообщать ее в явном или в зашифрованном виде. Иногда достаточно сообщить ему аналогичную информацию о другом человеке (см. задачи 16.1–16.2 и 16.4) или вообще промолчать (см. задачу 16.3)... 16.1. Приятели и их шапки Три приятеля: Антон, Борис и Виктор сидели друг за другом без головных уборов (см. рис. 16.1), причем Борису и Виктору было запрещено оглядываться назад, Борис видел голову сидящего внизу Виктора, а Антон — головы обоих своих приятелей. Из мешка, содержащего две белые и три черные шапки (о чем все трое были заранее осведомлены), достали и надели каждому из ребят шапку неизвестного (для ее владельца) цвета, а еще две шапки неизвестных (для всех) цветов остались в мешке. Антон заявил, что он не может определить цвет свой шапки. Борис услышал ответ Антона и сказал, что у него тоже не хватает данных для определения цвета шапки, находящейся у него на голове. Мог ли Виктор на основании этих ответов своих приятелей определить цвет своей шапки?
Занимательная информатика 220 Рис. 16.1 16.2. Те же приятели и те же шапки А теперь решите задачу о приятелях и их шапках, так сказать, «в общем виде». Пусть каждого из мальчиков спросили, может ли он определить цвет своей шапки. Сможет ли тогда Борис на основе ответа Антона определить цвет своей шапки? Сможет ли Виктор на основе ответов Антона и Бориса определить цвет своей шапки? Рассмотрите все возможные варианты ответов Бориса и Антона. 16.3. Зачет по логике Как-то раз преподаватель логики сказал трем своим студентам: «У меня здесь есть 5 шапок: 3 белых и 2 черных. Закройте глаза, и я надену каждому из вас шапку. Когда вы откроете глаза, то сможете увидеть, какого цвета шапки на ваших товарищах. Свою собственную шапку вы увидеть не сможете и не увидите, какие шапки у меня остались, — я их уберу. Тот, кто сумеет догадаться, какого цвета на нем шапка, сразу же получит зачет по логике». Через некоторое время, не обменявшись ни единым словом, все студенты закричали: «На мне белая шапка!». Пришлось преподавателю всем троим поставить зачет. Как они об этом догадались? 16.4. Умный сговор В зале с несколькими ярусами находятся n гномиков. Их посадили в одну колонну друг за другом так, что каждый видит всех сидящих впереди перед ним, но не видит находящихся сзади него (см. рис. 16.2).
16. Задачи о шапках 221 Рис. 16.2 Затем гномикам надели на голову шапочки — кому белую, а кому черную. Каждый гномик видит шапочки, надетые на находящихся перед ним, но не видит шапочки сидящих сзади него (и свою шапочку тоже). Снимать шапочки, поворачиваться и разговаривать гномикам запрещалось. После этого каждого из гномиков, начиная с сидящего последним, спросили, какого цвета на нем шапочка. Отвечать можно было только: «белая» или «черная». Ответы каждого были слышны всем остальным. Отгадавшему цвет своей шапочки давали рубль. Если каждый гномик будет отвечать наугад (вероятность угадывания — 50%), то общая сумма полученных всеми гномиками денег составит в среднем n/2 рублей. Вместе с тем, если гномики заранее договорятся о правилах ответа, то их выигрыш может быть и больше. Как им сговориться, чтобы гарантированный суммарный выигрыш был максимальным? Каким будет этот выигрыш? 16.5. Три коробки На столе находятся три совершенно одинаковых коробки. В какой-то из них лежат две черных шапки, в какой-то — черная и белая, а еще в одной — две белых. На крышках коробок есть надписи: «Две черных», «Две белых», «Черная и белая». Известно, однако, что ни одна из этих надписей не соответствует действительности. Можно ли, вынув наугад одну шапку (и не заглядывая в коробку), определить, где какие шапки лежат?
17 Шутки и розыгрыши на компьютере Одна улыбка продлевает жизнь человека на три минуты, а пять секунд смеха — на 1 час. Медицинский факт J* 17.1. «Фальшивый» рабочий стол Windows Хотите подшутить над своими близкими дома или над одноклассником в компьютерном классе? Тогда сделайте следующее. 1. Нажав клавишу PrintScreen, скопируйте в буфер весь экран в тот момент, когда на нем представлен рабочий стол Windows. 2. Запустите любой графический редактор и в нем вставьте сохраненное в буфере обмена изображение рабочего стола. Сохраните файл в любой папке на диске. В результате у вас имеется точная копия рабочего стола вашей «жертвы» со всеми папками, ярлыками, кнопкой Пуск и т. д. Эту копию надо теперь будет использовать в качестве «обоев» рабочего стола. (Единственное, * «Медицинский факт» — фраза, сказанная Остапом Бендером, всем известным героем романов И. Ильфа и Е. Петрова.
17 . Шутки и розыгрыши на компьютере 223 что может вас выдать, это неработающие часы, но когда на них обратят внимание, будет уже поздно J.) 3. Уберите с рабочего стола все значки. 4. Уменьшите размер панели задач до малюсенькой полосочки у края экрана (для пущего эффекта можно немного растянуть изображение на экране дисплея (его аппаратными настройками) по вертикали, чтобы эта полосочка вообще скрылась за край экрана), а на виду оказалась только ваша «фальшивая панель задач». Если же размер панели задач менять не удается, то снимите «галочку» в строке Закрепить панель задач в свойствах этой панели. 5. Откройте свойства рабочего стола (щелкнув правой кнопкой мыши на его свободной части и выбрав пункт Свойства в контекстном меню) и в появившемся диалоговом окне Свойства: Экран выберите вкладку Рабочий стол. Измените рисунок на столе на соответствующее изображение (выбрав в поле Фоновый рисунок с помощью кнопки Обзор созданный вами в графическом редакторе файл). В результате единственное, что теперь возможно на экране компьютера, — это щелчок правой кнопкой мыши на рабочем столе. Чтобы потом «вернуть на место» настоящий рабочий стол, надо отменить указанные выше настройки, а также восстановить прежний фон стола. Примечание. Если вы собираетесь проделать всё это в школе, в компьютерном классе, то обязательно согласуйте свои планы с учителем! 17.2. Невидимая сумма Подготовьте на листе электронной таблицы Microsoft Excel таблицу следующего вида (рис. 17.1). Рис. 17.1 В ячейки D1 и B5 введите формулу =B1; в ячейки D2 и B6 — формулу =B2; в ячейки B3, D3 и B7 — соответственно формулы
Занимательная информатика 224 =В1+В2, =D1–D2 и =В5*В6. Затем выполните следующие действия: 1) выделите ячейку В3; 2) в главном меню программы Excel выберите пункт Формат, Ячейки; 3) в появившемся диалоговом окне Форматы ячеек (рис. 17.2) в списке Числовые форматы выберите строку (все форматы), в поле Тип введите три символа «;» (;;;) и щелкните на кнопке ОК. Теперь после ввода значений в ячейки В1 и В2 в ячейках D3 и B7 будут выведены, соответственно, разность и произведение введенных чисел, а ячейка В3 будет пуста, хотя в строке формул для нее будет отображаться введенная ранее формула! (Это объясняется тем, что для этой ячейки задан так называемый «пустой пользовательский формат», — помните три символа «;»?) Рис. 17.2 Теперь предложите своим одноклассникам воспользоваться этим листом Excel для расчета суммы, разности и произведения двух чисел. Они увидят только что описанную картину (чем, конечно, будут очень удивлены). Наверное, кто-то из них предположит, что в ячейке В3 для содержащегося в ней значения задан белый цвет символов, но вы можете доказать, что это не так, установив для этой ячейки, например, черный цвет (используя кнопку с буквой А на панели инструментов).
17 . Шутки и розыгрыши на компьютере 225 17.3. Необычный результат расчета по формуле в Microsoft Word Вы, наверное, знаете, что в языках программирования имеется стандартная функция, возвращающая случайное число из некоторого диапазона. В школьном алгоритмическом языке, в языках Бейсик и Си эта функция имеет имя rnd, в языке Паскаль — random. Функция с похожим именем имеется и в текстовом редакторе Microsoft Word. Только возвращает она не случайное число, а… булки с чаем! J Не верите? Тогда наберите в редакторе на отдельной строке следующий текст: =rand(n), где n — некоторое натуральное число, и нажмите клавишу Enter. Тогда, скажем, при n = 3 вы увидите следующий результат* (рис. 17.3): Рис. 17.3 При других значениях n другим будет только количество повторяющихся абзацев. (Самостоятельно выясните «результат расчета» по формуле с использованием функции, в которой указаны два аргумента: =rand(n, k).) 17.4. Очень важный вывод Если вы имеете опыт работы с текстовым редактором Microsoft Word, то, конечно, знаете, что в нем предусмотрена возможность проверки правописания в набранном тексте. Участки текста, которые Word считает «неправильными», подчеркиваются красной * Указанная фраза представляет собой «панграмму» — текст, в котором присутствуют все буквы алфавита, — и служит для того, чтобы можно было оценить вид символов в некотором шрифте. — Прим. ред.
Занимательная информатика 226 или зеленой волнистой линией, а щелкнув на них правой кнопкой мыши, можно получить подсказку по исправлению ошибки. Попробуйте теперь набрать в отдельном абзаце текст «хочу избежать службу в армии» (именно так, как здесь написано, но без кавычек). Когда слова в нем будут подчеркнуты зеленой волнистой линией, щелкните на них правой кнопкой мыши, — Word «выдаст» вам очень важный вывод. 17.5. Проверка знания таблицы умножения Подготовьте лист электронной таблицы Microsoft Excel, с помощью которого можно проверять знание таблицы умножения. На этом листе (см. рис. 17.4) выводится вопрос о произведении двух чисел, каждое из которых может принимать значение от 1 до 9 (эти значения получаются случайным образом), например, в виде: «Чему равно произведение 9 * 4?». Рис. 17.4 После ввода ответа в ячейку В3 в ячейке А4 должно выводиться сообщение о его правильности. Чтобы получить такое случайное целое число х, что a „ х „ b, где a и b — целые числа, в электронной таблице следует использовать формулу: =a + ЦЕЛОЕ(СЛЧИС() * (b – a + 1)), т. е. множители в ячейках В2 и D2 можно получить, записав в них формулу =1 + ЦЕЛОЕ(СЛЧИС() * 9). Формула в ячейке А4: =ЕСЛИ(B2*D2=B3; "Правильно!"; "Неправильно!"). Ну как? Знает ли играющий в вашу игру таблицу умножения? Объявление в Интернете: «Куплю винчестер. Жесткие диски не предлагать!».
18 Разные задачи 18.1. Вкусные ломтики Мама очень вкусно поджаривает ломтики хлеба, пользуясь специальной маленькой сковородкой. Для готовности каждый ломтик должен быть поджарен с двух сторон. Поджаривание каждой стороны ломтика длится 30 секунд, причем на сковороде умещаются только два ломтика рядом. За какое минимальное время при этих условиях мама может приготовить: а) четыре ломтика хлеба; б) пять ломтиков? 18.2. Три лампочки Есть две изолированные друг от друга комнаты. В одной из них расположены три лампочки, в другой — трехклавишный выключатель к этим лампочкам, каждая клавиша которого включает одну и только одну из них, но какую именно — неизвестно (рис. 18.1). Изначально все лампочки выключены. Требуется за минимальное число переходов из одной комнаты в другую определить, какая клавиша какой лампочкой управляет. Как это сделать?
Занимательная информатика 228 ? Рис. 18.1 18.3. Как приготовить эликсир бессмертия Есть двое песочных часов: на 3 минуты и на 8 минут. Для приготовления эликсира бессмертия его надо непрерывно готовить ровно 7 минут, не меньше и не больше. Как это сделать за минимально возможное число операций (установок часов и их переворачиваний)? Время, затрачиваемое на переворачивание часов, не учитывать. Возможное решение этой задачи приведено ниже (самостоятельно догадайтесь, как его прочитать). В описанном алгоритме делаются 6 операций с часами (их установок и переворачиваний). Но существует алгоритм с меньшим числом операций. Найдите его самостоятельно. Если вы смогли это сделать, то решите еще несколько вариантов этой задачи (табл. 18.1).
18. Разные задачи 229 Таблица 18.1 ¹ Первые часы Вторые часы 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 4 мин 3 мин 3 мин 4 мин 4 мин 6 мин 3 мин 3 мин 3 мин 7 мин 7 мин 5 мин 6 мин 6 мин 6 мин 3 мин 5 мин 7 мин 9 мин 5 мин 5 мин 7 мин 5 мин 5 мин 5 мин 10 мин 4 мин 10 мин 9 мин 11 мин 14 мин 5 мин 8 мин 8 мин 8 мин 12 мин 6 мин 10 мин 16 мин 22 мин 11 мин 8 мин 10 мин 11 мин 11 мин 12 мин 9 мин 16 мин 16 мин 16 мин Время приготовления эликсира 2 мин 2 мин 5 мин 7 мин 2 мин 10 мин 4 мин 1 мин 4 мин 3 мин 4 мин 3 мин 2 мин 8 мин 14 мин 7 мин 4 мин 2 мин 5 мин 8 мин 6 мин 1 мин 9 мин 8 мин 13 мин 18.4. Единственные часы остановились Представьте себе те стародавние времена, когда часы были редкостью, и вообразите, что у вас дома единственные часы остановились. Каким должен быть алгоритм ваших действий, чтобы правильно установить эти часы, если вы можете отправиться к своему товарищу (часы которого идут безукоризненно) и узнать у него точное время, но сколько времени занимает дорога к его дому, — заранее неизвестно. 18.5. Древнеегипетская задача В папирусе, написанном египетским писцом Ахмесом, есть такая задача: разделить семь хлебов между восемью людьми за минимальное число разрезов (разрез — разделение хлеба или его части пополам). Как решить ее?
230 Занимательная информатика 18.6. Задача о стрелках Эта задача была опубликована известным американским специалистом по теории автоматов Э. Ф. Муром. Допустим, что стрелкам, выстроенным в шеренгу, разрешена следующая процедура общения между собой: 1) каждый стрелок может общаться непосредственно только со своими ближайшими соседями слева и справа; естественно, левофланговый (правофланговый) может общаться только с правым соседом (с левым соседом); 2) «сеансы общения» могут происходить один раз в каждую секунду (или другую заранее назначенную единицу времени); считается, что все стрелки имеют секундомеры, которые строго синхронизированы; 3) для каждого стрелка один «сеанс общения» состоит в том, что он передает своим соседям по одному условному знаку и принимает к сведению те условные знаки, которые ему сообщают соседи. В некоторый момент левофланговый (или правофланговый) получает пакет с приказом «пли!», который адресован всем стрелкам и должен быть выполнен ими одновременно. Возникают вопросы: а) какую инструкцию должен заранее получить каждый стрелок (причем инструкцию, единую для всех стрелков!), чтобы при указанной процедуре общения в шеренге этот приказ был выполнен всеми одновременно? б) каково минимальное время (наименьшее число секунд), за которое может быть обеспечено выполнение такого приказа? Здесь важно подчеркнуть, что количество стрелков (длина шеренги) никому из этих стрелков не известно и вообще это число (обозначим его как n) может быть произвольным. Кроме того, в момент вручения пакета левофланговому (правофланговому) об этом никому из стрелков (кроме получателя) еще не известно. 18.7. Високосные годы Вы, конечно, знаете, что некоторые годы, которые называют високосными, состоят не из 365 дней, как обычно, а из 366 (в такие годы в феврале не 28 дней, а 29). Многие думают, что високосными являются все годы, номера которых кратны четырем. Однако это не так: 1900-й и 2100-й годы — не високосные! Каковы причины этого? Сначала разберемся с такими простыми понятиями, как год, месяц и сутки. Год (в астрономии называемый тропическим) — это промежуток от одного момента, когда центр Солнца на нашем земном
18. Разные задачи 231 небе проходит точку весеннего равноденствия, до следующего такого же момента. Этот промежуток длится 365 суток 5 часов 48 минут и почти 46 секунд, т. е. примерно 365,2422 суток. Месяцем считается так называемый синодический месяц, или месяц лунных фаз, — время от одного соединения Луны с Солнцем (новолуния) до другого. Синодический месяц длится 29 суток 12 часов 44 минуты и почти 3 секунды, или около 29,53059 суток. Солнечные сутки длятся 24 часа. Указанные временные периоды составляют основание календаря. Мы пользуемся солнечным календарем, созданным римлянами. В календаре Юлия Цезаря, или, как принято говорить, в юлианском календаре (созданном в 46 году до нашей эры), 12 месяцев и 365 дней. Каждый четвертый год — високосный — продолжается 366 дней. Однако в юлианском календаре каждый год длился на 11 минут 14 секунд больше, чем тропический год, из-за чего весеннее равноденствие (день года, когда продолжительность дня равна продолжительности ночи) к XVI веку сместилось с 21 марта на 11 марта. Поэтому потребовалась усовершенствовать календарь — отбросить «излишек» дней так, чтобы в будущем такая ошибка не повторялась. В 1582 году Папа Римский Григорий XIII повелел 5 октября считать как 15 октября 1582 г. (т. е. пропустить излишек в 10 дней), а последний год любого столетия считать високосным (366 дней) только в том случае, если его номер делится на 400 (например, 1600 или 2000). Юлианский год за четыре столетия «забегал вперед» на три дня. Чтобы «удержать» его, астрономы Папы Григория и отказались от трех високосных лет в четыре столетия. Григорианский же год лишь на 26 секунд дольше, нежели тропический, поэтому ошибка в один день набегает только за 3280 лет, и в этом уже нет ничего страшного. Принятым в XVI веке календарем, называемым григорианским, мы и пользуемся в настоящее время. Переход к нему был совершен после Великой Октябрьской революции, в 1918 году, когда для этого потребовалось «скомпенсировать» уже 13 дней. Летоисчисление по старому юлианскому календарю называют «старым стилем», а по григорианскому — «новым стилем». Алгоритм расчета даты праздника Пасхи Карл Фридрих Гаусс, которого часто называют «королем математиков» XIX века (жаль только, что не информатиков J), внес огромный вклад не только в «чистую» математику, но и в огромное число ее практических приложений — от геодезии и картографии до азартных игр. В частности,
232 Занимательная информатика он предложил формулы для непосредственного определения дат весеннего равноденствия и христианской Пасхи. Приведем алгоритм расчета даты православной Пасхи, основанный на формулах Гаусса, как говорят англичане, «as is» («как есть») — т. е. без всяких объяснений и обоснований. 1. Определить остаток от деления номера года на 19 (назовем eго a). 2. Вычислить остаток от деления номера года на 4 (назовем его b). 3. Определить остаток от деления номера года на 7 (назовем его c). 4. Рассчитать остаток d от деления суммы (19a + 15) на 30. 5. Вычислить остаток e от деления суммы (2b + 4с + 6d + 6) на 7. 6. Определить сумму f = d + е. 7. Пасха будет либо в марте, либо в апреле (все даты получаются по так называемому «старому стилю», или по юлианскому календарю — см. выше) в зависимости от величины f: если f не больше 9, то дата Пасхи — (22 + f) марта, иначе Пасха приходится на (f – 9) апреля все Указанные формулы предусматривают два исключения: при d = 29 и e = 6 Пасха должна быть перенесена с расчетной даты 26 апреля на 19 апреля*, а при d = 28 и e = 6 — с расчетной даты 25 апреля на 18 апреля**. Таким образом, Пасха всегда происходит между 22 марта и 25 апреля (еще раз напомним, что все даты приводятся по «старому стилю»). Например, для 2009 года: a = 14; b = 1; c = 0; d = 11; e = 4; f = 15. Так как f „ 9, то месяц — апрель, а день — (15 – 9) = 6. Переведя полученную дату в новый стиль (по григорианскому календарю), получим: 6 + 13 = 19 апреля. Дату Пасхи в 2011 и последующих годах предлагаю читателям определить самостоятельно. Для этого можно разработать компьютерную программу или использовать электронную таблицу Microsoft Excel***. В заключение замечу, что все эти формулы справедливы только для периода с 1900 по 2099-й год. * Такой случай был в 1981 г. Этот случай имел место в 1954 г. *** В ней для определения остатка от деления одного целого числа на другое используется функция ОСТАТ. **
18. Разные задачи 233 Задание Используя логические операции и операцию определения остатка от деления одного целого числа на другое, запишите условие, которое определяет, что N-й год является високосным. 18.8. Почтовые индексы На почтовых конвертах имеются трафареты, в которых записывается та или иная цифра индекса почтового отделения (рис. 18.2). (Номеров, указанных на этом рисунке, на конверте нет.) Запишите условия, по которым можно установить, какая именно цифра записана на трафарете. Например, для цифры 1 такое условие может быть оформлено в виде: Рис. 18.2 3И4И8 Кроме логической связки И (которой, как известно, обозначают знак логической операции конъюнкции, или логического умножения), в условиях можно использовать связки ИЛИ (знак логической операции дизъюнкции, или логического сложения) и НЕ (знак логической операции отрицания, или инверсии). Необходимо применить минимально возможное количество этих логических связок. (Считать, что все цифры всегда записаны правильно.) 18.9. Десять утверждений Определите, есть ли среди следующих утверждений истинные. 1. Только одно утверждение в этом списке ложно. 2. Только два утверждения в этом списке ложны. 3. Только три утверждения в этом списке ложны. 4. Только четыре утверждения в этом списке ложны. 5. Только пять утверждений в этом списке ложны. 6. Только шесть утверждений в этом списке ложны. 7. Только семь утверждений в этом списке ложны. 8. Только восемь утверждений в этом списке ложны. 9. Только девять утверждений в этом списке ложны. 10. Все десять утверждений в этом списке ложны. 18.10. Сказка Когда-то в древности в дремучем муромском лесу из-под земли били десять источников мертвой воды. Из первых девяти источ-
234 Занимательная информатика ников мертвую воду мог взять каждый, но десятый источник находился в пещере Кощея Бессмертного, в которую никто, кроме самого Кощея, попасть не мог. На вкус и цвет мертвая вода ничем не отличалась от обыкновенной, однако если человек выпивал из какого-нибудь подобного источника, то умирал. Спасти его могло только одно — если он запивал такую воду водой из источника, номер которого больше. Например, если он пил воду из седьмого источника (¹ 7), то ему надо было обязательно запить ее водой ¹ 8, ¹ 9 или ¹ 10 из соответствующих источников. Если же он пил воду ¹ 9, то ему могла помочь только вода ¹ 10. Ну, а если он сразу выпивал мертвую воду ¹ 10, то ему уже ничто помочь не могло. Чтобы извести Кощея Бессмертного, от которого страдали жители муромского леса, Иванушка-дурачок вызвал его на дуэль. Условия дуэли были такие: каждый приносит с собой кружку с жидкостью и дает ее выпить своему противнику. Кощей обрадовался: «Ура! Я дам ему мертвую воду ¹ 10 и Иванушка-дурачок не сможет спастись! А сам выпью воду, которую Иванушка-дурачок мне принесет, запью его своей десятой и спасусь!» В назначенный день оба противника встретились в условленном месте. Они честно обменялись кружками и выпили то, что в них было. Каковы же были радость и удивление обитателей муромского леса, когда оказалось, что Кощей Бессмертный умер, а Иванушка-дурачок остался жив! Только Василиса Премудрая догадалась, как удалось Иванушке победить Кощея. Попробуйте догадаться и вы. 18.11. Отец сына У входа в музей стоят два человека. Один из них — отец сына другого. Возможно ли такое? 18.12. Разговор родственников Сын отца профессора разговаривает с отцом сына профессора, причем сам профессор в разговоре не участвует. Может ли быть такое? 18.13. Кто изображен на портрете? У одного человека по фамилии Умников спросили: «Кто изображен на этом портрете?» Он ответил: «Отец висящего есть единственный сын отца говорящего». Чей это был портрет?
18. Разные задачи 235 18.14. Слова после чисел Определите, какие слова должны быть записаны во второй строке стихотворения: 1, 10, 11, 100, 101, ... 18.15. «Ей было 1100 лет» Ей было 1100 лет, Она в 101-й класс ходила, В портфеле по 100 книг носила — Все это правда, а не бред. Когда, пыля десятком ног, Она шагала по дороге, За ней всегда бежал щенок, С одним хвостом, зато 100-ногий. Она ловила каждый звук Своими 10-ю ушами, И 10 загорелых рук Портфель и поводок держали. И 10 темно-синих глаз Рассматривали мир привычно… Но станет все совсем обычным, Когда поймете наш рассказ. А. Н. Стариков Поняли ли вы рассказ поэта? 18.16. Непредвиденное затруднение Несколько лет назад в некоторой фирме один состоятельный клиент покупал компьютер. Этот компьютер был по тем временам мощным (с процессором Pentium с тактовой частотой 168 МГц — да-да, было и такое!) и, соответственно, дорогим. Неожиданно возникла проблема: индикатор тактовой частоты процессора на системном блоке оказался двухразрядным. Стандартное в таких случаях решение — установка на индикаторе буквосочетания «HI» (от англ. high — высокая) покупателя не устраивало — он требовал, чтобы индикатор показывал частоту с точностью до мегагерца. Это было сделано, причем без замены индикатора или дописывания символов на корпусе! Частота отображалась непосредственно на индикаторе, и покупатель ушел довольный. Как это было сделано?
236 Занимательная информатика 18.17. Пропущенное число Какое число надо поставить вместо символа «?» в приведенной ниже последовательности? 10, 11, 12, 13, 14, 15, 16, 17, 20, 22, 24, 31, 100, ?, 10000 18.18. Кощей Бессмертный и Иван Царевич Иван Царевич попал в плен к Кощею Бессмертному. Тот выдвинул Ивану такие условия. Кощей загадывает три двузначных числа a, b и c. Царевич должен назвать ему три своих числа X, Y и Z, после чего Кощей сообщит ему сумму aX + bY + cZ. После этого Иван Царевич должен отгадать задуманные Кощеем числа, иначе ему отрубят голову. Как ему спастись? 18.19. Бедный торговец (старинная задача) В лавке бедного торговца вместо гирь было всего 4 камня. Однако с помощью этих камней он на рычажных чашечных весах совершенно правильно взвешивал предметы массой 1, 2, ..., 40 кг. Какого веса были эти камни? 18.20. Может ли такое быть? Один мальчик сказал: «Позавчера мне было 10 лет, а в будущем году мне исполнится 13 лет». Может ли такое быть? 18.21. А такое? Один юноша написал: «Позавчера мне было 16 лет, а в будущем году мне исполнится 20». Может ли быть такое? 18.22. Об экономичности систем счисления Мы привыкли, что понятие «экономичность» применяется к различным приборам, устройствам и т. д. Но оно связано и с системами счисления. Под экономичностью системы счисления обычно понимается количество чисел, которое можно записать в данной системе с помощью определенного количества знаков. Поясню это на примере. Чтобы в десятичной системе записать 1000 чисел (от 0 до 999), необходимо 30 знаков (по 10 цифр для каждого из трех разрядов). А вот, скажем, в двоичной системе с помощью 30 знаков можно записать 215 различных чисел (так как для каждого двоичного разряда нужны только две цифры 0 и 1, то с помощью 30 цифр можно записывать числа, содержащие до 15 разрядов).
18. Разные задачи 237 Но 215 > 1000, поэтому, имея 15 двоичных разрядов, можно записать больше различных чисел, чем с помощью трех десятичных. Таким образом, двоичная система — более экономичная, чем десятичная. А какая из систем счисления — самая экономичная? Для ответа на этот вопрос рассмотрим конкретную задачу. Пусть в нашем распоряжении имеется 60 знаков. Мы можем, разбив их на 30 групп по два знака в каждой, записать с их помощью в двоичной системе любое число, имеющее не больше 30 двоичных разрядов (т. е. в общей сложности — 230 чисел). Те же 60 знаков мы можем разбить на 20 групп по три элемента и, пользуясь троичной системой, записать 320 различных чисел. Далее, разбив эти 60 знаков на 15 групп по четыре элемента в каждой, можно применить четверичную систему и записать 415 чисел и т. д. В частности, воспользовавшись десятичной системой (т. е. разбив все знаки на 6 групп по 10 элементов в каждой), мы могли бы записать 106 чисел, а применив шестидесятеричную систему, можно было бы с помощью 60 знаков записать только 60 чисел. Посмотрим, какая из возможных здесь систем — самая экономичная, т. е. позволяет записать с помощью данных 60 знаков наибольшее количество чисел. Иными словами, речь идет о том, какое из чисел — 230, 320, 415, 512, 610, 106, 125, 154, 203, 302, 60 — наибольшее. Предлагаю читателю получить ответ на обсуждаемый вопрос с помощью электронной таблицы Microsoft Excel, построив график зависимости указанных чисел от основания соответствующей системы счисления (рис. 18.3). Рис. 18.3 18.23. Прабабушки и прадедушки Сколько всего прапрадедушек и прапрабабушек было у всех ваших прапрадедушек и прапрабабушек?
Занимательная информатика 238 18.24. Илья Муромец и Змей Горыныч Рассказывал один программист своему сыну на ночь сказочку: «Срубил Илья Муромец Змею Горынычу голову, а взамен две выросли. Срубил 2 — выросли 4, срубил 4 — выросли 8, срубил 8 — выросли 16, срубил 16 — выросли 32, срубил 32 — выросли 63, срубил 63 — выросли 128, срубил 128 — выросли 256. А как срубил Илья 256 голов, тут и настал Змею Горынычу конец, потому что был Горыныч восьмиразрядный!» Какие три ошибки имеются в этой сказке? 18.25. Шутники и серьезные Школьники для игры разбились на две «партии»: на «серьезных», отвечающих правильно на любой вопрос, и на «шутников», дающих на любой вопрос только неправильные ответы. Учитель, узнав об этом, спросил у Иванова, «серьезный» он или «шутник». Не расслышав ответа Иванова, он спросил у Петрова и Сидорова (сидевших рядом с Ивановым и все слышавших): «Что ответил мне Иванов?». Петров сказал: «Иванов ответил, что он серьезный». Сидоров же сказал: «Иванов ответил, что он шутник». Кем были Петров и Сидоров? 18.26. Три очень умных попугая На рыночной площади одного маленького городка стояла клетка с очень умными говорящими попугаями (рис. 18.4). За некоторую плату каждый попугай отвечал на заданные ему вопросы. Жители городка знали, что один из попугаев всегда говорит правду, другой, сколько ему ни дай, соврет, а третий отвечает согласно плате и настроению: решит, что мало дали, — соврет; решит, что плата достаточная, — скажет правду. Но вот кто из них — лжец, а кто хитрец — никто не знал, пока в город не приехал... специалист по логике. Рис. 18.4
18. Разные задачи 239 — Кто сидит рядом с тобой? — спросил он у первого попугая. — Лжец, — ответил тот. — А ты кто такой? — спросил специалист у второго попугая. — Я хитрец! — А кто сидит рядом с тобой? — спросил он у третьего попугая. — Абсолютно честный попугай! — был ответ. После этого специалист по логике сказал, кто из них действительно абсолютно честный, кто лжец, а кто хитрец. А вы сможете это сделать? 18.27. Умная обезьяна Когда обезьяна несла три кокосовых ореха на вершину «многоярусного» дерева, один орех упал с 11-го «яруса» и разбился. Обезьяна хочет определить самый высокий «ярус», при падении с которого кокосовые орехи не разбиваются. Она может уронить орех с любого «яруса» и подобрать его, если он цел. При падении с первого «яруса» орехи точно не разбиваются. Может ли она, используя два уцелевших ореха, решить эту задачу за четыре испытания (во время которых все орехи могут быть разбиты)? 18.28. Импульсы с планеты t Кита С планеты t Кита поступают радиоимпульсы. Была получена последовательность сообщений вида: X[1] = 000100001001010101100001 X[2] = 00010001000010010101010101100001 X[3] = 0001000100010000100101010101010101100001 и т. д. Выдвинута гипотеза: если сообщения X[i], i = 1, 2, 3, ... подчиняются некоторому простому закону, то на планете живут разумные существа. Разумные ли существа живут на t Кита? 18.29. 10 единиц и 10 двоек На доске написано мелом 10 единиц и 10 двоек. За один ход разрешается стереть две любые цифры и, если они были одинаковыми, то написать двойку, а если разными — единицу. Если оставшаяся на доске цифра — единица, то выиграл первый игрок; если двойка — второй. Кто победит в этой игре?
Занимательная информатика 240 18.30. Еще одна «Шоколадка»* (задача-шутка) Двое ребят по очереди ломают шоколадку размером 6 ´ 8 долек. За один ход разрешается сделать прямолинейный разлом любого из кусков вдоль углубления в шоколадке. Проигрывает тот, кто не сможет сделать ход. Как должны играть участники, чтобы выиграть? Почему задача с этой игрой названа задачей-шуткой? 18.31. Почему трижды? Когда один компьютер посылает сообщения другому, используя «условные» единицы и нули, мы должны быть уверены в правильности полученной информации, Значит, для выявления редких, но возможных ошибок нам требуются какие-то методы. Один из таких методов — передача каждой цифры трижды, т. е. три раза подряд. Например, вместо 1100111 нужно передать 111 111 000 000 111 111 111. Почему делают именно так? 18.32. Детская песенка Вам, конечно, известна такая детская песенка: Точка, точка, запятая — Вышла рожица кривая. Палка, палка, огуречик — Получился человечек. Суть какого вида представления графической информации характеризуют слова этой песенки? 18.33. Умеете ли вы считать? Если вы прочитали главу 8, то, конечно, научились считать в уме J. Это значит, что вы легко решите следующие задачи. 1. Сколько квадратов имеется на дополнительной части клавиатуры настольного IBM-совместимого компьютера? 2. Сколько треугольников, квадратов и прямоугольников можно увидеть на рис. 18.5? Рис. 18.5 * Первую задачу с шоколадкой см. в главе 1.
18. Разные задачи 241 3. Определите количество треугольников на рис. 18.6. Рис. 18.6 4. Сколько треугольников, правильных шестиугольников и ромбов имеется на рис. 18.7? Рис. 18.7 5. Сколько треугольников содержит фигура, показанная на рис. 18.8? Рис. 18.8 18.34. Два вопроса Когда мы смотрим на число 10, а говорим: «Два», и когда мы смотрим на число 2, а говорим: «Десять»? 18.35. Пятьдесят вопросов 1. Вэ, икс, эль, цэ, дэ, эм. Здесь пропущено первое. Что именно? 2. В греческом их — 24, в латинском — 26. А сколько их в русском?
242 Занимательная информатика 3. В художественных произведениях на военную и приключенческую тему, написанных на русском языке, очень важные события происходят, как правило, во время Ч, а написанных на английском языке — в час Х. Почему? 4. Что такое «86 sмopuiM»? 5. Французский писатель Виктор Гюго сказал, что «у истории ее нет». Все вы ею пользовались, а ее виртуальной разновидностью можете воспользоваться на компьютере. Что это? 6. В языке PostScript имеется возможность обрабатывать целые числа не только в десятичной системе счисления, но и еще в 34 других системах. Почему используется именно 35 различных систем счисления? 7. В чем заключается метод подбора ключа к зашифрованному тексту, который по-английски называют Brute-force attack («атака методом грубой силы»)? 8. Что такое «кульбит» с точки зрения информатики? 9. Однажды дежурному пришло с корабля SMS-сообщение на мобильный телефон в виде числа 505. Дежурный (он понял, от кого это сообщение) срочно сообщил об этом командующему флотом, и на помощь кораблю были посланы специальные суда и самолеты. Почему это было сделано? 10. 1/2 этой буквы означает одно из основных понятий баз данных. Что это за буква и какое это понятие? 11. У фирмы Audi это четыре кольца; у фирмы Peugeot — лев. А что это у компьютерной фирмы Apple? 12. Какой цветок мог бы стать «символом» долговременной (внешней) памяти? 13. Специалисты по информационным технологиям, публикуя в Интернете свой адрес электронной почты, часто указывают его в виде: ivanov_dm<собака>mail.ru или ivanov_dm@mail <точка>ru, предлагая в письме заменить русские слова соответствующими символами. Почему? 14. Вы, наверное, слышали о так называемой «проблеме 2000-го года». Напомним, что она была связана с тем, что при переходе с конца дня 31 декабря 1999 года на начало 1 января 2000 года некоторые программы, созданные в 80-х годах прошлого столетия и оперировавшие только с двумя последними цифрами года, могли сработать неправильно. В англоязычной компьютерной литературе эту проблему часто называли «проблема
18. Разные задачи 243 Y2K». Почему для нее использовано именно такое сокращение? 15. Что общего между Государственным флагом России и принципом получения цветной точки (пикселя) на экране монитора? 16. Какая связь между городом в Великобритании, ружьем калибра 30´30 и одним из элементов компьютера? 17. Перед вами стихотворение, написанное в 60-х годах прошлого века программистом С. А. Марковым: Начало светлое весны... Лесов зеленые массивы Цветут. И липы, и осины, И ели помыслы ясны. Себе присвоил этот май Права одеть листвою ветки, И целый месяц в душе метки Он расставляет невзначай... И пишется легко строка, И на этюдник рвутся кисти, Уходит ложь в обличье истин, И говорю я ей: пока! Сколько слов, связанных с синтаксисом некоторого языка программирования, имеется в стихотворении? (Это могут быть так называемые «зарезервированные» слова языка, названия операторов, типов величин и т. п.) 18. Какая поговорка описывает момент, когда закончится выполнение следующего оператора цикла, записанного ниже на трех языках программирования: а) на школьном алгоритмическом языке: нц | вывод нс, "Здравствуйте!" кц_при 2 = 1 б) на языке Паскаль: repeat writeln('Здравствуйте!'); until 2 = 1 в) на языке Бейсик: DO PRINT "Здравствуйте!" LOOP UNTIL 2 = 1
244 Занимательная информатика 19. О какой компьютерной программе идет речь в песне (чутьчуть «подправленной» J): Он мне дорог с давних лет И его милее нет — Этих окон негасимый цвет. 20. Почему логическую операцию конъюнкции иначе называют логическим умножением, а логическую операцию дизъюнкции — логическим сложением, а не наоборот? 21. Этого литературного героя можно было бы назвать «предшественником» компьютера, — ведь именно он, изучая таблицу умножения, пользовался двоичной системой счисления, выясняя, что «единожды нуль — нуль», а «единожды един — един». Кто этот герой? 22. Вы наверняка слышали песню Максима Леонидова «Девочкавиденье», в которой есть слова: «Она прошла, как каравелла по зеленым волнам, Прохладным ливнем после жаркого дня. Я оглянулся посмотреть, не оглянулась ли она, Чтоб посмотреть, не оглянулся ли я.» С каким понятием программирования связаны две последние строчки? 23. В программировании часто используют особую структуру данных — так называемый «связанный список» из связанных между собой элементов, каждый из которых состоит как минимум из двух частей: в одной из них записана какая-то характеристика объекта, а другая часть — это указание на следующий объект. В какой известной русской народной сказке реализована такая структура данных? 24. В программировании также используют структуру данных, называемую стеком. В ней реализован принцип «последним пришел — первым вышел» (по-английски — «Last In — First Out», или, сокращенно, LIFO). Какое правило работы стека нарушил персонаж фильма «Операция «Ы» и другие приключения Шурика» по кличке Трус (роль которого исполнял Георгий Вицин)? 25. Какую клавишу начинающие пользователи часто называют «домиком», и почему?
18. Разные задачи 245 26. Есть такой широко известный английский анекдот. «Хотите получить много $$$$$$? Нет ничего проще! Включите компьютер, войдите в любой текстовый редактор и нажмите …». Что именно нужно нажать? 27. Одна школьница, впервые увидевшая Рабочий стол операционной системы Windows, робко спросила свою учительницу информатики: «А чем его мыть?». Что именно школьница увидела на Рабочем столе? 28. Один программист написал для компьютера специальную программу: если на клавиатуре одновременно нажимается несколько клавиш, то компьютер блокирует работу всех программ, выводит на экран рисунок и начинает лаять. Для чего ему понадобилась такая программа? 29. Как известно, в Windows запрещается использовать в именах файлов кавычки, потому что этот символ считается «специальным». Но Петя смог назвать файл своего реферата так: Реферат на тему "рекурсия". Как он это сделал? 30. От латинского слова curro — «бежать» происходят два термина, один из которых имеет отношение к полиграфии и компьютерам, а другой — только к компьютерам. Какие это термины? 31. Ряд известных компьютерных компаний (Intel, Microsoft и др.) организовали консорциум, занимающийся согласованием стандартов по применению Интернет-сервисов. Сокращенное название этого консорциума — W3C, хотя его полное название состоит из четырех слов. Почему эта аббревиатура (сокращенное название) — трехбуквенная? 32. Вы, конечно, знаете, что такое бит. А что такое «трит»? 33. Петр Первый прорубил его в Европу; оно же часто появляется на экране при работе компьютера. Что это? 34. При работе компьютеров Macintosh фирмы Apple на экране присутствует изображение . Что оно означает? 35. Какой счетный прибор после появления калькуляторов стали в шутку называть «деревянным калькулятором»? 36. Один из элементов диаграмм и графиков, получаемых в программе Microsoft Excel, называется словом иностранного происхождения, одно из значений которого означает «вымысел, выдумка, нечто невероятное» или «вымышленная биография разведчика». Что это за элемент? Каково его назначение на диаграмме (графике)?
Занимательная информатика 246 37 (вопрос для читателей, знающих английский язык). Перед вами табличка с названиями языков программирования: 1. Алгол (самый первый язык программирования высокого уровня). 2. Бейсик. 3. Си. 4. ??? (четвертый). Какой язык программирования должен быть здесь записан четвертым? 38. В обозначениях древнекитайского математика Фу Ши, жившего около 3000 г. до н.э., знак означал число 6, знак — число 1, а знак — число 3. Что тогда обозначал знак ? 39. Какое изображение вы разместили бы на месте вопросительного знака в приведенной таблице? |Оператор1 |Оператор2 |Оператор3 |... если | то | действия1 | иначе | действия2 все нц |Оператор1 |Оператор2 |... кц ? 40. Перед вами 9 таблиц: V 5 . 01110110 00110101 00101110 I 1 , 01001001 00110001 00101100 X 0 01011000 00110000 00100000 Почему в последней таблице символ отсутствует?
18. Разные задачи 247 41. Вы, конечно, знаете, что в программировании существует такая конструкция как вложенный цикл. Какая русская народная игрушка является «аналогом» этой конструкции? 42. Как говорится в русской пословице, «утопающий хватается за соломинку». А за какую клавишу, если можно так выразиться, «хватается» начинающий пользователь офисных и других программ при каких-либо затруднениях при работе с ними? 43. Вам, наверное, известно, что существует язык программирования ЛОГО. Как в шутку можно называть педагога, преподающего ученикам этот язык? 44. Вы когда-нибудь видели, как белка бегает в колесе? Какое состояние при работе программы является аналогом «белки в колесе»? 45. Вы, наверное, слышали такую пословицу: «Язык мой – враг мой». А когда бывает, что язык – это помощник и даже источник дохода? 46. Как известно, совокупность символов, используемых в некотором языке, носит название «алфавит». У этого слова есть и синоним – «азбука». Какое из этих слов следовало бы считать «исконно русским», а какое – «пришелец» из иностранных языков? 47. Какое состояние компьютера описывает крылатая фраза «А воз и ныне там» из всем известной басни Ивана Андреевича Крылова «Лебедь, Щука и Рак»? 48. Какая русская народная поговорка характеризует значение единицы информации «бит»? 49. Дана последовательность цифр: 8, 2, 9, 0, 1, 5, 7, 3, 4, 6. Почему эти цифры расположены здесь именно в таком порядке? 50. В идеологии объектно-ориентированного программирования важными понятиями являются «предок» и «потомок». Название какого романа И.С. Тургенева связано с этими двумя понятиями? Прокурор приезжает с инспекцией в тюрьму и видит: ворота открыты, охраны нет, камеры настежь, — и при этом все преступники на месте! Совершенно ошарашенный увиденным, он вызывает начальника тюрьмы и говорит: — Послушайте, у других сбегают несмотря на наручники, решетки и запертые двери, несмотря на собак и охрану! Что же сделали вы? — Провел им Интернет...
Ответы Ответы к главе 1 1.3 Все возможные варианты состава пиццы (кроме сыра) можно представить в виде табл. О1.1, в которой цифра 1 означает, что соответствующий компонент в продукте используется, а цифра 0 — что этот компонент не используется. Таблица О1.1 ¹ 1 2 3 4 ... Перец 0 0 1 0 Лук 0 0 1 0 Грибы 0 0 1 1 Помидоры 0 0 0 1 Морковь 0 0 1 0 Анчоусы 0 1 0 1 Из этой таблицы видно, что количество различных вариантов пиццы равно десятичному числу, которое в двоичной системе счисления выглядит как 111111, увеличенному на 1 (так как по условию задачи можно не использовать ни один из перечисленных компонентов — такому «составу» пиццы соответствует вариант номер 1). Следовательно, всего возможно 64 варианта. 1.4 Здесь рассуждения будут следующими. 1. Десятичное число 31 в двоичной системе счисления выглядит как 11111, а все числа, меньшие 31, в этой системе состоят (естественно) из единиц и нулей.
Ответы к главе 1 249 2. Любое двоичное число от 1 до 11111 можно получить, складывая двоичные числа 1, 10, 100, 1000 и 10000 (убедитесь в этом сами!). Эти числа есть двойка в степени 0, 1, 2, 3 и 4, т. е. десятичные числа 1, 2, 4, 8 и 16. Значит, минимальный набор гирь-разновесов, который можно использовать для градуировки весов на интервал масс от 1 до 31 кг, — это гири массой 1, 2, 4, 8 и 16 кг. Например, чтобы отградуировать весы на 3 кг (310 = 112) , можно использовать гири массой 1 и 2 кг (этим значениям соответствуют двоичные числа 1 и 10). Чтобы отградуировать весы на 13 кг (1310 = 11012), надо использовать гири массой 1, 4 и 8 кг (12, 1002 и 10002), и т. д. 1.5 1. Учитывая решение предыдущей задачи, нетрудно понять, что десятичные числа 1, 2, …, 7 можно получить из чисел 1, 2 и 4. Значит, надо иметь 1, 2 и 4 звена. Их можно получить, если расцепить третье или четвертое звено — тогда цепочка распадется на три части: в одной будет 2 звена, в другой — 4 звена, а в третьей — одно (разъединенное) звено. С их помощью удастся расплатиться в течение семи дней так, как показано в табл. О1.2. Таблица О1.2 Номер дня проживания (d) 1 2 3 4 5 6 7 Количество звеньев цепочки, отдаваемых в d -й день 1 2 1 4 1 2 1 Количество звеньев, возвращаемых хозяином — 1 — 1+2 — 1 — 2. Решим задачу в общем случае (n дней и n звеньев). Определим максимально возможное число дней, за которые можно расплатиться, расцепив k звеньев цепочки. Очевидно, что этими k расцепленными одинарными звеньями можно расплачиваться в течение первых k дней проживания. Чтобы расплатиться за (k + 1)-й день, надо иметь часть цепочки из (k + 1) звеньев — такую часть можно получить, расцепив первым (k + 2)-е звено. Тогда, имея k одиночных звеньев и (k + 1) сцепленных, можно будет расплатиться за (k + 2)-й, (k + 3)-й, ..., (2(k + 1) – 1)-й дни прожи-
Занимательная информатика 250 вания. Для расчета за следующий день надо иметь часть цепочки из 2(k + 1) звеньев — ее можно получить, расцепив вторым (3(k + 1) + 1)-е звено. Продолжая аналогичные рассуждения, можно получить (2k + 1) частей цепочки, представленные в табл. О1.3. Таблица О1.3 Номер части 1 2 3 4 5 6 ... 2k 2k + 1 4(k+ Количество k+ 1 1 1 2(k + 1) 1 1) звеньев 1 Номер 1 2 k разъединения Номер расцепk+2 3(k + 1) +2 7(k + 1)+3 ляемого звена Например, при k = 3 табл. О1.3 принимает вид табл. О1.4. Общее число дней, за проживание которых можно расплатиться в этом случае, равно 3 + 4 + 8 + 16 + 32 = 63. Таблица О1.4 Номер части Количество звеньев Номер разъединения Номер расцепляемого звена 1 4 2 1 1 5 3 8 4 1 2 14 5 16 6 1 3 31 7 32 В общем случае при k разъединенных звеньях число дней, за которые можно расплатиться таким способом, равно ((k + 1)2k+1 – 1). То есть если у путешественника имеется цепочка из n = ((k + 1)2k+1 – 1) звеньев, то он может разъединить k звеньев так, чтобы получились куски, состоящие, соответственно, из (k + 1), 2(k + 1), 22(k + 1), …, 2k(k + 1) звеньев. Тогда, располагая этими кусками и k разъединенными звеньями, путешественник может расплачиваться с хозяином в течение n дней. Если же число n звеньев цепочки непредставимо в виде n = ((k + 1)2k+1 – 1), то надо рассмотреть наименьшее k такое, что п < (k + 1)2k+1 – 1. В частности, если n = 100, то достаточно распилить k = 4 звена. Дополнительное задание* Самостоятельно ответьте на вопрос: какие 4 звена нужно распилить? * Ответы на это и другие дополнительные задания, которые даны в ответах на основные задачи, приводятся в отдельном подразделе в конце книги.
Ответы к главе 1 251 1.6 В первый кошелек надо положить одну монету, во второй — две, в третий — четыре, в четвертый — восемь, в пятый — шестнадцать, в шестой — тридцать две, в седьмой — шестьдесят четыре. Если этим кошелькам присвоить условные номера, соответственно, 1, 2, …, то любую сумму от 1 до 127 рублей можно получить следующим образом. Нужно перевести эту сумму в двоичную систему счисления, а затем взять кошельки, номера которых равны номерам тех разрядов двоичной записи суммы, где будет цифра 1 (разряды при этом следует нумеровать справа налево, начиная с 1). Например, чтобы выдать сумму в 109 рублей, надо отдать кошельки с номерами 7, 6, 4, 3 и 1, так как 10910 = 11011012 (см. разъяснения к задаче 1.4). 1.7 В таблице в первом столбце справа записаны десятичные числа, которым в двоичной системе счисления соответствуют числа, оканчивающиеся на 1; во втором столбце — числа, у которых в двоичном представлении вторая от конца цифра равна 1; в третьем — десятичные числа, которым в двоичной системе соответствуют числа, имеющие 1 в третьем справа разряде, и т. д. Например, число 22, указанное в задании, в двоичной системе счисления имеет вид 10110, поэтому оно записано в пятом, третьем и втором столбцах. Если вспомнить правило перевода чисел из двоичной системы в десятичную, то по записи 10110 соответствующее десятичное число можно получить как сумму 24 + 22 + 21 (это так называемая «развернутая запись числа»), или, «привязываясь» к нашей нумерации столбцов таблицы, — как сумму 25–1 + 23–1 + 22–1. Таким образом, для отгадывания чисел необходимо запомнить, что пятому столбцу соответствует число 16, четвертому — 8, третьему — 4, второму — 2, а первому — 1, и складывать соответствующие числа для столбцов, названных задумавшим число. При этом, повторим, отгадывать числа можно, даже не глядя на таблицу. Можно также для отгадывания чисел использовать веер (готовый или сделанный самостоятельно). На его пяти пластинках надо записать числа из приведенной в условии таблицы. Тогда вы, обвевая себя веером, сможете предлагать вашим товарищам задумывать числа и указывать только те пластинки, на которых оно записано, и вы сразу же будете называть задуманные числа! 1.8 Вот разгадка этого несложного фокуса. Запишем каждое из чисел от 1 до 127 в двоичной системе. Каждое из этих чисел содержит в двоичной записи не более семи цифр (в частности, 127 = 11111112). Запишем данное число А в таблицу с номером k (k* = 1, 2, …, 7), если в его двоичной записи на k-м месте стоит единица, и не будем его туда записывать, если в его дво* Номера таблиц приведены над ними.
252 Занимательная информатика ичной записи на k-м месте стоит нуль. Например, число 57, которое в двоичной системе записывается как 0111001, должно быть занесено в первую, четвертую, пятую и шестую таблички; число 1 — только в первую табличку; число 127 — во все семь табличек и т. д. Таким образом, слушая, в каких табличках содержится данное число, вы тем самым получаете его двоичную запись. Остается лишь перевести ее в десятичную. Можно поставить вопрос и наоборот: требуется назвать произвольное число от 1 до 127, а отгадчик говорит, в каких табличках оно есть, а в каких его нет. Для этого достаточно перевести названное число в двоичную систему (при некотором навыке это нетрудно сделать и в уме) и назвать номера тех разрядов, в которых получится единица. Примечание. В каждой из табличек (см. табл. 1.4–1.10) числа записаны по возрастанию, поэтому структура этих табличек (и секрет фокуса) довольно легко обнаруживается. Однако внутри каждой из них числа можно переставить совершенно произвольно, замаскировав таким образом способ построения табличек. Можно также не нумеровать карточки, а покрасить их в разные цвета. 1.10 Конечно, после разъяснений к предыдущим фокусам вы уже поняли, в чем секрет данного фокуса и как его демонстрировать. Единственная трудность — запомнить номера 15 слов (словосочетаний). При оформлении табл. 1.11 использованы некоторые приемы, облегчающие запоминание. Например, слова «бит» и «байт» даны, соответственно, под номерами 1 и 8 (1 байт = 8 бит), номер 13 («несчастливое» число) связано со словом «число», а перед ним под номером 12 приведено слово «цифра». Размер дискеты равен 3,5 дюйма, и слово «дискета» дано под номером 3. В жизни (не считая уроков информатики) мы пользуемся десятичной системой счисления, поэтому словосочетание «система счисления» дано под номером… правильно — 10! И еще: чтобы дополнительно «засекретить» фокус, можно в табл. 1.11 номера терминов не приводить (но запомнить их вам все равно, конечно, придется). 1.11 Одна из возможных серий вопросов, заведомо приводящая к успеху, такова. 1-й вопрос: «Разделите задуманное число на 2. Является ли единица остатком при таком делении?» Если ответ — «да», то запишем 1, если «нет» — то 0 (иначе говоря, мы запишем остаток от деления задуманного числа на 2). 2-й вопрос: «Разделите на 2 то частное, которое получилось при первом делении. Является ли единица остатком при таком делении? При ответе «да» запишем 1, а при ответе «нет» — 0.
Ответы к главе 1 253 Каждый следующий вопрос мы будем тоже составлять по тому же самому образцу, т. е.: «Разделите на 2 то частное, которое получилось при предыдущем делении. Является ли единица остатком при таком делении?» И всякий раз мы будем записывать 1 при положительном ответе и 0 — при отрицательном. Повторив эту процедуру 10 раз, мы получим 10 цифр, каждая из которых есть нуль или единица. После ответов на все вопросы записанные цифры надо расположить в обратном порядке — получится двоичное число, соответствующее задуманному десятичному (оно будет 10-значным). Действительно, система наших вопросов воспроизводит ту самую процедуру, с помощью которой делается перевод некоторого числа в двоичную систему. При этом десяти вопросов достаточно, так как каждое число от 500 до 1000 записывается в двоичной системе с помощью не более десяти знаков. Переведя затем полученное число в десятичную систему счисления, мы и получим задуманное число. Если же считать, что задуманное число уже заранее переведено в двоичную систему, то система вопросов, с помощью которой его можно узнать, будет такой. Нужно о каждой его цифре спросить, равна она нулю или нет. Для этого можно задать вопросы: 1) является ли единица крайней справа цифрой двоичного числа, соответствующего задуманному десятичному числу? 2) является ли единица второй справа цифрой двоичного числа, соответствующего задуманному десятичному числу? и т. д. 1.12 Для решения этой задачи достаточно 22 вопросов. Двоичная запись пятизначного числа является 17-значной (убедитесь в этом сами). Можно действовать, например, так. Сначала 15 вопросами, указанными при анализе решения задачи 1.11, вы выясняете последние 15 из 17 цифр, содержащихся в двоичной записи телефонного номера. Затем спрашиваете: «Солгали ли вы в одном из 15 ответов?» Если ответ — «да», то либо один из первых 15 ответов, либо этот последний ответ ложны. Методом «деления пополам» вы четырьмя вопросами узнаете, в каком из этих 16 ответов ложь, а затем двумя вопросами выясните оставшиеся две цифры. Если же на 16-й вопрос вам ответили «нет», то вам действительно не лгали, и уже полученные вами 15 цифр — верные (в противном случае ложь содержалась бы не в одном, а в двух ответах — в одном из первых 15 и в 16-м, а это противоречит условию). Тогда, чтобы узнать оставшиеся две цифры, достаточно пяти вопросов. Например, можно про каждую цифру спрашивать дважды, а если ответы противоречат друг другу, то задать тот же вопрос в третий раз.
Занимательная информатика 254 1.13 Положим на правую чашку весов 1 монету из первого мешка, 2 монеты — из второго, 4 — из третьего, 8 — из четвертого и 16 — из пятого. На левую чашку положим 31 заведомо настоящую монету. «Фальшивые» мешки определяются по двоичной записи разности весов на чашках — в этой записи разряды, в которых записана единица, соответствуют номерам мешков с фальшивыми монетами (проверьте это самостоятельно*). Например, если фальшивые монеты — в мешках под номерами 1, 2 и 5, то весы покажут разницу веса на чашках, равную 19 (1910 = = 100112). Дополнительное задание Как решить задачу, если мешков — шесть, и в шестом тоже все монеты могут быть фальшивыми? Других монет, кроме имеющихся в этих мешках, нет. Но зато вспомним, что наши весы могут показывать и отрицательные значения (от –1 до –100 г). 1.14 Представим номера монет в виде трехразрядных двоичных чисел (табл. О1.5). Таблица О1.5 Номер монеты Условный номер монеты Двоичное представление 1 2 3 4 5 6 7 0 1 2 3 4 5 6 000 001 010 011 100 101 110 8 7 111 В первом взвешивании должны участвовать монеты, содержащие единицу в первом разряде; во втором — монеты с единицей во втором разряде; в третьем взвешивании участвуют монеты с единицей в третьем разряде. Результаты измерений будем записывать так: если общий вес монет равен 39 г, то во взвешиваемой группе содержится фальшивая монета, — тогда запишем 1 в соответствующий номеру измерения разряд; в противном случае запишем 0. Полученное двоичное число будет однозначно определять номер фальшивой монеты. Пример. Пусть фальшивая монета имеет номер 6. Ее условный номер: 510 = 1012, значит, эта монета будет участвовать в первом и в третьем взвешиваниях. При них весы покажут 39 г, а при втором взвешивании — 40 г, т. е. в результате получится двоичное число 101, соответствующее условному номеру фальшивой монеты. Теперь, надеюсь, стало понятно, почему данная задача включена в главу, связанную с двоичной системой счисления, а не в главу с задачами на взвешивания. * Данное утверждение можно и строго доказать. Попробуйте сделать это.
Ответы к главе 1 255 Дополнительное задание Аналогично можно решить следующую задачу: «Среди 9 монет необходимо найти одну фальшивую, пользуясь чашечными весами без гирь, если известно, что фальшивая монета весит больше настоящей». Правда, здесь надо использовать не двоичную систему, а… Впрочем, подумайте о решении сами! J 1.15 Последовательность перекладывания дисков в случае, когда их 4, показана в табл. О1.6. Таблица О1.6 Цифры n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 D 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 C 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 B 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 A Перекладывается диск А B A C A B A D А B A C A B A 1.16 I. Нетрудно убедиться, что если число n есть степень двойки, то последним в круге останется человек, имевший (в исходной нумерации) номер 1. II. Если число n — любое (например, 20), то: 1) сначала из круга выбывает какое-то количество людей до момента, пока в круге не останется число людей, равное степени двойки (в рассматриваемом примере — 16; это означает, что выбыло 4 человека, а среди них последним выбыл 8-й); 2) среди оставшихся 16 человек того, кто стоит первым после последнего выбывшего на этот момент, можно рассматривать как имеющего номер 1, и именно он, в соответствии с пунктом I, останется последним в круге. Номер этого человека в исходной нумерации (в нашем примере) — 9.
Занимательная информатика 256 В общем виде методика определения номера оставшегося человека такова: из общего количества участников нужно вычесть максимальную степень двойки, меньшую количества участников, полученную разность умножить на 2 и прибавить 1. Например, если в круге первоначально стоит 271 человек, то номер последнего оставшегося будет равен (271 – 256) ´ 2 + 1 = 31. Можно также использовать следующую методику нахождения искомого номера: 1) число n перевести в двоичную систему; 2) в полученном двоичном числе первую слева единицу приписать в конце (возможные начальные нули при этом не учитываются); 3) перевести получившееся число в десятичную систему счисления. Проиллюстрируем ее на примерах n = 20 и n = 21 (табл. О1.7). Таблица О1.7 n Двоичное представление n Двоичное представление 20 10100 21 10101 Соответствующая 16 максимальная степень двойки (m) 10000 16 10000 Значение Комментарий к расчетам Сколько человек выбыло к моменту, когда осталось m человек (v) 4 10100 – 10000 100 5 10101 –10000 101 Исходное число n без первой единицы и возможных начальных нулей Номер последнего выбывшего человека 8 1000 (в двоичной системе: 100 ´ 210) 10 1010 (в двоичной системе: 101 ´ 210) Номер человека, который останется в кругу последним 9 1001 (в двоичной системе: 100 ´ 210 + 1) 11 1011 (в двоичной системе: 101 ´ 210 + 1) Чтобы умножить v на 210 и увеличить полученное число на 1, можно приписать к v справа единицу Обоснование этой методики расчетов приведено в последнем столбце таблицы. Дополнительные задания 1. Подумайте над вопросом: имеются ли в частном случае задачи Иосифа Флавия при k = 2 такие значения n, при которых последним в кругу останется человек с четным номером?
Ответы к главе 1 257 2. Кот и мыши Коту снится, что его окружили тринадцать мышей. Двенадцать из них — серые, а одна — белая. Слышит кот, как кто-то говорит ему: «Мурлыка, ты можешь съедать каждую вторую мышку. Но отсчитывай их по кругу в одном направлении. Если ты начнешь счет с белой мыши, то какая будет съедена последней? А вот тебе вторая задача: если последней ты должен съесть белую мышку, то с какой мышки тогда нужно начать счет?» Помогите коту решить эти две задачи, используя метод с записью чисел в двоичной системе счисления. 1.17 Существует 8 способов распределения десяти предметов на три кучки: 1) 1, 1 и 8; 5) 1, 4 и 5; 2) 1, 2 и 7; 6) 2, 3 и 5; 3) 1, 3 и 6; 7) 2, 4 и 4; 4) 2, 2 и 6; 8) 3, 3 и 4. Из них семь обеспечивают выигрыш первому игроку и только один — второму. Дополнительное задание Самостоятельно убедитесь в справедливости последнего утверждения — найдите, в каком случае первый игрок проигрывает. 1.18 На первый взгляд связь между играми «ним» и «шоколадка» не видна. Но присмотримся повнимательнее к шоколадке, изображенной на рис. 1.9. Она состоит из 6 ´ 8 = 48 долек. Ее делят 5 вертикальных и 7 горизонтальных прямых. В результате левее
Занимательная информатика 258 отмеченной дольки есть одна вертикальная полоска долек, а правее нее — 4 полоски; выше отмеченной дольки есть 5 горизонтальных полосок, а ниже — 2. Разложим теперь четыре кучки предметов: в первой — один предмет, во второй — 4, в третьей — 5 и в четвертой — 2. Будем после каждого хода в игре с шоколадкой брать предметы из этих кучек, причем если, скажем, мы отломили сверху полоску в 3 дольки, то берем из третьей кучки 3 предмета; если отломили справа полоску в одну дольку, то берем из второй кучки один предмет, и т. д. Заметим, что тогда, играя в «шоколадку», мы будем одновременно играть и в «ним», причем выигравший в «шоколадку» выиграет и в «ним». Но в «ним» мы играть уже научились, поэтому лучше будет поменять порядок ходов: сначала делать ход в игре «ним», а потом соответствующим образом разламывать шоколадку. Итак, игра в «шоколадку» — это просто игра в «ним» на четырех кучках камней, и выигрышная стратегия здесь та же! Запишем числа 1, 4, 5 и 2 в двоичной системе счисления и найдем сумму единиц в каждом разряде (табл. О1.8). Таблица О1.8 1 1 2 0 0 1 1 1 0 1 0 2 Во втором разряде сумма единиц (средний столбец, внизу) нечетная — значит, исходная позиция — проигрышная («опасная»), но начинающий игру может сделать ее выигрышной («безопасной»), отломив от шоколадки две нижние полоски и тем самым создав ситуацию, в двоичном виде характеризующуюся табл. О1.9. Таблица О1.9 1 1 2 0 0 0 1 0 1 2 Дополнительное задание Самостоятельно подумайте над вопросом: при каких размерах шоколадки начинающий выигрывает при любом расположении отмеченной дольки?
Ответы к главе 2 259 Ответы к главе 2 2.1 Если присвоить черным и белым шарикам номера 1–4 (рассматривая их слева направо), то алгоритм решения задачи будет выглядеть так: {Заводим белый шарик ¹ 4 в нишу} 1. Б4®. 2. Б4­. {Смещаем три белых шарика влево до упора} {Шарик ¹ 1} 3. Б1¬. 4. Б1¬. 5. Б1¬. {Шарики ¹ 2 и ¹ 3} 6. Б2¬. ... 11. Б3¬. {Смещаем все черные шарики влево до упора} {Шарик ¹ 1} 12. Ч1¬. ... 16. Ч1¬. {Шарики ¹ 2, ¹ 3, ¹ 4} 17. Ч2¬. ... 29. Ч4¬. {Выкатываем белый шарик ¹ 4 из желоба} 30. Б4¯ 31. Б4®. ... 35. Б4®. Получаемая в результате ситуация показана на рис. О2.1. Рис. О2.1 {Перемещаем все черные шарики вправо (за нишу)} 36. Ч4®. ... 55. Ч1®.
Занимательная информатика 260 {Перемещаем белый шарик ¹ 3 вправо до ниши, а затем — в нее} 56. Б3®. ... 60. Б3®. 61. Б3­. {Перемещаем все черные шарики влево (за нишу)} 55. Ч1¬. ... 74. Ч4¬. {Выкатываем белый шарик ¹ 3 из желоба} 75. Б3¯ 76. Б3®. ... 80. Б3®. Ситуация после этих действий показана на рис. О2.2. Рис. О2.2 {Перемещаем 81. Ч4®. ... 100. Ч1®. {Перемещаем 101. Б2®. ... 106. Б2®. 107. Б2­. {Перемещаем 108. Ч1¬. ... 127. Ч4¬. {Выкатываем 128. Б2¯ 129. Б2®. ... 133. Б2®. все черные шарики вправо (за нишу)} белый шарик ¹ 2 вправо до ниши, а затем — в нее} все черные шарики влево (за нишу)} белый шарик ¹ 2 из желоба} Получаемая в результате ситуация показана на рис. О2.3.
Ответы к главе 2 261 Рис. О2.3 {Перемещаем 134. Ч4®. ... 153. Ч1®. {Перемещаем 154. Б1®. ... 160. Б1®. 161. Б1­. {Перемещаем 162. Ч1¬. ... 181. Ч4¬. {Выкатываем 182. Б1¯ 183. Б1®. ... 187. Б1®. все черные шарики вправо (за нишу)} белый шарик ¹ 1 вправо до ниши, а затем — в нее} все черные шарики влево (за нишу)} белый шарик ¹ 1 из желоба} Теперь, надеюсь, вы убедились, что с помощью алгоритма любой процесс распадается на простые и однообразные операции, — а ведь именно из таких операций и состоит работа исполнителя всех действий, происходящих в компьютере, — его процессора! 2.2 Задача решается за следующие четыре перекладывания (см. также рис. О2.4): 1. 5 к 2. 2. 3 к 7. 3. 4 к 1 (или 1 к 4). 4. 6 к 8 (или 8 к 6). Возможно также «симметричное» решение: 1. 4 к 7. 2. 6 к 2. 3. 5 к 8 (или 8 к 5). 4. 3 к 1 (или 1 к 3). Рис. О2.4
Занимательная информатика 262 2.3 Задача может быть решена несколькими способами. Минимальное количество действий в алгоритмах — 4. Вот несколько возможных алгоритмов: 1) 1. 1 к (3, 6). 2. 6 к (4, 5). 3. 5 к (3, 1). 4. 1 к (5, 6). 2) 1. 2 к (5, 6). 2. 4 к (5, 2). 3. 5 к (1, 3). 4. 1 к (5, 4). 3) 1. 4 к (1, 2). 2. 5 к (4, 2). 3. 2 к (3, 6). 4. 6 к (2, 5). 2.4 1. Монеты А, В и С необходимо переложить на новые места, показанные пунктирной линией (рис. О2.5). Дополнительное задание Возможно несколько вариантов алгоритма такого размещения (кроме представленного на рис. О2.5). Предлагаем читателям самим найти все эти варианты. Рис. О2.5 Рис. О2.6 2. Задача решается за два перекладывания (на рис. О2.6 пунктирной линией показаны места, куда нужно переложить монеты, расположенные слева и справа во втором горизонтальном ряду). Десять линий (рядов), о которых шла речь в условии задачи, найдите самостоятельно. Возможен также вариант решения с перекладыванием монет, расположенных во втором вертикальном ряду.
Ответы к главе 2 263 2.5 2.5.1. Задача может быть решена несколькими способами. Один из возможных алгоритмов: 1. 2. 3. 4. 5. 4 7 5 2 8 к к к к к 1. 3. 9. 6 (или 6 к 2). 10 (или 10 к 8). Прежде чем продемонстрировать другое решение, заметим, что не всякое иное решение будет новым или, как говорят в математике, существенно отличающимся от приведенного. Так, решение 7 4 6 5 1 к к к к к 10, 8, 2, 9, 3 не является «совсем другим», так как полностью повторяет указанный только что порядок распределения, если спички пронумеровать не слева направо, а справа налево. А вот существенно новым решением будет, например, следующее: 5 7 3 1 9 к к к к к 2, 10, 8, 4, 6. 2.5.2. Здесь порядок перемещения спичек должен быть таким: 5 к 1, 6 к 1, 9 к 3, 10 к 3, 8 к 14, 7 к 14, 4 к 2, 11 к 2, 13 к 15, 12 к 15.
Занимательная информатика 264 Второе возможное решение: 5 к 1, 6 к 1, 9 к 3, 10 к 3, 8 к 14, 4 к 13, 11 к 14, 15 к 13, 7 к 2, 12 к 2. 2.6 2.6.1. Основная идея алгоритма решения задачи — сначала собрать шашки в требуемом порядке на свободном месте слева. Это можно сделать за три хода (перемещения) — см. рис. О2.7а. После этого шашки можно разместить на тех же шести местах, что и в исходном положении, еще за три перемещения (рис. О2.7б). Рис. О2.7
Ответы к главе 2 265 Для случая, когда свободное место находится справа, задача решается «симметричными» перемещениями (на рис. О2.8 показаны три первых хода). Рис. О2.8 2.6.2. Решение показано на рис. О2.9. Рис. О2.9 2.6.3. Оптимальное решение для 10 шашек показано на рис. О2.10, для 12 шашек — на рис. О2.11, для 14 шашек — на рис. О2.12.
Занимательная информатика 266 Рис. 02.10 Рис. О2.11
Ответы к главе 2 267 Рис. О2.12 2.6.4. Решение показано на рис. О2.13: Рис. О2.13
Занимательная информатика 268 2.6.5. Решение (для шести шашек) показано на рис. О2.14. Рис. О2.14 Для восьми шашек задача решается в 24 хода следующими перемещениями: 1) 6 ® 5; 7) 6 ® 8; 13) 7 ® 5; 19) 3 ® 2; 2) 4 ® 6; 8) 4 ® 6; 14) 9 ® 7; 20) 5 ® 3; 3) 3 ® 4; 9) 2 ® 4; 15) 8 ® 9; 21) 7 ® 5; 4) 5 ® 3; 10) 1 ® 2; 16) 6 ® 8; 22) 6 ® 7; 5) 7 ® 5; 11) 3 ® 1; 17) 4 ® 6; 23) 4 ® 6; 6) 8 ® 7; 12) 5 ® 3; 18) 2 ® 4; 24) 5 ® 4. Первое число здесь обозначает номер перемещаемой шашки, а второе — номер клетки, в которую она перемещается.
Ответы к главе 2 269 2.7 Возможный алгоритм решения задачи: 2—1, 3—2, 4—3, 4—А, 5—4, 5—3, 6—5, 6—4, 7—6, 7—5, 7—Б, 8—7, 8—6, 8—5, 9—8, 9—7, 9—6, 1—9, 1—8, 1—7, 1—В, 9—7, 9—8, 9—9, 9—10, 8—6, 8—7, 8—8, 8—9, 7—5, 7—6, 7—7, 7—8, 1—7, 1—6, 1—5, 1—Б, 6—5, 6—6, 6—7, 6—В, 5—4, 5—5, 5—6, 5—7, 4—3, 4—4, 4—5, 4—6, 1—5, 1—4, 1—3, 1—А. Дальнейший порядок перемещений очевиден. 2.8 Решение состоит из 13 ходов: 1) a2–с2; 6) с3–е3–е5; 2) al–cl–с3; 7) d3–d5–f5; 3) bl–b3–d3; 8) d4–f4–f6; 4) b2–d2–d4; 9) e4–e6–g6; 5) с2–с4–е4; 10) e5–g5–g7; 11) f5–f7–h7; 12) f6–h6–h8; 13) g6–g8. Примечание. При записи ходов использовалась так называемая «алгебраическая шахматная нотация», изобретенная Филиппом Стаммой (автором книги «Опыт шахматной игры», вышедшей в 1737 г. в Париже) и усовершенствованная немецким шахматистом М. Гиршелем в 1784 г. Согласно ее правилам, поля шахматной доски обозначаются двумя символами: буквой латинского алфавита, обозначающей вертикаль (слева направо от «а» до «h» — см. рис. 2.15), и арабской цифрой, обозначающей горизонталь (от 1 до 8, при счете от белых фигур к черным, а на бумаге — снизу вверх). 2.9 Алгоритм решения задачи состоит из 24 действий: 1) 2) 3) 4) 5) 6) 6 4 3 5 7 8 в в в в в в 5; 6; 4; 3; 5; 7; 7) 6 в 8; 8) 4 в 6; 9) 2 в 4; 10) 1 в 2; 11) 3 в 1; 12) 5 в 3; 13) 14) 15) 16) 17) 18) 7 9 8 6 4 2 в в в в в в 5; 7; 9; 8; 6; 4; 19) 20) 21) 22) 23) 24) 3 5 7 6 4 5 в в в в в в 2; 3; 5; 7; 6; 4. 2.10 Разместить зверей по их клеткам с соблюдением всех условий работник зоопарка может за 14 переселений, последовательность которых указана в табл. О2.1 (В — волк, Т — тигр, Л — лев, О — осел, П — пантера). Возможны и другие варианты решения, в том числе такое «оригинальное», как просто поменять таблички на клетках, чтобы надписи на них соответствовали находящимся в них зверям J.
Занимательная информатика 270 Таблица О2.1 ¹¹ пп 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Перемещение животного Исходное размещение Лев ® общий вольер Осел ® клетка ¹ 4 Лев ® клетка ¹ 3 Пантера ® общий вольер Тигр ® клетка ¹ 1 Лев ® клетка ¹ 2 Осел ® клетка ¹ 3 Волк ® клетка ¹ 4 Пантера ® клетка ¹ 5 Тигр ® общий вольер Лев ® клетка ¹ 1 Осел ® клетка ¹ 2 Волк ® клетка ¹ 3 Тигр ® клетка ¹ 4 1 П П П П Т Т Т Т Т Л Л Л Л Клетка 3 4 О Л О О Л О Л О Л О Л О Л О Л О В Л О В Л О В О В О В О В О В Т 2 Т Т Т Т Т 5 В В В В В В В В П П П П П П Общий вольер Л Л П П П П П Т Т Т Т 2.11 Задача изящно решается при помощи «метода пуговиц и нитей», предложенного известным английским мастером головоломок Г. Дьюдени. На каждое поле нашей маленькой доски, кроме центрального (на него кони попасть не могут), поместим по пуговице (на рис. О2.15а они изображены кружками). Если между двумя полями возможен ход конем, то лежащие в них пуговицы соединим нитью (на рис. О2.15а нитям соответствуют отрезки, соединяющие кружки). А затем весь полученный «клубок» пуговиц и нитей распутаем так, чтобы все пуговицы расположились по кругу (рис. О2.15б). Теперь решение задачи отыскивается почти автоматически. Выбрав одно из направлений движения по кругу, будем перестав- Рис. О2.15
Ответы к главе 2 271 лять по нему коней до тех пор, пока они не поменяются местами. Тогда необходимое перемещение коней по доске получится, если записать соответствующие пуговицам обозначения полей. Нетрудно убедиться, что решение состоит в 16 перемещениях коней (восьми белых и восьми черных), причем кони разного цвета могут ходить по очереди. Дополнительное задание Поставим теперь дополнительное условие — чтобы белые и черные кони при своем движении не угрожали друг другу (очередность ходов в этом случае можно нарушать). Самостоятельно найдите решение для этого случая. 2.12 Задача «АПЕЛЬСИН — СПАНИЕЛЬ» Основные промежуточные состояния при решении показаны на рис. О2.16–О2.18 , а результат — на рис. О2.19. Рис. О2.16 Рис. О2.17 Рис. О2.18 Рис. О2.19
Занимательная информатика 272 (Один остроумный человек, долго мучавшийся с этой головоломкой, сказал автору так: «Решая эту задачу, я ПАСИНЕЛЬ»! J) Задача «ПЕРЕПРАВА» За манипуляциями с карточками здесь удобнее следить, если два «П», два «Р», два «А» и два «Е» обозначить по-разному: «П» и «п», «Р» и «р», «А» и «а», «Е» и «е » (рис. О2.20–О2.22). Рис. О2.21 Рис. О2.20 Рис. О2.22
Ответы к главе 2 273 Задача о мухе и слоне (см. сноску к заголовку задачи) Задача решается следующим образом: «муха» — «муpа» — «туpа» — «таpа» — «каpа» — «каpе» — «кафе» — «кафp» — «каюp» — «каюк» — «кpюк» — «уpюк» — «уpок» — «сpок» — «сток» — «стон» — «слон». В результате муху удалось «пpевpатить» в слона всего лишь за 16 ходов. J 2.13 Авторские решения предложенных задач содержат следующие количества перекладываний: 1) «АДРЕС» ® «СРЕДА» — 20; 2) «ТРОПИК» ® «ПРИТОК» — 20; 3) «АТЛАС» ® «САЛАТ» — 22; 4) «ПРИКАЗ» ® «КАПРИЗ» — 24; 5) «СОКОЛ» ® «КОЛОС» — 36; 6) «ВОДОПАД» ® «ПОДВОДА» — 42; 7) «ЛЕПЕСТОК» ® «ТЕЛЕСКОП» — 48; 8) «ВЕРТИКАЛЬ» ® «КИЛЬВАТЕР» — 64. Может быть, вам удастся справиться с этими задачами быстрее? 2.14 Решение показано в табл. О2.2. Таблица О2.2 Исходное состояние 1. Переставляем карточки 4, 5, 6, 1, 2, 3 2. Переставляем карточки 7, 8, 9, 3, 2, 1 3. Переставляем карточки 9, 8, 7, 6, 5, 4 7 7 1 1 8 8 2 2 9 9 3 3 4 3 9 4 5 2 8 5 6 1 7 6 1 6 6 7 2 5 5 8 3 4 4 9 2.15 3. Для упорядочивания n карточек не обязательно требуется (n – 1) проходов. Например, для 10 карточек, показанных на рис. О2.23, задача сортировки по возрастанию решается всего за три прохода. Рис. О2.23 Дополнительное задание Возникает новый вопрос: как «поймать» момент, когда числа на всех карточках (в программе — все элементы массива) стали упорядоченными, и прекратить бесполезные дальнейшие проходы? Просмотр и сравнение соседних чисел после каждого прохода —
Занимательная информатика 274 нерациональный вариант, так как он требует много дополнительных операций. Подумайте над более рациональным приемом, позволяющим зафиксировать факт, что все карточки (все элементы массива) стали уже отсортированными. Ответы к главе 3 3.1 Таблица О3.1 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 3 0 2 К3 Перелить из А в В 0 3 3 К1 Наполнить А 3 3 4 К3 Перелить из А в В 2 4 3.2 Эта задача имеет два лучших (принципиально разных) решения, равнозначных с точки зрения количества команд (табл. О3.2 и О3.3). Таблица О3.2 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 3 0 2 К3 Перелить из А в В 0 3 3 К1 Наполнить А 3 3 4 К3 Перелить из А в В 0 6 5 К1 Наполнить А 3 6 6 К3 Перелить из А в В 0 9 7 К1 Наполнить А 3 9 8 К3 Перелить из А в В 2 10 9 К6 Вылить из В 2 0 10 К3 Перелить из А в В 0 2 11 К1 Наполнить А 3 2 12 К3 Перелить из А в В 0 5
Ответы к главе 3 275 Таблица О3.3 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 12 К2 К4 К5 К4 К5 К4 К5 К4 К2 К4 К5 К4 Описание Исходное состояние Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А Вылить из А Перелить из В в А А 0 0 3 0 3 0 3 0 1 1 3 0 3 В 0 10 7 7 4 4 1 1 0 10 8 8 5 3.3 Таблица О3.4 ¹ Команда 1 2 3 4 5 К2 К4 К5 К4 К5 Описание Исходное состояние Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А А 0 0 4 0 4 0 В 0 10 6 6 2 2 3.4 Здесь также возможно несколько вариантов решения. В наилучшем варианте задача решается за 6 операций (табл. О3.5). Таблица О3.5 ¹ Команда 1 2 3 4 5 6 К3 К9 К11 К9 К3 К9 Описание Исходное состояние Наполнить С Перелить из С в В Вылить из В Перелить из С в В Наполнить С Перелить из С в В А 0 0 0 0 0 0 0 В 0 0 10 0 2 2 10 С 0 12 2 2 0 12 4
Занимательная информатика 276 3.5 Таблица О3.6 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К2 Наполнить В 0 10 0 2 К7 Перелить из В в С 0 0 10 3 К1 Наполнить А 5 0 10 4 К5 Перелить из А в С 3 0 12 5 К12 Вылить из С 3 0 0 6 К2 Наполнить В 3 10 0 7 К7 Перелить из В в С 3 0 10 8 К5 Перелить из А в С 1 0 12 Возможны также варианты, отличающиеся от приведенного выше порядком выполнения трех первых и трех последних команд. 3.6 Здесь оптимальных решений также может быть несколько. Один из вариантов приведен в табл. О3.7. Таблица О3.7 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К2 Наполнить В 0 5 0 2 К6 Перелить из В в А 4 1 0 3 К10 Вылить из А 0 1 0 4 К6 Перелить из В в А 1 0 0 5 К3 Наполнить С 1 0 10 6 К8 Перелить из С в А 4 0 7 3.7 Данная задача имеет два оптимальных варианта решения, представленных в табл. О3.8 и О3.9.
Ответы к главе 3 277 Таблица О3.8 ¹ Команда 1 2 3 4 5 К2 К6 К7 К2 К7 Описание Исходное состояние Наполнить В Перелить из В в А Перелить из В в С Наполнить В Перелить из В в С А 0 0 3 3 3 3 В 0 5 2 0 5 0 С 0 0 0 2 2 7 Таблица О3.9 ¹ Команда 1 2 3 4 5 К2 К7 К2 К6 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в А Перелить из В в С А 0 0 0 0 3 3 В 0 5 0 5 2 0 С 0 0 5 5 5 7 3.8 Здесь лучших вариантов также может быть несколько. Один из них приведен в табл. О3.10. Таблица О3.10 ¹ Команда 1 2 3 4 5 6 К1 К5 К1 К5 К1 К5 Описание Исходное состояние Наполнить А Перелить из А в С Наполнить А Перелить из А в С Наполнить А Перелить из А в С А 0 3 0 3 0 3 0 В 0 0 0 0 0 0 0 С 0 0 3 3 6 6 9 3.9 Обратим внимание на требование решить эту задачу, использовав минимально возможное количество воды. Этому требованию удовлетворяет следующий алгоритм (табл. О3.11).
Занимательная информатика 278 Таблица О3.11 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К1 Наполнить А 3 0 0 2 К5 Перелить из А в С 0 0 3 3 К1 Наполнить А 3 0 3 4 К5 Перелить из А в С 0 0 6 5 К1 Наполнить А 3 0 6 6 К5 Перелить из А в С 0 0 9 Для решения этой задачи использовано 9 л воды (здесь и далее в аналогичных задачах соответствующие объемы выделены курсивом). Возможны также и другие алгоритмы с большим количеством операций, при которых также используется 9 л воды. 3.10 Один из нескольких возможных оптимальных вариантов приведен в табл. О3.12. Таблица О3.12 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К2 Наполнить В 0 6 0 2 К7 Перелить из В в С 0 0 6 3 К2 Наполнить В 0 6 6 4 К7 Перелить из В в С 0 1 11 5 К1 Наполнить А 3 1 11 6 К4 Перелить из А в В 0 4 11 7 К12 Вылить из С 0 4 0 8 К7 Перелить из В в С 0 0 4
Ответы к главе 3 279 3.11 Таблица О3.13 ¹ Команда 1 2 3 4 К2 К7 К2 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в С А 0 0 0 0 0 В 0 10 0 10 9 С 0 0 10 10 11 3.12 Оптимальные варианты приведены в табл. О3.14 и О3.15. Таблица О3.14 ¹ Команда 1 2 3 4 5 К2 К6 К7 К2 К7 Описание Исходное состояние Наполнить В Перелить из В в А Перелить из В в С Наполнить В Перелить из В в С А 0 0 3 3 3 3 В 0 7 4 0 7 0 С 0 0 0 4 4 11 Таблица О3.15 ¹ Команда 1 2 3 4 5 К2 К7 К2 К6 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в А Перелить из В в С А 0 0 0 0 3 3 В 0 7 0 7 4 0 С 0 0 7 7 7 11 3.13 Здесь возможно несколько оптимальных вариантов. Один из них представлен в табл. О3.16.
Занимательная информатика 280 Таблица О3.16 ¹ Команда 1 2 3 4 5 К2 К6 К7 К2 К7 Описание Исходное состояние Наполнить В Перелить из В в А Перелить из В в С Наполнить В Перелить из В в С А 0 0 4 4 4 4 В 0 5 1 0 5 0 С 0 0 0 1 1 6 3.14 Здесь также необходимо решить задачу, использовав минимально возможное количество воды. Алгоритмов, в которых используется 8 л воды, возможно четыре. Один из них приведен в табл. О3.17. Таблица О3.17 ¹ Команда 1 2 3 4 5 6 К3 К9 К6 К11 К4 К9 Описание Исходное состояние Наполнить С Перелить из С в В Перелить из В в А Вылить из В Перелить из А в В Перелить из С в В А 0 0 0 4 4 0 0 В 0 0 5 1 0 4 5 С 0 8 3 3 3 3 2 Кроме того, для данной задачи существует еще более эффективный с точки зрения общего количества используемой воды алгоритм. Он представлен в табл. О3.18. Таблица О3.18 ¹ Команда 1 2 3 4 5 6 7 К2 К6 К7 К4 К2 К6 К7 Описание Исходное состояние Наполнить В Перелить из В в А Перелить из В в С Перелить из А в В Наполнить В Перелить из В в А Перелить из В в С А В 0 0 0 5 4 1 4 0 0 4 0 5 (= 4 + 1) 4 1 4 0 С 0 0 0 1 1 1 1 2
Ответы к главе 3 281 Обратим внимание: при выполнении 5-й операции (команда К2) доливается только 1 л, так что общее количество используемой воды составляет всего 6 л (!). 3.15 Два возможных оптимальных алгоритма приведены в табл. О3.19 и О3.20. Таблица О3.19 ¹ Команда 1 2 3 4 5 К2 К6 К7 К2 К7 Описание Исходное состояние Наполнить В Перелить из В в А Перелить из В в С Наполнить В Перелить из В в С А 0 0 4 4 4 4 В 0 7 3 0 7 0 С 0 0 0 3 3 10 Таблица О3.20 ¹ Команда 1 2 3 4 5 К2 К7 К2 К6 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в А Перелить из В в С А 0 0 0 0 4 4 В 0 7 0 7 3 0 С 0 0 7 7 7 10 3.16 Таблица О3.21 ¹ Команда 1 2 3 4 5 6 К2 К6 К10 К6 К2 К6 Описание Исходное состояние Наполнить В Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А А 0 0 4 0 3 3 4 В 0 7 3 3 0 7 6 С 0 0 0 0 0 0 0
Занимательная информатика 282 Возможен также целый ряд вариантов решения этой задачи за 7 операций. 3.17 В этой задаче возможно несколько оптимальных вариантов решения, один из которых представлен в табл. О3.22. Таблица О3.22 ¹ Команда 1 2 3 4 К2 К7 К1 К5 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить А Перелить из А в С А 0 0 0 4 3 В 0 8 0 0 0 С 0 0 8 8 9 3.18 Таблица О3.23 ¹ Команда 1 2 3 4 К2 К7 К2 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в С А 0 0 0 0 0 В 0 8 0 8 7 С 0 0 8 8 9 3.19 За минимальное количество действий (4) данная задача может быть решена несколькими способами. Один из представлен в табл. О3.24. Таблица О3.24 ¹ Команда 1 2 3 4 К1 К4 К3 К9 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить С Перелить из С в В А 0 3 0 0 0 В 0 0 3 3 5 С 0 0 0 11 9 3.20 Здесь возможно два оптимальных варианта решения (табл. О3.25 и О3.26).
Ответы к главе 3 283 Таблица О3.25 ¹ Команда 1 2 3 4 5 К2 К7 К2 К7 К6 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в С Перелить из В в А А 0 0 0 0 0 2 В 0 6 0 6 2 0 С 0 0 6 6 10 10 Таблица О3.26 ¹ Команда 1 2 3 4 5 К3 К9 К8 К10 К8 Описание Исходное состояние Наполнить С Перелить из С в В Перелить из С в А Вылить из А Перелить из С в А А 0 0 0 3 0 2 В 0 0 6 6 6 6 С 0 11 5 2 2 0 3.21 Требованию решить задачу, использовав минимально возможное количество воды, удовлетворяют алгоритмы, при выполнении которых используется 12 л воды. Таких алгоритмов может быть несколько; один из них представлен в табл. О3.27. Таблица О3.27 ¹ Команда 1 2 3 4 5 6 7 8 9 К2 К7 К2 К7 К6 К9 К12 К7 К5 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в С Перелить из В в А Перелить из С в В Вылить из С Перелить из В в С Перелить из А в С А 0 0 0 0 0 1 1 1 1 0 В 0 6 0 6 1 0 6 6 0 0 С 0 0 6 6 11 11 5 0 6 7 3.22 В оптимальном варианте эта задача решается за 6 действий — так, как показано в табл. О3.28 и О3.29.
Занимательная информатика 284 Таблица О3.28 ¹ Команда 1 2 3 4 5 6 К1 К4 К1 К4 К1 К4 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В А 0 3 0 3 0 3 2 В 0 0 3 3 6 6 7 С 0 0 0 0 0 0 0 Таблица О3.29 ¹ Команда 1 2 3 4 5 6 К3 К8 К9 К4 К8 К4 Описание Исходное состояние Наполнить С Перелить из С в А Перелить из С в В Перелить из А в В Перелить из С в А Перелить из А в В А 0 0 3 3 0 3 2 В 0 0 0 3 6 6 7 С 0 10 7 4 4 1 1 3.23 Здесь также требовалось решить задачу, использовав минимально возможное количество воды. В наилучших вариантах решения используется 9 л воды; один из таких вариантов показан в табл. О3.30. Таблица О3.30 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 К1 К4 К1 К4 К1 К4 К5 К6 К5 К6 К5 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Перелить из А в С Перелить из В в А Перелить из А в С Перелить из В в А Перелить из А в С А 0 3 0 3 0 3 2 0 3 0 3 0 В 0 0 3 3 6 6 7 7 4 4 1 1 С 0 0 0 0 0 0 0 2 2 5 5 8
Ответы к главе 3 285 3.24 Наилучшие алгоритмы решения этой задачи состоят из шести действий. Один из возможных оптимальных вариантов приведен в табл. О3.31. Таблица О3.31 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К1 Наполнить А 3 0 0 2 К4 Перелить из А в В 0 3 0 3 К1 Наполнить А 3 3 0 4 К4 Перелить из А в В 0 6 0 5 К3 Наполнить С 0 6 12 6 К9 Перелить из С в В 0 8 10 3.25 Минимально возможное количество воды, используемое для решения этой задачи, равно 12 л. Один из наилучших вариантов показан в табл. О3.32. Таблица О3.32 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К2 Наполнить В 0 9 0 2 К1 Наполнить А 3 9 0 3 К5 Перелить из А в С 0 9 3 4 К7 Перелить из В в С 0 2 10 5 К8 Перелить из С в А 3 2 7 6 К12 Вылить из С 3 2 0 7 К5 Перелить из А в С 0 2 3 8 К7 Перелить из В в С 0 0 5 3.26 Требованию решить задачу, использовав минимально возможное количество воды, удовлетворяют алгоритмы, при выполнении которых используется 12 л воды. Таких алгоритмов может быть несколько; в табл. О3.33 представлен один из них.
Занимательная информатика 286 Таблица О3.33 ¹ Команда 1 2 3 4 5 6 К2 К7 К1 К5 К9 К6 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить А Перелить из А в С Перелить из С в В Перелить из В в А А 0 0 0 3 2 2 3 В 0 9 0 0 0 9 8 С 0 0 9 9 10 1 1 3.27 Лучшие алгоритмы решения этой задачи состоят из шести команд (см. табл. О3.34 и О3.35). Таблица О3.34 ¹ Команда 1 2 3 4 5 6 К2 К7 К1 К5 К12 К5 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить А Перелить из А в С Вылить из С Перелить из А в С А 0 0 0 3 1 1 0 В 0 9 0 0 0 0 0 С 0 0 9 9 11 0 1 Таблица О3.35 ¹ Команда 1 2 3 4 5 6 К1 К2 К5 К7 К12 К7 Описание Исходное состояние Наполнить А Наполнить В Перелить из А в С Перелить из В в С Вылить из С Перелить из В в С А 0 3 3 0 0 0 0 В 0 0 9 9 1 1 0 С 0 0 0 3 11 0 1 В них очередность выполнения первых четырех команд может быть и несколько иной, что дает еще ряд возможных вариантов решения.
Ответы к главе 3 287 3.28 Минимально возможное количество воды, используемое для решения этой задачи, равно 12 л. Один из возможных оптимальных вариантов приведен в табл. О3.36. Таблица О3.36 ¹ Команда 1 2 3 4 5 6 7 8 К2 К7 К1 К5 К9 К12 К5 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить А Перелить из А в С Перелить из С в В Вылить из С Перелить из А в С Перелить из В в С А 0 0 0 3 1 1 1 0 0 В 0 9 0 0 0 9 9 9 0 С 0 0 9 9 11 2 0 1 10 3.29 Здесь решение крайне простое (см. табл. О3.37). Таблица О3.37 ¹ Команда 1 2 К3 К8 Описание Исходное состояние Наполнить С Перелить из С в А А 0 0 4 В 0 0 0 С 0 11 7 3.30 Наилучшее решение этой задачи дают алгоритмы, состоящие из шести команд. Таких алгоритмов может быть несколько; один из них представлен в табл. О3.38. Таблица О3.38 ¹ Команда 1 2 3 4 5 6 К2 К7 К2 К7 К1 К4 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Налить из В в С Наполнить А Перелить из А в В А 0 0 0 0 0 4 0 В 0 7 0 7 2 2 6 С 0 0 7 7 12 12 12
Занимательная информатика 288 3.31 Таблица О3.39 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 4 0 2 К3 Перелить из А в В 0 4 3 К1 Наполнить А 4 4 4 К3 Перелить из А в В 0 8 5 К1 Наполнить А 4 8 6 К3 Перелить из А в В 3 9 7 К6 Вылить из В 3 0 8 К3 Перелить из А в В 0 3 9 К1 Наполнить А 4 3 10 К3 Перелить из А в В 0 7 3.32 Таблица О3.40 ¹ Команда Описание А В Исходное состояние 0 0 1 К2 Наполнить В 0 11 2 К4 Перелить из В в А 4 7 3 К5 Вылить из А 0 7 4 К4 Перелить из В в А 4 3 5 К5 Вылить из А 0 3 6 К4 Перелить из В в А 3 0 7 К2 Наполнить В 3 11 8 К4 Перелить из В в А 4 10 9 К5 Вылить из А 0 10 10 К4 Перелить из В в А 4 6 11 К5 Вылить из А 0 6 12 К4 Перелить из В в А 4 2
Ответы к главе 3 289 3.33 Таблица О3.41 ¹ Команда 1 2 3 4 5 6 7 8 К2 К4 К5 К4 К5 К4 К2 К4 Описание Исходное состояние Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А А 0 0 6 0 6 0 2 2 6 В 0 14 8 8 2 2 0 14 10 3.34 Таблица О3.42 ¹ Команда 1 2 3 4 5 6 К1 К3 К1 К3 К1 К3 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В А 0 3 0 3 0 3 1 В 0 0 3 3 6 6 8 3.35 В этой задаче возможно два наилучших решения, равнозначных с точки зрения количества действий (табл. О3.43 и О3.44). Таблица О3.43 ¹ Команда 1 2 3 4 5 6 7 8 9 10 К1 К3 К1 К3 К1 К3 К6 К3 К1 К3 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В А 0 3 0 3 0 3 1 1 0 3 0 В 0 0 3 3 6 6 8 0 1 1 4
Занимательная информатика 290 Таблица О3.44 ¹ Команда Описание А В Исходное состояние 0 0 1 К2 Наполнить В 0 8 2 К4 Перелить из В в А 3 5 3 К5 Вылить из А 0 5 4 К4 Перелить из В в А 3 2 5 К5 Вылить из А 0 2 6 К4 Перелить из В в А 2 0 7 К2 Наполнить В 2 8 8 К4 Перелить из В в А 3 7 9 К5 Вылить из А 0 7 10 К4 Перелить из В в А 3 4 3.36 Таблица О3.45 ¹ Команда Описание А В Исходное состояние 0 0 1 К2 Наполнить В 0 8 2 К4 Перелить из В в А 7 1 3 К5 Вылить из А 0 1 4 К4 Перелить из В в А 1 0 5 К2 Наполнить В 1 8 6 К4 Перелить из В в А 7 2 7 К5 Вылить из А 0 2 8 К4 Перелить из В в А 2 0 9 К2 Наполнить В 2 8 10 К4 Перелить из В в А 7 3
Ответы к главе 3 291 3.37 Таблица О3.46 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 7 0 2 К3 Перелить из А в В 0 7 3 К1 Наполнить А 7 7 4 К3 Перелить из А в В 2 12 5 К6 Вылить из В 2 0 6 К3 Перелить из А в В 0 2 7 К1 Наполнить А 7 2 8 К3 Перелить из А в В 0 9 9 К1 Наполнить А 7 9 10 К3 Перелить из А в В 4 12 3.38 Таблица О3.47 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 5 0 2 К3 Перелить из А в В 0 5 3 К1 Наполнить А 5 5 4 К3 Перелить из А в В 4 6 5 К6 Вылить из В 4 0 6 К3 Перелить из А в В 0 4 7 К1 Наполнить А 5 4 8 К3 Перелить из А в В 3 6 3.39 Одно из возможных в табл. О3.48. оптимальных решений представлено
Занимательная информатика 292 Таблица О3.48 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К3 Наполнить С 0 0 11 2 К9 Перелить из С в В 0 6 5 3 К11 Вылить из В 0 0 5 4 К9 Перелить из С в В 0 5 0 5 К3 Наполнить С 0 5 11 6 К9 Перелить из С в В 0 6 10 7 К8 Перелить из С в А 3 6 7 3.40 Минимально возможное количество воды (15 л) используется в алгоритме, показанном в табл. О3.49. Таблица О3.49 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К2 Наполнить В 0 6 0 2 К7 Перелить из В в С 0 0 6 3 К2 Наполнить В 0 6 6 4 К7 Перелить из В в С 0 1 11 5 К6 Перелить из В в А 1 0 11 6 К9 Перелить из С в В 1 6 5 7 К12 Вылить из С 1 6 0 8 К5 Перелить из А в С 0 6 1 9 К7 Перелить из В в С 0 0 7 10 К1 Наполнить А 3 0 7 11 К5 Перелить из А в С 0 0 10 3.41 За минимальное количество действий (8) задача может быть решена двумя способами (табл. О3.50 и О3.51).
Ответы к главе 3 293 Таблица О3.50 ¹ Команда 1 2 3 4 5 6 7 8 К2 К6 К10 К6 К10 К6 К2 К6 Описание Исходное состояние Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А А 0 0 3 0 3 0 1 1 3 В 0 7 4 4 1 1 0 7 5 С 0 0 0 0 0 0 0 0 0 Таблица О3.51 ¹ Команда 1 2 3 4 5 6 7 8 К2 К6 К5 К6 К5 К6 К2 К6 Описание Исходное состояние Наполнить В Перелить из В в А Перелить из А в С Перелить из В в А Перелить из А в С Перелить из В в А Наполнить В Перелить из В в А А 0 0 3 0 3 0 1 1 3 В 0 7 4 4 1 1 0 7 5 С 0 0 0 3 3 6 6 6 6 3.42 Здесь возможно несколько оптимальных вариантов, один из которых представлен в табл. О3.52. Таблица О3.52 ¹ Команда 1 2 3 4 5 6 7 К2 К7 К2 К7 К6 К12 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в С Перелить из В в А Вылить из С Перелить из В в С А 0 0 0 0 0 3 3 3 В 0 9 0 9 8 5 5 0 С 0 0 9 9 10 10 0 5
Занимательная информатика 294 3.43 Минимально возможный объем воды (12 л) используется при выполнении нескольких возможных алгоритмов. Один из них представлен в табл. О3.53. Таблица О3.53 ¹ Команда 1 2 3 4 5 6 К2 К7 К1 К5 К12 К5 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить А Перелить из А в С Вылить из С Перелить из А в С А 0 0 0 3 1 1 0 В 0 9 0 0 0 0 0 С 0 0 9 9 11 0 1 3.44 Здесь наилучшие алгоритмы содержат пять команд (табл. О3.54 и О3.55). Таблица О3.54 ¹ Команда Описание Исходное состояние 0 0 0 1 К3 Наполнить С 0 0 11 2 К9 Перелить из С в В 0 9 2 3 К8 Перелить из С в А 2 9 0 4 К3 Наполнить С 2 9 11 5 К8 Перелить из С в А 3 9 10 А В С Таблица О3.55 ¹ 1 Команда К3 Описание А В С Исходное состояние 0 0 0 Наполнить С 0 0 11 2 К8 Перелить из С в А 3 0 8 3 К9 Перелить из С в В 3 8 0 4 К3 Наполнить С 3 8 11 5 К9 Перелить из С в В 3 9 10
Ответы к главе 3 295 3.45 Наилучшие алгоритмы решения этой задачи состоят из семи команд. Один из них представлен в табл. О3.56. Таблица О3.56 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К2 Наполнить В 0 7 0 2 К6 Перелить из В в А 3 4 0 3 К7 Перелить из В в С 3 0 4 4 К2 Наполнить В 3 7 4 5 К10 Вылить из А 0 7 4 6 К6 Перелить из В в А 3 4 4 7 К7 Перелить из В в С 3 0 8 3.46 Минимальное количество воды, требующееся для решения этой задачи (11 л), обеспечивает алгоритм, который представлен в табл. О3.57. Таблица О3.57 ¹ Команда Описание А 1 К2 Исходное состояние 0 0 0 Наполнить В 0 8 0 2 К6 Перелить из В в А 3 5 0 3 К5 Перелить из А в С 0 5 3 4 К6 Перелить из В в А 3 2 3 5 К5 Перелить из А в С 0 2 6 6 К1 Наполнить А 3 2 6 7 К5 Перелить из А в С 0 2 9 8 К6 Перелить из В в А 2 0 9 В С 9 К9 Перелить из С в В 2 8 1 10 К12 Вылить из С 2 8 0 11 К7 Перелить из В в С 2 0 8 12 К5 Перелить из А в С 0 0 10 Возможны и другие алгоритмы, при выполнении которых также используется 12 л воды.
Занимательная информатика 296 3.47 Таблица О3.58 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К2 Наполнить В 0 9 0 2 К7 Перелить из В в С 0 0 9 3 К2 Наполнить В 0 9 9 4 К7 Перелить из В в С 0 7 11 3.48 Два алгоритма решения задачи, являющиеся наиучшими, показаны в табл. О3.59 и О3.60. Таблица О3.59 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К3 Наполнить С 0 0 9 2 К9 Перелить из С в В 0 8 1 3 К8 Перелить из С в А 1 8 0 4 К3 Наполнить С 1 8 9 5 К8 Перелить из С в А 4 8 6 Таблица О3.60 ¹ Команда Описание А В С Исходное состояние 0 0 0 1 К3 Наполнить С 0 0 9 2 К8 Перелить из С в А 4 0 5 3 К9 Перелить из С в В 4 5 0 4 К3 Наполнить С 4 5 9 5 К9 Перелить из С в В 4 8 6
Ответы к главе 3 297 3.49 Таблица О3.61 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 6 0 2 К3 Перелить из А в В 0 6 3 К1 Наполнить А 6 6 4 К3 Перелить из А в В 2 10 3.50 Оптимальные алгоритмы решения этой задачи насчитывают 10 команд (табл. О3.62 и О3.63). Таблица О3.62 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 6 0 2 К3 Перелить из А в В 0 6 3 К1 Наполнить А 6 6 4 К3 Перелить из А в В 0 12 5 К1 Наполнить А 6 12 6 К3 Перелить из А в В 2 16 7 К6 Вылить из В 2 0 8 К3 Перелить из А в В 0 2 9 К1 Наполнить А 6 2 10 К3 Перелить из А в В 0 8
Занимательная информатика 298 Таблица О3.63 ¹ Команда Описание А В Исходное состояние 0 0 1 К2 Наполнить В 0 16 2 К4 Перелить из В в А 6 10 3 К5 Вылить из А 0 10 4 К4 Перелить из В в А 6 4 5 К5 Вылить из А 0 4 6 К4 Перелить из В в А 4 0 7 К2 Наполнить В 4 16 8 К4 Перелить из В в А 6 14 9 К5 Вылить из А 0 14 10 К4 Перелить из В в А 6 8 3.51 Таблица О3.64 ¹ Команда Описание А В Исходное состояние 0 0 1 К2 Наполнить В 0 22 2 К4 Перелить из В в А 6 16 3 К5 Вылить из А 0 16 4 К4 Перелить из В в А 6 10 5 К5 Вылить из А 0 10 6 К4 Перелить из В в А 6 4 7 К5 Вылить из А 0 4 8 К4 Перелить из В в А 4 0 9 К2 Наполнить В 4 22 10 К4 Перелить из В в А 6 20 11 К5 Вылить из А 0 20 12 К4 Перелить из В в А 6 14
Ответы к главе 3 299 3.52 Таблица О3.65 ¹ Команда Описание А В Исходное состояние 0 0 1 К1 Наполнить А 5 0 2 К3 Перелить из А в В 0 5 3 К1 Наполнить А 5 5 4 К3 Перелить из А в В 2 8 5 К6 Вылить из В 2 0 6 К3 Перелить из А в В 0 2 7 К1 Наполнить А 5 2 8 К3 Перелить из А в В 0 7 9 К1 Наполнить А 5 7 10 К3 Перелить из А в В 4 8 3.53 Таблица О3.66 ¹ Команда Описание А В Исходное состояние 0 0 1 К2 Наполнить В 0 10 2 К4 Перелить из В в А 7 3 3 К5 Вылить из А 0 3 4 К4 Перелить из В в А 3 0 5 К2 Наполнить В 3 10 6 К4 Перелить из В в А 7 6 7 К5 Вылить из А 0 6 8 К4 Перелить из В в А 6 0 9 К2 Наполнить В 6 10 10 К4 Перелить из В в А 7 9 11 К5 Вылить из А 0 9 12 К4 Перелить из В в А 7 2
Занимательная информатика 300 3.54 Таблица О3.67 ¹ Команда 1 2 3 4 5 6 7 8 К1 К3 К1 К3 К6 К3 К1 К3 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В А 0 9 0 9 7 7 0 9 5 В 0 0 9 9 11 0 7 7 11 3.55 Оптимальных алгоритма решения этой задачи возможно два (табл. О3.68 и О3.69). Таблица О3.68 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 К1 К3 К1 К3 К1 К3 К6 К3 К1 К3 К1 К3 К6 К3 К1 К3 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В А 0 5 0 5 0 5 3 3 0 5 0 5 1 1 0 5 0 В 0 0 5 5 10 10 12 0 3 3 8 8 12 0 1 1 6
Ответы к главе 3 301 Таблица О3.69 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 К2 К4 К5 К4 К5 К4 К2 К4 К5 К4 К5 К4 К2 К4 К5 К4 Описание Исходное состояние Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А Вылить из А Перелить из В в А А 0 0 5 0 5 0 2 2 5 0 5 0 4 4 5 0 5 В 0 12 7 7 2 2 0 12 9 9 4 4 0 12 11 11 6 3.56 Таблица О3.70 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 12 К1 К3 К1 К3 К6 К3 К1 К3 К6 К3 К1 К3 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В А 0 7 0 7 5 5 0 7 3 3 0 7 1 В 0 0 7 7 9 0 5 5 9 0 3 3 9
Занимательная информатика 302 3.57 Таблица О3.71 ¹ Команда 1 2 3 4 К2 К7 К2 К7 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить В Перелить из В в С А 0 0 0 0 0 В 0 9 0 9 8 С 0 0 9 9 10 3.58 Минимальное количество воды (12 л) используется при выполнении алгоритма, представленного в табл. О3.72. Таблица О3.72 ¹ Команда 1 2 3 4 5 6 К2 К7 К1 К5 К9 К6 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить А Перелить из А в С Перелить из С в В Перелить из В в А А 0 0 0 3 1 1 3 В 0 9 0 0 0 9 7 С 0 0 9 9 11 2 2 Три первые команды могут выполняться и в такой последовательности: К1, К2, К7. 3.59 Оптимальные алгоритмы решения задачи (их возможно несколько) содержат 7 команд. Один из них представлен в табл. О3.73. Таблица О3.73 ¹ Команда 1 2 3 4 5 6 7 К1 К4 К1 К4 К5 К1 К5 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Перелить из А в С Наполнить А Перелить из А в С А 0 4 0 4 3 0 4 0 В 0 0 4 4 5 5 5 5 С 0 0 0 0 0 3 3 7
Ответы к главе 3 303 Возможен также аналогичный алгоритм, в котором предпоследней является команда К6 (Перелить из В в А). 3.60 Наилучший вариант алгоритма представлен в табл. О3.74. В нем используется всего 8 л воды. Возможны и другие алгоритмы, использующие 8 л воды, но с большим числом операций. Таблица О3.74 ¹ Команда 1 2 3 4 5 6 7 К1 К4 К1 К4 К5 К6 К5 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Перелить из А в С Перелить из В в А Перелить из А в С А 0 4 0 4 3 0 4 0 В 0 0 4 4 5 5 1 1 С 0 0 0 0 0 3 3 7 3.61 Оптимальные алгоритмы содержат всего четыре команды (табл. О3.75 и О3.76). Таблица О3.75 ¹ Команда 1 2 3 4 К2 К7 К1 К5 Описание Исходное состояние Наполнить В Перелить из В в С Наполнить А Перелить из А в С А 0 0 0 4 3 В 0 8 0 0 0 С 0 0 8 8 9 Таблица О3.76 ¹ Команда 1 2 3 4 К1 К5 К2 К7 Описание Исходное состояние Наполнить А Перелить из А в С Наполнить В Перелить из В в С А 0 4 0 0 0 В 0 0 0 8 3 С 0 0 4 4 9
Занимательная информатика 304 3.62 Минимальное количество воды, требующееся для решения этой задачи, составляет 6 л. Возможно несколько вариантов соответствующих алгоритмов, один из которых представлен в табл. О3.77. Таблица О3.77 ¹ Команда 1 2 3 4 5 6 7 8 К1 К4 К1 К4 К7 К4 К8 К4 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Перелить из В в С Перелить из А в В Перелить из С в А Перелить из А в В А 0 3 0 3 1 1 0 3 0 В 0 0 3 3 5 0 1 1 4 С 0 0 0 0 0 5 5 2 2 3.63 Таблица О3.78 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 12 К1 К3 К1 К3 К1 К3 К1 К3 К6 К3 К1 К3 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В А 0 5 0 5 0 5 0 5 4 4 0 5 0 В 0 0 5 5 10 10 15 15 16 0 4 4 9 3.64 Здесь наилучших решений возможно два (табл. О3.79 и О3.80).
Ответы к главе 3 305 Таблица О3.79 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 К2 К4 К5 К4 К5 К4 К5 К4 К2 К4 К5 К4 К5 К4 К5 К4 К2 К4 К5 К4 Описание Исходное состояние Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Вылить из А Перелить из В в А Наполнить В Перелить из В в А Вылить из А Перелить из В в А А 0 0 5 0 5 0 5 0 1 1 5 0 5 0 5 0 2 2 5 0 5 В 0 16 11 11 6 6 1 1 0 16 12 12 7 7 2 2 0 16 13 13 8 Таблица О3.80 ¹ Команда 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 К1 К3 К1 К3 К1 К3 К1 К3 К6 К3 К1 К3 К1 К3 К1 К3 К6 К3 К1 К3 Описание Исходное состояние Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Наполнить А Перелить из А в В Вылить из В Перелить из А в В Наполнить А Перелить из А в В А 0 5 0 5 0 5 0 5 4 4 0 5 0 5 0 5 3 3 0 5 0 В 0 0 5 5 10 10 15 15 16 0 4 4 9 9 14 14 16 0 3 3 8
Занимательная информатика 306 Ответы к главе 4 4.1 Сначала надо всю крупу (9 кг) разделить на две равные части по 4,5 кг (это можно сделать и без использования весов). Затем одну из частей весом 4,5 кг также надо разделить на две равные части по 2,25 кг (для этого тоже весы не нужны). После этого из порции крупы весом 2,25 кг нужно последовательно отвесить на весах: 1) 100 г; 2) 100 г; 3) 50 г. В результате в указанной порции останется 2 кг, а вес всей остальной крупы составит (4,5 + 2,25 + 0,1 + 0,1 + 0,05) = 7 кг (либо можно вести подсчет и так: 9 – 2 = 7 кг). 4.2 Сначала рассыпаем гвозди на две одинаковые кучки по 12 кг. Затем одну из этих кучек делим пополам, а потом еще раз пополам. Полученные 3 кг откладываем в сторону и получаем в остатке 9 кг. 4.3 Можно. Будем весь ранее взвешенный сахар ссыпать на правую чашку (и на нее же иногда будем класть гирьку), а отмеряемый сахар будем сыпать на левую чашку (см. табл. О4.1). Таблица О4.1 Номер взвешивания Левая чашка Правая чашка 1 2 3 4 5 6 7 8 9 10 1 2 4 8 16 31 63 125 250 500 г 1 + г 3 + г 7 + г 15 + г 31 62 + г 125 250 500 Примечание. Буквой «г» обозначена гирька. После 10-го взвешивания, ссыпав вместе весь сахар на правой и левой чашках, получим искомый 1 кг. Очевидно, что меньшим количеством взвешиваний обойтись нельзя: из табл. О4.1 видно (см. взвешивания 1–5), что при k-м взвешивании можно получить (2k – 1) граммов сахара. Таким образом, за 9 взвешиваний можно отмерить самое большее 511 граммов. 4.4 Задача решается в два этапа: 1) надо положить на одну чашку весов гирю в 1 кг и уравновесить ее с помощью имеющихся «правильных» гирь; 2) затем нужно заменить килограммовую гирю таким количеством муки, чтобы весы оставались в равновесии.
Ответы к главе 4 307 4.5 Пронумеруем оставшиеся гири по возрастанию их размера. Произведем первое взвешивание: на левую чашку весов положим гири ¹ 3 и ¹ 4, а на правую — ¹ 7. Прежде чем рассматривать возможные случаи состояния весов, заметим, что гиря ¹ 3 может иметь вес 3 или 4 кг, гиря ¹ 4 — 4 или 5 кг, а гиря ¹ 7 — 7 или 8 кг. Приведем также все возможные варианты сочетания этих гирь на разных чашках весов (табл. О4.2). Таблица О4.2 ¹ 1 2 3 4 5 6 Левая чашка весов Правая чашка весов Гири весом Общий вес Гиря весом 3 и 4 кг 7 кг 7 кг 3 и 5 кг 8 кг 7 кг 4 и 5 кг 9 кг 7 кг 3 и 4 кг 7 кг 8 кг 3 и 5 кг 8 кг 8 кг 4 и 5 кг 9 кг 8 кг Возможные случаи при таком взвешивании. 1. Весы в равновесии. Это может быть при вариантах 1 и 5. Можно видеть, что в первом случае веса гирь соответствуют их номерам, т. е. потеряна гиря весом 8 кг, а во втором — потеряна гиря весом 4 кг (так как гиря ¹ 4 весит 5 кг). Чтобы определить, какая гиря потеряна, надо на одну чашку весов положить гири ¹ 1 и ¹ 3, а на вторую — ¹ 4. Первая чашка перевесить не может. Если перевесит вторая чашка, то потеряна гиря весом 4 кг, а в случае равновесия — весом 8 кг. 2. Если перевесит левая чашка весов, то, рассматривая варианты 3 и 6, можно установить, что потерянной может быть гиря весом 1, 2 или 3 кг. При втором взвешивании на первую чашку надо положить гири ¹ 1 и ¹ 2, а на вторую — ¹ 3. Если перетянет первая чашка, то потеряна гиря весом 1 кг; если вторая — весом 3 кг; если весы в равновесии — 2 кг. 3. Если перевесит правая чашка весов, то потеряна гиря весом 5, 6 или 7 кг. Тогда на одну чашку положим гири ¹ 4 и ¹ 7, а на вторую ¹ 5 и ¹ 6. Если перевесит первая чашка, то потеряна гиря весом 7 кг; если весы в равновесии — весом 6 кг; если перевесит вторая чашка — 5 кг. 4.6 По условию, общий вес всех гирек из сплава Б меньше, чем из сплава А. Гирьки из сплава Б не могут весить меньше, чем 1 + 2 + ... + 9 = 45 г (WБ 45), а гирьки и из сплава А не могут весить больше, чем 11 + 12 + ... + 19 = 135 г (WА „ 135). Если хотя
308 Занимательная информатика бы одно из этих неравенств было строгим, то вес гирек из сплава А превышал бы вес гирек из другого сплава более чем на 90 г. Значит, все гирьки из сплава Б весят 45 г, а из сплава А — 135 г. А это возможно, только если они, соответственно, девять самых легких и девять самых тяжелых. Значит, золотая гирька весит 10 г. 4.7 Идея решения состоит в том, чтобы каким-то образом уменьшать количество монет так, чтобы настоящих среди них по-прежнему оставалось больше, чем фальшивых. Тогда рано или поздно вы дойдете до того момента, когда монет останется всего одна или две. Настоящих же среди них по-прежнему будет больше, чем фальшивых. Поэтому все они будут настоящие и, следовательно, — ваши J. Рассмотрим два случая. 1. Если количество имеющихся монет четно. Разобьем их на пары и взвесим. Если весы при каком-то взвешивании покажут равенство, то монеты на них либо обе настоящие, либо обе фальшивые. Причем таких равенств среди настоящих монет должно быть больше, чем среди фальшивых (убедитесь в этом, рассмотрев несколько частных случаев). В следующий этап вы должны отбирать по одной монете из каждого такого равенства. Даже с учетом того, что владелец весов заберет себе по одной монете, настоящих монет среди отобранных будет большинство. 2. Если количество имеющихся монет нечетно. Разобьем их на пары и еще одну монету отложим. Произведем взвешивания в каждой паре и подсчитаем количество равенств. Если оно нечетно, то отберем, как и прежде, по одной монете из каждого равенства (напомним, что равенств среди настоящих монет не может быть меньше, чем среди фальшивых). Если же количество равенств четно, то возьмем оставленные нам владельцем весов монеты из этих равенств и добавим к ним отложенную монету. Настоящих монет опять будет больше, чем фальшивых. 4.8 Можно. Надо сравнить на весах вес двух любых монет. Если весы будут в равновесии, то фальшивая монета — та, которая не участвовала во взвешивании; в противном случае она — более легкая из сравниваемых монет. 4.9 Алгоритм решения задачи следующий: 1) разделить все монеты на 3 кучки по 27 монет в каждой; 2) сравнить на весах две любые кучки (первое взвешивание). При этом можно выявить кучку, в которой находится фальшивая монета (если весы будут в равновесии, то она — в кучке, не участвовавшей во взвешивании; в противном случае она находится в той кучке, которая легче);
Ответы к главе 4 309 3) разделить монеты из выявленной кучки на 3 кучки по 9 монет в каждой; 4) сравнить на весах две любые кучки по 9 монет (второе взвешивание). При этом можно выявить кучку, в которой находится фальшивая монета; 5) разделить монеты из выявленной кучки на 3 кучки по 3 монеты в каждой; 6) сравнить на весах две любые кучки по 3 монеты (третье взвешивание). При этом можно выявить кучку из трех монет, в которой находится фальшивая монета; 7) сравнить на весах две любые монеты из выявленной кучки и найти фальшивую монету (см. предыдущую задачу). Дополнительное задание При решении этой задачи заодно возникают следующие вопросы: 1) можно ли описанным способом найти фальшивую монету, если общее число монет не является степенью тройки (например, если оно равно 55)? 2) за какое наименьшее количество взвешиваний всегда можно найти фальшивую монету среди n монет? 4.10 Положим на каждую чашку весов по пятьдесят монет. Если чашки уравновесились, то оставшаяся 101-я монета — фальшивая. Сравнивая ее на весах с любой из настоящих монет, можно узнать, легче она или тяжелее их. Если при первом взвешивании весы не находятся в равновесии, то возьмем 50 монет с более тяжелой чашки, разделим их на две кучки по 25 монет и положим на чашки весов. Если весы уравновесятся, то фальшивая монета находилась на чашке, которая при первом взвешивании оказалась легче, и она (монета) — легче настоящих. Если же при втором взвешивании весы не уравновесятся, то среди сравниваемых 50 монет есть фальшивая, и она — тяжелее настоящих. Возможны и другие варианты решения. Например, можно разделить сначала все монеты на 3 кучки: две — из 33 монет и одну — из 35. Первым взвешиванием сравниваем на весах две кучки по 33 монеты. Если при этом весы уравновесились, то все сравниваемые монеты — настоящие, а фальшивая монета находится в кучке из 35 монет. Чтобы определить, легче или тяжелее она, чем настоящие, надо сравнить на весах вес третьей кучки монет и кучки из 35 любых монет, которые являются заведомо настоящими.
310 Занимательная информатика Если же при первом взвешивании весы не уравновесились, то в какой-то из сравниваемых кучек — фальшивая монета, а в кучке из 35 монет — все монеты настоящие. Запомнив, каким было положение чашек весов при первом взвешивании, возьмем любую из кучек монет, использованных при этом взвешивании, и сравним ее вес с весом 33 монет из третьей кучки (т. е. с настоящими монетами). Если при втором взвешивании весы уравновесились, то фальшивая монета находится в неиспользованной кучке, и осталось только вспомнить, больше или меньше весила кучка с фальшивой монетой при первом взвешивании. Если же весы не уравновесились, то поскольку мы знаем, что на одной чашке весов все монеты — настоящие, можно легко определить, больше или меньше настоящей весит фальшивая монета, находящаяся на другой чашке. Нетрудно догадаться, что возможны и иные варианты деления 101 монеты на три кучки для решения задачи: 49, 49 и 3; 48, 48 и 5; ...; 32, 32 и 37; 31, 31 и 39; ... . Дополнительное задание Предлагаем читателям самостоятельно определить последнюю тройку чисел в этой последовательности. 4.11 Надо все монеты, кроме одной, разделить на 25 пар и последовательно сравнивать веса монет в каждой паре. Если при каком-то взвешивании равновесие нарушится, то более легкая монета и является фальшивой. В противном случае фальшивая монета — та, что осталась «без пары». Ясно, что аналогично решается и задача в общем виде: «Найти фальшивую монету в группе из (2m + 1) монет за m взвешиваний, взвешивая каждую монету не более одного раза». 4.12 2. Сначала положим на обе чашки весов по 13 монет. Затем (если весы находятся в равновесии) уберем их и положим по 11 из еще не бравшихся монет; затем по 9, 7, 5, 3 и 1 до тех пор, пока одна из чашек не перевесит. Если этого не произойдет, то после седьмого взвешивания (когда на чашках весов будет по одной монете) останется одна, 99-я по счету, монета, которая во взвешиваниях не участвовала. Она и является фальшивой. Если же при каком-то взвешивании какая-то чашка весов перевесила, то прежде всего ясно, что в этот момент фальшивая монета лежит в другой чашке. Составим таблицу взвешиваний (табл. О4.3).
Ответы к главе 4 311 Таблица О4.3 Номер взвешивания (k) Количество монет на одной чашке (n) 1 13 2 11 3 9 4 7 5 5 6 3 7 1 Итак, при очередном, k–м взвешивании мы можем выявить n монет, среди которых находится искомая фальшивая. Тогда можно записать, что n = (7 – k) · 2 + 1. Получается, что мы пришли к задаче нахождения среди (7 – k) · 2 + 1 монет фальшивой монеты за (7 – k) взвешиваний (так как k взвешиваний уже проведено, причем каждая монета в рассматриваемой группе взвешивалась один раз). Введем новую величину: m = 7 – k. Тогда только что сформулированная задача сводится к следующей: «среди (2m + 1) монет найти фальшивую монету за m взвешиваний (среди трех монет — за одно взвешивание; среди пяти монет — за два; ...; среди тринадцати — за 6). При этом никакую монету нельзя взвешивать более одного раза». Такую задачу мы уже знаем (см. решение предыдущей задачи). Надо все монеты, кроме одной, разбить на m пар и последовательно сравнивать веса монет каждой пары — для этого понадобится m взвешиваний. Если при каком-то взвешивании равновесие нарушится, то более легкая монета и является фальшивой. В противном случае фальшивая монета — та, что осталась «без пары». 4.13 Положим на каждую чашку весов по 20 монет. 1. Если весы в равновесии, то среди сравниваемых 40 монет либо нет ни одной фальшивой, либо содержатся обе фальшивые монеты, причем по одной в каждой чашке. Разделим одну из этих групп монет на две равные части (по 10 монет) и сравним их веса: 1.1) если одна из чашек весов перевесит, то среди этих 20 монет есть ровно одна фальшивая, а среди 21 монеты, не участвовавшей во взвешиваниях, фальшивых монет нет. Соотношение весов 20 монет, среди которых есть фальшивая, и 20 монет из 21 оставшейся будет соответствовать соотношению весов фальшивой и настоящей монет; 1.2) если весы будут в равновесии, то среди этих 20 монет (и всех 40 монет, участвовавших в первом взвешивании) нет ни одной фальшивой, а все фальшивые монеты находятся среди оставшихся 21. Выберем из 40 заведомо настоящих монет 21 монету и положим на одну чашку весов, а на вторую положим оставшиеся 21 монету. Соотношение весов будет соответствовать соотношению весов настоящей и фальшивой монет.
312 Занимательная информатика 2. Если при первом взвешивании одна чашка перевесит другую, то среди 40 взвешенных монет одна или две — фальшивые, причем обе фальшивые находятся на одной чашке. Разделим более тяжелую группу монет на две равные части (по 10 монет) и положим на чашки весов (второе взвешивание). Тогда: 2.1) если весы в равновесии, то либо фальшивых монет в этой группе из 20 монет нет, либо их две, по одной в каждой чашке. Разделим кучку монет с одной из чашек на две равные части (по 5 монет) и сравним их веса. Возможные варианты: l весы в равновесии — тогда фальшивых монет в данной кучке нет, а в более легкой (при первом взвешивании) кучке одна или две — фальшивые; значит, фальшивая монета легче настоящей, l одна из чашек перевесила — тогда среди этих 20 монет находятся обе фальшивые монеты, а в более легкой кучке их вообще нет; значит, фальшивая монета — более тяжелая; 2.2) если при втором взвешивании одна из чашек перевесит, то среди этих 20 монет есть хотя бы одна фальшивая. Значит, фальшивая монета — более тяжелая (ведь мы отобрали более тяжелую группу монет). 4.14 Задача решается аналогично задаче 4.13. Положим на каждую чашку весов по 34 монеты. 1. Если весы в равновесии, то среди сравниваемых 68 монет либо нет ни одной фальшивой, либо есть обе фальшивые, по одной монете в каждой чашке. Разделим одну из этих групп монет на две равные части (по 17 монет) и сравним их веса: 1.1) если одна из чашек весов перевесит, то среди этих 34 монет есть ровно одна фальшивая, а среди 35 монет, не участвовавших во взвешиваниях, фальшивых монет нет. Тогда соотношение весов 34 монет, среди которых есть фальшивая, и 34 монет из 35 оставшихся заведомо настоящих будет соответствовать соотношению весов фальшивой и настоящей монет; 1.2) если весы будут в равновесии, то среди этих 34 монет (и всех 68 монет, участвовавших в первом взвешивании) нет ни одной фальшивой, а все фальшивые монеты находятся среди оставшихся 35. Выберем из заведомо настоящих 68 монет 35 и положим на одну чашку весов, а на вторую положим оставшиеся 35 монет. Соотношение весов будет соответствовать соотношению весов настоящей и фальшивой монет. 2. Если при первом взвешивании одна из чашек перевесит, то среди 68 взвешенных монет одна или две — фальшивые, причем обе фальшивые монеты находятся на одной чашке. Разделим бо-
Ответы к главе 4 313 лее тяжелую группу монет на две равные части (по 17 монет) и положим на чашки весов (второе взвешивание). Тогда: 2.1) если весы в равновесии, то либо фальшивых монет в этой группе из 34 монет нет, либо их две, по одной в каждой чашке. Разделим кучку монет с одной из чашек на две равные части (по 5 монет) и сравним их веса. Возможные варианты: l весы в равновесии — тогда фальшивых монет в данной кучке нет, а в более легкой (при первом взвешивании) кучке — одна или две фальшивые; значит, фальшивая монета легче настоящей, l одна из чашек перевесила — тогда среди этих 20 монет находятся обе фальшивые, а в более легкой кучке их вообще нет; значит, фальшивая монета — более тяжелая; 2.2) если при втором взвешивании перевесит одна из чашек, то среди этих 34 монет есть хотя бы одна фальшивая. Значит, фальшивая монета — более тяжелая (ведь мы отобрали более тяжелую группу монет). 4.15 Разобьем монеты на следующие группы: А — три серебряных; В — одна серебряная; С — еще одна серебряная; D — две золотых; Е — три золотых. Сравним вес монет группы А и монет из групп С и D. При этом возможны три варианта. 1. Весы в равновесии. Тогда сравним при втором взвешивании между собой две монеты из группы D. Если и тут наблюдается равновесие, то среди этих двух монет нет фальшивой. Это также означает, что фальшивой нет и среди монет групп A и С (иначе не было бы равновесия весов при первом взвешивании). Следовательно, оставшаяся «серебряная» монета из группы В — фальшивая. Вторая же фальшивая монета («псевдозолотая») может находиться только в группе Е. Ее можно найти за одно взвешивание. Если же при втором взвешивании равновесия весов нет, то более легкая из сравниваемых монет группы D — фальшивая. Вторая фальшивая монета при этом — среди монет группы A (иначе не было бы равновесия весов при первом взвешивании), и ее можно найти за одно (третье) взвешивание. 2. Группа монет A легче монет групп С и D. Значит, одна из монет в A — фальшивая, и при этом в группах С и D фальшивых монет нет. Вторая фальшивая монета («псевдозолотая») находится в группе Е. С группами A и Е можно «разобраться» еще за два взвешивания.
314 Занимательная информатика 3. Группа монет A тяжелее монет групп С и D. В этом случае в группе A фальшивых монет нет (напомним, что фальшивые монеты легче настоящих). Тогда сравним между собой монеты из группы D. Если весы будут в равновесии, то фальшивая монета — в группе С, а среди монет группы D фальшивых нет, т. е. вторая фальшивая монета («псевдозолотая») находится в группе Е. Ее можно найти за одно взвешивание. Если же при втором взвешивании равновесия весов нет, то более легкая из сравниваемых монет — фальшивая, а среди монет групп A и Е фальшивых нет. Вторую фальшивую монету можно найти, сравнив группы В и С. 4.16 Присвоим монетам номера: 1, 2, …, 6 и обозначим их вес, соответственно, как m1, m2, …, m6. При первом взвешивании на левой чашке весов разместим монеты 1, 2 и 3, а на правой — монеты 4, 5 и 6. Тогда все возможные варианты состояния весов и выявленные при этом фальшивые монеты приведены в следующей алгоритмической записи: |Первое взвешивание m1 + m2 + m3 ? m4 + m5 + m6 1. если m1 + m2 + m3 = m4+ m5 + m6 то |На обеих чашках находится по одной фальшивой монете |Второе взвешивание m1 ? m2 |Можно сравнить и другие монеты если m1 = m2 то Первая фальшивая монета - 3 иначе если m1 > m2 то Первая фальшивая монета - 2 иначе Первая фальшивая монета - 1 все все |Третье взвешивание m4 ? m5 |Можно сравнить и другие монеты если m4 = m5 то Вторая фальшивая монета - 6 иначе если m4 > m5 то Вторая фальшивая монета - 5
Ответы к главе 4 315 иначе Вторая фальшивая монета - 4 все все все 2. если m1 + m2 + m3 < m4 + m5 + m6 то |Обе фальшивые монеты находятся на левой чашке весов |Второе взвешивание если m1 = m2 |Можно сравнить и другие монеты то Фальшивые монеты - 1 и 2 иначе если m1 > m2 то Фальшивые монеты - 2 и 3 иначе Фальшивые монеты - 1 и 3 все все все 3. если m1 + m2 + m3 > m4+ m5 + m6 то |Обе фальшивые монеты находятся на правой чашке весов |Далее все аналогично случаю 2 |Второе взвешивание ... все 4.17 Обозначим монеты как a, b, c и d. При первом взвешивании сравним веса пар {a, b} и {с, d}; при втором взвешивании — веса пар {a, c} и {b, d}; при третьем — веса пар {a, d} и {b, c}. Рассмотрим (в табл. О4.4) все возможные состояния наших «странных» весов при всех возможных вариантах (символ «<» означает, что перевешивает правая чашка весов, символ «>» — что левая). Примечание. Так как в каждом взвешивании участвуют все монеты, одна из которых — фальшивая, то равенства весов сравниваемых грузов быть не может, и одна из чашек будет перевешивать «по правилам условия задачи». Видно, что для каждого варианта (какая монета — фальшивая и как она отличается от настоящей) последовательность состояний весов при сделанных трех взвешиваниях является оригинальной. По этой последовательности и можно определить то, что требуется в задаче.
Занимательная информатика 316 Таблица О4.4 Какая монета фальшивая? a b c d Ее особенности Она тяжелее настоящих Она легче настоящих Она тяжелее настоящих Она легче настоящих Она тяжелее настоящих Она легче настоящих Она тяжелее настоящих Она легче настоящих 1-е 2-е 3-е взвешивание взвешивание взвешивание Левая Правая Левая Правая Левая Правая чашка чашка чашка чашка чашка чашка {a, b} {с, d} {a, c} {b, d} {a, d} {b, c} > > > < < < > < < < > > < > < > < > < < > > > < 4.18 Присвоим монетам номера: 1, 2, ..., 6. Их можно объединить в различные пары, например: {1, 2}, {1, 3}, ..., {1, 6}, {2, 3}, {2, 4} и т. д. до {5, 6}. Всего таких не повторяющихся пар будет 15. Будем записывать слева от тире номера монет на левой чашке весов, а справа — на правой. Первое взвешивание: 1, 2, 3 — 4, 5, 6. Второе взвешивание: 1, 2, 4 — 3, 5, 6. Если хотя бы при одном из этих взвешиваний равновесие весов нарушилось, то на чашке, вес которой больше, две из трех монет — фальшивые, а на другой — все монеты настоящие (только в этом случае весы среагируют — см. условие задачи). Для выявления фальшивых монет в этой ситуации достаточно еще двух взвешиваний (каких именно — установите самостоятельно). Если же при первых двух взвешиваниях равновесие весов ни разу не нарушилось, то фальшивые монеты при обоих взвешиваниях находились на разных чашках. Таких пар (по результатам первых двух взвешиваний) может быть только пять: {1, 5}, {1, 6}, {2, 5}, {2, 6}, {3, 4}.
Ответы к главе 4 317 Осталось сравнить вес этих пар: 1, 5 — 2, 6 и, при необходимости, 1, 6 — 2, 5. Если при третьем или четвертом взвешивании весы не оказались в равновесии, то фальшивые монеты — те, которые находятся на перевесившей чашке весов; в противном случае фальшивые монеты имеют номера 3 и 4. 4.19 Можно. Разобьем монеты на четыре группы: A, B, C и D по две монеты в каждой и произведем три взвешивания: 1) {A + B} — {C + D}; 2) {A + C} — {B + D}; 3) {A + D} — {B + C}. Их результаты можно проанализировать с помощью табл. О4.5, аналогичной использованной при решении задачи 4.17 (записав в нее знаки «>», «<» или «=»). Таблица О4.5 Особенности фальшивых монет Где находятся 1-е 2-е 3-е взвешивание взвешивание взвешивание Левая Правая Левая Правая Левая Правая чашка чашка чашка чашка чашка чашка {A, B} {С, D} {A, C} {B, D} {A, D} {B, C} В одной группе В разных группах В одной Они легче группе двух настояВ разных щих группах Две фальши- В одной группе вые и две настоящие В разных монеты весят группах одинаково Они тяжелее двух настоящих Если встретится хоть одно равенство, то это означает, что две фальшивые и две настоящие монеты весят одинаково. Если же не будет ни одного равенства, то ответ на вопрос из условия задачи можно получить так: отбросить два одинаковых из трех полученных знаков, и оставшийся знак покажет, что будет, если положить фальшивые монеты на левую чашку весов, а настоящие — на правую. Действительно, если фальшивые монеты находятся в одной группе, то они нечетное количество раз окажутся слева. Если тяжелая монета находится в группе A, а легкая — в группах B, C или D, то один раз обе они окажутся слева, а дважды
Занимательная информатика 318 получится знак «>». Аналогичный вывод можно сделать, и если фальшивые монеты «поменяются местами» в этих группах. Наконец, если обе фальшивые монеты находятся в двух из трех групп B, C или D, то они дважды окажутся по разные стороны, дав оба знака «>» и «<» по одному разу, а один раз окажутся справа. При этом соответствующий знак будет отброшен как парный и останется противоположный ему. 4.20 Разделим монеты на три кучки по 7 монет в каждой, а одну монету отложим в сторону. Все возможные варианты нахождения фальшивых монет в кучках, а также соответствующее «состояние» дополнительной, 22-й монеты приведены в табл. О4.6. Таблица О4.6 В кучке A Нет Нет Нет Нет Нет 1 1 1 2 В кучке Б Нет Нет 1 1 2 Нет Нет 1 Нет В кучке С 1 2 Нет 1 Нет Нет 1 Нет Нет 22-я монета Фальшивая Настоящая Фальшивая Настоящая Настоящая Фальшивая Настоящая Настоящая Настоящая Сделаем два взвешивания для двух любых пар кучек. Проанализировав все варианты в табл. О4.6, можно сделать вывод, что в результате этих двух взвешиваний будут найдены две кучки, равные по весу, и еще одна кучка, вес которой отличается от веса первых двух кучек, причем станет ясно также, в какую сторону. В