__Страница_001
__Страница_002
__Страница_002
__Страница_003
__Страница_003
__Страница_004
__Страница_004
__Страница_005
__Страница_005
__Страница_006
__Страница_006
__Страница_007
__Страница_007
__Страница_008
__Страница_008
__Страница_009
__Страница_009
__Страница_010
__Страница_010
__Страница_011
__Страница_011
__Страница_012
__Страница_012
__Страница_013
__Страница_013
__Страница_014
__Страница_014
__Страница_015
__Страница_015
__Страница_016
__Страница_016
__Страница_017
__Страница_017
__Страница_018
__Страница_018
__Страница_019
__Страница_019
__Страница_020
__Страница_020
__Страница_021
__Страница_021
__Страница_022
__Страница_022
__Страница_023
__Страница_023
__Страница_024
__Страница_024
__Страница_025
__Страница_025
__Страница_026
__Страница_026
__Страница_027
__Страница_027
__Страница_028
__Страница_028
__Страница_029
__Страница_029
__Страница_030
__Страница_030
__Страница_031
__Страница_031
__Страница_032
__Страница_032
__Страница_033
__Страница_033
__Страница_034
__Страница_034
__Страница_035
__Страница_035
__Страница_036
__Страница_036
__Страница_037
__Страница_037
__Страница_038
__Страница_038
__Страница_039
__Страница_039
__Страница_040
__Страница_040
__Страница_041
__Страница_041
__Страница_042
__Страница_042
__Страница_043
__Страница_043
__Страница_044
__Страница_044
__Страница_045
__Страница_045
__Страница_046
__Страница_046
__Страница_047
__Страница_047
__Страница_048
__Страница_048
__Страница_049
__Страница_049
__Страница_050
__Страница_050
__Страница_051
__Страница_051
__Страница_052
__Страница_052
__Страница_053
__Страница_053
__Страница_054
__Страница_054
__Страница_055
__Страница_055
__Страница_056
__Страница_056
__Страница_057
__Страница_057
__Страница_058
__Страница_058
__Страница_059
__Страница_059
__Страница_060
__Страница_060
__Страница_061
__Страница_061
__Страница_062
__Страница_062
__Страница_063
__Страница_063
__Страница_064
__Страница_064
__Страница_065
__Страница_065
__Страница_066
__Страница_066
__Страница_067
__Страница_067
__Страница_068
__Страница_068
__Страница_069
__Страница_069
__Страница_070
__Страница_070
__Страница_071
__Страница_071
__Страница_072
__Страница_072
__Страница_073
__Страница_073
__Страница_074
__Страница_074
__Страница_075
__Страница_075
__Страница_076
__Страница_076
__Страница_077
__Страница_077
__Страница_078
__Страница_078
__Страница_079
__Страница_079
__Страница_080
__Страница_080
__Страница_081
__Страница_081
__Страница_082
__Страница_082
__Страница_083
__Страница_083
__Страница_084
__Страница_084
__Страница_085
__Страница_085
__Страница_086
__Страница_086
__Страница_087
__Страница_087
__Страница_088
__Страница_088
__Страница_089
__Страница_089
__Страница_090
__Страница_090
__Страница_091
__Страница_091
__Страница_092
__Страница_092
__Страница_093
__Страница_093
__Страница_094
__Страница_094
__Страница_095
__Страница_095
__Страница_096
__Страница_096
__Страница_097
__Страница_097
__Страница_098
__Страница_098
__Страница_099
__Страница_099
__Страница_100
__Страница_100
__Страница_101
__Страница_101
__Страница_102
__Страница_102
__Страница_103
__Страница_103
__Страница_104
__Страница_104
__Страница_105
__Страница_105
__Страница_106
__Страница_106
__Страница_107
__Страница_107
__Страница_108
__Страница_108
__Страница_109
__Страница_109
__Страница_110
__Страница_110
__Страница_111
__Страница_111
__Страница_112
__Страница_113
Текст
                    СОДЕРЖАНИЕ
Предисловие•,•,•••,•,,•.....
Обозначения • , • , • , , ••...•...
Часть 1. УСЛОВИЯ ЗАДАЧ
1. Случайные числа
.
.
,..•,•,••••
Генерация случайного числа . . . •
.
.
.
Непредскавуемые числовые последовательности
Авартные игры ........•••.•...••••.
Воспроизводима.я непредсказуемая последовательность ...
Другие азартные игры . ,
...
2. Игры с числами
.....••.••
Арифметические развлечения . . .
Числовые последовательности • • .
Зашифрованные операции • , . . . .
Доказательства теорем .••• . ..
Простые числа ......• , ••.
Таинственные программы • • . . . .
3. Игры бев стратегии
.
•,••,..
Общиепредложения• , , • • , • • •
.
.
.
4. Игры ео стратегией •.••• , •••••••.
5. Стратегия бев игры (выигрывающие стратегии) •••••
Ханойекие башни. Печальный конец Паскаля Младшего
6. Комбинаторные вадачи •••••• , ••••
..'
7.Обовсемпонемногу,••••••••••••••••••
Ч а о wь 11. ПЕРВАЯ ПОМОЩЬ
1.Случайныечисла , • •, • . .
2. Игры с числами
.
••,•.•••
.
.
Зашифрованные операции , • . • • . • •
3.Игрыбезстратеиш , ••• , • • • ,
4.И11рыоостратегией,•,•••.•••••
.
.
•.
5. Стратеrия бев игрьr (вЬ1ИI'рывающие стратегии)
..
6.Комбинаторныевадачи,,•,•,•••,,•,,
'
..
7.Об0всемпенемиоvу,,••••,•••••,,,,
Чао1'1ЬIII.ИЕСЛИВЫВСЕЕЩЕНЕНАШЛИРЕШЕНИЯ
1 . Случаiвые числа
.
.
.
.
.
.
.
.
2. Иvрьr 0. числами , .... .
3. И11рьr fea стратеvии ...... .
4.И11рыеостратегией•••,,•,•,,•,••.,
5. Стра!1.'8J/ИЯ бев игры (выигрывающие стратегии)
6. Rомбиваторвые вадачи , •••••.••
7 . Обо всем повемвоvу
.
,.,
.
.
Спясовлитературы•• , , , • , , . .
...
...
3
7
9
9
11
13
15
19
23
23
24
28
30
32
35
38
38
59
70
77
85
94
102
108
114
121
127
141
149
170
183
184
196
198
201
211
212
222


ББR 22.18 А85 У.ДR 519.68 JElJX et casse -·- tete. А PROGRAMMER JACQUES ARSAC DUNOQ Ар с а к Ж. Программирование игр и голоnоломоr(: Пер. с франц.- М.: Наука . Гл. ред. физ.-мат. лит" 199U.-- 2 24 c.- ISBN 5-02 -013959-9 . Рассматринаются способы программирования различных зани­ мательных игр и голщюломо.к с числами, геометрическ:имн фигура­ ми и др. Изложение большппства игр и головоломок ведется в не­ сколько этапов. Сначада разъясняется сама постановка задачи и требования, предъявляемые к алгоритму ее решения. В следующем разделе книги обсуждается сам алгори1'м и воз­ можные пути его реализации. В конце кв:и.ги по многим играм и головоломкам даются наброо­ Rи их программной реализации. Используемый при этом язык типа Паскаля допускает перевод на другие широко распространенные языки программирования. Для начинающих программистов, студеnто.в вузов и технику· мов. Ил. 41. Библиогр. 15 назв, А 1404000000·:_036 129 89 053(02)-90 ISBN 5-02 -013959-9 © BORDAS, Paris 1985 ISПN 2-04 · 0157GЗ-8 © «Науна». Фиsм атлит. .Пер•вод на р)' сс 1шй язын, 19\JO
ПРЕДИСЛОВИЕ «Играйте с номпьютером, это захватывает".~ «Нет ничего увленательнее создания собственных Rом­ пьютерных игр»". Это - два привленательных лозунга, взятые из реR­ ламы минрокомпьютеров. Поэтому самое существенное - вто создавать игру. КТО САМ ПРОГРАММИРУЕТ СВОИ КОМПЬЮТЕР­ НЫЕ ИГРЫ, НАСЛАЖДАЕТСЯ ДВАЖДЫ*) Я уже проводил небольшое расследование в SICOB в 1984 году. Во многих торговых предприятиях я пред­ ставлялся нан отец, ноторый хочет подарить своему сыну микрономпьютер. Мне объяснили, что именно нужно Rу­ пить и во сколько это мне об9йдется. Затем я спрашивал об r~грах. И вот что, приблизительно, там происходило. « -Так он сможет со всем этим играть? - Да нет же, месье. Чтобы он мог играть с Rомnью­ теро.ч, он должен покупать Rассеты с играми. - Кассеты с играми? Я думал, что компьютер ..• А ско.1ъко стоит нассета?» Продавец называет мне цену, Rоторую вы1 должно быть, знаете. Я отвечаю: «- И сколько игр на Rассете? - Одна, месье. - Но тогда двадцать игр стоят дороже самой машины! А я слышал от сведущих людей, что на Rомпьютере инте­ . реснее всего создавать игры самому. - Для этого, месье, нужно уметь программировать. - Но по теJiевизору твердят, что это очень просто. Мой сын, должно быть, может научиться? *) Я 3ДС()Ь совершаю плагиат по отношению к поговорке жите­ . пей плоскогорья В1>rсоких Вивар,__хоторая ввучит так: кто сам пи­ пит свои дрова, согревается дважды. 1* 3
- Да, месье. У пас есть кассета с Бейсиком.- - Кассета с Бейсиком! Бейсик - это и есть прог- раммирование? - Нет, месье. Чтобы уметь программировать, нужна еще вот эта кассета с языком ассемблера".» Л удалялся, исполненный отвращения,. жалкий истец отцов семейств! В другом торговом заведении я отважил­ ся утверждать, что я слышал от сведущих людей, что некоторые журналы публикуют совершенно готовые игро­ вые программы. «- Да, это так. Но эти игры плохо сделаны. Они не являются профессиональной работой, как наши кассеты,: где вывод изображения на экран тщатеш,по отработан. Кроме того" очень пепри·ятно набирать те1iсты этих игр на клавиатуре. Так 'ЧТО все это не очень серьезно.t что бы об этом ни говорили ... » · На этот раз я поверил, что мне говорят правду. Опуб­ ликованные таким образом; игры весьма посредственны по качеству. Л не поденился вниматедьно прочесть не­ r<оторые ив них (см.,. например, головоломку 28). Чаще всего они плохо составлены и так плохо прокоммептиро­ ваны, как будто автор хочет помешать читателю понять их. Стратегия этих игр иногда более чем примитивна: я видел игру ТИК-ТАК-ТОК,; где компьютер случай­ ным образом выбирал свой игровой ход". Это издеватель­ ство над читателями! Во всем этом совершенно отсутствует творчество. Реклама трубит: «Создавать - это увлекательно/». Но на практике все делается так.,: кан будто подростки не­ способны что-либо создавать. И им не помогают начать делать что-нибудь творческое. Чтобы восполнить этот пробел .~ я и написал эту книгу. Многие подростки обучены программированию - в ли­ цее (причем не только в таких лицеях, которые официаль­ но предоставляют обучение со специализацией по инфор­ матике, устраивая курсы по программированию}, в клу­ бах и на каникулах - с родителями, с друзьями_, по книгам... Но вот что программировать на компьютере? Игры? Какие? Примеры, публикуемые в журналах и книгах.~: непонятны. Как они могут хоть на что-то вдохновить? А если и посмотреть вокруг, что мож­ но найти? Шахматы, Отелло, вошек? Это слишком трудно". Поэтому я собрал здесь описания некоторых игрJI которые есть в продаже,, чаще всего на Бейсике,, для ко- 4
торых не нужны графические возможности компьютера. Я сам все эти игры реализовал на микрокомпьютере,. имеющем только алфа:sитно-цифровой черно-белый экран и не имеющем ни светового пера, ни мыши, ни планшета. Трудность программирования обозначается звездочками «*». Начинайте с игр без звездочек. R остальным 'Вы перей­ дете позже. Каждая игра допускает многочисленные вариации, которые вы легко изобретете. Для того чтобы менее мужественные читатели могли избежать искушения сразу же читать все подробности изготовления программ, в первой части книги условие игры обычно излагается вместе с некоторыми указаниями. Если этих указаний вам недостаточно, иначе говоря, если после размышления и возможных обсуждений с то­ варищами вы не видите, как тронуться с места, вас вы­ ведет из затруднений <шервая помощь». Если же вы опять упретесь в какую-нибудь трудность, то третья часть книги должна позволить вам достичь цели. Смелее вперед: СОЗДАВАЙТЕ. Игры прИ:влекательны не только для молодых людей от 14 до ? (а до скольких?). Я знаю многих взрослых 1 любящих играть (и сам люблю). У меня много коллег, для которых программирование и есть игра - как для меня. Я написал эту книгу для всех мо.л:одых людей от 14 до 77 лет, которые любят играть с компьютером или которые любили бы это делать, если бы средство для этого им было предоставлено. Серьезные журналы публикуют математические раз­ влечения для <<Порядочных людей»; Продаются книги с логическими головоломками. Продаются обзоры стра­ тегий. Применение компьютеров полностью обновило весь этот круг вопросов. Всем тем, кто интересуется голово­ ломками, я предлагаю здесь новую форму головоломок: задача, решение которой нужно найти на компьютере,­ это настоящая головоломка. Они бывают трех основных типов: некоторые головоломки интересно программировать (например, зашифрованные операции, господин S и гос­ подин Р, пентамино".); некоторые задачи имеют очень простой вид, но дове­ дение решения до программы является настоящей голово­ ломкой (например, переставить две части вектора, найти наибольший белый прямоугольник в решетке кроссворда). Это - совершенно новый тип задач 1 тесно связанный .с компьютером; 5
након~ц, последний тип - паиолько трудный, что я ~1еньшил набор его примеров, выбрав их из поистине неисчислимого множества,- связан с тем, что я говорил в начаЛе. Вам дана программа {в напi:ей книге - напи­ санная настолько хорошо, насколько это возможно), но без комментариев. Скажите, что она делает. Трудность головолоМКJI обозначается вопросительпыми знаками. Есть головоломки с довольно простыми реше­ - ниями, но деликатным программированием: «?***», и есть ужасные головоломки с легким программированием: «.???». Выбирайте/ Эта книга будет полезна и всем тем, кто занимается подготовкой подростков по информатике: преподавателям лицеев и колледжей, руководителям клубов или кани- кулярных занятий. - Я не привожу никаких решений, за исключением нескольких настолько классических случаев, что- их ре­ шение исследовано всюду, или задач, решение которых является образцом, который часто встречается и который нужно знать. Изучите сначала их. Первый раздел - немного особенный. Каковы бы ни были ваши склонности - начните с него; он даст вам инструмент, необходимый для почти всех игр и немалого числа головоломок (формирование ситуаций случайным образом). Если вы уже перелистали книгу, то вы,, может быть.!) заметили в ней и кое-что, похожее на математику, При­ знаюсь! Несколько rоловоЛомок в ней - арифметические,; и их решение требует вычислений. В ббльшей части эта книга доступна и людям, не имеющим никакой специаль­ ной математической подготовки, даже тем,. кому вся эта математика внушает страх и отвращение. · Я сказал все, Теперь - вам ИГРАТЬ.~ вам СО3ДА.....- ВАТЬ."
ОБО3НАЧЕНИЯ Вот RонструRции, используемые в программах этой книги. Оператор присваиqания. В нем используется знак «:=• t:=i+1 Вот его апалоги на других языRах: Бейсик: LET I=I+1 LSE: I<-- I+1 Паскаль: I:=I+1 У слоеный оператор имеет вид ЕСЛИ условие ТО последовательность операторов Н:ОНЕЦ_ЕСЛИ . При работе условного оператора вначале проверяется усло­ вие. Если оно имеет вначение ИСТИНА, то выполняется последова­ тельносrь операторов, заключенная между ТО и RОНЕЦ_ЕСЛИ. RОНЕЦ_ЕСЛИ играет роль ванрывающей скобRи, избавляющей от применения разделителей DEBUT FIN, RaR на LSE, или BEGIN END,' Ra:t в языRе ПасRаль. При работе оператора ЕСЛИ условие ТО последовательность операторов ИНАЧЕ последо~ательность операторов RОНЕЦ_ЕСЛИ вначале проверяется условие. Если оно имеет значение ИСТИНА, то выполняется последовательность операторов, заRлюченная меж­ 'ДУ ТО и ИНАЧЕ, а если ус11овие имеет значение ЛОЖЬ, то вы­ uолняется то, что содержИ'I'ся между ИНАЧЕ и RОНЕЦ_ЕСЛИ. Снова, RaI\ и выше, нет нужды в DEBUT FIN. Цикл ПОНА условие ВЫПОЛНЯТЬ последовательность операторов ВЕРНУТЬСЯ выполняет последовательность операторов, заRлюченную между СRОбRами ВЫПОЛНЯТЬ - ВЕРНУТЬСЯ, поRа условие справед­ / Пиво. Он э1шивалентен циRлу LSE FAIRE номер стро1ш ПОНА условие последовательнпсть операторов n замыRающая строRа 7
или цвклу на яаыRе ПасRаль WHILE условие DO BEGJN последовательность операторов END ЦИRЛ ВЫПОJШ.НТЬ последовательность операторов, содержащая слово КОНЧЕНО ::JЕРНУТЬСЯ работает так:, Последовательность инструкций, заключенная между с~юбками операторов ВЫПОЛНЯТЬ - ВЕРНУТЬСЯ. повторяется неограни­ ченно. Слово КОНЧЕНО означает, что цель цикла достигпута, по­ вторяемая работа заRончена. На этом цикл останавливается и ирш.>рамма продолжается со следующего sa циклом оператора В английсRих книгах и статьях вместо КОНЧЕНО обычно пишут EXIT: выйти иа цию1а (также сделано и в μзыке Ада). Но EXfT вызывает идею действия: выхода. Я предпоqитаю ему слово КОН­ ЧЕНО, которое лучше отражает идею не действия, а ситу1щии: я достиг цели цикла, с ним все кончено., •. Простых эквивалепто13 этого цикла на Бейсике, LSE или Пас­ Rале нет. Можно применить операторы ALLER EN или GO ТО для симуляции такого цикла. - На Бейсике можно использовать дополнит1:тьную пере- менную Z: FORZ=1ТОО LET Z=О NEXT Z заменяет ВЫПОЛНЯТЬ заменяет КОНЧЕНО заменяет ВЕРНУТЬСЯ Кроме того, нужно перепрыгнуть в цикле все, что стоит после eJIOBa :КОНЧЕНО, т. е. после оператора LET Z = О. Так как это можно сделать с помощью GO ТО, то я считаю предпоqтительным испольаовать таRИм образом GO ТО для циклов. Если ваш язык ве структурирован, то красивых циклов вы никогда не получите .•• - На языке Паскаль используйте булеву переменную z, ко­ '1'орой до начала цикла присвоено значение TRUE, и тогда цикл примет вид WНILE 1 DO BEGIN END Слово КОНЧЕНО придется заменить оператором 1 := FALSE, включенным в конструкцию так, чтобы сдеJrать этот оператор по­ еледним выполняемым оператором цикла. Если структура языка нехороша". Цикл ДЛЛ t := ехр 1 ШАГ ехр 2 ДО ехр 3 ВЫПОЛНЯТЬ." ВЕРНУТЬСЯ повторяет последовательность операторов, за1шючснную между ВЫПОЛНЯТЬ и ВЕРНУТЬСЯ, придавая t значения из арифме­ тической прогрессии с разностью ехр 2 (постоянная вмичина в дан­ ном цикле), начиная с ехр 1 и останавливаясь на ехр 3, Если шаv равен 1, то фрагмент ШАГ 1 можно опустить.
ЧАСТЬ 1 УСЛОВИЯ ЗАДАЧ 1. СЛУЧАЙНЫЕ ЧИСЛА Генерация случайного числа Можно сделать из этого настоящую головоломну: написать программу, выполнение ноторой на номпьютере дает число, случайным образом распщ1оженное в данном интервале, например, между О и 1. Но это невозможно,, Неноторые язьши содержат фуннцию, значение но­ торой есть непредсназуемое число в данном интервале. Если ваш номпьютер использует LSE~ достаточно набрать на нлавиатуре ?ALE(O) чтобы получить .в ответ непредсказуемое число между О и 1,, которое может рассматриваться RaR полученное случайным образом. На языке Бейсик команда RND(O) дает ~:от же эффент при условии, что предварительно выполнена инструнция RANDOM. Но Бейсин - это скорее общее :цмя для це­ лого Rласса язынов, чем обозначение совершенно опре­ деленного стандартизованного язына,; не меняющегося от одной машины н другой. Так что сверьтесь с описа­ нием R вашему номпьютеру ... Если используемый вами языR допуснает описанные вьппе или аналогичные возможности, то получить случай­ ное число в интервале (О, 1) - это нинаная не голово­ ломка, это тривиально. Но если в языне таной возможности нет" то это больше чем головоломна, это невозможно. ПредпоJiожим:» что мы сделали программу, производящую таное число. Эта программа не может иметь исходных данных,: иначе это не она вытаснивает. случайное число, а именно вы при .введении данных". Если же у нее нет данных,. то она действует~ исходя из нонстант. Но тогда нет переменных 9
элементов, и поеледовательпые запуски проrраммы дают совпадающие результаты. Как же вы получите с помощью IJ.'акой проrраммы случайное число? *) Поэтому если ваш компьютер пе допускает функции, дающей стохастическое число, я вижу · только одно ре­ шение**): введите сами случайное '!Исло в ваш компью­ тер. Как это сделать? Вот предложение. Вы берете колоду пз 52 карт, перетасовываете. Затем вы делите колоду на верхнюю и нижнюю части и берете из нижней части три верхние карты. Небольшая и очень простая программа читает три целых числа х, у, z. В качестве значений этих цедых чисел вы задаете численные значения трех выбран­ ных карт,, считая туза за 1, валета - за 11, даму - за d.2, короля - за 13. Компьютер вычисляет значение (((х- 1)/13+у- 1)/13+z- 1)/13, Например 1 если · вы достанете, кан только что случи­ лось со мной, семерку бубен 1 десятку червей и еще шестер­ ку бубепJ то х=7у==10z=6 и компьютер получит 0.440601. Это значение не является воистину непредсказуемым. Rак тьлько вы достанете карты, вы уже сможете понять порлдок велвчины результата. с другой стороны, таким способом вы не сможете получить более 133 = 2197 раз­ личных чисел, Но этого на самом деле достаточно для при .п ожепий, которые мы рассматриваем в этой книге. А если nы И в самом деле хотите получить что-либо не-_ предсказуемое, прочтите следующий раздел. *) Строrо говоря, эти рассуждения примени.мы к любой про­ rрамме, написанной на любом языке, если только эта программа вв использует никакой внешней информации в качестве исходнЫJI данных. В качестве такой внешнеи информации удобнее всеrо ис­ пользовать что-нибудь связанное с временем: числ0- изменений напряжения в сети с момента последнего включения вашего компью- 1rера ищ1 число секунд с момента ero покупки, если ваш компьютер снабжен внутренними энерrозависимыми часами (на ·литиевой ба­ ' ! ареi'!ке), и т. п. Обычно, на каком бы -языке вы ни работали, · У вао есть возможность прочесть показания внутренних часов компью­ 'l'в ра (посмотрите в документации, как работать с таймером).­ Jl римеч. ред. **) См. предыдущую сноску.- Примеч. ред, 10
Непредсказуемые чис.JJовые последовательности Редко бывает цужно получить -rольно одно случай­ ное число. Чаще нужно получить много таких чисел. Большая часть игр, представленных в этой книге, требует~ чтобы играющий с компьютером по ходу игры встречал­ ся, сообразно с предложенными правилами, с непреi:;­ скаэуемыми ситуациями. Нужно уметь порождать такие ситуации. Поэтому нужно иметь возможность построить такую цоследовательность чиселr чтобы переход от одного числа к друrому определялся простыми вычислительными пра­ вилами, но чтобы в то же время результат было трудно предсказать. Может случиться, что используемый вами язык предо­ ставляет эту возможность непосредственно в виде одной из консrруRций языка. Так; на LSE команда ALE (х) дает число,; лежащее в интервале (О, 1), значение которого зависит от х1 но непредвиденным образом и~ кроме того, не специфици­ рованным в языке: значение будет различным на разных машинах. Если вы трижды зададите один и тот же вопрос ?ALE(0.1) вы каждый раз получите один и тот же ответ, но между ALE(0.1) и ALE(0.2) нет простого соотношения. На Бейсике функция RND играет ту же самую роль. Она порождает непредсказуемую последовательность1 зна­ чения которой зависят только от начального числа - оно одно и то же для данного компьютера. Инструкция RANDOM дает случайное число и ставит его начальпым элементом последовмельности 1 что позволяет порождать различные последовательности. Может быть, интересно посмотреть, как можно строать подобные последовательности. Вот метод, предложепп rй А. Энгелем [ENG]. Если х - число между О и 1 1 то сле­ дующий за х элемент последовательности есть дробная_часть ((х + 3.14159)8 ) Rонечно 1 восьмая степень вычисляется тремя последоnа­ тельными возведениями в квадрат! Она дает число метду 9488 (для х = О) и 86564. Очень небольшое изменепие х вызывает сильное изменение (х + л) 8 , и, в частности,; оно может перейти через ближайшее целое, так что новое значение (дробная часть результата) может оказаться меньше преды,~;ущей,
Возьмем, например, х = 0.52000; тогда (х + 3.14159)8 = 32311.5437 так что аа 0.5200 следует 0.5437. Но для х = 0.52005 имеем (х + 3.14159)8 = 32315.0736 и аа 0.52005 следует 0.0736 . .Так как мы берем дробную часть, то полученное числоf разумеется, лежит между О и 1. У п р а ж н е н и е 1. Поведение последовательности. Речь идет о том., чтобы увидеть, как ведут себя чис­ ловые последовательности, порожденные таким образом. Для этого вычислим большое число членов последователь­ ности, порожденной своим первым элементом. Поместим каждый иа этих членов в один иа 50 интервалов длины 0.02, составляющих интервал от О до 1. Выведем число членов последовательности, попавших в каждый иа этих интервалов. Если числа иа Последовательности равномерно распределены в интервале (0"1), мы ,должны будем обна­ ружить, что их количество в разных интервалах имеет ощутимую тенденцию к постоянству. Составьте программу для проверки этого утвержде­ ния. Начальное значение может, например, вводиться в начале каждого вычисления. Упражнение 2. Поиск других последователь­ ностей. Число л:, использованное при вычислении наших по­ следовательностей, не обладает никаким специальным свойством., и можно спросить себя, действительно ли вы­ бор этого ЧИСJiа является наилучшим возможным. Числа (х + л:) 8 довольно велики" а берем мы от них только дробную часть. При этом мы отбрасываем значащие цифры целой части, и - поскольку вычисления на компьютере проводятся с фиксированным количеством значащих цифр - на дробную часть остается относительно неболь­ шое количество цифр. Предположим, что числа представ­ ляются с помощью 24 двоичных цифр. Нужно 14 двоичных цифр, чтобы записать 9488, так как 213 = 8192<9488<214 = 16384 и 17 цифр, чтобы записать 86564, так что остается лишь от 7 до 10 двоичных цифр на дробную часть. Используя (х + а) 8 вместо (х + л:) 8 с мею,шим зна­ чением а" можно ожидать сохранения большего коли- 12
чества значащих цифр для дробной части. Но ·нельзя взять а слишном близко ц 1, так как тогда распределение чисел в интервале (О, 1) окажется плохим. Можете ли вы объяснитt-.-~ почему? 8 Например, почему нельзя ·взять а = ]f2? Если вы сделали упражнение 1, вы располагаете программой для проверки случайных qисел. Измените ее так, чтобы она осуществляла чтенпо - постоянной а, - начального значения посщщовате:~ьности. На своем микрокомпьютере я выяснил, что а= 1.226 дает достаточно хорошие результаты. Но это наблюдение может меняться от машины к машине, так как все это очень чувствительно к способу, которым осуществляются умножения: в последней двоичной цифре результата умн)­ жения есть неопределенность, существенно влияющая на рассматриваемый процесс. Азартные игры Теперь вы должны быть в состоянии получать посJrе­ довательности случайных чисел. Либо эта возможность есть в исполь3уемом вами языке, либо вы можете постро­ ить непредсказуемую последовательность чисел методом, описанным в предыдущем разделе. Упр аж не н И е 3. «Орел» или «решка>>. Я не осмеливаюсь предложить это как игру; это ско­ рее упражнение, чтобы научиться использовать случай­ ные числа. Составьте следующую программу: - она спрашивает вас, что вы загадали, «орла» или «решку», и читает ваш ответ; - она порождает случайное число и ватем сообщает вам" выиграли вы или проиграли. Единственная трудносты генератор случайных чисел дает вам.~ быть может, число, содержащееся между О и 1 (это так в случае функции ALE явыка LSE и для генератора ив равд. 1.2. Имеются противоречивые сведе­ ния о явыке Бейсик, возможности которого существенно меняются от машины к машине). Следовательно, нужно перейти от вещественного числа в интервале О : 1 к чему­ .пибо принимающему не более двух значений, например О и 1. Вы сопоставляете по своему усмотрению «орла• одному ив них, а «решку» - другому. 13
Если генератор случайных чисел действует не лучшим оfiразом·, то игра может оказаться нечестной, и одна иэ возможностей - «орел» или «решка» - может выпадать чаще ,, чем другая. Сделайте программу, реализующую большое число испытаний1 и подсчитайте число выпаданий орла. Упражнение 4. Игральные кости. Вместо игры в «орла» или «решку» заставьте компыо­ тер играть в кости. Напишите программу, симулирующую большое число выбрасываний двух костей, и подсчитайте, сколько раз будет выпадать каждая комбинация от 2 до 12. Знаете ли вы, сколько раз должна выпасть каждая из них~ если генератор случайных чисел идеален, а число бросаний действительно велико? Перед вами - та же задача .t что и в предыдущем упражнении: перейти от некоторого числа в интервале {О., 1) к целому числу от 1 до 6 включительно. Но если вы знаете1 как сделать это для ·2, то вы сможете · сделать и для 6... Игр а 1. Фальшивые кости. Ну да1 такое еще бывает; есть еще такие люди, которые мошенничают и используют поддельные кости. Нужно быть в состоянии заметить это и,.- 1<ак в любом хорошем вестерне, устроить грандиозную драку с мошенником. Здесь мошенником пусть будет компьютер. Он играет .. одной-единственной костью и бросает ее столько раз 1 сколько вы требуете. Оп дает вам число выпаданий еди­ ницы, двойки" ....• шестерки. Вы сообщаете ему, верите ли вы, что кости поддельные, и если да, то какая грань выпадает чаще других. Компьютер отвечает вам, выиграли вы или проиграли, и случайным образом оценивает ваш выигрыш. Совершенно ясно, что если вы потребуете 10 ООО бросаний, то у вас будет больше шансов обна­ ружить истину, чем если вы потребуете 20 бросаний". Нужно решать две задачи: компьютер должен вы­ брать - подделывать кости или пе подделывать, и если он их подделывает 1 то оп должен решить, какая грань будет встречаться 11аще остальных. Вспомогательная задача: выбрать функцию оцепки для :выигрыша. ? И г р а 2. Стратегия для одной игры в кости. Ж.-R. Бейиф [BAI] предложил игру в кости с двумя игроками. Каждый игрок в свою очередь хода бросает :кость столько раз_, сколько хочет. Если оп не выбрасы­ вает единицу 1 то он записывает за этот ход сумму выпав- 14
ших за бросания этоrо хода очков. Если же он выбрасы­ вает единицу, то он не записы~ает ничего {и его ход кон­ чается с выбраеы'ванием единицы). Выигравшим считает­ ся тот, кто первым наберет (или превысит)- 100 очков. ·Составьте программу, которая позволит человеку иг­ рать против компьютера. Эта программа реализует бро­ сание кости. На своем ходе она честна и пе мошенничает. На вашем ходе она бросает кость и сообщает_,, что выпало" а вы требуете следующего бросания,, если вы хотите играть дальше. - Задача о стратегии ясна. Вы можете, например, бро-. сать кость ровно один раз. У вас хорошие шансы увели­ чить свою сумму, н<tна небольшое число очков {от2 до 6). Если вы делаете несколько· бросаний, вы увеличиваете шанс получить большую сумму, но вы увеличиваете и риск выбросить единицу. Стратегия играющего против компьютера - это его проблема, и программа компьютера во всех этих рассмотрениях це участвует. Она цграет по команде человека, он говорит, хочет ли он продол­ жать - под его личную ответственпость. Напротив, программа должю\ быть снабжена стра­ тегией для управления игрой Rомпьютера. Возможностей много. Выбирать следует вам. Программирование этой .игры представляет двоякий интерес~ - нужно придумать стратегию для компьютера; - у вас есть возможность экспери~ентировать. Если компьютер снабжен некоторой стратегией~ то вы можете играть против него с другой стратегией и посмотреть, кто выигрывает ... Вы можете также захотеть переиграть партию с тем .же началом, что и в предыдущей партии,_ но вводя в вall!y игру изменения, чтобы изучить последствия. Это при­ водит к новому понятию. Воспроиаводимая непредекавуемая последовательность Вы научИлись порождать последовательности непред­ сказуемых чисел, или, допуская неточность речиJI приня­ тую в информатике1 случаиных чисел (эти последователь­ ности совершенно не случайны: они полностью детерми­ нированы, но, поскольку мы не можем найти простого способа перехода от данног.о числа к следующему и по­ скольку эти числа приблизительно регулярно размещены в промежутке О: 1.i то они производят впечатление слу- 15
чайности). Каждое ч1fc.no в этой последовательности за­ висит только от предыдущего числа. R тому же, как и выше, ·вы можете получить и в самом деле непредска­ зуемое число , вадавая компьютеру значения трех карт. Вы заставляете его вычислить значение, определенное в разд . 1.1, затем вы берете следующее за этим значением либо с помощью функции ALE или RND вашего компью­ тера, либо с помощью метода, описанного в разд. 1.2. Эти последовательности случайных чисел таковы, что каждое число в последовательности зависит только от предшествующего ему и задание начального элемента последовательности полностью определяет последователь­ ность. При отправлении из одной и той же точки два по­ следовательно проведенных вычисления дают одинако­ вые последовател~:ности. Таким образом, вы не только можете получить в игра х непредсказуемые ситуации, но и воспроизвести их столько раз, сколько вам нужно. Для этого нужно 1 чтобы программа требовала ввести исходное значение последовательности. Я считаю удоб­ ным вывести приглашение приблизительно такого рода: ВВЕДИТЕ ТРЕХЗНАЧНОЕ ЦЕЛОЕ ватем прочесть знаЧ:ение х этого целого и ваять в качестве начального значения случайной последовательности чис­ ло х/1000. Исходя из генератора случайных чисел,_ можно легко построить последовательность целых чисел. Название функции, порождающей случайные числа.~, меняется от языка к языку; назовем ее ale (х) - это функция, сопоставляющая X:i О < х < 1~ следую­ щее за ним число О<ale(х)<1. Построим теперь последовательность неотрицательных це­ лых чисел, меньших данного числа п. У нас есть две воз­ можности. 1. Мы порождаем последовательность случайных чисел в интервале (О,_ 1) и для кащдого из чисел последователь­ ности получаем соответствующее целое х := ale (x) .t р = целая_часть(n * х). Различные значения х могут давать одно и то же зна­ чение р, так что элемент~ следующий за р в последова- 16
тельности целых, не определяется каким-либо riредска­ ауемым образом. Вообще говоря, данное значение р мо­ жет иметь несколько последующих значений. Маловероят­ но, Что ата последовательность окажется периодической. Это заведомо случится, если последовательность х, опре­ деляющая ее, периодична (а это бывает, хотим мы этого или не хотим). 2. Пусть р дано; тогда р/п лежит между О и 1. И эле­ мент.» следующий за р, можно определить формулой р := целая_часть (п * ale (р/п)). Здесь элемент., следующий за р, полностью определен числом р, и эта последовательность неизбежно оказы­ вается периодической. В наиболее удачных случаях она дает п различных значений (п целых от О доп - 1), после чего возвращается :к уже встретившемуся в последова­ тельности числу, и - так как каждое ив чисел имеет однозна:чно определенное следующее за ним число - мы повторяем уже построенную часть последовательности. Но чаще всего этим способом получаются слишком корот­ копериодические последовательности. ??Головоломка 1. Периодическая последова­ тельность. Построим последовательность целых чисел в промежут­ ке (О, п - 1) только что описанным способом. Предпо­ ложим, что п достаточно велико (например 10 ООО). Напи­ сать программу., определяющую период этой последова­ тельности. Ограничение: вы не имеете права запоминать в таблице последовательные значения элементов посл-е­ довательности (вы не имеете права запоминать их и в лю­ бой другой форме). Именно поэтому п предполагается достаточно большим~ не может быть и речи о сохранении всех полученных эначений, чтобы смотреть, встречается ли каждое новое значение среди предыдущих. Нужен другой метод. Вам предлагается обнаружить один из них ... Головоломка для маленького вун­ деркинда. В прессе - как американской, так и французской - часто появляются восторженные сообщения о детях, ко­ торые обучаются работе с компьютером за несколько часов и затем объясняют своим родителям, как это дела­ ется. Разрастаются клубы по информатике, где дети пи­ шут программы, заставляющие бледнеть профессионалов. Подающие надежды Эйнштейны информатики." Я бы ни- i7
когда и пе · предлагал следующую головоломку, если бы пе был жестоко ущемлен одним из пих, Попятно.1 что я не скажу. ни где,; mt когда, Я находился в зале для практических занятий с деть­ ми 15-16 лет. Преподаватель предложил им составить программу, бросающую две случайные кости и сообщаю­ щую , число появлений каждой комбинации (см. упраж­ u_ение 4). Маленький местный вундеркинд закончил свою довольно простую (не так лиf) программу.~, и преподава­ тель . предложил ему следующую задачу: пусть последователь:но п раз выбрасывается «орел~ или <<Решка». Сосчитать число случаев появления номби­ нации «орел» - «орел» - «орел».1, и число случаев по­ явления комбинации «орел» - «решка» - «орел». Мальчик очень быстро написал программу, но опа не пошла. Поэтому Я уселся рядом с ним и предложил ему nровериi'Ъ, что именно пе идет.' Мы вывели программу на экран. Совершенно непонятно. Плохо вложенные циклы. Поскольку ошибки были, то прищлось делать исправле­ ния вплоть р.о убирания одпоrо GOTO, чтобы заменить его другим GOTO. Я сделал ему замечание, что его программа непонятна, на что он ответил, что это не имеет значения, поскольку он ее понимает. Я возразил ему, что через три месяца он сам ее не поймет: никакой реакции, это его не интересовало." Так что вааимопонимапия между нами достичь не удалось. Я вижу только дв а возможных объяс­ нения этого явления, в конечном счете не исключающих друг цруга: Шiогие преподаватели лицеев располагают наблюдениями такого рода. Можно представить себе, что успешный диалог между человеком и машиной разрушительно действует на диа­ лог между людьми, Это было бы катастрофой. Но эту столь пессимистическую гипотезу ничто реально не подкрепляет. Гораздо более правдоподобно, что этот мальчик (как и подобные ему) встречают естественные затруднения в об­ щении с другими людьми. Оп нашел в информатике стра­ ну, в которой можно избежать ТаJ{ОГо общения и где ма­ шина принимает все, что оп скажет, какова бы пи была форма и структура, лишь бы только синтаксис был соблю­ ден. ИмеНпо поэтому ф~номен «информатических Jшубов• оказывается опасным. В рамках преподавания информа­ тики нужно, чтобы преподаватель требовал от своих уч&­ ников анализа поставленной задачи и словесного выраж&­ ния па обыденном языке результата этого анализа. Про­ граммирование может начаться только после этого. На 18
этом уровне преподаватель заботится о качестве стиля про­ rракм:,- написанных по ясному плану". (Я надеюсь, что и вы работаете именно так, иначе вас нужно остерегаться.) В обстановке, когда подростков недос'rаточво контролиру­ ют и они находятся как бьi на самообучении, они могут оказаться свободно предоставленными своим естествен­ ИЪIМ склонностям. Если организованное преподавание по­ могало бы им учиться выражать и структурировать свои мысли, то всетерпимость к средствам выражения, свойст­ венная машине, позволяет им оставаться в их собственном :мирке, и случайные - но настоящие - успехи ошибоч­ но убеждают их, что искать других путей пе нужно. Это ли нужно подросткам, испытывающим трудности при обще­ нии? Вернемся к нашим баранам. Если кто-то из молоды.t людей и обломает па этой sадаче свои зубы, то вто, мож0'1 быть~и правда головоломка. Пора перейти к формулиров­ -ке задачи. - *Головоломка2. Последовательности«орловt И <<Решею>. · Осуществим п выбрасыван:gй «орла» и «решки» с боль­ шим п (например 10 ООО). Сколько раз встретится в неl данная комбинация из т следующих Друг за другом выбра­ сываний (например, 10 раз «орел» или чередование :иt: tO выбрасываний «орла» и «решки», начиная с «орла»). Есть много способов решить вто упражнение. Они не всd равноценны по времени вычисления. .f,I взял большое JI и относительно большое т, чтобы прояснить явление~ Ваша программа пе должна работать долгие часы.,, Другие азартные игры *Игра3. Покер -М - С. Я пе уверен,. что это следует писать. Я знаю вту игру толыtо по услышанной мною радиопередаче какой то пе­ риферийной радиостанции (угадайте какой?). Тасуем кар­ точную колоду. Разыгрывается некоторая сумма. Берем верхнюю карту из пачки и требуем от игрока, чтобы оа угадал, является ли следующая карта младшей и.Ли стар­ шей- по отношению к только что взятой. Учитывается только число очков, а не масть карты. Валет всегда боль­ ше девяти, король больше валета:, туз больше всех. Если игрок угадал правильно, сумма в игре возрастает (я не виаю точно, добавляется ли при втом некоторое фиксиро­ IВанное количество или сумма удваивается, по вто не тая 19
уж .важно. В любом случае ваш компьютер не имеет связи с распределителем банковских билетов. Жаль, быть мо­ жет ...). Если он не угадывает, он теряет все. в · конце не­ которого фиксированного числа бросаний (кажется 6; а слушал недостаточно внимательно, я прошу прощения у упомянутой станции) игрок, если он всегда оказывался прав, присваивает сумму игры. _ Составьте программу, которая позволит вам быть иг­ роком, а компьютер пусть будет всем остальным (за исклю­ чением того, что вы называете и сумму игры). На ыой взгляд, хотя я могу и ошибаться, единст венная трудная вадача - перетасовать карты". ?** И г р а 4. Лабиринт для шахматного 1юня. Лабиринты являются очень высоко ценимыми голово­ ломками. Почему не использовать компьютер и генератор случайных чисел для построения случайных лабиринтов, которые вы затем будете пытаться пройти? Но мой микро- · кщшьютер не имеет графических возможностей. l{ тому же если у вашего такие возможности есть, то я не уверен, что желание нарисовать обычный лабиринт приводит к хо­ рошему упражнению по программироранию. Внимание часто в большей мере поглощается графическnми задача­ ми, чем более фундаментальной задачей порождения ла­ биринта. Тем не менее, если вам так подсказывает сердце, не стесняйтесь: . стройте от случая к случаю такой лаби­ ринт, чтобы у него был хотя бы один путь от начала к кон­ цу, и играйте с ним. Чтобы освободиться от графических задач, рассмотрим другую форму лабиринта. Его создание составляет голо­ воломку, а использование - игру. Пусть дана прямо­ угольная область, образованная п строками с р полями па каждой из них. На моем компьютере, где приходится учитывать формат экрана, числа п = 12 и р = 20 дают хорошие результаты. Занятые места считаются препятст­ виями (обозрачепными вдесь О}, пусть как-то помечены свободные места (здесь - точкой}, пусть значок * обо­ вначает всадника. Rонь перемещается, как конь в шахма­ тах: два шага в одном направлении и еще один шаг П;:Jр­ пендикулярно предыдущему направлению. Rонь может перемещаться только с одного свободного места на дру­ гое, В начальный момент он находится в правом нижнем углу. Оп должен попасть в верхний левый угол (который, таким образом, тоже должен быть свободным}. Число хо­ дов игры ограничено. На рис, 1 изображен типичный при­ мер лабиринта, 20
Составьте программу для компьютера для создания этого лабиринта и попытки его пройти. Так как должен существовать какой-то путь, проходящий из правого ниж­ него угла в правый верхний угол, то я прещ1агаю вам дей­ ствовать следующим образом: - возьмите случайным образом путь, связывающий эти два угла. Это<- маленькая головоломка. Может быть, вы знаете задачу Эйлера о шахматном коне: составить .0.0.00000000 .0 •• 000 0.0000.о.оо.о ••• о.оо 0.0.00000.аоо.о •• ооо 0000000.000000 •• 0000 , такой путь коня по шах­ матной доске, чтобы он побывал на каждом поле один и только один раз. Но здесь у вас больше сво­ боды. Тем не менее не представляется разумным проходить два раза одно и ООО. 000000. О. 0000. 00 то же поле (если ваш путь будет содержать круг, то он будет предоставлять воз­ можность для короткого 000000000000.0 •• 0000 0000.000000.00000000 вамыкавия, т. е. удаления 00000000000000. 00000 этого круга). Но, может ~~~ =:::г:е~~~о~::~~ 0000000000000000. ООО даем на одно и то же поле, 00000000. 0000000 . ООО то мы предоставляем много возможностей выбора, и осложняем задачу воссоз- О. 00. 0000000000. О. 00 дания пути. Не нужно ис- пользовать какой-либо си- • 0000000000. 0000000* стематический алгоритм прохода, иначе ваш лаби­ Рис. 1 ринт будет расшифровываться слишком быстро. Следую­ щий ва ·данньiм полем шаг на нашем пути должен выби­ раться случайным образом. Rак тогда мы сможем быть уве­ рены в попадании в левый верхний угол? - получив однажды такой путь, отметьте его. Затем вы случайным образом распределяете препятствия на по­ лях, не принадлежащих выбранному пути. Степень за­ полнения этих полей является параметром, который вы подберете по опыту. Если вы поставите слишком мало препятствий, ваша шахматная доска будет почти пустой, и будет много возможных путей, так что лабиринт не по­ лучите~., Если же вы поставите много препятствий, то 21
д)"ТЬ будет почти полностью определен (на рисую•е пре­ пятствия ааним:ают приблиаительно 2/3 полей. Это - верхняя rрань); - Rогда ато сделано, вы снимаете обоаначения полей выбранного пути, ааменяя их точRам:и. Лабиринт готов R покаау. Остается обеспечить движение коня. Вот каR действую я. Сначала я подсчитываю ;rисло полей на исходном: пути, которые были выбраны случайно, и вывожу ато число в Rачестве верхней границы числа ходов. Я свидетельст­ вую, что всегда обнаруживался более короткий путь. Я не пытался объяснить атот аксперим:ентальный факт". Компьютер сообщает число оставшихся ходов и тре­ бует ваших укаааний о движении. Ответ дается в виде двух букв: первая иа атих букв дает направление, в кото­ ром: нужно переместиться на два шага, вторая буRва дает перпендиRулярное предыдущему направление, в котором нужно сделать один шаг: Н - для ниж;ней, В - для верх­ ней-, П - для правой, Л - для левой сторон. В случае на рис. 1 первое движение предписЫва0'1' ЛВ - два шага влево, один вверх. / Rомпьютер анализирует ответ. Если превышено число ходов или ход встречает препятствие, то игрок проигры­ вает. Если нет - авеадочка, изображающая коня, пере­ мещается в новое положение, число оставшихся ходов уменьшается на единицу, и игра продолжается . И г р а 5. Спящая красавица. , Rраткое содержание предыдущих апиаодов. Доктор Жабуа пе убил великолепную Жюли·, он только приоста­ новил жианенные процессы. Ее мог бы раабудить надлежа­ щий лицевой массаж, но ато его не беспокоит, впередu еще · много времени. Иа аам:ка вывеаено все, что имело хоть какую-то ценность: обстаповка, картины, проиаведепия искусства". Молодой повеса обнаруживает пустой аамок и находит, что оп должен быть аамечательпым треком: для мотогонок ... 13-й 3ПИ30Д. Рыжий Тони входит в темную Rомнату. Несмотря па грохот мотоцикла, отчетливо воспринимается равномер­ ный храп. Он аажигает фару и обнаруживает беамяте;к­ но спящую прекрасную Жюли. Ослепленный ее Rрасотой, он приближается R ней и гладит ее по лицу. Ничего боль­ .ше и не нужно. Жюли внеаапно просыпается и, приходя в соапание с удивительной быстротой, восклицает: «Бе­ жим: отсюда с1юрее, в аам:ке аападня, все сейчас ва<r 22
рвется». Тони садится на мотоцю{л.- Жюли вскатшrает на сир;еаье ва Тони и пристегивается к нему. Но уже повсю­ д'/ rремят вэрывы, и огонь охватывает деревянный пото­ nок. Тони мчится эигэагами среди обломков. Обрушива­ ются куски rорящих балок, угрожая раэдавить их в лю- бой момент. _ Удастся ли им выбраться из замка? Продолжение в следующем эпизоде. Эта игра является вариантом предыдущей. Вы пред­ ставляете. эамон тем же самым прямоугольным простран­ ством, rде точки обозначают свободные места, нули - пре­ пятствия, а ввеэдочRа сообщает местоположение Тони. В начале игры Тони находится в правом нижнем углу, а выход находится в левом верхнем углу. Препятствий вна­ чале крайне мало. После каждого хода Тони компьютер случ:айным обраэом формирует новые препятствия и раз­ мещает их на игровом поле. Если Тони окаэывае~ся на мес­ те одного из них, то он раздавлен и для него все кончено ..• Чтобы оставить Тони хоть какой-то шанс, я предпочи­ таю устанавливать препятствия парами - поочередно вер­ ти1<альными и горизонтальными. После небольшого на­ блюдения :можно заметить, что дви~ение большей частью идет в тесных коридорах, нуда препятствия не могут по­ пасть (J;Iужно по крайней мере два смежных свободных поля, чтобы _там моrло раэ:ъюститься препятствие). Если не пр;инимать мер предосторожности, то препят­ ствия могут полностью эагородить путь R выходу. Может быть, предпочтительнее условиться, чтобы хоть какой-то путь оставался свободным. Каким обраЭом -- на ваше усмотрение. В своей первой версии такой программы я ~того не сделал. Чаще всего выход оказывался блокиро­ ванным и игра могла быть выиграна лишь в исключитель­ ных случаях. 2. ИГРЫ С ЧИСЛАМИ Арифметические развлечения Есть много примеров арифметических ·игр, головоло­ мок и развлечений. Их можно найти в [BAL], [BER], (KUE]. MI;iI обращаемся и к другим источникам и добавля­ ем некоторые задачи, которые представляют интерес собст­ венно с точRи зрения программирования. Многие арифме­ ьческпе головоломки можно сделать вручную: для чеrо еоставлять программу? Очень часто вам нужно сделать 23
часть работы на руках, а машина сделает остальное. Это вы должны правильно распределить работу, иначе время вычисления может оказаться чрезмерным. Строгих пра­ вил здесь нет. Одна и та же задача может иметь много ре­ шений, и методы решения одной и той же задачи могут быть различными. Это и создает игровую ситуацию. Группировка различных головоломок по темам более или менее условна. Начнем е наиболее простых задач. ДЛЯ РАЗМИНКИ. Головоломка3. Вращающеесячисло. Найти такое число, оканчивающееся на 5, что, умно­ жая его на 5, мы получим новое число, полученное из пре­ дыдущего вычеркиванием цифры 5 на конце и приписыва­ нием ее в начале. Это легко". Та же задача с заменой 5 на 2. Можно ли заменить здесь 5 какой-нибудь цифрой, о·r­ личной от О? ** Гол о в о лом R а 4. Квадратный корень. Извлечь целый квадратный корень с недостатком из очень длинного целого числа (намного более длинного, чем наибольшее целое, которое воспринимается вашим компыо­ тером, например, содержащего 50 или 100 значащих цифр). Числовые послеJ\овательности Вот две известные в информатике головоломки. Сожа­ лею, что обманываю ожидания своих коллег, которые не найдут здесь ничего нового", ?*Головоломка5. ПоследоватеЛьность Хзм­ минга. Рассмотрим числа, не имеющие других простых дели­ телей,; кроме 2, 3 и 5. Расположим их в возрастающем по­ рядке. Это и есть последовательность Х змминrа. Вот ее начало: 23456810121516182024252730323640 45 48 50.•. Составьте программу, выписывающую п первых чле­ нов этой последовательности для большого п. Внимание: вы должны порождать последовательность Хзмминга в порядке возрастания ее членов. Нетрудно, например~ взять степени тройки и разместить их в последователь­ ность. Вы же образуйте последовательность от номера 1 до номера i - 12 а затем вычислите и поставьте на место 24
элемент, последовательности с по,мером i. В этом-то и го­ ловоломка ... ?**Головоломка6. Счастливыечисла. Унтер-офицер собирает своих людей, чтобы решить, кого отправить в наряд на картошку. «Постройтесь гуськом и рассчитайтесь, начиная с 2». Первый из стоящих говорит 2, следующий - 3, следую­ щий:- 4ит.д. «Первый в ряду, выйди из строя. Ты освобоа\ден от наряда. Какой у тебя номер?» «Второй»,- отвечает солдат, «Начиная со второго, рассчитаться по два; тем, кому не выпадет 2, выйти из строя; они пойду·r в наряд». И процесс возобновляется, Первый из вышедших из строя имеет номер 3, и он счастлив: он освобожден от на­ ряда. Теперь рас.считываются по трое, начиная с 3 - с того, кто первы~ вышел из строя за нарядом ... Составьте программу, выписывающую п первых счает­ ливых чисел для большого п (100f даже 500), Внимание~ в ч1:1м состоит головоломка: каждый член послсдо.ватель­ ности должен вычисляться, исходя из данных значений предыдущих счастливJ,Jх чисел. У вас есть t первых" вы­ числите следующее. В табщще-то легко вычеркивать". Вот первые счастливые числа: 2з571'113112з·2529 Счастливые числа - не обяватедьно простые,_ а прос­ тые числа - не обязательно счаQтлив:ь~е." ???ГоловоломRа 7~Ды~вольсная последова- тельность. Марк Твен описал в своих рассназах жутную историю, Человек прочел гJ1упые стихи вроде Кондуктор, отправляясь в путь, Не рви билеты каIС-нибудь, Стриrи как можно осторожней, Чтоб видел пассажир дорояшый: Синий стоит восемь цеитов Желтый стоит девять цент~в, Красный стоит только три. Осторожней режь, смотри! Припгв: Режьте, братцы, режьте~ Режьте осторожно! Режьте, чтобы виден пассажир дорожный! (Я цитирую по памяти, но дух соблюден.) Он был порабо­ щен ритмом зтих стихов, что стало настоящим паважде- 25
нием. Если он начинал писать, его перо выводи:;о «Режьте, братцы, режьте». Если оп встречал кого-нибудь, он не здоровался с пим, а говорил «Режьте, братцы». Оп пробовал управлять собой, но это подрывало его здоровье. Оп решил обратиться к своему священнику и объяснить ему, в чем дело, и читал ему зто маленькое ст:rхотворение, подчеркивая его ритм, пока пастор не вы­ учил его наизусть. Ушел он исцеленный. Но в воскресенье пастор начал проповедь словами «Режьте, братцы, режьте». Что бJ>I пи было в гимне, ко­ торы:й он запевал, слова были одни - «Режьте, братцы, режьте ... » Его жизнь стала адом. Он пе мог исцелиться, nока в один прекрасный день ему не удалось зло~ дrйсни обучить атому стихотворению одного профессора университета ... Ншиеследующее и есть «режьте, братцы, режьте». Оно преследует меня долгие годы. Я потерял массу вре­ мени на размышления о нем без сколько-нибудь значитель­ ного успеха. Но ничто меня не ванимает в большей степе­ ни. Моя единственная надежда освободиться от него - это то, что вы им заинтересуетесь ... , Последовательность определяется следующим обра­ вом: первый член этой последовательности есть произ­ вольное нечетное число, отличное от единицы. Следующее за числом р равно р/2, если р четно, Зр + 1, если р нечетно. Последовательность заканчивается, когда в ней встреча­ ется значение 1. Вот последовательность, которую !lfЫ получим1 исходя И3 .7: . 7221134175226134020105168421 Нет никакой надежды 1 что вам удастся доказать, что д,дя любого нечетного числа в качестве начального значе­ ния последовательность достигает единицы. Но в высшей степени увлекательно составить ату кро­ шечную программу и посмотреть, как опа работает. Ис­ пытайте число 27 в качестве начального значения: вы полу­ чите очень длинную последовательность, ~реди элементов ноторой есть 9232. Если вы изучите ряды чисел, получае­ мые для начальных значений, взятых среди нечетных целых от 3 до 99, вы получите довольно много патологиче­ ских последовательностей, не всегда сильно отличающих-. 26
ся. Все это очеиь смущает. Ни один специалист по теории чисел еще но смог доказать, что такая последователь­ ность принимает значение 1 для любого начального зна­ чения. Не больше известно и о том, почему некоторые из зтих последовательностей - короткие 1 а другие - слишком длинные ... Эта программа замечательно иллюстрирует то, что на­ зывается <шроблемой остановки)). Существуют простейшие программы, относительно которых нет увер~нности, что они остановятся ... Теперь, когда вы уже познакомились с зтой последо­ вательностью, получите предмет головоломки. За.метим еначала, что если р нечетно, то мы переходим к 3р + 1 - числу, отличному {)Т 1. Очевидно, что непосредственно предшествующий шаг есть деление на 2. Позтому можно изменить правило построения последовательности описан­ ным ниже образом: следующее за числом р равно р/2.,, если р четно, (3р + 1)/2t если р нечетно, Это вычеркивает некоторые члены предыдущей после­ довательности, не меняя проблемы остановки: 711172613901058421 Вы можете пойти еще дальше в том же направлении, об­ единяя вместе все последовательные- шаги, действующие по правилу (3р + 1)/2, и все следующие за ними шаги~ состоящие в делении на два. Вы получите два новых пра­ вила перехода, гораздо более уплотненные. Свяжите их и пустите в ход. Для числа 7 вы должны без задержки получить последовательность 71351 Это позволяет рассматривать обобщения задачи. Пусть k - нечетное число. Возьмем в качестве правил перехо­ да следующие: р/2, ее-ли р четноt k*р+k- 2,еслирнечетно. Возможно уплотнение, аналогичное предыдущему. Для k = 5 следующее за числом 3 есть 3, и существуют исход­ ные точки, для которых программа не останавливается. Для k = 7 она идет точно так же. Так что проблема оста­ новки связана со свойством числа k, Я бы здесь... Впро­ чем:, мало ли чего я хочу! 27
Зашифрованные операции Это - класс самых разнообразных задач. Задаются точные арифметические операции, в которых некоторые цифры либо стерты, либо заменены буквами. В данной операции одна и та же буква всегда заменяет одну и ту же цифру, и разные буквы представляют по:этому разные цифры. Нужно восстановить исходную операцию. Есть случаи.• в которых зто сводится к решению системы урав­ нений с неизвестными, представляющими собой букву,­ системы, решение которой дает также решение исходной задачи. Компьютер пе видит ничего скрытного. Таким об­ разом, если что-то пе так, то нужно действовать система­ тически методом проб и ошибок. Нужно выбрать значе­ ния для одних букв и получить с их помощью значения остальных. Нужно проверить, что разным буквам соот­ ветствуют разные значения. После конечного числа по­ пыток мы по.Лучим решение - если оно единственно - или список всех возможных решений. А еще существуют промежуточные решения: вычисление ограничивает число осуществляемых попыток. Головоломка8. SEND MORE MONEY. *) Это - лаконичная телеграмма английского студента своему отцу. История умалчивает о том, как отец это при­ нял и были ли отправлены деньги ... SEND + MORE MONEY Программа очень легкая. Время вычисления короткое. Едва ли это головоломка. Rак раз для тренировки." Головоломка9. HELPТНЕYOUNG. **) Rопечпо, конечно. Почему бы пе послать им еще де­ нег? Та же задача: HELP + ТНЕ = YOUNG Отметим разницу с предыдущей задачей. Предыдущая использовала пе все цифры от О до 9. В этой участвуют все. Можете ли вы воспользоваться этим? 28 DEVOIR, LE~ON, ELEVE. **) *) «Пришлите побольше денег.» **) «Помогите молодому человеку.» ***) «Нужно, лекция, ученик.»
Есть аналогичные зашифрованные 'сложения по-фр ан­ цуаски. Например, таиая: ELEVE + LE~ON = DEVOIR ?Головоломка10. Зашифрованное умноже ние. Довольно сложений, это становится скучным. Вот аа­ шифроваппое умножение: ABCDE * 9 = FGHIJ Здесь 10 бунв представляют 10 различных цифр, так что одна из них равна 9, Можно сразу кое-что сказать о воз­ можных значениях букв, но чтобы получить решение, при­ дется идти буквально ощупью. Столько же Придется ис­ кать и компьютеру, ?*Головоломка11.Забавноечисло. Число 123456789 обладает забавными свойствамщ 123456789 * 2 = 246913578 I{ак и исходное, удвоенное число образовано всеми де­ nятью цифрами, нроме О. 123456789 * 4 = 493827156 Результат снова образован девятью цифрами 1 отличными от о. 123456789 * 5 = 617283945 По-прежнему 9 цифр. 123456789 * 7 = 864197523 Опять 9 цифр, и это еще не все. 123456789 * 8 = 987654312 Но это не работает ни для 3, ни для 6. Это не может рабо­ тать и для 9, потому что в результате больше 9 цифр, Тем не менее есть много чисел, образованных всеми 9 цифрами (кроме О), которые после умножения на 3 дают ре­ зультат, образованный теми же девятью цифрами. Можете ли вы дать списон всех таких чисел,; оканчивающихся на 9? И также списон тех, которые копчащтся на 3? Можно 'IИ распространить использованный метод на случай умножения на 6? 29
ДQю1зательетва теорем Компьютер можно использовать для доказательстnа теорем. Это - трудная задача искусственного интеллек­ та. Мы снабжае111 компьютер правилами вы вода, даем фор­ мулировку того,· что требуется доказать, и исходные ак­ сиомы. Компьютер пытается найти последовательность правил вы:вода, которые могут привести от исходных дан- ных к требуемым результатам. · 8десь обо всем этом речь не идет. Я предлагаю вам только взглянуть на путь, использованный для доказа­ тельства с помощью номпьютера 3наменитой пробл емы четырех красок: любая географическая карта может быть раскрашена четырьмя нрасками так, что любые две тер­ ритории, имеющие общую границу, раскрашены. разны­ ~и красками. Общая идея состои~ в том, чтобы доказать вручную или, в случае необходимости, с помощью про­ граммы, что проблема будет решена полностью, если бу­ дет известно ее решение в некотором конечном числе слу­ .•аев. Эти случаи исследуются на компьютере. Вот приме­ ры, доступные этому методу. Внимание: вы должны бороться с проблемой сложнос­ •п~. Если вы не будете принимать никаких мер предосторож­ n о сти, число подлеж ащих исследованию случаев может с : :азаться. невероятно большим и работа компьютера cтa­ IJ t' T невозможной: ведь перед вами не вечность ... Равнове­ с.1 е между подготовительной работой (доказательством м;11ых теорем) и работой компьютера оценивается в зави­ ~;:мости от ваших возможностей, . одновременно в области 11!Н тематических доказательств и в ресурсах вашего микро­ но:мпьrотера. К сожалению, не говорите: эта программа отнимает уйму времени, я перепишу ее на ассемблере. Это - худшее из решений. Все, что я вам предлагаю" осуществимо на Бейсике за разумное время. Если ваша программа требует уйму времени, значит, она плохо при- 11.умана. Го лов о лом к а 12. Теорема 153. Этот пример заимствован из [MJB]. Образуем числовую последовательность следующим образом: - начальный элемент - произвольное натуральное число, кратное трем, - ва любым элементом последовательности следует число"· равное сумме кубов всех цифр данного элемента. Теорема. Любая такая последовательность становит­ ся (начиная с некоторого места) постоянной,_ равной 153. JO
Пример.Начнемс33: 33 33+33 =54 53+43=189- f3+83+9з~1242 f3+23+43+23 =81 83+t3=153 13+53+33 = 153 f3+53+33 = 153 и теперь последовательность стала постоянной. Используйте ваш хомпьютер для дов:азательства этой теоремы. ?Головоломка13. Варианты. • Нелегко сказать, какую роль в предЫдущей теореме играет то, что исходное число кратно трем. Но от вас не потребует чрезмерных усилий в общем случае, что два nо­ следоnательных числ.а последовательности имеют равные остатки при: делении их на 3. В последовательностях, ко­ торые мы стали изучать, все члены последовательности делятся на 3. Можно докl!зать также, что все члелы по­ следовательности, кроме, быть может, первого, делятся иа 9. Если взять натуральное число, не кратное трем, то все члены соответствующей последовательности будут иметь один и тот же остаток при делении на 3. Что, кроме это­ го, вы можете узнать о поведении этих последовательностей? Если при переходе к следующему члену последователь­ ности вы будете брать сумму нвадратов цифр (вместо то!'n 11 чтобы брать сумму кубов), то все будет не намного лучше. Можете ли вы доказать следующую теорему: каково бы ии было натуральное число, взятое в качестве первого элемента последовательности, эта последовательность со­ держит число, ие превосходящее 4? ? Головоломка 14.Теорема6174. Построим последовательность натуральных чисел сле­ дующим образом. Начальный элемент - натуральное число с четырьмя цифрами, которые не все равны между собой. Мы переходим от данного члена последовательности к следующему ио такому правилу. Пусть а, Ь, с, d - четыре цифры, представляющие де­ сятичную запись данного числа. Расположим их в порядке убывания слева направо и получим первое число. Распо­ J1ожим их в обратном порядr<е и вычтем это второе число nci первого. Это и есть искомый следующий член после­ дuватеJ1ьности. Зt
Т е о р ем а. Эта последонательпость для любого на­ чального элемента становится (пачипая с неноторого места) постоянной, равной 6174. Пример.Начнемс7815: 8751 - 1578 = 7173 7731 - 1377 = 6354 6543 - 3456 = 3087 8730 - 0378 = 8352 8532 - 2385 = 6174 6174 - 1467 = 6174 Используйте ваш компьютер для доказательства этой теоремы. Это окажется намного проще, чем в щ;едс,щущей головоломке, поскольку имеется всего лишь 9000 чисел с четырьмя Цифрами, и нужно исследовать 9000 последо­ вательностей. Но вы можете сделать число испытаний намного меньше этого ... ??Головоломка15.Господин8игосподинР*). Вот одна из наиболее классических арифметических rоловоломок. Выберем два натуральных числа, больших единицы, по меньших ста. Значение их суммы сообщено господину 8, значение их произведения - господину Р. Ни один из них не знает, какое число сообщено другому. Господин Р звонит господину 8 по телефону. Р. Я пе могу найти эти два числа. 8. Я знаю, что вам это и пе удалось бы. Р. Ах, так... Но тогда я их знаю! 8. Ну, тогда и я тоже их знаю! Рассуждение позволяет существенно видоизменить задачу, и даже более тоrо - предъявить решение. Много ли их? Используйте ваш компьютер 1 чтобы их найти. Простые числа ??** Гол о в о лом к а 16. Чемпион головоломок. На мой взгляд, наиболее замечательная арифметиче­ ская головоломка, над которой мне пришлось особенно долго работать и которая дала мне возможность получить некоторые удовлетворительные результаты,- это_, конечно, проблема простых чисел. Пусть дано число п (конечно, нечетное) и достаточно большое; сказать, является ли оно простым и, если можно, дать его разложение па простые множители. *). S - первая бунва слова «somme» (фр. сумма), Р - слоnа «produit» (фр. произведение).- Примеч. ред, 32
Если пе предполагать,, что п велико, то есть простой способ действовать: делить п па простые числа и смотреть~ удается ли деление без остатка. Если да, то число состав­ ное и допускает разложение в произведение. Впрочем,, при таком методе многие делители можно вообще не рас­ сматривать. Если п есть произведение двух сомножителей риq: п=р*q, то либо р = q, либо один из сомножителей больше друго­ го, так что можно считать.•. что р - делитель, q - чаетное и р < q. Поэтому будем делить п па последовательно воз­ растающие простые числа, для ноторых частное больше или равно делителю. Так нак мы пе располагаем таблицей простых чисел,, то используем последовательность дели­ телей, которая заведомо содержит все простые числа, на­ пример, последовательность нечетных чисел или лучше целых чисел вида 6k ± 1. Число операций растет как квадратный корень из п. Если вы добавите к п одну цифру, то вы увеличите время вычисления примерно раза в три. Но более важно другое. Если вы увеличиваете п, вы можете превысить «арифм&­ тические способности» своего компьютера. Rак вы узнаете, правильно ли выполнено деление? Предел, которого вы можете достичь таким образом, существенно зависит от~ марки вашего микрокомпьютера * ). Таким образом, вы должны бороться со следующими трудностями: - точность вашего компьютера. Вам нужно им_еть возможность делать вычислевю1 с повышенной точностью, а это очень дорогостояще по времепщ - число требуемых операций; - цоверие к вашей пр грамме. Если ваша машина сообщает вам,, что 9873564383 = 631181 * 15643,, то вы, вероятно, сможете проверить 0тот результат па ва­ шем микрокалькуляторе. А если компьютер сообщит вам, что 9873564401 - простое число., то как вы это проверите? Проделав вычисления па руках? Вот· основы метода Ж.-М. Полларда [POL]. По данному числу п (нечетному натуральному) стро­ ится последовательность по описанному ниже правилу: *) Да и от я:шка2 кщорый вы используете.~ Примеч. ред. 2 Ж. Арсак 33
первый член последовательности равен 2; следующий ва х элемент равен х2 - 1 по модулю п (остатку от деления х2 - 1 на п}. Окавывается~ что эта последовательность периодична. Это легко видеть. Остаток от деления на п есть нtJотрица­ тельное целое,. меньшее п, поэтому не может быть более п равличных остатков. Поэтому неивбежно, что как Т<>JJько число членов превысит п, среди членов последователънос'fи мы получим два одинаковых, что и оаначает периодичн о сть последовательности. Но она может окаваться периодиче­ ской с на.много более коротким периодом,, чем п. Вот, на­ пример,, последовательность для п = 137: а1=2 а2=3 аз=8а4=63а5=132 а6=24 а7=27 . а8, . 43а9=67а10=104 а11=129а12=63 = а4 Последовательность периодична с периодом 8. Пусть дана последовательность, вычисленная для не­ которого п. Предположим, что п делится на s, и что со­ ответствующа~ числу s последоватедьность периодична с периодом р. Для достаточно большого i имеем ai+p = а 1 по модулю р, следовательно, а1+р - а 1 делится на р. · Так как.~: кроме того, и п делится на р, то наибольший общий делитель (НОД} чисел Щ+р - ai и п отличен от 1 *). Построим последовательность Полларда для п ~ 22879~ а1= 2 а2=3 аз=8 а4=63а5=3968 а6=4271 а.;=6877а8=2235а9=;7602 а10 =:; 20928 а11 .. , 8486 а12 = 11982 ПОД чисел а12 - а4 и п = 22879есть137~ делитель числа п. Если мы спос.обны екавать, становится ли данная последовательность периодической (головоломка 1), то мы распоJ1агаем быстрым методом определения~ имеет ли *) Повторим эти рассуждения чуть более подробно, Пуеть ai=2, ai+l=а~- 1modп, bt=2, .bi+l=ь~mods - поеледовательноети, еоответствующие числам п и s соответст­ венно. Тогда легко доказать по индукции, что bi = ai mod s. Од­ ним из периодов поеледовательноети {ai} является п. 3вачит, 1J являетея периодом и для поеледовательности {bi}. Извоотно, что тобой период последовательноети кратен ее минимальному перио­ ~~,у. Так как р, по определению, являетеJJ мипимальиым .периодом nоо.педоватепьuости ьi. ТО п делится на р.- Примеч, ред- м
Аанпое число делитель. Можете играть. Это пе такая уж nростая программа ... , Есть тест па простоту числа, основанный на так на­ зываемой малой теореме Ферма: если п - простое, причем число п не является делителем а, то an-1 = 1 по модулю п. . Представим п в виде п = 2 8 m + 1. Назовем число п сильно псевдопростым по основанию а, если выполнено одно из следующих двух условий: ·· либо ат= 1 ПО Модулю n1 либоam2r= п-1помодулюп=2 8 m+1дляне- которого r, О<r<s. Qqень мало сильно псевдопростых чисел.~ не являющих­ ся простыми; так 2047 _: _ 23 * 89 - сильно псевдопросто ! по основанию 2i 1373653 = 829 * 1657 - по основанию 25326001 = 2251 * 11251 по основанию 3215031751 = 151 * 751 * 28351 по основанию 2и3,; 2"3и5,, 2,3J5и7. Метод интересен, потому что ап вычисляется за время. растущее не быстрее1 чем ln п. Это утверждение вытекает из соотношений: а0= 1,а1=а, а2п = (а* а)п, а2п+1 = (а* а)п !11 а. Все, что нужно для работы 1 у вас есть. Вольте делатъ нечего, кроме собственно составления программы. Кстати: знаете ли вы две универсальные конструкции в информатике? Первая - «известно, что".)). Вторая - «это и нужно сделать."». Таинственные программы Я надеялся пе приводить в этой книге никаких готовых программ. Программирую не я, а вы. И я не очень люблю смотреть, как подростки копируют программу, набирм ее на клавиатуре и при этом пе отдавая себе отчета в том, что она делает и как устроена. Но сказать, чtо Д{!Лает та или иная программа, может оказаться настоящей голов~ ломкой, Программы 1 которые мы будем обсуждать~ на" 2• 85
писаны па некотором воображаемом языке*). Вам при­ дется по крайней мере сделать усилие .~; чтобы перевести их на ваш обычный язык: Бейсик,, LSE или Паскаль. Уславная команда записывается в виде ЕСЛИ условие ТО последовательность команд КОНЕЦ_ЕСЛИ (последовательность команд выполняется тогда и только тогда, когда условие истинно) или ЕСЛИ условие ТО последовательность команд ИНАЧЕ последовательность команд КОНЕЦ_ЕСЛИ (если условие истинно,,: то выполняется последователь­ ность команд, заключенная между ТО и ИНАЧЕ ,,; в про­ тивном случае выполняется та последовательность команд 8 которая расположена между ИНАЧЕ и RОНЕЦ_ЕСЛИ). В обоих случаях КОНЕЦ_ЕСЛИ играет роль закры­ вающей скобки, связанной с открывающей скобкой ЕСЛИ. Мы будем использовать цикл ПОКА условие ВЫПОЛНЯТЬ последовательность команд ВЕРНУТЬСЯ llоследовательность команд,, содержащаяся между ВЫ:­ ПОЛНЯТЬ и ВЕРНУ'FЬСЯ,, повторяется.t ПОКА условие истинно. *Головоломка17.Длязабавы. Вот легко понимаемая программа. Здесь пи Ь - !\Ва натуральных числа и Ь нечетно (вто существенно) ПРОЧЕСТЬ п, Ь ПОКА п > Ъ ВЫПОЛНЯТЬ ЕСЛИ п четно ТО п ::::; п/2 ИНАЧЕп:=п-Ь КОНЕЦ_ЕСЛИ ВЕРНУТЬСЯ СООБЩИТЬ ЕСЛИ п = О ТО' ДА' ИНАЧЕ 'НЕТ' КОНЕЦ_ЕСЛИ Вы м ожете попробовать выполнить ее вручную для п=2 77 - 3,;ь=7. *) Этот язык описан на стр. 7-8 выше. Здесь тппь кратко па. поминаются формы ~;аписи условяы:а1 операторов и операторов ЦИК· па.- Примеч, ред. 36
8абавно, не правда ли? Несмотря на свою исключительну{О простоту, эта программа, кажется, новая ... *** Гол о в о лом к а 18. Посерьезнее. Эта - несомненно более трудная. И тоже неопубли­ кованная. Боюсь, что вы можете избаловаться". На вхоа програм-мы подается п - нечетное натуральное чисJiо. ПРОЧЕСТЬ п q := (п - 1)/4; р := целая_часть (q) ЕСЛИ q =:/=- р ТО СООБЩИТЬ 'НЕТ'; КОIШЦ_РАБОТЫ КОНЕЦ_ЕСЛИ ЕСЛИ нечетное р ТО СООБЩИТЬ 'НЕТ'; КОНЕЦ_РАБОТЫ КОНЕЦ_ЕСЛИ а:=4;Ь:=1 ПОКА р ;;::>а ВЫПОЛНЯТЬ р:=р/2 ЕСЛИнечетноерТОр:= р - а/2 - Ь; Ь:=а-Ь КОНЕЦ_ЕСЛИ а:= а+ а ВЕРНУТЬСЯ ЕСЛИ р = О ТО СООБЩИТЬ Ь; КОНЕЦ_РАБОТЫ КОНЕЦ_ЕСЛИ ЕСЛИр+2*Ь =аТОСООБЩИТЬа - Ь; КОНЕЦ_РАБОТЫ КОНЕЦ_ЕСЛИ ЕСЛИр=4*(а-Ь)ТОСООБЩИТЬ2*а- Ь; Н:ОНЕЦ_РАБОТЫ КОНЕЦ_ЕСJIИ СООБЩИТЬ 'НЕТ'; КОНЕЦ_РАБОТЫ Я не запрещаю вам перевести эту программу па ваш любимый язык, а затем испытать ее для различных зна­ чений п. Есть маленький шанс, что вы угадаете, па что она способна. Это не очевидно! *~' Гол о в о л ом к а 19. Вклад Жака Гебепстрейта. Я обязан Жаку Гебенстрейту следующей программой. Она была предложена в том виде, в каком я ее привожу, без какого-либо комментария (это было сделано без злого умысла с его стороны: сам он получил не больше от того, кто дал ему эту программу). ПРОЧЕСТЬ а., Ь; р := max (а, Ь); q: = min (а_, Ь) ПОКА q > eps ВЫПОЛНЯТЬ r:=(q/p)2; s:=rl(r+4) p:=(2*s+1)*Pi q:=s*q ВЕРНУТЬСЯ результат : = р Как вам нажется~ что вычисляет эта программа? 37
3. ИГРЫ БЕЗ СТРАТЕГИИ Общие предложения _Мы собираемся предложить вдесь игры для програм­ мирования. Мы выбрали их потому, что они не требуют придумывания выиrрывающей стратегии при составлении программы. Каждая игра ставит вас перед, вообще говоря, непредскавуемой ситуацией. Вы должны играть, соблюдая правила и имея в виду добиться определенной цели. Вам следовало бы раввить собственную стратегию. После того, как вы предложили свой ход, компьютер сообщает новое состояние игры,_ ватем ивменяет это состояние неноторым почти полностью определенным обравом. Ваша стратегия должна оценить, как именно. Программирование этих игр не представляет вам1:Jтных трудностей. Это - не головоломка (есди искJ1ючить ла­ биринт для коня~ который представляет настоящую труд­ ность). Но нужно работать очень тщательно, чтобы ком­ пьютер соблюдал правила и не жульничал. Ошибки· про­ граммирования всегда достойны_ осуждения. Здесь может вовникну'fь. искушение сделать все быстро, потому что 11 конце концов всегда что-то получится. Тщательно изу­ чите вадачу, продумайте прежде чем писать_, составьте плав вашей программы, равберите подвадачи отдельно." И г р а 6. Гениальный ответчик. Я не думаю, что есть еще хоть кто-нибудь, кто не внает игру, которую М. Мсйрович ваввал «гениальный ответ­ . чию> *). Обычно она играется с цветными шашками (6 · и 8 равличвых цветов в вависимости от ивготовлевия). Играю­ щий должен угадать сделанную ив этих шашек тайную 1\омбинацию. Так 1 » варианте «мини» вы должны угадать --lЮМбивацию ив четырех шашек, например: ГОЛУБАЯ _ ЖЕЛТАЯ ЖЕЛТАЯ КРАСНАЯ (в этом порядке). Второй игрок - ведущий. Это он выбирает комбинацию для уга­ дывания и он оценивает ходы, которые вы делаете. Ваш ход» игре состоит в том, что вы предлагаете комбинацию, содержащую то же число шашек, ив того же набора цвс1 ов, например, КРАСНАЯ ГОЛУБАЯ ЖЕJIТАЯ: ГОЛУБАЯ. Ведущий сообщает вам, сколько шашек иа вашей ком­ бинации содержат правильный цвет на правильном месте: вдесь - 1, третья I1Iашка ЖЕЛТАЯ, как и в неиввестной вам: _ комбинации. Затем он сообщает вам, еколько шаш е к имехот правильный цвет, во стоят на неправильных местах. Здесь 1, так как вы предложили краевую шашку~ но она *) В ориrивапе qmaster-mindt,- Пpu.tiQ'I, ред, 38
ва неuерном месте. Согласно традиции 1 ведущий выставля­ ет сто.1ько черных шашек, сколько в вашем ответе шашек правшrьного цвета на правильном месте, а ватем столько белых шашек, сколько шашек правильного цвета на не- . ' верных !t{естах. Составьте программу, ваставляющую ваш компьютер играть роль ведущего. Он дожен случайным обравом вы­ бирать комбинацию и, конечно., не сообщать ее. Когда вы предлагаете свою комбинацию, компьютер должен также сообщить вам, сколько черных и белых шашек она васлу­ живает. Если в конце обусловленного варанее числа по­ пыток вы не достигли ревультата, компьютер вас не повд­ равит, но сообщит вагаданную комбинацию. Введите в вашу программу параметры по числу цветов и числу шашек в комбинации, как и по степени сложности~ простая: 4 шашки, 6 цветов, 6 попыток; средняя: 6 шашек, 8 цветов,, 8 попыток. Особой трудности нет. Игра ваведомо приятна. Отладь­ те диалог ... И г р а 7. Пляж Ботафого. Несколько лет навад я отправился вести курс в Понти­ фикальном университете Рио-де-Жанейро. Часть моей семьи смогла присоединиться но мне на несколько дней. Мы отправились посмотреть на внаменитую «Сахарную голову», расположенную вбливи Ботафого. Мы прибыли на место. В нескольких стах метров перед нами «Сахарная голова» на берегу маленькой бухты открывала весьма привлекательный пляж. Чтобы его достичь, мы должны были преодолеть одно препятствие: автостраду. Нам очень хотелось отправиться на пляж и насладиться морем (мы еще не ввали, насколько оно может быть вагрявненоf). Но очевидным обравом не было никаких средств п~рэсечь эту автостраду. Ни один переход не пересекал ее поверху1 это мы видели. Не было побливости и подвемных переходов. Мы не говорили по-бравильски (он проивошел от порту­ гальского., но он отошел от явыка, на котором говорят в Лиссабоне, так же сильно, кан явык Квебека отличается от францувского в Париже). Наконец, мы попытались что-нибудь ПОН!IТЬ с помоПU>Ю моего прибливительного английского. «Чтобы попасть туда? Пересеките автостра­ ду".» Это не было многообещающим раввлечением. Дви­ жение было интенсивным. Бравильцы водят машины на большой сщ>рости. Не слушая ничего, кроме вова нашей отваги1 мы успешно ~оствгли покрытой дерном полосыt 39
р1.зделяющей два направления автострады., и впали в глу· бокое уныние. Никогда нам не добраться до цели/ Но от· ступать было некуда. Либо в одном, либо в другом направ· лении, но дорогу пужво было пересечь. Я не знаю,, каким образом нам удалось ее перейти. И вот,, после того~ как мы реши ли, что пробил ваш последний часJ мы вылезJш из моря на пляж Ботафого и - обнаружиJ1и в ста метрах подземный переход, 11озг.ошшший безопасно перейти до­ рогу. Когда я позже расеказывал эти злоключения одному из своих коллег, он заявид мне, что вообще молодые люди не имеют привычки пользоваться ни подземными, ни на­ вемными переходами, они бросаются прнмо под автомобили безо,всякой боязни. Он рассказал мне также., что после тор­ жественного открытия надземного перелода, который r:.ере­ секал ту же автостраду немного выше Фламенко" в одном журнале был опубликован юмористический рисунок. На нем была изображена мать семейства, катящая детскую коJiяску и тянущая другой рукой ребенка, чтобы перейти пеJПком автотрассу у надземного пер е хода, говоря «Rаной удобный переход! Наконец-то мы сможем переходить дорогу в тенечке ...» Все это навело меня на вот какую игру. На энран вы­ водится рисунок, символизирующий автостраду с п поло­ сами движения. По каждой полосе движутся автомобиJ1и. В начале игры вы находитесь на краю автострады. Вы мо­ жете либо оставаться там, где вы есть, либо прыгнуть на шаг вперед. Автомобили перемещаются согласно неизвест­ uому закону. Если один из них достигает занимаемого вами положения или проходит по нему, то вы раздавлены. А есJ1и нетr. то ваш ход. Вы снова можете либо остаться неподвиж­ ным~ либо продвинуться на шаг вперед, либо вернуться на mar назад, и цикл возобновляется. Вы выигрываете, если вы достигаете другой стороны дороги, не будучи раздавJiевным. Вот вескоJ1ько предложений по реализации игры . .Н представляю автостраду следующим образом. Расстояние между машинами постояпно, В верхней полосе оно равно 18 (17 точек между двумя машинами) и :возрастает на 1 в каждой следующей полосе (24 точки между двумя стрелками в нижней полосе). Стрелки 11ред­ ставляют машины острием в направлении их перемещения. 'rире указывают место вашего перехода, во это отнюдь не переход «зебра»: ни одна машина не замедлит хода, чтобы дать вам перейти! В начале игры вы находитесь вве а~нu­ страды1 как на рис. 2. 40
Скорость машин постоянна. В верхней полосе я выб­ рал 5: любое перемещение машин продвигает их на 5 точен влево. В результате одна из машин может уйти влево или справа может появиться новое транспортное средство~ если интервал вправо увеличится более чем на 17 точен до края: расстояние между машинами поддерживается постоянным. Я решил сделать скорость машин растущей на 1 точку при каждой смене полосы: она равна 6 во второй полосе1 7 - в третьей." .. ·* ••• - ••••-Е••••••••••••••••.•~••••••••.•••••••• ·'' -•••• • • • - •••••••••••...r••••••••• •.: •••••• ,<lflii:-• • - ••••••• ~ ~ •• ••• - •••••<Е-,, •••• ~ ••••••••••••" •••••••••••••-•••••• ...-.......... ".................." ................ . ... -....-.................... ~................... . о•,-,••••••••••••••••~••••••••, е • • • • 8 ••••••~.а•, ••• - •••••••••• .+••••••••••••••• ., ,-( ", •• •• •+ ••••••••• •••- ••••••••••••••••••••••~•••••~ ••••••••••••••• 4 _Рис. 2 Таким образом, расстояние между машинами растет• скорость тоже, но отношение не постоянно. Если вы всту­ паете на первую полосу в тот момент, когда машина только что проехала тире, то у вас 16 точек до машины справа от вас. При скорости 5 точек вы можете оставаться непо­ движным три хода. На нижней полосе у вас осталось бы справа 23 точки, но при скорости 12 вы не можете оставать­ ся на месте более одного хода. Чем дальше вы продвигае­ тесь, тем больше риск,, что вы будете раздавлены. При таком выборе данных период рисунка очень велин. У вас нет никакой возможности получить по ходу партии дважды одну и ту же конфигурацию. Единственный случайный элемент: начальное положе­ ние машин на каждой полосе. Вы задаете это начальное положение, выбирая число точек между тире и первой ма­ шиной справа от тире; это - целое число,; выбираемое случайно, строго меньше расстояния между машинами на данной полосе. Таким образом, для 8 поло(} нужно сдучайпым образом получить 8 чисел, Используя воспро- 41
изводимую пепредсказуемос!fь последовательности, как uто описано в разд. 1 вы можете переиграть партию, если сочтете.~: что плохо использовали ваши возможности. Вы :можете провести соревнования со своими друзьями. В моей программе я подсчи:тываю число шагов~ потребовавшихся рля перехода дороги. Выигрывает тот,1, кто переходит с наи­ меньшим числом шагов. Не говорите: идиотская игра, придуманная в дурацком мозгу". Прежде всего это невежливо по- отпошепию ко мне. Rμоме того 3 в пей пужпо иметь некоторый опыт, чтобы дать себе отчет в том1 ·насколько трудно играть оптимальным образgм. Благодаря изображению точек, вы можете - есди захотите - проводить свои подсчеты и узнавать" 1<аrшм будет положение машин после следующего хода. Вы можете предвидеть или вычислять с.только ходов от B<J'laлa, сколько вы пожелаете: игра вашего противника nо Jшостью определена. Но опыт показывает,, что это скучно. Ходы лучше делать, оценивая положение машин Dl' ред следующим ходом. Может получиться, что вы говорите cefie: у меня есть время пройти ., а оп возьмет да и раздавит. :Может случиться, что вы не берете па себя риск пойти в11оред, а машина останавливается в точности перед тире. · Точно так же может случиться, что вы правильно оце­ nиuаете ситуацию, по вам не удается достаточно точно рас­ счнтат:Ь начальные ходы, и вы попадаете в ловушку. Вы оназываетесь па некоторой полосе в не раздавленным. Но 1н · J1ьзя ничего пе делать: если оставаться на местеJ то вас ращавят. Нельзя вернуться - там~ на предыдущей по­ пос.е, машина слишком близко н тире: Нельзя идти и впе­ ре;\: па следующей полосе машина стоит перед тире или сш1шком близко к тире. Вот еще несколько предложений. Необходимо держать рисунок па зкрапе неподвижным: только стрелки машин и 1'рестик (Х) пешехода должны перемещаться по непо­ движному полю. Чтобы передвинуть пешехода, я предла­ :rаю следовать очень простому правилу. На вопрос номпью­ тера отвечать Н, если вы собираетесь пойти в нижнюю сторону (па само собой разумеющуюся полосу), В - если :вы хотите перейти па полосу выше, и ничего пе отвечать . - . - J если вы пе хотите шевелиться. П роrраммировапие этой игры очень просто. Желаю успеха, • Игра8.Шадокугиби. «У шадоков ситуация удовлетворительна, Испытания ракет npo~OJ_I~a!O~cя.i постоянно кончаясь неудачами. 42
Дело здесь в одном из ос11овных принципов шадокской логики: «Нет ничего, что бы непрерывно продолжалощ, и не кончилось успехом». Или, в других выражениях~ «Чем больше неудач, тем больше шансов,, что опо зарабо­ тает»;' Их ракета еще несовершенна, но они вычислили.11 что у них есть по крайней мере один шанс из миллиона,J что она заработает". И они торопятся поскорее осуще:. ствить 999999 первых неудачных опытов, чтобы быть уве­ ренными, что миллионная заработает». (Жак Руксель~ Великолещ1е :цавыворот. Париж" издательство Грассе.) Великий колдун сказал, что ракеты терпят неудачу потому, что не хватает транзисторов в системах безопас­ ности. Но у гиби транзисторы .собирают с растений 1 про­ израстающих на огородах. Решено послать одного из шадоков на планету гиби искать транзисторы. Гиби, очень умные благодаря с:воим шляпам, быстро проникли в планы шадоков и решили позабавиться. Они позволили шадоку забраться в один из их огородов, но окружили его со всех сторон~ и всякий раэ, когда растение расцветает и дает­ транзистор, они мчатся,_ чтобы собрать урожай прежде шадока. Вот В3;М тема игры. Как и в предыдущих играх, я пред­ nагаю здесь версию, которую я реализовал на своем микро­ :компьютере, Вы можете цодогнать nараметры в зависимо­ сти o·r возможностей вашей машины, а также в зависимости от желаемой трудности игры и шансов на успех. Было бы благоразумно. В первых версиях из осторожности стбит считывать все параметры до начала каждой партии. Вы сможете также сделать несколько попыток, чтобы добиться удовлетворительного расположения всех персонажей в ого­ роде. Не придерживайтесь рабски сделанных ниже пред­ ложений. В начале игры компьютер воспроизводит образ огорода,\ где появляются: гиби, обозначенные буквами Г; цветы с транзИсторами, обо3наченные цифрой, показывающий число транзисторов, которые можно собрать с этого цвет1<а (есть цветки с одним транэистором, наи:менее продукrивные, и цветки с девятью транзисторами, наиболее цродуктивпые); шадок, представленный крестиком ( Х ); пустые места,i обозначенные точкой. Вот возможная комбинация. В нвй 12 строк по 20 полей, с 15 гиби и 20 цветками. Все их значения уJ<азаны. Шадок имеет право на 40 ходов~ чтобы собрат;ь 100 транзисторов. Компьютер постоянно сообщает число оста.~шл~~я ходов и qисдо уже собранных тра.нзисrоровt/ ~'- '~" 43
На своем ходе шадок может переместиться па одну :илетку в любом направлении. Я выбрал определение перемещения с помощью 0,,1и4 букв: В - для верха, Н - длявиза,,Л- дляленойиП - для правой стороны. EcJiи ответ пуст,, то шадок не шевелится. Если ответ П, то нужно сделать один шаг вправо на той же строке. Если ответ BJI (или ЛВ, порядок пе важен), то шадок перемещается па 1 шаг no направлению диагонали нверх и влеnо. Если при движении шадок оказывается па поле, запл­ том цифрой, то эта цифра исчезает из игры и ее значение прибавляется к сумме,, набранной игроком. Случайным образом выбирается новая цифра и располагается на сво­ бодном игровом поле. Ну,, а теперь - о путешествиях гиби. Каждый 1·иби перемещается на один шаг по строке, столбцу или диаго­ нали к ближайшей к нему цифре. Это правило может при­ Dести двух гиби на одно и то же пoJre. Есть много способов разрешить проблему этих столкновений: например, если nоле назначения какого-либо гиби пе является ни точ1юй,. ни цифрой, то перемещение па него пе осуществляе1·ся. Это проще всего. Если при своем перемещении гиби при­ бывает на поле,, обозначенное цифрой, то эта цифра ис­ чезает из игры. Rогда все гиби перемещены, нужно слу­ чайным образом раздобыть столько же цифр, сколько было упразднено, и случайным образом расположить их па мес­ !fах, обозначенных точками. Игра кончается, либо когда mадок приобретает свои 100 транзисторов, либо когда число ходов, предоставлен­ ных ему, оказывается исчерпанным. Эта игра включает намного более случайных элемеп­ тоn, чем предыдущая. Но r.iожво играть с большей ИJIИ меньшей ловкостью. На рис. 3 шадок может собрать уро­ жай с одной из трех следующих цифр: с 3 - выше от него в том же столбце (этой цифре угрожает гиби, по шадок, играя первым, достигает ее раньше); с 5 - ниже и пра-:- 11ее его (и ей тоже угрожает гиби,, по mадок его опередит) с 9 - ниже и левее (эта цифра дальше, нужно три хода, чтобы достичь ее.• вместо двух для предыдущих цифр, но нет ни одного гиби поблизости). Цифра 9 дает наибольшее число очков,, но обходится в три хода. Если так и сделать, то уже пи одной цифры поблизости не окажется. Цифра 5 находится в углу, паводпеппом гиби. Rак будто у пас пет особых оснований выбрать в :иачестве следующего хода что-либо другое. Именно 3 окаэывается паи.Лучшим выбо­ ром,, потому что и 51 и 71 и 9 пе слишком близко. В этом 44
углу гиби есть, но там и с цифрами непдохо, так что иж перемещения более или менее предсказуемы (если сумеете, сделайте, чтобы это было в точности так). Итак, у вас есть возможность выбирать каждый отдельный ход наилучшиd образом~ но вы не можете I'роводить вычисления слишкои • оо•о••~•• •r•3 " ." ••• ?.о Т' - •• 1. 5 r ..., 8 ••о•о о • •• .1 ооох •• •• 4••3• • 5 г г ') 1 оо•• •• •оо о • .., •• о•• о•• " ••• 8••г•• • •.9 •о•••г• • • о• •1 •r •о•о5.о•оо.• о•о4 • ••• о оо•о••7 ••ог• • г·••rо о•• о•г•••• о ••••••• •о5о•••оо2 ••• 8• • • • ••оr• • .. ••r• Рпс. 3 далеко: вы не внаете, как будуl проти~оμействовать гиби, а их достаточно много для тоГО.~; чтоб:t.t при каждом ходе какие-то цветы исчезали, поэволя.FJ другим расцвести. Эту игру не так уж трудно запрограммировать. Но нуж­ но сосредоточить внимание на перемещениях гиби. Для каждого ив них найдите ближайший цветок и, если не­ сколько цветков uаходятся на одном и том же расстоявии 1 выберите случайным образом тот.r к которому он от­ правится. *Игра9, Платазастрах. Шел когда-то фильм с таким названием. Я его :в:е JШ.,. дел.!, но о нем достаточно много говорили по телевЙ&QРУ.~ 45
чтобы я звал, о чем ов1 и он дал мне идею гораздо менее опасной игры! , Вы - тот самый игрок1 который., в обмен на обещ ап­ вую кучу денег, рискует своей жиэвью1 которой угрожа­ ют nаемвые убийцы. Игра раэыгрываетея в простравст­ - '<le 1 ваполвеввом препятствиями. За вами гонятся трое •• ООО ••ООО.О ••О.УО •• о•;••о•••••о•.•о•.ооо .0 •• 00.0 •• 0 ••••• 00.0 О••О ••••10.О ••ОО.О ••О оо•о..••о •••••оо•о •••.х• ..о.о ооооо• ооо•• о••••• .....о.о..оо •• ооо••••••••оооо•оо•• о'•оо••о ••УО оо••о •• о оо оооfоооу •••• ••• •• • • • о••оо •••о•ооооо••о• ••ооооо•.'•о•о••ооо•о Рис. 4 убийц. Они вооружены револьверами и стреляют в вас1 если вы с ними пе разделевы препятствием. Это - хоро­ шие стрелки: если вы находитесь на линии выстрела, они не промахнутся и ко:мпыотер сообщит R. 1. Р. (requiescat in расе: «да покоится в мире~ - для тех1 кто совсем не учил латыни) . Более точно1 иrра снова реализуется на прямоуrо.JУьпи­ ве, образованном точками (свободвыии местами) 'И пулями (препятствиями). Я выбрал прямоугольник с 12 строка­ ми и 20 столбцами, Я расположил там 100 препятствий в трех убийц (обозначенных У). Рисунок 4 снят с экрана. Условимся., что убийцы мо­ гут стрелять ~олько в направлении строки или столбца• .46
В приведенно!i конфигурации игрок (обозначенный х) не находится на линии выстрела ни одного ив убийц. Он может перемещаться на один ход в любом направлении (как король в шахматах). Игра разыгрывается следующим: образом: - игрок перемещается (один ив спооо6ов перемеще­ ния - пребывание на месте, где он находиrея. Но М{)ЖНО помешать игроку укрываться в норе. Я ограничиваю чис­ ло стояний на м:есте пятью ходами}. Переходиrь М{)Жно только на место1 обоаиа:ч:енвое точкой. Если игрок оказы­ вается после этого на. лmш:и выстрела одного из убийц (в той же строке mm в тои же сwлбце и не огороженным препЯ:тствием), ro он мертв; - поо:11е этого трое убийц перемещаются на один шаг - Все равно в каком шшравлениП {они не могут ос­ таваться uеподвижвнм:и). Они перемещаются на поде,) обозначенное точкой. Нужно договориться об их переме­ щении,_ чтобы учесть в случае необходимости спорные си­ туации, например" перемещать их одного за другим, что позволяет для каждого из них учесть движения предыду­ щих. Убийды, когда у них есть возможвость}j перемеща­ ются так, чтобы приблизиться к игроку. Если в результа­ те этого перемещения убийца оказывается в состоянии взять игрока па мушку, то он стреляет и убивает его. Игра сразу кончается. Если это не так, то цикл возобнов- ляется. , Если игроку удается просуществовать в продолжение данного числа ходов, он выигрывает. Может случиться, что убийца оказывается бок о бок с игроком, но по диагонали. Он не: может стрелять, поrому что не находится ни на той же строке, ни в том же столб­ це. Вы можете сказать, например, что ваш игрок -" -- чем­ пион по дзюдо и что убийцы не рискуют атаковать его в ближнем бою. Но вы мо1f\ете принять и противополож­ ную тактику: если при равреmевиом перемеще:rши убий­ ца может попасть на клетку игрока 1 то последний счита­ ется уб:Итым:. Тем: самым вы уменьшите шансы игрока". Эту игру вапрограмрро:вать ~ очень труд!fо. Нужно только привять единс11щв:яую меру предосrорожностю в процессе бросания жребия Q Q~альной конфиrурации устройте так, 'lТобы ситуация • QIЦl.аалась катастрофиче­ ской с самого начала игры~ ии одип: uв_ убийц не должен находиться ни в стрьке" нu: в стоябце~ где в:цодится иг- ро:«,- а танже и не в соседних стр<щах и столбцах, :- Я сыграл немало партий. Есть два способа играт•. 41,
Можно трепыхаться в набитом препятствиями участке в Wiавать между двумя соседними неприступными поля­ ми. Выигрываешь без славы... Можно обыгрывать труд­ ности и, напротив, пытаться вовлечь убийц в гонку пре­ с .1едования, уклоняясь от всех их ловушек. Это намного 4Хруднее. Их все-таки трое... Если у вас появятся сооб­ ражения о том., как ограничить возможности избирать пер- , 11ую тактику,, используйте их. Я в этом не преуспел. Дея­ тельность по подсчету стояний на одном месте - это прос­ wейшая защита, позволяющая избежать случая, изобра- . · женного на рис. 5. Попав однажды на • У О У G место.t обозначенно е крестиком ( Х), игрок ООХОе •;оооо Рис. 5 может оставаться там бесконечно, Перед лицом необходимости перемещаться убий­ цы то освобождают1 то снова занимают два места.•; обозначенные буквой У, по пе имеют возможности выселить игрока. Если же число стояний на месте ограни- чено, то игроку невыгодно входить на э.го поле, с которого он больше не сможет уйти. Но это может оказаться выгодным в конце партии ., если число оставших­ ся ходов меньше числа разрешенных стояний на м:есте. И г р а 10. Игра роботов. Я принял за образец игру, которую я нашел в . обзоре по компьютерам. Я глубоко сожалею, что не узнал о ней больше, чтобы воздать ее автору (мне неизвестному) по васлугам. Ее тема в каком-то смысле сравнима с темой «платы за страх», но правила другие и они дают сущест­ sенно отличающуюся стратегию игры при не очень изме­ ненном программировании. Это - идеал для тех, кто боль­ ше любит играть с компьютером, чем писать программы. Здесь мы отличаемся: для меня большее развлечение - писать программы ... История происходит в 2387 году. Космическая экспе­ диция достигает планеты Х. Один из участников экспеди­ ции проникает в огромный эал разрушенного здания. Зем­ ля изры"а многочисленными расщелинами ,, открывающи­ ми бездонные пропасти. Ни одной живой души,, но мест­ uые ЖИ1' ели достигли высокого технического уровня. Они построили автоматические заводы, производящие движу­ щихся роботов. Заводы еще работают сами по себе,, но с пе­ ребоями. Появление роботов случайно, да и не работают больше эти роботы так~ как когда-то ... Они продолжают стремительно нападать на пришельцев, но как слепые. Если избранный ими путь приводит их к расщелин е.t они 48
оказываются не в состоянии избежать ее и проваливаются в дыру. Что же касается избираемого ими пути, то он оп­ ределен полностью без всяких уловок: прямо к пришель­ цу. Игра начинается с входа посетителя в помещение. Дверь ва ним автоматически закрывается. Единственный • • о.оо . .о•р••ро•р• •о•••••• •• •р •• •рро.. ••• ••оQo • • • оо оооо•о• • .ОР••Р ооо•. • еоG •рр•••о +• о·•о • • •р(Уо • ••• • •р•о. .-· • •••-Ро.,. •• . • о••о • •• • р•• оо •• Р.ОРО.Х • . ро• о. • о••• •• •р •• •• о•ор •• •.• о••о• •• •• о• р Рис. 6 выход - на другом краю. Роботы входят в вал через че­ тыре угла. В начаде игры в помещении находится некото­ рое количество роботов. У посетителя есть два козыря: - с помощью хитроумных перемещений он может за­ ставить роботов сваливаться в расщелины и тем самым от­ делываться от них; - у него есть несколько девинтегрирующих зарядов,: с помощью которых он может разрушать роботов. Но он может применять их только в ближнем бою (разве что даль­ ность его оружия не ограничена. Насколько мы внаем,; на земле такая дистанция есть".). Кроме того, ему нуж­ но экономить заряды. Еще неизвестно, что его ждет., ког­ да он приблизится к выходу". Рисунок 6 воспроиаводит экран микрокомпьютера. По­ мещение есть прямоугольник с 11 строками и 18 столбца- 49
ии. Строни обоэначаюr свободНЬ1е иеста,_ О - расщелины в по.11уt Р - роботы. :КрестИR ( Х) обозначает игр она, эдесь - в начальном: положении. Выход обозначен плю­ сщ1. При своем: ходе игрок может - убить роботов на полях, прилегающих к его собст- венному~ . - переместиться на одно поле в любом направлешш,1 при условии, что он не попадет в расщелину, в результате чего он погиб бы. Он не должен также перемещат.~,ся в клетку, помеченную Р, так как там он был бы уничтожен роботом. Если это перемещение приводит его к полю +~ то он выигрывает. · . . Вот что сделал я для реализации этого. Игрок сначала говорит, каких роботов он хочет разрушить, а затем - ку­ да он хочет пойти. Если он отвечает это означае~\ что должен быть разрушен робот слева (на соседнем: поле),, как и робот, находящийся на соседнем: поле над ним,, после чего он передвинется на поле, распо­ поженвое ниже и девее. - :КаЖдый раз,; прочитав ответ.1, компьютер вычисляе'D новое состояние игры и показывает его. Число роботов~ которых игрок может разрушить~ Qграничено, компьютер следит за ним и в каждое мгновение может сообщить. После этого . роботы переместятся,, каждый на одну клетку i 1;1се равно в ка:кую сторону (по горизонтали, по вертинали пли по диагонали). Если при этом робот оказы­ ~rся на поле О, то он уничтожается. Если дnа робота Grаяниваются при движении, .то один из них уничтожает­ ея. Кроме того, роботы случайным: образом добавляются в четырех углах игрового поля. Это нужно делать для тo­ rot чтобы число роботов в игре оставалось более или менее постоянныц . .В случае,; изображенном на рис. 6_, игрок можеr ос­ ~аться неподвижным. Тогда робот1 расположенный над иrро:кои в том: же сrолб~е.~ уничтожается в эаnадпе.~ распо­ ;аожеиной непосредствевпо ивжеs во роботj расположен­ вый левее и ниже игрока1 приблизится к игроку~ и послед­ веку придеrся разрушить его на следующем ходе. Игрок иожет т~кже начать с хода влево,, ио тогда два робота при­ бпзяrея к нему1 и ему придется разрушить их на сле­ дующем ходе. ю_
Игра оказывается более или менее трудной в вависи­ мост:И от соотношения :иежду числом· препятствий и чис­ лом роботов. Я взял прямоугольник G 11 строками и 18 столбцами (число строк нечетно по причине особой роли, :которую играет среднее поле), с 30 расщелинами и 20 роботами. Игрок имеет право разрушить 12 роботов. В начале игры игроку, :как правило 1 трудно вЬl:йти из своего начального положения1 потому что он находится поблизости от двух правых уг.лов, из которых появляется немало свежих роботов. Когда же ему удается удалить­ ся от правого края, выходящие иа углов роботы его меньше стесняют и большая их qасть па~ает в расщелиНЬI. Трудности возобновляются при приближении· к .левому :краю. Именно поэтому нужно избегать растраты боепри­ пасов в начале партии. Попытайтесь1 и вы увидит01 что это требует немалой ловкости .•• * Игр а 11, Формула 1 *). Задумывались ли вы когда-нибудь над тем, что пере­ живает водитель, мчащийся на огромной скорости по извилис'fоЙ дороге, обгоняя попутные машины и уклоня­ ящ. от встречных? Конечно, вы не преобразуете ваш ком~ пьютер в быстро мчащийся автомобиль, и с помощью используемых нами графических средств мы не сможем создать· впечатление движения по расстилающейся перед вами дорог.е. Так как_, наконец, я полагаю, что у вас нм средств управления вашим компьютером в реальном вре­ мени (этих_· средств нет не только у меня, но и в обору. довании учебных заведений) **), поэтому перед любым вашим действием вы сможете раэмышлять столько вре­ мени,; сколько вам эахочется, а это совсем не так в слу.. чае водителя на дороге. Но попытайтесь-ка в этой игре реагировать быстро и вы увидите,, что эффект не так Y'J. плох, несмотря на элементарность средств ... Автострада выводится на экран в виде последователь. ности строк" на ·которых поставлены точки_,_ нули .и ввеа. дочка. Точки реализуют 4 полосы движения и предстаа­ ляют свободные места. Выше транспортное средство пред­ ставимо эвездочной. Ну.11И суть неподвижшае препятствия (скажем1 что-то тяжеловесное и оченъ медлительнqе). Типич;ная ситуация ивображеяа на рис. 7. Вы находи· тесь перед участком дороги (я выбрал 13 строк. Это даеt •) Таи ва1J11Иаются прамша ~IПlll а:втоrов:ок.- Пpu.n. ред. ••) Напомвим1 1JТО- няиrа ваписава в вача.ле 80-х годов.- Примеч, ред, _ rн
мне охрошие результаты. Но вы можете взять больше~ если вам позволяет ваш экран; это увеличивает возмож· пости предвидения. Вы можете взять и меньше, что за­ ставит вести машину в еще более стесненных условиях , ..) . у вас есть некоторая скорость, которая пе выводится па экран, по вы можете ее узнать. В пачале игры решается.!) .*. • * •• • • •••о .. •••0' •о •• • • •••• •• •• ..' " •..о •••• •• •• •••• " " •• •о• •••• о•• •••• •••• ••• •••• .. . • .... Рис. 7 Рис. 8 фиксируется ли опа сразу па всю игру (я выбрал 4) или предлагается вами. Когда вы решаете - ускоряете ли вы движение или замедляете · его - вы можете узнать па каждом ходе.~ какова опа. Но я пе считаю уместпыъ-1 заставить компьютер сообщать ее постоянно - это слиш­ ком многое облегчает водителю. Увидите сами. Компьютер ~ребует от вас". что вы собираетесь делать: ускорять, замедлять, повернуть правее или повернуть левее. Попарно эти возможности взаимоисключающие,; по вы можете одповремеппо ускорить движение и взя т ь вправо или замедлить и ваять влево, Вы можете таюке 52
не менять ни вашу скорость, ни направление вашего движения. Если вы ускоряете движение, то ваша скорость уве­ личивается на одну единицу. Если вы замедляете движе~ ние, то сщ:>рость уменьшается на единицу. Если вы та­ ким образом добираетесь до нуля, то вы рассматривае­ тесь1 как проигравший партию: вы не имеете права оста­ навливаться ... Предположим сначала, что вы пе меняете gаправления движения. Ваша машина спускается по вертикали на число строк, равное вашей скорости. Это может привести к тому, что вы пересечете поле, обозначенное О. Тогда пы сталкиваетесь с грузовиком, вы пропали. Это может также привести вас к тому, что вы попадаете на не обоз­ наченное поле. Вы покинули дорогу. Это - тяжелый не­ счастный случай. Вы пропали. Так, на рис. 8, если ваша скорость превосходит 2, то вы сталкиваетесь с грузо­ виком. Если бы вы исходили из крайнего левого поля того же ряда и ваша скорость превосходила бы 5, то вы покинули бы дорогу (внимание: вы пропали с того мо­ мента, кан вы достигли нуля или не обозначенного поля. Оставшаяся часть вашей траектории движения не рас­ сматривается). Теперь, если вы меняете направление движения, дви­ гаясь, например, вправо, то ваша машина продвигается по диагонали из исходного р~да вправо до следующей строки, а затем движение продолжается дальше в том столбце, в котором оказывается машина. Понятие «Впра­ во» двусмысленно: вы можете расширить его до «Вправо на фигуре» или «вправо по направлению движения». Это не так уж важно, выберите тот смысл, кщ·орый вы поже­ лаете. Если это вас шокирует, переверните рисунок и заставьте машину подниматься; тогда «Направо» будет значить «Направо на экране» во всех случаях. Но это немного усложняет программу 1 и я так не делаю. Если вы повернете направо в случае, изображенном на рис. 8, то какова бы ни была ваша скорость_, вы сразу же сталкиваетесь с грузовиком. Если вы повернете нале­ во, то вы избегаете грузовиков, но ваша скорость не должна превосходить пяти. Когда вы сообщиJJи все ваши команды, компьютер показывает положение звездочки на последовательных строчках, чтобы материаливовать ваше движение. Если вы оказываетесь на поле, Ие помеченном точкой, то все останавливается,,_ вы пропали, В противном случае через 63
некоторое время - время ожидания 1 дающее вам воз­ можность лучше рассмотреть пройденное вами 1 вся фигура поднимается, чтобы возвратnть вашу машину на верхнюю строку, и да экране появляется новый - кусок дороги. Таким образом, вы можете обнаружитьf, что вы едете слишком быстро и что дорога резко поворачnвает или что попарно гусько14 идут по два тяжелых; грузовика, кото­ рые блокируют две полосы движения. Вы можете затор. мозить1 но только на одну единицу. Придется риско- вать.,. / ДJiя того чтобы игра не продолжалась бесконечно, вы должны условиться о числе линий, которые нужно пере­ сечь (например 100). Если вы достигли этого, компьютер прославляет вас так, как вы того заслуживаете 1 и ука­ зывает вашу среднюю скорость. Эту игру программировать не очень трудно 1 если не считать того, что нужно оказаться способным корректно дозировать число грузовиков, и что нельзя позволять дороге часто делать зигзаги, а также выходить за преде­ лы экрана. Но здесь нет ничего, с чем вы не. могли бы справиться. Собственно игра ОКi\Вывается гораздо труднее, чем можно было себе представить. Вы, конечно, можете за­ тормозить до скорости 1. Вы оказались на краю. Но ни­ чего смешного нет. Вы можете оказаться в самом риско­ ванном положении, вы терпите удар за ударом: Б.iшгода­ ря воспроизводимым непредсказуемым последователь­ ностям вы можете многQ раз возобновлять один и тот же пробег. Впрочем" здесь бывает трудно вспомнить,, что же происходит на шестидесятом километре". Вы можете также попробовать маршрут1 а затем предложить eI'O вашим друзьям. И если вы ва их глазах вылетели с трас­ сы1 но вовсе не факт1 что они смогут на ней удержаться. Итак, желаю успеха! ?** И г р а 12. Твоя песенка спета_,_ любопытный! Идея не нова_, да и реалnзация поступила в рыночную продажу. Но в этой игре возникают некоторые маленькие задачи по программировани:IО~ и я предлагаю вам краси­ вый план их реализации._ :К тому же это позволит ввести B/U1 в игры с числами. Вы знаете телевизиоШiуЮ игру: вытащить случайным образом 6 шашек среди 24.i; образованных следующим образом: 5&. двойной набор из 10 шашек с числами от 1 до 101 четыре шашки с чисщ1щ1 25i 50"' 75i 100.
·случайным образом вьiбирается трехзначное целое число (первая цифра котррого - ве нуль, так что оно со­ держится между 100 и 999, включая границы). Задача состоит в том, чтобы менее чем за 45 с обнаружить после­ довательность операций, использующих только значения тести выбранных шашек, причем каждую не более одно­ rо раза, и соединить их знаками + - Х / (целочислен­ ное деление разрешается только в тех случаях 1 когда оно вьшолпяется нацело, без остатка). Вот пример, который я получил с помощью своей программы. Шашки:44789100 Число, которое нужно получить: 380 В течение 45 с, которые я выделип своему комirьютеру, я получил следующее решение: 4х100=400 9+8=17 7+17=24 24-4=20 400-20 =380-. Это решение использует 6 шariieк. :Компьютер сообщает еще через 45 с: 4Х9=36 4+36 .40 7х40=280 280+100= 380 Это решение не использует шашки 8. Не пытайтесь сделать эту программ:у1 следуя методу игры: вытащить случайным образом 6 шашек1 вытащить случайным образом число,, которое нужно получить2 со­ общить и то, и другое и в продолжение следующих 45 е искать нужную комбинацию. У вас нет Шiкаких шансов, чтобы это произошло (с:м:. Го.ловоломку 28). Действуйте лучше следующим обраво:м:. Выберите случайным образом 6 шашек и их комбина­ цию. Если результат не лежит в промежутке от 100 до 999,- повторите выбор. Если результат допуст.Ии.~: то выведите сообщение2 какие 6 шашек участвуют1 расnо­ ложив их2 например 1 в возрастающем порядке1 чтобы не было понятно1 в каком: порядке они были исriо.львовавы; сообщите искомое число 1 ватем: сообщите оставmиесу: се­ Rунды и1 когда 45 с протекут" С()общите реву.льтат. 8десь ~• ' ·-· ·-. - • "'-· •• •• ~.1
есть неудобство: всегда есть хотя бы одно точное реше-­ вие. И при том, что не приходится особенно обольщаться~ то, что вы достигнете с его помощью, вы f, может бытьt сможете сделать по-другому только приближенно. Внимание: случайным образом выбирать комбинацию на самом деле вовсе не всегда так просто, как в приведен­ ном примере. Не забывайте,. что вы можете использовать и не все шашки. Найдите способ получать ответ. Я не •• е . •• •d * ••• а*.•·е•g. . ·* . * •• •ьс.• f• аьсdеfg h•jk1mn hijk1mn орq о.рq rst rst Рис. 9 Рис. 10 вполне удовлетворен своим собственным. Я предпочел бы звать и другие способы это сдела·rь". ?**Игра 13.Двелисыи20кур. Иогда я был молод, мы играли в эту игру на свежем воздухе,: используя маленькие булыжники в качестве кур и два булыжника побольше для лис. Мы расчерчи­ вали эту игру мело:и на асфальте или палкой на утрамбо­ ванной земле. Вот . как я представляю ату игру на экране своего компьютера. Буквы представляют KYP .t звездочки - две лисы. Иуры могут перемещаться на один шаг вверх, вле­ во или вправо,. во не назад и не по диагонали. Лисы также когут перемещаться только на один шаг, во также и вверх - как и вниз, влево и вправо. Лиса мощет съесть курицу - как в игре в шашки: если в горизонтальном или вертикальном направлении за курицей на один шаг следует свободное поле,; то лиса перепрыгивает через ку­ рицу на свободное поле и берет ее. При этом трофеи скла­ дываются. На рис. 9 одна · лиса может съесть курицу Ь" тогда как вторая лиса может съесть за один ход кур е и /. Лисы всегда обязаны есть И,; когда у них есть выбор - как на рис. 9,- они обязаны осуществить наиболее длин­ ное поедание. Если два приема пищи имеют одинаковую длину.!) осуществляется один ив них - по выбору лисы. 56
В запрограммированной версии компьютер играет за лис. Вы перемещаете кур. Партнеры играют по очереди~ причем куры начинают. Они выигрывают партию, если· девяти из них удается занять 9 полей, образующих верх­ ний квадрат игры (квадрат~ нижние углщ которого па рис. 10 занимают лисы). Начальное положение кур и лис изображено на рис. 10. :Куры выигрывают таюке 1 если им удается заблокировать лис. Лисы выигрывают, если им удается съесть 12 KYPt так как тогда оставшихся кур недостаточно, чтобы занять 9 верхних полей. Может показаться удивительным~ что я отношу эту игру к категории 'игр бев етратегии. :Как вы собираетесь перемещать лис по вашей программе для компьютера? Действительно~ возможностей слишком мало, и едва лп: стоит говорить о стратегии. Нужно.,, чтобы при каждон ХОДе программа искала наиболее ДЛИННЫЙ Среди ВС!' Х: возможных путь поедания для лио и осуществляла ен;,; если он единствен. Если существуют два таких пути.~ то один из них нужно выбрать Е.сли их нет совсем, то СП(J­ соб действия состоит в том.t q·rобы посмотреть~ позволит л п каrше-нибудь перемещение лисы поставить ее в состояние возможного поедания. Если такой ход есть,; то почему бы его не сделать, это заставит кур реагрровать. Если и Т;J­ кого угрожающего хода нет, то остается мало возмож­ ностей выбора. Я был поражен,, увидвв.t ч:то если выбра­ сывать ходы случайным образом вместо того.r чтобы осу­ ществлять их выбор, то результат будет не намного хуже." Но., конечно, не так уж трудно придумать что­ нибудь получше. Единственная наотоящая трудность программированин - определение наиболее длинного пути поедания. ?**Игра14.Одналисаи13кур. Это - вариант предыдущей игры. Та же конфигура­ ция" не только одна лиса и 13 кур. Та же вадача: 9 кур должны ванять верхний квадрат. Лиса обязана есть" и притом по наиболее длинному пути. В отличие o·r предыдущей игры лиса и куры могут так­ же перемещаться по диагонали, но куры не могут дви­ гаться вниз. Линии на рис. 11 указывают на возможные перемtJщепия. Программирование этой игры сравнимо с программи­ рованием предыдущей. Я попытался быть немного более хитрым при определении ·перемещений лисы: так как вдесь меньше. того~ за чем нужно СJl~~итьj, то можно из-· 51
росходовать немного больше времени,. чтобы · заняться адинственной лисой . В результате получилась более хитрая игра. В вариан­ те с двумя лисами курам довольно легко удается блоки­ ровать лис и~ таким образом.• выиграть. В версии с одной­ единственной лисой увеличивается богатство возможных перемещений, и блокμровать лису трудно. Можно отдать ве более четырех кур и не так-то легко пожертвовать вх так, чтобы отправить лису на другой край, в то время как остальные куры заполняют ку­ рятник. Привыкнув к игре с двумя лиса­ ми, я внаqале никак не мог приспо­ собиться к этой игре, особенно к манере лисы ходить по диагонали. · Но это не страшно. С того мо~ен­ та, как вы полностью· ухватите спо­ соб движения (и, в частности, воз­ можность перей'J.:и из h в Ь и изj вf р11 на рис. 11), эта программа даст вам: ис. настоящую возможность играть: вы можете применить ту или иную стратегию игры на вы­ игрыш против машины, которая такой стратегией не очень-то обладает ... И г р а 15. Игра_ Доминика. Уж здесь-то я могу · ручаться, что это игра для начи­ нающих. Ее для своего малюсенького микрокомпьютера придумал м:ой племянник Доминик. Она напо:шшает сплату за страх)) (игра 9). Начальное положение иrры - то же (рис. 4). Доминик взял прямоугольник поменьше и уменьшил число препятствий. Для начала он поставил препятствия на определенные места. Правила, игры изменены. Убийцы не вооружены огне­ стрельным оружием, у них - только ножи. они · не могут добраться до игрока иначе, чем достигнув ваним:аемого иr."1 поля. Игрок перемещается на 1 шаг в любом: направ­ лении (по горизонтали, по вертикали, по диагонали) с условием: перемещаться на свободное поле. Убийцы на своем ходе приближаются к игроку на один шаг - обя­ зательно на свободное поле - в любом . направлении. Игра осталась очень интересной. Проблема яахожде- . JIПЯ игрока и убийцы на смежных ли-ниях больше пе стоит. Еели убийца оказывается рядом с игроком в · каr<ом-либо J1аправлепии, он его хватает на следующем: ходе 1 если иrр()К не удаляется от него при своем ходе".
4. ИГРЫ СО СТР А ТЕГИ.ЕЙ В этом разделе мы предлагаем программировать игры~ гланпая трудность которых заключается в том, чтобы дать компьютеру хорошую стратегию. Разделение па игры со стратегией и без пее до некоторой степени произвольно. Уже по поводу случайных чисел мы предлагали игру со стратегией (игра 2). Конечно, совершенно пеобходимо,1 чтобы вы могли хоть немного развлечься". Некоторые из игр~ с которыми вы познакомитесь, требуют пе намного больше размышлений, чем игра в лис и кур. На самом деле это во многом зависит от особенностей вашего ума: стратегия~ очевидная для одного, является головоломкой для другого. Можно также упрекнуть некоторые игры в том, что они теряют всякую привлекательность, поскольку ком­ пьютер располагает выигрывающей стратегией. Если парт­ нер компьютера пе знает этой стратегии, то оп проигры­ вает все партии. Если же оп ее знает, то тот, кто делает выигрывающий начальный ход, неминуемо становится по­ бедителем. Накошщ, некоторые игры настолько распространены~ что я постеснялся их здесь предлагать: такова., напри­ мер, игра Отелло. Не пытайтесь браться за шашки или шахматы. Слишком трудно! В этом: разделе вам предстоит встретиться <: двумя трудностями: - паiiти стратегию для компьютераj - запрограммировать ее. · Именно потому, что есть так много опубликованных плохих программ, я, не ссылаясь на эти публикации,1 добавил игру Нима, Сочувствую всем тем_,, кто может оказаться обиженным. Но тот, кто публикует програм­ мы, всегда рис:kует. Таковы правила этой игры. И гр а 16. Чтобы войти в курс дела, Это - крайне простая игра, которую Роуз - Вол [BAL] относит к средневековым играмJ, поскольку ей действительно более ·500 лет. Вы выкладываете на стод 50 спичек. Каждый игрок по очереди вынимает спиЧки из кучи, по меньшей мере 1 и пе более 6. Кто берет последню10 спичку,, выигрывает. Вы можете реализовать ее" засrавляя компьютер сооб­ щать число оставшихся спичек, Когда очередь хода за компьютером:,, он делает ход настолько быстро, что игрок не уепевает увидеть происходящеrо. Включите в вашу ~
проrрамму «цикл ожидания».t чтобы замедлить иrру ком­ пьютера (цикл от 1 до нескольких тысячt в котором ни­ чего не происходит: ДЛЯ i = 1 д? 2000 ВЫПОЛНЯТЬ ВЕРНУТЬСЯ) Вы можете изменить игру., взяв в качестве допускаю­ щих изменение данных - начальное число спичек и , мак­ симальное число спичек.r, которое можно вытащить на каждом ходе. ?Игра17. Иградат. . Эта игра предложена Берлокеном [ВЕЮ. Номер года 11 ней не очень- существен, но предполагается, что год ne високосный: в феврале 28 дней. Первый игрок сооб­ щает какую-нибудь дату января. Каждый игрок на своем ходе называет более позднюю дату., увеличивая либо нnлендарную дату в месяце, либо месяц, но не то и другое сразу. Если, например, начальной датой было 8 января,. то можно перейти н 8 марта или н 12 января. Можно уве­ личить меньше: 9 января или 8 февраля; можно перейти сразу к 8 денабря или 31 января. Внимание: если вы переходите н 31 января, то ваш противнин сможет в даль­ нейшем менять тольно месяцы,_ и притом лишь месяцы с 31 днем. Первый, нто доберется до 31 денабря, выигрывает. У вас не должно возниннуть нинаких затруднений пи в определении стратегии.. пи в программировании этой игры. Под·умайте о проверне осмысленности предлагае­ мых дат." Кроме того.• вставьте цинл ожидания, чтобы дать игрону время для ответных действий. Компьютер должен быть вежлив и должен спросить, нто будет па­ чи нать, по нрайней мере, бросить «орла» или «решну», чтобы узнать, ному начинать." ?**Игра 18.Играс24картами. Расположим на столе 24 раснрытые нарты: все нарты с номе'рами от 1 до 6 обычной колоды, где туз считается за 1. Масти карт несуществев.пы: двойна бубен имеет то же значение., что и двойна треф. Каждый игрон при своем ходе берет со стола карту и складывает ее значение с суммой тех, ноторые были взя­ ты ранее *). Первый., кто берет в точности 50 очнов, вы­ игрывает. Внимание: есля: при вашем ходе вы, взяв нарту, не можете не превысить 50 очнов., то вы проиграли. Если, •) Таким образом, подсчитывается общая сумма карт, взятых партнерами, а не отдельные суммы для каждого партнера.~ Примеч. ред. 60
например, ваш партнер увеличил сумму до 49 оч1<0в,1 а все тузы уже взяты, то вы проиграли: карту нужно брать, а ее значение .больше единицы. Это - вариант средневековой игры. Стратегия гораздо сложнее, потому что карт каждого сорта только 4. К зтой игре нулшо привыкнуть. Сперва компьютер выигрывает все партии подряд (любопытна реакция программиста: я счастлив,: что моя программа меня обыгрывает). Но по прошествии нескольких партий уже я выигрываю, Тогда программу нужно улучшить. ?** Игр а 19. Игра города Нима. Ах! Эта нимская игра." кто ее на знает. Сущес·rвует немало запрограммированных вариантов в болf>шом числе публикаций и обзоров. Читатель может сказать мне, что зтой игре здесь не место: если моя цель - заставить чи­ тателя программировать,, то я проиграл с самого начала. Ну, нет. Поскольку решения, предложенные в выше­ упомянутых книгах (и,, поскольку перечитывать их бес­ полезно, то я их имена и не указываю), очень плохо за­ программированы и совершенно не объяснены. Вам при­ дется сделать лучше. Если вы знаете выигрывающуIQ стра­ тегию1 то вам придется ее испытать, чтобы ее проверить. Если вы ее не знаете, в.ы должны попробовать ее изобрес­ ти. Во всех случаях нужно программировать очень тща­ тельно1 чтобы не делать ненужных вычислений. Напомним даже саму игру на тот очень мало правдо­ подобный случай, если вы ее еще не знаете. Это игра для двоих., и компьютер будет вашим партнером. На столе - кучи спичек в некотором количестве, и в каждой куче - некоторое количество спичек. Напри:мер 1 есть 5 кучек с 8, 13.i 7.i 5,, 9 спичками. Каждый игрок на своем ходе берет столько спиче:к• сколько хочет.•. из одной кучки, но он обязан ваять хотя бы одну. Выигрывает тот,, кто берет последнюtо спичку. Вот партия.~ сыгранная от начала до конца, Компьютер на­ чинает. Исходное положение: 8, 13, 7, 5 1 9 Ход компьютера Ваш ход 6.i 13.t 7,,, 5,, 9 6s3.i;7,;5,9 6,;3"7,,5,;7 2,J3{7i5,;7 2,3.i7"1,. 7 2vOs7,~1t7 2i О.,:4~1";7 2,:О,;3.~1,7 2"Os3";1JiО 2.1) 0.1) 2.1) 1.1) О 2.1) О.1 2.1) О.,, О 61
Вы проиграли. Если вы возьмете две спички из одной Кучки, то компьютер возьмет две из другой, так что и последнюю и потому выиграет. Если же вы возьмете одну еrrичку иэ одной кучки" то он возьмет одну из другой, и вы проигрываете на спедующем ходе. Мариевбадская игра _является простым вариантом этой~ nроигръmает тот_, кто берет последнюю спичку". Этот род игр можно решительно осудить. Это - совер­ - m-енно несправедливая игра. Выигрывающая стратегия Рис. 12 о•••••••* о•••-• •• •* о•••••••* о•••••••* Рис. fЗ существует. Если ваш противник ее не знает (как было в nрв»еденном вы_mе примере), то он обязательно проиг­ рывает. Если же он е~ знает, то он первый воспользуется усвоеавой им: выиrрывающей стратегией, и вы ничего пе с~южете сделать . . С друг°'й стороНЬI, даже если вы знаете 11ыигрывающуЮ стратегию, вы рискуете проиграть ком­ пьютеру, потому что вы не так хорошо считаете". ?** И г р а 20. Игра Норткотта. , Вот менее из:в.естная игра, которую, одиако_~ гораздо труднее программиw-вать. Эта игра разыгрывается дву­ мя участниками ва прямоугольной площадке1 разделен- пой ва поля~ ках показано на рис. 12. - -Каждый игрок располагает по mаш:ке на каждой C'IJJO-IW, В начале червые шаш:ки находятся -ва левых волях.1 белые - ш пра:аых. При каждом ходе игрок пе­ ремещает од:ку из своих шашек направо или налево на стош.ко полей~ сколько он хочет; во оп пе может пере­ ходить край игрового поля, и не может переходить за клетку1 предшествующую противоположной шашке; шаш­ ки друг друга не берут и нельзя переходить заJIЯтое поле. Проигрывает тот, кто ве может пошевелиться, потому Что 11се его шашки з,агнаны между краем и противоположпы­ ми шашками. Размер игры значит очень маJ10. Я предпочитаю игру -с тремя строками, во 4 и 5 - тоже очень хорошие числа. Длина строк весуществеива. Выберите ее так1 'IТобы игра s:орошо смотрелась. 12
Н а экране вы можете воспользоваться техникой, RО-­ торая нам так часто служила. Пусть свободные клет~аr будут представлены точками, шашки одного из игроков - звездочками, а другого - О. На рис. 13 воспроизведено наqальное положение (4 стрQJ<И, 9 по.лей на строRе). Хсд н:омп.ьютера состоит просто в перемещении· одной из •~го шашек (внимание: если отве.т будет слишком быстрым, егп1 1\JОЖет статься, будет трудно воспринимать. ПодумайтtJ• как использовать цикл ожидания). Ход игрока може" быть дан компьютеру в вгде указания, на какой cтpoive нужно перестав.ять шашку и число полей при перемещенин; положительное число указывает на приближение к про­ ти внику, отрицатедьное число означает отход к краrо игрового поля. Все это очень просто, ?*Иrра 21.ИграRейлеса. В наиболее простой форме эта игра разыгрывается со спичками, положенны~ш в один ряд. Каждый игрок на евоем ходе вынимает либо какую-то одну спичку из стро­ rш, л:нбо две смежные спички. Это может разломать ис­ ходный ряд на несколько меньших рядов. Вот, например, uачальная конфигурация (спички обозначены нулями). а затем - состояние игры через несколько ходов (точки обозначают места1 оставшиеся пустыми). Вначале: ооо.оооооооооооо После нескольких ходов: .. ооо..оо .оо.оо•• Выигрывает тот~ кто берет последнюю спичку. Игру можно легко распространить на случай несRоль­ ких исходных линий спи'lек. На каж)!Ом ходе игрок бере'l! либо одну спичку~ либо две соседние спички на линии, которую он выбрал. Rак и в предыдущих играх, .поду.майте о применении цикл~. ожидания,, чтобы у вас было время увидеть ome'l! компьютера. Rак и в игра~ Нима и Норткоnа~ ara. игра не очень-то справедлива. RоШI.Ьютер выиrрьшает все пар­ тии, по крайней мере"' если его противник не в:яает выиrры­ .вающей стратегии ... *И:Гра 22.Игр.аСима. Еще одна игра~ тоже совершенно ве раввоnравная для двух игроков - для ком.пьюrер.а и для вас. Игра разыгрывается ва листе бумаrJ1 1 ва котором об.о­ значены 6 точек_,, яв.~JЛЮ~Х~Я вершинами правильного 63
шестиугольника, помеченные буквами А, В, С, D, Е, F. Естественно ожидать, что вашим партнером будет компью­ тер, и ему никакой бумаги не нужно, так что 6 точек появятся на экране. :Каждый игрок· при своем: ходе проводит отрезок пря­ мой,- соединяющий еще не соединенные вершины. Нужно, чтобы следы отрезков, проведенных различными игрока­ ми, можно было отличить. На рис. 14 следы одного - сп.Лошные, а у другого ._ _ штриховые. В запрограмми­ рованной игре именно компьютер берет на себя прове- дение отрезков. Скажите еиу только названия вершин, которые вы хотите соеди­ нить. Он и проведет отре­ зок, причем та~юго типа, который вам присвоен. Затем оп выберет вершины, кото­ рые оп захочет соединить, и проведет свой собственный отрезок. Рис. 14 Проигрывает тот, кто пер­ вым построит треуголь~ик из своих собственных отрез­ ков. Так, на рис. 14 тот, кто проведет отрезок из тире меж- - ду D и Е, проигрывает, потому что оп образует отрезок AED из тире, между тем Rак отрезок АС из тире безопа­ сен: он образует, конечно~ треугольник ACD~ но одна из его сторон - сплошная" и _поэтому оп безвреден для обоих игроков. Сумеете ли вы показать_, что в этой игре всегда есть проигравший? (Нельзя так расположить все возможные отрезки, чтобы никакие три стороны их, одинаковым об­ разом выполненные, пе образовывали бы треугольника.) Сумеете ли вы предложить хорошую стратегию для ком­ пьютера? Если компьютер и игрок играют в равную силу и не совершают никаких ошибок,: кто тогда выиграет? Начинающий? Или другой? На моем микрокомпьютере, пе имеющем графических средств,; я был вынужден удовлетвориться · проведением отрезков с помощью выстраивания в ряд букв там_, где компьютер считал нужным их поставить. :Картина полу­ чалась не очень красивой, по игра оставалась осущест­ вимой и интересной. С графическим да еще с цветным экраном у вас должно получиться просто загляденье, Но пе забывайте поговорку Анри Ледгара [LEDI; 64
Не ванимайтесЬ формой вывода результа·rов, пока ваша программа не окажется правильной. Когда ваша программа окажется правщrьной1 тща­ тельно отработайте форму ВЫВ9да ревультаrов. ? И г р а 23. Спички Бергсона. Нет," этот великий философ не играл в такие игры - по крайней мере,1; насколько я внаю. Эту игру uредложил мне М. Дюма,; профессор лицея Бергсона. Еще одна игра для двоих', в которой компьютер - ваш неумолимый партнер. Потому что если вы обнаружите выигрывающую стратегию, то компьютер не оставит вам никаких шансов, .ведь у него и память есть ..• На столе - кучка спичек (достаточно большая: вна­ чале - по крайней мере 50). l\аждый игрок при своем ходе берет спички цв кучки. Нужно взять по крайней мере одну и не более чем вдвое больше, чем взял преды­ дущий игрок. На первом ходе можно взять одну или две спички. Выигрывает тот, кто берет последнюю спичку. Вот последовательность возможных ходов. Вначале - 50 спиче:к. Игрок А берет 1 Остается 49 Игрок в 2 8 берет Остается 47 4 4З- 35 16 19 19 выиграл На каждом ходе, кроме по~леднего, каждый из игро­ ков брал максимальное вовможное·количество, и игрок Б легко выиграл, ввяв на последнем ходе 19 спичек,, на что имелполноеправо,таккак1<19<:2Х16= 32. Ко­ нечно, это очень плохая стратегия. й"от другая партия: Игрок А берет Остается Игрок Б берет Остается 3 47 4 43 1 42 2 40 1 39 .1 38 1 37 2 35 1 м ~ ~ 3 ~ 6 ~ 2 21 4 17 4 13 2 11 3 8 Игрок А близок к победе. Если Б возьмет 3 спички .и ос­ танется 5, то А имеет право ввять последнюю. Это тем более верно1 если Б возьмет более чем 3 спички (4,; 5 или 6). Игрок Б не ~ожет ваять больше и во всех случаях дает 3 Ж. Арсан 65
игроку А все права, чтобы он моr ваять последнюю с,пич· ну). Единственными случаями, подлежащими обе) :~tде­ нию, остаются поэтому случаи" когда Б Церет одну или две спички. Если В берет одну., то осrается 7, А берет 2 и {)Стается 5. Если Б после зтого берет более одной, то А берет послед­ нюю; если Б берет одну и остается 4, то А берет одну и остается 3; Б может взять только одну или двеi и кончает игру А. Если Б берет 2 и остается 6" то.А берет одну и остает­ ся 5", и А выигрывает тем: же способом. Я так подробно разбирал зтот пример, чтобы познако­ мить вас с о,сновными идеями. Тщательно изучите этот пример. Всегда Ли игрок А заведомо выигрывает, как только он оставляет в нуче 8 спичек... , Не предпринимайте эдесь слишком глубокого ИзУ'Jе­ ния выигры:nающей стратегии. Мы к пей еще вернемся ниже. Устройте тольно, чтобы ваш компьютер выигрывал при приведенных выше условиях,, если старт для него благоприятен,,, Бы легко сообразите1 как представить эту игру на ,экране, ??** И r р а 24. Гениальный отгадчик. Вы уже сделали гениальпоrо ответчика; зта игра слож:­ иее. Составьте программу для отыскания комбинаций~ задуманных гениальному отгадчику, Вы можете идти дву­ мя путями: - вы выбрали номбинацию. Компьютер предлагае~' вам свою,, за!ем читает число черных и белых шашек, ноторые получаются из того, что оп вам предложил. Он должен найти ответ за наименылее возможное число хо­ дов; - вы выбрали исходную комбинацию и сообщили ее номпьютеру. Дальше все идет автоматически, Он выбирает некоторую номбинацию,, определяет число черных и белых mameнi сообщает это все, затем переходит к следующей номбинации - пока пе найдет ответ. Компьютер честен и пе хитрит: оп пе использует того.~; что он внает задуман­ ную номбинацию." _Вы скажете;,; что это неинтересно. Но зто не так. Во­ первыхt стратегия поиска является вызовом для спосQб­ ности мышления. Мне пришлось немного подумать, чтобы 'получить в свое время разумный ответ с 6 позициями и 8 цветами. Попробуйте сами и убедитесь! С другой сторо_ ны, для гениального отгадчика существует проблема зФ- 66
фектиююго начала. В программе, составленной мною, я сам выбираю первые испытательные номбинации. , Я смотрел, сколько было систематических попыток и на­ ковы они были. Это позволило понять, насколько важен начальный выбор и может л, он сильно влп~ть на резуль­ таты. Это - хорошее, орудие зксперимептирования. И зтр очень легко устроить. Компьютер запрашивает вас, сколько опытов априори вы хотите осуществить, Затем оп вапраши'вает у вас начальные комбuнации, .число которых он только что прочел. После этого компьютер предпри­ нимает систематичесное исследование, какая из предло­ женных комбинаций должна быть оставлена. Чтобы преуспеть, вам нужен хороший метод, и програм­ мировать нужно очень тщате;;rьпо. ?** И r р а 25. Погоня ва сокровищем. Любой начинающий в информатике мечтает сделать программу - чемпиона мира по шахматам". Я и сам видел несознательных., бросавшихся на зту вадаЧу. Чтобы уте­ шить их, нужно сказать1 ч'Го это - одно из больных мест истории информатики. Компьютеры были еще влек­ тронными монстрами, напи_чкаными радиолампами, ко­ торые приходилось охлаждать кубическими метрами ·Воды~ ногда Герберт Симон (недавний Нобелевский лауреат по экономике) уЖе сделал примечательные предсказания: - черев 10 лет чемпионом мира по игре в шахматы станет компьютер, по :крайней мере если правила пе будут запрещать им участвовать в соревнованиях; - черев 10 лет компьютер обнаружит :ц докажет новую важную математическую теорему; - через 10 лет большая часть диссертаций, выпускае­ мых по психологии, будет облечена в форму программ для компьютеров или качественных комментариев н приме­ чательным особенностям компьютерных программ (Гер­ берт А. Симон, Аллан Кьюзлл: Эвристическое решение вадач: следующее продвижение в исследовании операций. «Operations research»1 т. 6.1 январь-февраль 1958,; с. 6). И черев 25 лет с момента предснававия у нас не воввик­ ло проблемы запрещать доступ номпьютеров к шахмат­ ным чемпионатам, они пе представляют серьезной угрозы. Да, одна ив программ выиграла партию у чемпиона_ (каж. дый человек имеет право ошибиться; конечно,: это отно­ сится ин чемпиону, Он был очень усталым). Ни одна важ­ ная теорема машиной пе обнаружена, Что же касается диссертаций по психологии, то, может быть1 даже xopomo1 что предсказание Симрна пе оправдалось". Очень боль- э• 67
во видеть, до какой степени информатика явллетеfl блаrоприятВЬiм местом для ложных предсказаний. Сколь- 1<0 их вам обещали, этих чудес, которых мы так никогда и пе увидели! Два rода тому назад, BQ время Сикоба, журналист первой программы Французсного телевиде­ ния показывал чудесную машину. Она была удивительно. похожа на фотокопировальную. Он приподнял крышку, нашел там букву, нажал кноп« у «И теперь буква зареги­ стрирована и мы ее легко узнаем, когда это потребуется». Фантастика! Покончим с этими мучительны.мл сеансаАш поп сков буквы этим господином, 8Х•••о • • • который два месяца назад под- 7•0 • • • , 0 • писал по этому делу ионтракт, 6 номер котороrо я аабыл ... Но 0 • 0 • • • 0 • это был не господин., это была 5••о •о • •о дама, и это было не дв.а месяца 4 назад, это был прошлый фев- • о •••о.~ Б раль. ольше никто не говорил 3•••о • • о • об этой волшебной машине, 2•• Как же может случиться, что •••••о молодые люди пе имеют вика- 1•.о • • • • •* кого здравого смысла в инфор­ - АвсDЕFGН а1атике,такчтоможнобефзопа­ ски предсказывать самые анта­ стические и самые неправдопо- Рис. 15 добные вещи, не вызывая ни смеха, ни краски стыда. «Мы подготовим 100 ООО препо­ давателей за пять лет... » Но это - совсем другая исто­ рия, как rоворил Киплинr. Вернемся-ка к шахматам. Речи нет о _том, чтобы вы ими эанялиtь; это выше понимания любителя , даже самого талантливоrо. Но я хочу предложить вам нечто, . что все же имеет какое-то отношение к шахматам и одновремен­ но может позволить упражняться в постановке пьесы. Я представляю шахматную доску па рис. 15 как на экране щюеrо микрокомпьютера в виде нвадратной таб­ лицы с 64 полями, которые представлены точками. На шахматной доске в левом верхнем yrJiy расположена ч е р­ ная ладья (помеченная крестом), а в нижнем правом углу - белая ладья (помеченная ввевдочкой). Тринад­ цать шашек, помеченных маленькими кружочками, слу­ чайНЪlм образом расположены в:а иrровом поле. Компью­ тер - перемещает черную ладью Х '· а вы - белую ладью *· Rаждый иrрок на своем ходе передвигает ладью, I<ак при иrре в шахматы: только на поJiя на той же строке 68
или в том же столбце. Можно взять mamкy l'l встать на место, которое она занимала; тогда эта mamкa выходит из игры. Можно, взять противоположную ладью, если оказывается возможным попасть на занимаемое ею место. Тогда игра останавливается, и тот, кто взял чужую ладью, и есть победитель. В протищ:юм случае игра останав­ ливается, когда больше шашек пет. Тот, кто взял болыпе шашек, и есть победитель. · Вам необходимо указывать компьютеру, какой имеп:во ход вы хотите сделать. Вы можете, например,,, отметить строки цифрами, а столбцы - бук­ вами, как на ·рисунк~. Ваш первый ход будет, беа- сомнения, на Н2 или В1... . . Стратегия совершенно не очевид­ на. У вас много возможностей. Не так много,, конечно, как в шахмат­ ной игре, но достаточно для того, чтобы вам пришлось заняться всерь­ ез, что бы написать программу, которую было бы трудно побить. .. • оо•+ +оо+ .++о+ •• 12з4567 Рис. 16 Если вы при этом достигли совершенства, почему бы не попробовать ее вариант, который не должен вызывать намного больше затрудненllй (???): та же задача, но ладьи заменены конями. ~ ***И г р а 26. Могущественная четверка. Эта игра продается на рынке в другой форме. Она про­ исходит в прямоугольном пространстве с 5 строками и 7 столбцами. Игра ориентирована, у нее есть низ и верх. Игровые позиции суть наинизшие свободные места в каЖ• дом столбце. Каждый игрок на своем ходе помещает свой отличительный знак на одно из игровых полей: например, один ставит крестики (+),другой - нолики (О). Первый, кто поставит на одной линии четыре принадлежащих- ему знака - либо горизонтально, либо вертикально, либо по диагонали - выигрывает. На рис. 16 будем считать, что нолики при игре ставит тот игрок, чей ход именно сейчас. Если он не сыграет немедленно в пятом столбце, то его про­ тивник выиграет следующим ходом. По диагонали, начи­ нающейся у основания четвертого столбца и идущей влево и вверх, есть три нолика, но единственное игровое поле в первом столбце обозначено точкой, и немедленно реали- · зовать продолжение линии поэтому нельзя. Очевидно, что его противник не имеет никакого желания служить ему подставкой при пополнении первого столбца вместо того, 69
чтобы ;;апиматься разыгрыванием мест, допускающих продолжение линии.,. Эту игру, производную от вошек, дрограммировать вамвого проще, потому что всего полей только 35, и толь­ ко 7 ив них являются. игровыми полями на каждом ходе. · Это существенно ограничивает работу. В реализованной мною версии ответ микрокомпьютера практически мгно­ венный (порядка секунды). Я не думаю, что я распола­ гаю программой-чемпионом, я пе очень хорошо знаком с втим родом игр." 5 СТРАТЕГИЯ БЕЗ ИГРЫ (ВЫ~ГРЫВАЮЩИЕ СТРАТЕГИИ) Я объединил в этой главе несколько игр~ которые можно найти на рынке и для которых существует страте­ rия решения. Как только опа становится и;авестной, игра 1rеряет всякий интерес. Единственное связанное с· такими играми удовольствие - обнаружить, как с ними покоп- . чить. Поэтому напишите програмыу - это наилучший способ сфориулцровать выигрыmпую стратегию, а затем забудьте игру, опа вам больше ничего пе принесет. И тем хуже, если продавцы вmх игр пе согласятся со мной ... Некоторые иа этих игр являются классическими среди ивформатиков. Я попытался их немного подновить. Мно­ гие стратегии могут быть элегантно аапрограммироnаны с помощью рекурсивных щ:. оцедур, но па языке Бейсик это невозможно. Всегда пr, ступает день, когда фанатики этого языка, такого удобного для первых шагов, начина­ ют понимать его ограниченность." Рекурсивность доп у- стим в пзыках LSE и Паскаль. , ? Игр а.27. Бездельник. Эта игра па рынке есть. Она имеет вид дощечки, в ко­ торую продето п гвоздей, скош,зящих через соответствую­ щее отверстие, причем конц:..~ гвоздей расплющены и в каждом просверлено отверстие, в которое продето коJ1ь­ цо. Вы безусловно можете изготовить все вто св.ми, нс-· пользуя достаточно толстые гвозди (диаметром порядда ч~тырех миллиметров). Пропустите гвоздь в отверстие в 5 миллиметров в дощечке, а затем расплющите острие молотком. Просверлите головку наконечника, обраао­ вавmуюся у конца гвоздя, и вставьте туда кольцо длл ключей. Каждое кольцо должно проходить вокрую пре­ дыдущего гвоздя. Трудность игры зависит от n. Для п = = 6 опа довол~по быстро приходит к концу. Для п = 8 ио
она требует .цолгИх мив3т. Она поЧти невыполнима, если п больше восьми. · Через кольца проходит челвон, длинный замкнутый контур, представленный ва рисунке. Дело в том, чтобы его вынуть и, таким образом, освободить от колец (рис. 17). Первое, .что нужно сделать - это научиться, как Про­ пускать одно кольцо через челнок, или как его оттуда вынуть. Несколько манипуляций - и вы быстро убеж-, даетесь, что в какой стадии ни была бы игра, всегда мож­ но надеть или спять первое кольцо, которое свободно (не проходит вокруг какого-либо гвоздя). Можно также Рис. 17 освободить кольцо, которое следует ва первым занятым кольцом (если оно проходит вокруг челнока), или одеrь. его на челнок, если оно пе одето. Таким образом, игру «бездельник& можно заменить равносильной игрой, кото­ рую легче представить на компьютере. - Эта игра- ведется на таблице, разделенной на нескольц(} полей (8 полей на рисунке). В начальном состоянии каж­ дое поле по;крыто шашкой. Поля размечены цифрами. Играть на данном поле - значит, поставить туда шашку, если поле пусто, и удалить шашку, стоящую на атом поле - в противоположном случае. Правила игры сле­ дующие: - можно всегда играть на первом поле, - можв:о играть на поле, которое следует ва первым занятым полем. Есть две возможных игрыr НАДЕВАТЬ: игровое поле вначале пусто. Заполнить все поля. СНИМАТЬ: игровое поле вначале наполнено шашка?>m на кажд~й клетке. Нужно все убрать. 71
Зта задача имеет очень элегантное рекурсивное реше­ ние. Но если вы немного подумаете, то вы сможете также найти очень простое итеративное решение, причем игра НАДЕВАТЬ оказывается более простой, чем игра СНИ­ МАТЬ. Вот другая интерпретация этой игры - для тех, кто любит арифметику. Вы можете считать, что каждое поле lolololololololol Аачальное состояние 11°] l0l 0 Il0l 0 I Промежуточное состояние. Рис. 18 может принимать два состояния (свободное и занятое), что экви­ валентно двоичным числам - например, О для свободного и 1 для занятого полей. Тогда каж­ дая конфигурация являе'l'СЯ представлением целого числа по основанию. 2. Таким образом, рис. 18 представляет целое чис­ ло 11111111 в качестве начал~ ного состояния и 01011011 в ка- честве промежуточного состоя­ ния. Ниже нам будет удобно читать зти слова в обрат­ ном порядке, так что в этих новых обозначениях прgме­ жуточное состояние соответствует двоичному числу d1011010. Ясно, что зта игра порождает последовательность чи­ сел (в приведенном выше примере число равно 218 в де­ сятичной записи). При переходе от одного числа к следую­ щему меняется лишь одна двоиtЩая цифра. Можете ли Рис. 19 Рис. 20 вы сказать, какая последовательность порождается та­ ким образом в каждой ив игр? ?*Иrра28. Зануда. Эта игра называется также «игра в лягушек». У нее была версия, использованная в материалах лицеев,_ но в ней было пе все, что я вам сейчас предлагаю. Игровое поле снова имеет вид прямоугольной пло·щадки, разделен­ ной на поля. Число полей должно быть нечетным (9 на 72
рис. 19). Поля слева покрыты щаmками некоторого цве­ та {я представил их нолииами), поля справа - mашкам:0 другого цвета (эдесь - крестиками). Среднее поле СБО­ бодно. Крестики могут переднuгатъся только влево, ноли­ ки - толыю вправо. ШашF.а 1\IОЖет быть либо подвинута на один ша.r~ есди сдедующее поле в направлении ее пе­ ре1'dещщmя свобод110, ;цибо перепрыгнуть через шашку ,11ругого рода, если следующее ва ней поле с.вободно. Рисунок 20 иллюстрирует два ВОSJ\fОЖЯЫХ хода в партии с начальным полщнение1\1 ц.а pnc. 19, Цель игры состоит в TOJ\f, чrобы привести все Х влево, а все О вправо, так что конечное состояние должно быть похоже на начальное, и шашки должнт.,~ поменяться 1\fес­ таш:~: (крестики справа, nолпки. слева). ПрограмМ:а, которую вы должны составить, должна описывать посдедователъность перемещений шашек для произвольного (но, конечно, нечетного) числа полей. Вы можете получить рещение :в щще пары рекурсивных про­ цедур ил.и в виде одной итеративной програ1'd1\IЫ .. Rак только вы найдете стратеrию, зануда пе будет больше предс1·авлять вика~юго интереса. Как Это случИJюсь ~ те­ ми, с ке1\1 я занимался на Митра 15, в лицее, требуя, что­ бы игрок шщел ва своей клавиатурой и переставлял шаш · ки. Но если в-е знать стратегии и действовать случайным o5paso1'd, то выиграть нель.вя всл·едст:вие теоре1'dЫ Дюнойе: «Если какой-то выбор :вы делаете случаЙRЫJ\f обрщю1'd, то вы всегда проигрываете~. Это на1\1 постоянно повторял наш учитель м.ате1'dатики, ко.гда я был в подготовительном классе Политехнической школы. Мы приду1'dали след­ ствие: поскольку м:ы всегда проигрывае1\1 при случайном щ.Iборе, то достаточно после этого выбора выбрать дру­ гую сторону альтернативы. Но это дает выход из пара­ докса Дюнойе (я совершенно не знаю, кто такой Дюнойе, Это - сущеетвенный момент истории науки, который сле­ довало бы прояснить. Всегда цитируют Мзрфи и его вна­ м:енитые законы: если в некоторо1'd опыте что-то 1\IОЖет разладиться, то 1\IOЖF.IO быть уверенны1'd, что это обяза­ тельно произойдет. Если, кро1'dе того, прИ: зто~ в KOJ\fнare есть пQсторонний наблюдатель, то он прибавит «Ну, я же та~~ и говорил".». Дюнойе - предшественник Мзрфи), Вот в че1'd парадокс. Есть альтернатива. Вы выбрали слу­ чайны1\1 образом и обманулись. Следовательно, если вы взяли другую сторону альтернативы, то вы оказались правы. Но зто~ тоже случайный 1;,.выбор 1 поэтому вы опять об1'dан~лись". 73
?-:Игра29. Б -А - БА. · Эта игра вовсе пе потому самая простая среди всех игр этого сорта, что опа называется б-:-а-ба. Согласно [BAL], опа имеет японское происхождение. Ее можно сформулировать следующим образом. Игра равыгрывае'l'­ ся па площадке, разделенной па клетки, па втот раз в чет­ ном числе. Есть шашки двух сортов, скажем, крестики и нолики - как в «ваиуде~. I 1}о!хIoJxJ oJxl oJ xJ ·~о;:ч~:~б~:.~~~а~=~~~ заняты поочередно О и Х, Рио. 21 как указапо яа рис. ·21 ~ При каждом ходе вьi мо­ жете переместить пару смежЯЬiх шашек, перепое.я ее па пару смежных свободilых клеток. Вы вщграете, когда все Х будут вместе стоять яа левых полях, затем будут нолики, а два правых поля останутся свободяыми. Можно также представить это друmм ··способом. С~о­ "боДЯЬiе поля представляются точками (рис. 22), осталь­ ныезаняты·буквамиаиб(вотвамиб- а - ба) . •• аба6 .аба<$ ббббзааа •• Оаа6аба~•б Начальное состояние Конечное состояние Возможный пер внй ход Рио. 22 Пара шашек, которая переносится при даипом ходе, вбсолютио произвольна: две одинаковых буквы, две раз- · пых буквы, все равно в каком порядке". Начните с решения задачи для 8 букв и 10 полей, как на рисунке, Это очень просто в у вас пет необходимости 11 компьютере. Попробуйте затем решить ее для б6льшеrо числа полей. Честно говоря, я соответствующую программу ве на­ писал, потому что ее использование яа компьютере мец, ничему новому яе научило бы. То, что здесь приведепо 1 подходит программисту, который па что-то рассчитывает. Если у вас есть склонность к программированию, то вы вайдете способ решить задачу для всех случаев. *Игра30.Отшельник. Может бЬl:ть, мне и яе · следовало бы помещать «01'- mельпика» в ату главу, · Классификация игр полностью осяоваяа яа оттеяkах и на индиви.цуальЯЬiх оценках. '"
Я провел немало времени в забавах о «Отшельяином»; но все же верно, что еДва только удается обнаружить хорошую стратегию, кап нцтерес уменьшается. Возмож­ ность его программирования связана с улучшениями. «Отшельник» разыгрывается яа площадке с проделанными <1J пей отверстиями, в которых могут быть размещены шаmнн. Но можно также использовать доску, на которой нарисованы поля, а можно также все зто очень хорошо нарисовать па земле и использовать камешки в качестве шашек --:- точно так же, как я рассказывал -i;i:pи игре в лис и кур. Впрочем, может ока- • • •. заться, что «отшельник» был ивобре- •х•" тея каким-нибудь знатным францу- зом, заключенным в Бастилию, кото- • • Х Х Х • • рыймодифицировалигрувлисикур, • • • х •· • • Рисунок 23 представляет одяо ив состояний игры в «Отшельника», Сво- • • • Х • • • бодпые места представлены то11Ками; шашки - знаком Х. Как показы­ вает название, зто - игра для одяого­ единствеппого лица. При каждом ходе нужно съесть шашку, заставляя ...- ••• Рио. 23 перепрыгнуть- через нее другую шапmу так, чтобы по­ пасть Па свободное поле - либо горизонтально, hибо вер­ тикально. Так, па рис. 23 имеется 4 возможных хода: - шашка, лежащая па пересечении планок креста, может в в ять шашку, расположенную яепосредствепяо яад пей, и попасть в сер{ЩИЯу верхней строки (щашка, через которую перепрыгнули, а именво, расположенная в вер­ шине креста, удаляется ив игры); та же шашка может ваять шашку с~ева; или шашку справа; наконец, шашка в центре игрового поля может ваять шаmну под пей, расположенную в визу креста. Цель игры состоит в том, чтобы удалить все шашки, кроме одной. Число необходимых для втого ходов легко подсчитать: поскольку при_каждом ходе берется одна шаш­ ка, то число ходов равно числу подлежащих удалению шашек. В случае креста яа рис. 23 вам осталось сделать до конца еще 5 ходов. Составьте программу для отшельника. Вы даете ком­ пьютеру начальную конфигурацию, например крест на рис. 23. Он сообщает вам ходы, которые приводят к ре­ шению. Другие RQнфигурации приведены яа рис. 24. '75
В своей наиболее общей форме эта игра .начинается с игрового цоля.. полностью по:крытого шаш:ками, :кроме единственного остающегося свободным поля. Попробуйте хх.х ••• ххк ••• •• ххх•• о • х•х•• •• х•хоо .ххххх. • • • оео• •• x :R.JC •• ••• ,х• ••• ••• Рис. 24 заставить вашу програМ'му работать и в этом случае. 'У вас появится новая трудность" связанная с симметрией игры: есть много решений, з:квивалентных с точностью до симметрии. ххх ххх .ххх х•х хххххх:Х ххх•хх}G ххх:•ххх ххххххх ххххххх ххххххх Х·Х х хх:х: ххх ххх ·ххх х•х хххх••х ххххххх ххххххх ххх ххх Рис. 25 На рис. 25 сначала изображена исходная Rонфигура­ ция, Есть 4 различных хода - шашна из перенладивы нр еста прыгает в центр игр_ового поля. Эти 4 хода вачи- Ч6
нают 4 решения, вквивалептных с точностью до Поворота на прямые углы. После втого остаются еще две возмож­ ности эквивалентности с помощью симметрии относи­ тельно вертикальной ·оси игры. Нижняя конфигурация показывает результат одного из втих ходов. В позиции, к которой мы пришли, никакой симметрии уже н~т. Ее-то и возьмите как исходную. Ваша программа дает только одно решение или все возможные решения? Ханойские башни. Печальный конец Паскаля Младшего Очень мало говорят о печальном конце Паскаля Млад­ шего. Его бывшие коллеги знали, что у него I}озникли проблемы, заставившие поместить его в психиатричеtкий госпиталь. Теперь когда он умер, я могу опубликовать письмо, которое он мне послал в свое время; оно уже больше пе может причинить ему вреда ..• «Господин профессор, Я не знаю, помните ли вы меня: я был вашим учеником: n Институте программирования. Конечно, у вас их столь­ ко было ... После того, как я окончил институт, я посту­ пил на работу програмШiстом-аналитиком в бюро обслу­ живания. Я бьiл на очень хорошем счету. Я следовал вашим урокам: использовал программирование «сверху­ вниз», я выводил свои циклы в программах, используя пост- и предусловия и инварианты. Мои программы рабо­ тали верно с первого запуска, с точностью до опечатон. Rороче, по прошествии нескольких лет я сказал себе, что у меня будет более интересная -работа, если я буду вести ее на свой собственный счет. Поэтому я -все подго­ товил, нашел помещение. Я подал в отставку и взял :nce отложенные отгулы, на которые я имел право. БудуЧif холостым, я, вообще говоря, брал очень мало выходных дней, настолько меня захватывала моя работа. Но, соби­ раясь испытать счастья в большом деле и становясь своим собственным работодателем, я хотел получить настоящий отдых. Право, я пе знаю, как зто меня по рекламному объяв­ лению занесло в бюро путешествий «Посетите таинствен­ ную Индию». И вот я отправился с тремя десятками дру­ гих в организованное путешествие. ~онечно, я должен был задуматься раньше, то ли я выбрал, что мне нужно. Оказалось, что я с трудом переношу беспрерывную бол­ товню то одних" 1·0 других; это мешало мне думать о чем- 77
нибудь своем. Мне пришлось примириться с тем, что мне придется думать о чем-то еще, кроме_ написания какой-то упирающейся программы! Детали этого путешествия пе­ существеПНЬI вплоть до дня, когда пас привезли в мопас­ mрь в предгорьях · rималаев. Монах, который пас принял, говорил па отличном французском. Сообщение, которое оп сделал о ?tfQHacтыpe, свидетельствовало о свободном владении нашим языком. Это дощю10 было показаться мне поцозрительПЬiм. Он ввел пас в помещение и~ о того момента как я вошел J-, 1 1 1 1 о1. Рио. 26 я смог только выдавить «ОХ» изумления: мы увидели мопаха 1 который запималси знаменитейшей игрой в Ха­ нойские башни. Диски были ,, очевидно, из золота,, и я сразу угадал 1 даже пе считая,, их ровно 50. ~онах объяс­ Яllл игру посетителям: ,как вы видите_, игра состоит иэ круглой подставки с тремя стержнями. На стержни нанизаны диски раэлич­ :ных диаметров. (Рис. 26 представляет конфигурацию игры с семью дисками.) На каждом стержне диски сложены . в стопку по возрастанию диаметра: никогда ни один циск пе кладется па другой диск меньшего диаметра. в· начале игры, это было много лет назад, дl\Же много веков, все пятьдесят дисков находились па первом стерж­ не. Монах перекладывает эти диски один sa другим~ сле­ дуя r.1етоду1 который мы тщательно продумали. Когда все диски соберутся снова па одном стержlfе, отличающем­ ся от иоходного1 игра кончи.тся. Великий труд, который бощ паJJожили па nюдей.1 б-удет завершея, и сможет uaorymr"tь конец света".» Я решил насмешливо добавить вполголоса: ну, это еще не завтра." Это стоило мне разгневанного взгляда rида · который продолжат tkaк только что заметил один из вас, это занятие по- . .сrребует еще многих столетий, несмотря па большую сно­ ровку монахов, которые перекладывают каждый диск приблизительно за одну секунду&. Я снова продемонстри­ ровал свое раздражение, Разумеется.~: я предполагал.~: что .1 18
из-за меня посещение будет сокращено. Но ве для 'J,'ОГО же я сюда приехал, чтобы цадо мн9й; как и над осталь· ными путешественпиками, насмехались? Мы хорошо знаем~ что игра в ханоijские башни была изобретена в конце прошлого века преподавателем математики в лицее СенТ:­ Луи по имени Люка, который под этц соусом ее и пустил в свет, окружив легендой, согласно которой монахи где-то в Ин,дии суетятся вокруг игры в 50 дисков,, по окончании которой наступит щшец света. Эта легенда делала естест­ венной задачу о подсчете числа ходов{ необходимых для завершения игры. Что же касается того, что кажД!iЙ диск перекладывается за секундуt то это элементарно 1 и мы знаем итеративную стратегию,. которая позволяет нам просто играть, ни о чем не думая - вы ее нам сами ,IfJl.- вaли в вашем курсе в институте ..• Когда мы покидали монастырь, ~аш гид подошел ко мне и спросил меня, пе хочу ли я оказать его настоятелю большую честь своим посещением. Обсуждение с руково­ дителем группы. Назавтра мы пе должны были уезжать рац.о, и поэтому я приняJJ приглашение снова прийти туда до нашего отъезда. Настоятель принял меня очень любезно и предвосхитил мои упреки: «Несомненно, вы уже знакомы с башнями Брахмы. Мы знаем, что они были введены во Франции много лет назад М. Люка. Он ни­ когда пе говорил, что он сам придумал зту игру. Совсем наоборот, оп очень добросовестно изложил то, что мы делаем. И разве мы виноваты в том, что вы вбили себе в голову, что с его стороны это была чистейшая уловка~ чтобы придать больший блеск своему мнимому открытию? А зто была и в самом деле чистейшая уловка 1 потому что ему приписали созданИе этой игры, в то время как оп всего лишь пересказал то, что ему описал один путешест­ венник... Нас тревожит то невероятное времяf, которое нужно для окопчанця игры. Мы очень терпеливыf, однако мы пщем, как двигаться быстрее. Один наш посетитель~ приехавший из американского университета~ предложил нам сконструировать робота-манипулятора, управляемо­ го Rомпьютером. Мы со своей стороны финансировали это исследование. Но робот :iie мог двигаться быстрее~ чем нашИ монахи,. натренированные до совершенства и действовавшие безошибочно>). Когда же я высказал замечание, что при таком решении проблемы игру будуr вести уже пе люди, а машина, настоятель решительно возразил мне, сказав! «Мы прекрасно пользуемся моли.f.,. венными меJiьницами. Во всяком случае1 машина делается 79
ЛЮДЬМИ И уnраВЛНеТСЯ nрш'раММОЙ,~ НаПИСаННОЙ JIIOДb­ Mir,,,& /Он также скааап: мне, каким: обраsом: это иссп:едова- , ние к тому же открывает новые перспективы, Были вре­ мена ., когда монахи пытап:ись присоединить к игре чет­ вертый стержень. Правила оставались такими же: пере­ мещать sa один раа не более одного диска и никогда не класть диск на другой диск меньшего диаметра. Конечно, манипуляция игрой с 50 дисками до .сих пор не удалась. Они вывели 1 что при этом: требуется гораздо меньше хо- , дов ,, но стратегия манипулирования становится много сложнее. Монахи терялись, часто оказывалось, что они ошибаются,, они снова попадали в уже пройденные кон- . фигурации ;, так что не было викаRой уверенности в том:.,: что . удастся дойти до конца, если постоянно приходится · начинать сначала", «Не могли бы вы ваяться за решение проблемы башен Брамы с четырьмя стержнями, составить ·· программу для соответствующего компьютера и исполь­ зовать его для управления роботом, м:анипуJiирующим игрой? Ведь даже если каждый ход отнимет много секунд, конец должея будет наступить намного быстрее. А нам, · таким обрааом:, выпадет величайшая радость - стать теми, кто выполнил волю богов. Мы увидим:, что мир дос твг своего конца, и вступим в счастье, которое никогда' ве кончится ... » Это дело покавалось мне выполнимым:, Договорились, ~то я реаливую информативную систему и передам ее им . .Настоятель вручил мне в качестве оплаты авансом игру, сделанную ив серебра, Это было настоящее богатство. iHy, как тут устоять? Вернувшись во Францию, я ваялся аа работу. Болъ­ - mпх трудностей она не представляла. Вначале я составил рекурсивную процедуру для решения игры с четырьмя ·стержнями. Поскольку я искал оптимальную стратегию, ! я сделал по ней итеративную версию. Для этой м:алею,. : ной программы был достаточен микрокомпьютер. Я ис­ ; n<тьзовал ручной манипулятор ,, оснащенной электро­ •а1агнитом в форме кольца. Я работал с деревянной игрой, iJ<а~кдый .диск которой был снабжен маленьким кольцом i иВ мягкого желеаа, позволявшим ручному манипулятору ' брать его,, и притом не воввикало необходимости чрез- вычайно точно этот диск устэвавливать • .И я был всем очень доволен, пока не повял ввевапно, что я бев равдумий бросился в ужасное предприятие. А что, если монахи говорили правду? Какую польву 80
мне принесет обладание бо1'атством (ибо они должны были ваплатить мне еще" если программа будет работать правильно) 1 если вскоре наступит конец света? Бевуслов­ но, будучи убежденным рационалистом.~: я не очень-то всерьев принимал их истории. Но, в конце концов,, это - новая форма пари Паскаля *). Даже если шанс,; что все это верно, бесконечно мал 1 я не испытывал ни малейшего желания ускорять конец света. Но прошлое верв~ть нельзя.1 и их плату я уЖе получил, Мне припtла в голову поистине дьявольская мысль: эти прекрасные монахи ж~лали конца света, чтобы ка~ можно скорее достичь вечного счасты~.~ вот уж я его им обеспечу, В корпус компьютера я добавил выдвижной ПЩИК 1 который окрестил «КОНЦОМ Света». В нем были под видом блона питания толстые цилиндры, на корпу­ сах которых быJiа маркиронка конденсаторов, во в ко­ торых находились пластиновые бомбы. Маленькое изме­ нение программы дошнно быпо вызвать взрыв сраву же после того, кат\ наименьший диск покидал свой стержень и перед тем, как он достигал места своего назначения. Таким образом, игра никогда не должна была кончиться. Что до монахов, то они будут с восторгом представлять · себе конец света в тот момент, когда вавершится игра. В тот момент чудовищность моего поступка меня не шо­ кировала. Наоборот, я был в восторге: монахи будут счастливы, а я уберегу весь :мир от конца. Я дошел до тоl'о, что смотрел на себя как на благодетеля человечест­ ва. J\овечно, я брал на себя риск. Программу, бев со­ мнения, нужно было испытать. Но, как я вам уже говорил~ я прошел хорошую школу - Вашу- школу - ияпро-. граммировал правильно. J\огда все было ваковчено, я отправился вручить свое проивведение сияющим монахам. Она была испытана на игре в 20 дисков. Затем аппарат был пущен в работу для игры с 50 дисками и 4 стержнями. Тут я попросил у мо­ нахов раврешения удалиться: ведь мне хотелось бы при­ вести свои дела в порядок в то небольшое время, которое •) Имеется в виду поставовка Блезом Паскалем (1623-1662) вопроса о вере в существование боrа как задачи о выборе страте­ rии в азартной иrре («Мысли», отрывок 233): «Взвесим •выиrрыш и проигрыш, ставя на то, что бог есть. Возьмем два случая: если выиr­ раете, вы выиграете все; если проиграете, то не потеряете ничего. Поэтому, не колеблясь, ставьте на то, что он есть» (Антология ми­ ровой филосqфии в четырех томах, Том 2, М., «Мыслыt, 1970, С, 306). - При.меч. пер, 81
остuось НЩf жить, что о:ви очень хорошо понимали. Л вов вратилсц с полными пригоршнями волота. Черев некоторое время сообщили, что ужасный ~врыв неиввестноrо происхождения равруш~л монаст.ырь в Ин­ дии. В живых не о'Ста.дось никого. Моя программа была правильной ... Уже повже меня стали одолевать сомнения. Не были ли монахи правы? Не я ли тот, кто помешал воле богов? Не воспрепятствовал ли я выполнению работы, которая была доверена людям? Не должен ли я сконструировать иrру в 50 дисков, ц не следует ли ее равЬiг,рать, чтобы искушi:ть свою вину? · С этих пор я живу в ужасе. Если я ничего пе делаю,; я несу на себе груа того J что я препятствую воле богов. Если я сделаю игру, что для меня не составляет н:цкакоrо труда, то именно я и приведу мир к гибели ... Л uкому не могу довериться. Я умоляю вас, помогите мне ..• » Л н·е стал вмеmпваться, Душа Паскаля Младцrего не могла сопротивляться этому удару. Он впал в бевумие и немного спустя умер ... И г р а 31. Рекурсивная форма. Письмо Паскаля Младшего ставит много вадач по программированию. Л пе осмеливаюсь предложить вам написать ренурсивную процедуру, . которая перечисляет последовательность движений диенов в и_rре с тремя стержнями, помеченными номерами О, 1 и 2 (например, в форме последовательности строк ДИСК 2 ИДЕТ С 1 НА О~ дающих номер перемещаемого диска 1 есщ1 наименьший диск имеет номер 1i номер стержня, с которого диен снимается, и номер стержня.~ на нотором атот диск ока­ зывается). , Тем не менее эта процедура была бы ·для вас очень полевна как для наблюдения ва перемещениями в течение партии.~, так и для ивучения свойств игры ; . Можете ли вы вычислить число f (n) ходов, необходи­ мое для Проведения партии в игре с n дисками? Сколько веков потре~уется для проведения игры в 50 дисков ~ если каждыи ход делается ва секунду? . Л испольвовал игру ив дереваf, в которой диски были обтесаны иа двух равных пород дерева, поочередно свет­ .пых: и темных. Проводя · игруf ~ожно убедиться, что два диска одоого и того~ же цвета никогда не окааываются друг на друге. Сумеете ли вы покавать это с помощью рассуждения, основанного на рекурсивнQй процедуре? Заметьте~ что это сводится к вопросу четности. Если 82
диеки sанумерованы так, кан это было описано выше, то диски с номерами одинаковой четности никогда ~е попадают друг ца друга. *Иrра 32.Рисунокигры. · Напишите простую рекурсивную процедуру_, наибоЛее обраsно дающую воsможность увидеть движение дисков. Очень общий способ состоит в том, чтобы иsобравить три стержня в виде трех стро~, на которых последовательно поставлены· нощ~ра диенов. Таким обраsом, рис. 27 пред­ ставляет начальное состояние и промежуточное состояnи~ игры с 5 дисками. о 1 2 54з21 Ряс. 27 о 1 2 51. з2 4 Внимание: ваша программа работает слишком быстро, и вы не видите перемещений. Вставьте цикл ожидания_, чтобы sамедлить игру... · Более хитрый способ представляет стержни верти­ кально либо как последовательность номеров, либо - что еще лучше - если у вас есть :rрафическая систем:а 1 стилиsованным: обраsомf ка~< на рис. 26. Это труднее". ? И г р а 33. Итеративная сурат.егия. - Та:ких стратегий мноrо. Сумеете ли вы предложить такую, которая поsволила бы играть по ходу в_ секунду, как у монахов." ???Игра34. Игра с 4стержнями. Составьте рекурсивную программу для игры с 4 стерж­ нями, не sанимаясь представлением дисков на экране каким-либо хитрым обраsом. Вам и беа этого будет до­ статоЧIJо работы. Даже если ваш компьютер не предостав­ шяет вам воsможности вычислять рекурсивные процедуры, это поможет вам Ясно увидеть sадачу и найти стратегию. Найдите способ действовать, минимиsируя число ходов, и найдите их необходимое число для малых sначений п. Иs -цисьма Паскаля Младшего неясно, сколько времени нужно - если каждый ход совершается sa секунду - для sавершения игры с 4 стержнями и 50 дисками. Вычислите .его. ??** Игр а 35. Составьте итеративную програШfу для игры с 4 стержнями. · 8З
Если теперь добавить пятый стержень, то нужно все начинать сначала, или ревультаты, полученные для 4 стержней, допускают немедленную экстраполяцию на слу­ чай 5 стержней? ??? И г р а 36. -Спички Бергсона. Эта игра была предложена выше (игра 23). Тогда тре­ бовалось только дать компьютеру укавание, что он дол­ жен будет сделать, чтобы выи1·рать наверняка, если ис­ ходить ив 50 спичек. Теперь нужно ваглявуть глубже и ивучить выигрывающую стратегию в полной общно­ сти. Rак и во многих играх, есть ситуации, которые по­ вволяют игроку выиграть наверняка (если оп их ввает), и другие ситуации, исходя ив которых выиграть невов­ можно. Пусть П обоввачает ситуацию, благоприятную первому игроку (или предыдущему. П - это первая буква слова «повитиввый», как это ваметил Роув Болл [BALJ). Эта ситуация хороша для меня, если это такая ситуация, которой я достигаю после своего хода. Ситуация Н бла­ гоприятна второму,, «Новому», игроку (неблагоприятна первому, негативна). Она хороша для меня, если это - та ситуация, которую я вастаю в момент своей игры. Вся моя стратегия есть переход от ситуации Н в ситуацию П. Это вее работает, если, походя ив ситуации Н, я всегда могу достичь ситуации П с помощью раврешеввого хода,_ и если, с другой стороны, налицо ситуация П, то я пе могу достичь ни:иа:иой ситуации П с помощью довволев­ ного мне хода. Итак: ив ситуации Н всегда можно достичь ситуации П,, - ив ситуации П можно достичь только ситуаций , Н~ - выигрывающая ситуация есть ситуация П. Игра происходит переходами между ситуациями Н и П. Победитель определяется природой - принадлежно­ стью классу Н или П - начальной ситуации и, таким обравом, определяется тем, кто начинает. В игре в спички Бергсона ситуация характеризуется двумя целыми числами р, q: р - число спичек, оставшихся в куче; q - число спичек, ввятых па предыдущем шаге. Тогда можно ввять от 1 до 2q спичек. · Ситуация О, q - выигрывающая для любого q. Ситуации 1, q и 21 q суть ситуации Н. Исходя ив них~ можно ввя1ъ последнюю спичку. Ситуация 3, 1 есть П: всходя ив нее, вельвя получить ничего, кроме 21 1 и 11 2. и обе эти ситуации относятся :и классу Н. 84
Составьте программу, перечисляющую положения П вплоть до некоторого уровня. Понаблюдайте sa реsультатами. Попытайтесь уsнать их свойства иJ если вам хватит смелости, проверить их. Вы наверняка sваете числа Фибоначчи: они определя­ ются рекуррентным соотношением f(п)=f(п - 1)+f(п- 2) и единичными sвачениями двух первы~ чисел. Какой черт их сюда sавес," 6. КОМБИНАТОРНЫЕ ЗАДАЧИ Я объединил здесь различные головоломки, решение которых для компьютера в принципе нетрудно. Есть конечное число воsможвых случаев. Мы испытываем их все и выбираем наилучший. К этой натегории относится и чемпион мира по шахматам: конечное число шахматных фигур, конечное число правил, нонечвое число ходов." Но, ковечвоf есть препятствие - sто число опытов, которые нужно· провести. Прежде всего нужно хорошо оргавивоваться, чтобы некоторых попытон и не предпри­ нимать. Нужно выбрать также путь, ноторый предостав­ ляет наиболее вовможвые шансы дойти до конца, и не вступать на такой путь, ноторый не дает ничего, кроме неудач. В этом - все искусство программирования. ГоловоJIомка20. Восемьфервей. Вовьмите на заметку: это самая простая головоломка подобного типа. Поставить на шахматной дос1{е 8 фервей так, чтобы они друг другу не угрожали. Фервь может ваять вее, что паходится в этой же строке, что и он, в том же столбце или на той же диагонали. Представим, как обычно, шахматную доску квадратной таблицей полей, среди которых свободные поля помечены точками, а фер­ sи помечены крестиками ( Х ). На рис. 28 представлены две попытки решения. На левой доске поставJtеВЫ 4 фервя. Все поля строки 6 ими уже блокированы. Продолжать дальше бесполеsво. На правой доске мы сумели поставить 7 фервей, во восьмая строка блокирована. Я обратил ваше внимание на эту вадачу, поскольку ее решения всюду приведены. Ее можно в высшей степени sлегантвым обравом решить с помощью рекурсивной процедуры. Но нетрудно дать решение и в итеративной форме, 85
ДеликатНЬIЙ вопроо овЯвая о предс-rав"Лением шахмат­ ной дооки. Но и вовможнооти этого выбора также обоуж­ даются в известных книгах •. Что же тогда остается найти? Если у вас нет ЭТИХ книr,, то остается найти решение. Нет - решения,~ поскольку Их 92. Но · не все они сущест­ венно равличныr так как шахматная доска обладает сим­ метриями. Поэтому пытайтесь искать только о_свовные решения, исходя ив которых и используя симметрии шахматной доски,; можно найти все остальные решения". 1·х••••••• 2 3 4 5 6 7 8 • •х• ••• • • •• •х• •• •х•••••• •••••••• .-....... •••••••• • • • • • о • • Рис. 28 х••••••• ••х••••• •••• х••• ......•х• •х•••••• •••х•••• ••...х•• • • • • • • 5 • В этом примере вам не следует бояться сложности, Даже самые плохие программы будут все еще достаточно быстры". · · ?'1 " 1'Головоломка21.Хферзей. - Поставить на шахматной доске 8 ферзей так.1 чтобы они друг. другу не угрожали .~ можно. Но трудности, с ко­ торыми мы встретились при попытке достичь решения бев помощи компьютера1 ясно показывают., что пет н;еоб­ ходимости в 8 фервях 1 чтобы блокировать вою шахмат­ ную доску. Каково наименьшее число фер~ей" необходимых для блокирования шахматной доски, так~ чтобы пе было воз­ можности поставить ни одной фигуры ни на одно поле~ чтобы один ив уже стоящих фервей не мог эту фигуру ввять? Так как я вам не вадал х, то вам нужно пытаться ва­ ставить х либо растиt либо уменьшаться. Впрочем ~ в этой задаче наши дела идут хуже~ чем с 8 ферзями. В преды­ дущей задаче мы ввали" что в каждой строке и каждом столбце обязательно должен быть ферзь. Если ферзей меньше 81 то это уже неверно. ' 86
*Головоломна22.Домино. Маленькая прелестная головоломна,. совсем не труд­ ная. Она была предложена яа испытании на проница­ тельность на иовкурсе организации АФСЕТ по програм­ мированию в 1981 году. Берутся 7 иостяшеи ив одного набора домино, Напом­ ним, что эти шашки сделаВЪ1 ив двух частей, на иаждо~ ив иоторых либо ничего не написано (чистая сторона), либоочиивчислеот1до6, Задача состоит в том, чтобы образовать ив этих 7 костей все возможные цепи, состыковывая иостяшки до­ мино частями с равными иоличествами точек. Нет никакой уверевности.r что такая цепь существует. Не ведите себя :гаи, иаи пеиоторые ив соревнующихся на этом кониурсе. Я тогда входил в жюри. Мы должны были оценивать работы соревнующихся. Если бы я при­ нимал решения единолично, я потребовал бы, чтобы мне были представлены теисты программ~ и я. бы судил по самим произведениям. Но другие члены жюри нашли более дливный и более сложный метод. Они приготовили специальные тесты. Они должны были быть испытаны на программах соревнующихся, и нужно было подсчи­ тать числ.о правильных ответов, чтобы расилассифициро­ вать соревнующихся. Новое обсуждение: Я' выдвигаю оцениу.~: что и один-единствевный неверный ответ выражает ошибочность программы и, следовательно, выводит ее ив иониурса. В ионце ~юнцов было решено, что так и будем делать. Все программы 1 содержащие ошибку, будут рас­ сматриваться иак неверные, Если две иомавды получат одйнаково верные ответы, 10 мы еще рав детально изучим полученные результаты, стараясь разгадать природу ошиб­ ки при переходе к данному тесту от уже удавшихся, чтобы отдать одному ив них предпочтение. Вот вам и досталось: один ив с.оревпующихся, думая1 что с удавшимися тестами это согласуется, пытался упростить программу для до­ мино. Он сиаsал себе, что вне всякого сомнения, будут даны иости, ив которых никаких цепей ставить нельзя. Его программа читала последовательность иостей домино и сообщала НЕВОЗМОЖНО бев каиих-либо других вы­ числений. Если бы я пе настаивал на своем таи решитель­ но, то он был бы пе хуже других." ·Не поступайте таи. Эта задача при всем том нетруд­ ная." Рис. 29 дает пример цепи. *Головоломка23,Последовательность0-1- 4-6. . 87
Эrо ...... головсщомка, на которую я натолиi~улся, ра­ ботая в-ад с1юей диссертацией яа ученую степень по физи­ ке. я sа:нимал~я сетями антенн дл:я радиоастрономии~ Сеть антенн состоит из основания, на котором по одной пинии равмещены отдельные в.n-тенпы, достав.ляющде ин­ формацию о наблюдаемых нами sвеsдах. ltаждая пара антенн дает информацию о не.которой нэличине, nрвuор­ циональной расстолнию между двумя ан:теJ.ш<ша эт.ой пары. Нас интересуют sначения этой величины, обраsую­ щие арифметическую проrресеию. Таким обраsом, нужно Рис. 29 было располагать антенны таким обраsом:, чтобы рас-.. стояния между разными пцрами обраsоJJывали арифмети­ ческую прогреесию. Я предложил систему иs 4 антенн" расположенных :ца прямой в точ.нах с абсциссами О 1 4 6. Тогда получаем'1!е иs лих 6 раsличных пар приводят к расстояниям между антеннами 1 пропорци.ощшьным сле­ дующим чисдам:: 0-1 1 4-6 2 1-4 3 0-4 4 1-6 5 0-6 6 Можно сфор~улировать sадачу по-другому. Нужно найти последовательность натуральных чисел а11 а2 , ••• г·-1 1------ 13 1-----; Рис. 30 • . •, an - последовательность, которую можно п_редполагать воsрастающей - такую, что­ бы попарные равности членов этой последовательности ai - - a.i (j > i) были попарно раsличны и обраsовывали по­ следоват1;щьность всех пелы:хt чисел от 1 до п(п - 1)/2. Это - еще и проблема трансформатора (см. рис. 30). Если включить во вторичную обмот1tу 4 выхода так, чтобы число витков между первым и другими выходами 88
ваходилось в отношениях 1, 4 и 6, то можно получить 6 напряжений на выходе, обравующих арифметическую прогрессию. Опустим другие фивические вадачи, порождающие та­ кие последовательности. Четырехчленная последователь­ ность 0-1 -4-6, по-видимому, является наибольшей по­ следовательностью, обладающей свойством порождать по­ следовательность первых целых чисел, не пропуская и не повторяя дважды ни одного ив них, при попарном вычитании членов этой последовательностIJ. Так, для 5 целых можно обравовать 10 равностей. Поэтому крайние члены должны быть а1 = О, а2 = 10. Чтобы получить в виде равности 9 ив двух членов после­ довательности, нужно, чтобы либо было а2 = 1, и тогда а3 - а2 = 9, либо а4 = 9. Эти два решения легко полу­ чаются одно ив другого операцией симметрии. Поэтому положим а2 = 1. К этому моменту мы получили уже а1 = О, а2 = 1t а 5 = 10. Чтобы получить равность, равную 8, нужно ввять - либо а 8 = 2, но тогда равность, равная 1, полу­ чается дважды: аз-а2=а2-ан, - либоа4=8, - либо а4 = 9, но тогда снова дублируется равность 1. Следовательно, а1 =О, а2 = 1, а4 = 8, а0 = 10. Достаточно теперь пересмотреть одно ва другим воз- 1110жные вначения а 8 и удостовериться, что каждоеив них дублирует какую-то равность. Для аз, равного 2, дублируется равность 1: 32 44 55 62 71 Таким обравом, нет последовательности ив 5 целых, попарные равности которых порождают 10 первых на­ туральных чисел. Допустим теперь вовможность повто­ рений в последовательности равностей. Можно ли с по­ мощью 5 членов породить - с помощью их равностей - 9 первых натуральных чисел? Об этих последовательностях ничего не иввестно. Пусть дано число п членов последовательности; каково наиболь- 89
шее число последоватепьных целых чисел, начиная с 1, котор:Ые можно nопучить с помощью попарных равностей члеиов последовательности? Запрограммировать это не очень трудно. Но береги­ тесь чересчур долгих вычи·слепийl ?**Гоповолом:ка24.Прогул:ка:королевы. Нет, не в Булопс:ком лесу, если говорить серьевно ..• Прогул:ки фигур на шахматной дос:ке - :классичес:кий сюжет для гоповопомок. Эйлеровский копь должен обойти всю шахматную доску и вернуться па поле, с которого отправился в путь, не попадая дважДЬI ни на одну клетку. Это настолько общеиввестно, что это уже и ве головолом­ ка. Но если вы пе внаете решения, Я не мешаю вам по- пр'обовать. · Случай «королевы» (фервя) - немного другой. Эта фигура может перемещаться по горивоптали, по верти­ :кали или no диагонали . Навовем «движением» перемеще­ ние на некоторое число полей в опредепеппом направле­ нии, Раврешается много рав проходить по одному и тому же попю. Но требуете пройти все поля ва наименьшее вовможпое число движений, причем, конечно, нужно вер­ нуться па исходное поле. Так как число движений пе дано, то пе попытаетесь ли вы сначала проделать все вруч­ ную, .чтобы увнать верхнюю границу... - ???*Головоломка 25. Девушки ив пансиона Киркмапа. Пансион Киркмапа - это колледж для девушек ив высшего общества. Надвирательницей там- мисс Фар­ мер. Каждую среду после полудня опа . сопровождает класс па прогулку. В своей нарядной униформе, в соло­ :иенных шляпках они медленно вышагивают по трое в три ряда. Мисс Фармер несговорчива: «Я пе хочу маленьких компаний; вы должны располагаться так, чтобы не ока- . заться с той же подругой в вашем ряду до тех пор, пока вы пе проведете этих прогулок со всеми остальными». На DТО наши девушки ваявили, что поступать так очень труд­ но. Поэтому мисс Фармер решила сама органивовать ряДЬI. Для начала опа ваяла класс с 9 ученицами. Ей удалось быстро оргапивовать рядЫ. У каждой ученицы было 8 подружек, и опа должна была находиться с дву~ :ия новыми подружками каждую педелю, так что мисс Фармер предусмотрела цикл в 4 педели. · Затем мисс Фармер был поручен класс с 15 ученицами. Поэтому было необходимо ввести цикл в 7 педель для того, чтобы каждая ученица была ва это время в одном 90
ряду с t4 остальными. Тогда мисс Фармер поняла, в юа­ ное ужасное предприятие она окаsалась вовлеченной .. Хотите ей помочь? Но sаметьте: это вы сами пускае­ тесь в это ужасное предприятие. Всячески }Келаю, чтобы вашему микрокомпьютеру бЫ:ло больше нечего делать. Попытайтесь, если все предыдущее не будет отнимать дош·ие часы." 9~ ~~l?l? LЬ~~О QРис. 31 Эта sадача принадлежит Т. П. Киркману и была впер­ вые опубликована в Lady's and Gentlr,man 's Diary ва 1850 год. Для ее решения нужно пролин, немало чернил, и вы можете рассмотреть sначения, от.шчные от 9 и 15. Но выглядит вполне правдоподобным, что 15 - патоло­ гическое число, и Роув Болл [BAL] предложил геометри­ ческий подход к решению, если число девочек не равно 15. Можеr быть, подход с точки sрения инфор)'dатики поsво­ лит вам получить в этой sадаче новые реsультаты". ***Головоломка26.Пент.амино. Домино, пентамино: очевидная игра слов, sаставляю­ щая перейти от шашек с двумя квадратами. к шаmкDм: с 5 квадрата~.ш. Вот двенадцать воsможвых шашек, полу­ чаемых объединением 5 квадратов равной площади. Все они приведены на рис. 31. Эти двенадцать шашек, каждая ив которых имеет площадь 5, могут быть собраны 91
в прямоуго;11ьник с площадью 60. Есть много решений для прямоугольника 6 х 10, а также 5 Х 12. Меньше решений для прямоугольника 4 Х 15 и только два для прямоугольника З х 20, если, конечно, не различать решения, отлич~ющиеся тольно симметрией. Можете ли nы f!айти их за равумное время на вашем 1юмпьютере, проверив, что их действительно именно 2? Есть много путей подхода к этой задаче, даже если все они действуют согласно одной и той же стратегии: перебрать все возможные попыт1ш. Но есть ходы, которые ни к чему не могут привести. Е.ы г н~можете начать с того, чтобы riо­ ставит~> Т в левый нижний угол, как на рис: 32. Ни одна шашка не может замкнуть две заштрихо­ ванные пустые клетки рядом с Т ... Рис. 32 Здесь есть необходимость и для хорошего представления позиций, по также и немного - для хитрости". *Головоломка27.Песенкапочтиспета. Знаменитая игра Армана Жаммо уже бы.ТJа упомянута Rыше (игра 12). Но сейчас мы еще не описываем ее пол­ ностью; она довольно трудна для программирования. Вот другая форма, которую проще реализовать и которая еще не лишена интереса. Я верю также, что для люби­ телей математических раввлечений вдесь есть что делать. Возьмем случайным образом р двузначных чисел. Возьмем случайным обравом также двузначное число s. Соединим эти р чисел между собой сложениями или вы­ читаниями. Все числа должны быть исполЬ3ованы. Можно ли таким обравом получить число s? При последовательных испытаниях компьютер будет · работать быстро. Тогда вы можете попытаться увидеть, что происходит, когда мы заставляем меняться р. Если у вас мало чисел, то у вас и мало шансов получить s. Если вы берете много чисел {большое р}, то, поскольку вы обявапы испольвовать их все, то у вас снова мало шан­ сов прийти к цели. Мне кажется, что наиболее благо­ приятны вначения р около 8 или 9. Но я не осмеливаюсь гарантировать этого полностью. Нужно быть уверенным в генераторе случайных чисел. Получаете ли вы тот же результат? Я пе пытался получить его математическим рассуждением. Может быть, я и неправ. Если я дейст­ вительно неправ, дайте мне внать об этом! ***Головоломка28.Песенкаспета. 92
На этот рав дело идет именно об игре Армана rRаммо. Вам надлежит вадать вашему компьютеру шесть шашек, ввятых среди 24; а именно, в набор входят: подварава- шашкиот1до10, один рав - шашки 25, 50, 75, 100. Затем вы ваrщете исномое число, скажем п, обя:ва­ тельно трехвначное. Требуется соедивить вначения ша­ шен между собой с помощью чет:Ырех операций: сложе­ ния:, nычитания:, умножения и деления __. чтобы полу­ чить число п. Не обявательно испольвопать все 6 шашен. Если число п получить нельвя:, то телевивионная игра допускает и числа, бливкие к п, и тот, чье число б.'Iиже всего к п, и становится: победителем. Теоретически эта программа не должна быть трудной. Есть ограяиченное число возмоЖНЪiх комбинаций: - есть 15 способов ввять две шашни среди 6 и, самое большее, 4 способа соединить их ме)кду собой, следова­ тельно, самое большое 69 комбинаций с двумя шашиами. Но их уже горавдо больше дпя трех шашек. Испытать все комбинации ва равумное время не представляется nовможным. Когда вы ивлагаете решение, вы берете дuе шашки ив 6, соединяете их между собой одной ив четырех оuера­ ций (на самом деле можно считать, что ~9JIЫIO тремя, Начинать с деления - это исключение). Есть 60 (или, скорее, 45) способов это сделать. После этого вадача сво­ дится к вадаче с 5 шашками. При таком подходе решение « ажется более доетищимым. Следовательно, попробуем. Самые большие упроще­ ния новникают, есJш вы не ищете для данного 1ф:сла при­ ближенных sначений. Компьютер выводит реsул~тат, если он его находит; в противном случае он сообща01', что 01:1 решения не нашел. Вы сами м9жете системати•~ески про­ водить одну попытку sa другой. Пусть Pi• р1 , р11 обозна­ чают три ив 6 шашек. Вы можете искать решение в виде р 1 *комбинация иа 5 о~тавшихся шашек = п, р1 + р 1 * комби11ация иs 4 оставшихся шашек = п, -р1 + Pi *комбинация иs 4 оставшихся шашек.= п, ±(Р1 • Р11) + Pi • комбинация ив 3 оставшихся ша- шек= п, где о оsначает одну ив четырех разрешенных операций. Удивительиым обравuм все это очень быс'rро и очень 93
часто при11одит и rочному ответу. Ни.к.то ва вапреща ет вам попробовать что-то лучшее". В соответствии с ваглавием примера попытайтесь цо­ этоиу для 6 шашек 10, 10, 25, 50, 75, 100 найти 370, 369, 368". 7. ОБО ВСЕМ ПОНЕМНОГУ В этом равделе я объединил равличвые вадачи, среди которых далеко не все являются rоловоломками, по той причине, что опыт покавывает: средний програшшст в них достигает цели не бев труда. Для некоторых ив них в равличных книгах можно найти многочисленные реше~ ния, не всегда правильные, или - во всяком случае - пе всегда хорошие, или слишком плохо объясненные. Услови я этих вадач могут покаваться мало привлекатель­ ными. Но если в программировании вы любите именно трудности, не поддавайтесь первому впечаrлению. * Гол о в о лом к а 29. Дихотомичес1щй поиск. Это - · совершенно иввестная вадача. Вам предлагает­ ся упорядоченная таблица попарно равличных элемен­ тов; например, в порядке воврастания. Вам предлагается, кроме того, другой элемент: его нужно равместить в таб- лицу. , , , Следовало бы уточнить (хоть это и не в моих правилах: обычно я предоставляю вам ваботу об уточнении. В этой книге вовсе не я тот человек, который должен аккуратно работать."). Пусть а - таблица с п элементами, упоря­ доченная так, что а[iJ<а[t+1)для1<t<п, -в а; - элемент, который нужно равместить. Его место О, еслиж<а[1], t, еслиа[tJ<х<а[t+1), п,еслиа[п]<х, Один сотрудник факультета Нотр-Дам де ла Пэ в На- 1поре · ивучил 18 программ, опубликованных равличпыми авторами по всему свету и в каждой нашел хоть что-то, вв что можно упрекнуть. Всякий рав, когда я получаю новую книгу по программированию (к счастью, я полу­ чаю не все), я смотрю, нет ли там случайно исследования зтой вадачи, Почти во всех случаях это так. Настоящий сосливый моет•*) информатИ{(и ... •) сОслииым моотош, дальше которого учащеrооя сдвивутъ трудно, С'IИТап:ась в XIl-XIII вв. в Париже.кои . университете либо. 94
*Головолоцка30.Равенство«сточностьюдо пробелом, Пусть даны две буквенные цепочки: а и Ь. Составьте программу, которая может скавать, совпадают ли эти цепочки с точностью до пробелов. Внимание: вы не имеете права иsменять цепочки а и Ь, вы не имеете права порож­ дать новые цепочки. Это sапрещает вам удалить пробелы ив обеих цепочек или копировать их, удаляя пробел;:.1. Под равенством с точностью до пробелов нужно пони­ мать, что обе цепочки должны быть обравованы одними и теми же буквами в одном и том же порядке, если не учи­ тывать пробелы. Такая вадача встречается в системах, свяванных с практической работой, 'с программами, по­ тому что пробелы чаще всего рассматриваются в опера" торах и командах как неsначащие. Если вы находите это совершенно элементарным, вы можете иsучить, являются ли данные цепочки обращениями друг друга с точностью до пробелов. Вы можете также увидеть, является ли цепочка палиндромом (т. е. совпа­ дает со своим обращением) с точностью до пробелов, Так, полиндромами являются А РОЗА УПАЛА НА ЛАПУ А30Р А АРГЕНТИНА МАНИТ НЕГРА Попытайтесь получить правильную (это уж как минимум) и элегантную программу. Головоломка31. Анаграмма. Еще одна головоломка, :l!Опреки ее внешнему виду. Дело в том, чтобы скаsать, являются ли две цепочки букв анаграммами друг друга (т. е. получаются ли они друг ив друга перестановками букв). Эта sадача имее11 соверше_нно равличный вид в sависимости от того, равре­ mите ли вы себе ивменять обе цепочки. или порождать новые цепочки, или нет. Выбор я предоставляю вам ..• Может быть, вы ваметите, что раsличные решения следует 1Jценивать в вависимости от соотношения между раэм~ рамп цепочек и исполь-sуемого алфавита. Подумайте о крайних случаях: алфавит ив 26 букв и цепочка иs 1000 символов; алфавит иs 1000 символов (это вроде китай­ ского".) и цепочка ив 10 символов. - Головоломка 32. Анаграмма·с точностью до · пробелов. теорема о равенстве уrлов при основании равнобедренноrо тре­ угольника, либо rеометрическое доказательство теоремы Пифаго­ ра. - Примеч. пер. 95
Та же головоломка, но, кроме того, пробелы не счи­ таются. Вы можете ее еще немного обобщить: являются ли. две страницы тенета анаграммами одна другой, не считая знаков препинания? ??*Головоломка 33. Переставить две части вентора. Вам дана таблица а с п элементами, Требуется пере­ станитьчасти·сномерами от 1дотиотт+1доп (рис, 33) . :1 mr nf :1 ~ "': Рис. 33 Порядок элементов в каждой ив частей должен быт!> сохранен *). Вы не должны испольsовать вспомогатель­ ную таблицу. Каждый элемент должен быть перемещен не более одного pasa. Это - довольно любопы'l'ная задача, которая была предложена мне Давидом Грисом, и которую он иссле­ довал в своей книге [GRIJ~ Это - один ив редких слу­ чаев, когда я не смог вывести программу ив гипотеsы ренуррентности, 1rак я это обычно делал LARS). В данном случае я сначала придумал программу (ничего особен­ ного, вьi ев, конеч110, прекрасно составите). И только после того - именно после того - я смог покаsать, по­ чему эта программа работает пра·вильно. *ГоловоJIомка34.Задачаоравнинах. Вам дается упорядоченная таблица наких-то элемен­ тов, например, телефонный справочнии (где фамилии расположены в алфавитном порядке. Здесь мы не учиты­ ваем имев). В таблице могут встретиться омонимы (иначе говоря, последовательности ив совпадающих нлемевтов), как в телефонном справочнике. Требуется найти наибо­ лее длинные омонимю больше ли МАРТЫНОВых, чем СЕМЕНОВых? Я испольsовал для этой головоломки наsвание, данное ей в книге Давида Гриса [GRI). Если вместо того, чтобы вsять для иллюстрации таблицу . Фамилий, вы берете *) Вот другая и, на мой ввюляд, С'lолее правильная формули­ ровка втой задачи: циклически сдвинуть элементы п-вектора аа т позиций влево.- Примеч, ред, 06
таблицу чисел, расположенных в неубывающем порядке, то такая таблица составлена иs участков воsраставия, подъемов и р6вных участков, «раввин». Тогда нужно найти наиболее длинную равнину. Эта sадача окаsывается не вполне одной и той же в sа­ висимости от того, ищете ли вы только наибольшую длину равнины (что делает Д. Грис) или ищете одновременно и длину ряда омонимов и сам наиболее часто встречаю­ щийся омоним (что предлагаю вам я). О этой вадачей свявана неприятная для меня история. Я намеревался продумать эту sадачу в Нанси также, впрочем, как и Давид Грис. Я довольно легко обнаружил два решения, раsличные по духу, во не по виду, что поставило передо мной sадачи преобраsования программ (каким обраsом равличные отправные точки могут при­ вести, с точностью до нескольких манипуляций, к одной и той же программе). Как и расскаsывает в своей .книге Давид Грис, я очень гордился своими решениями, пона не обнаружил в той же книге Д. Гриса решение, принад­ лежащее Майклу Гриффиту: его решение намного проще". Сумеете ли вы найти простое решение? ??**Головоломка35.Самаядлиннаявозрас­ тающая подпоследовательность. Пусть дана таблица а иs п каких-либо чисел (но если это може'r доставить вам удовольствие - иs натураль­ ных чисел. Это неважно). Подпоследовательность этой таблицы есть последовательность чисел, выделенная в по­ рядке воsрастания номеров. Более точно, последова­ тельность а [i1] а [t2] а [t81••• а [tp] есть подпоследоnательность последовательности а, если t1<i2<,..<tv• (Числа идут в одном и том же по­ рядке в таблице а и в ее подпоследовательности, но эта формулировка двусмысленна.) Последовательность воврастает *), если, кроме 'lого, а[i1] <аli11<а[i8] <...<а[ip~· Требуется выделить иs а самую длинную воврастаю­ щую подпоследовательность. Вы имеете право испольво вать вспомогательные векторы. Можно найти исследование этой sадачи в нескольких книгах и на нее иsведено немало чернил (да и мела тоже: *) Нужно было бы сказать «не убываеп, но получилось бы совершенно пе в стиле этой книги,- Примеч, ред, 4 Ж, Арсав 07
я видел ее исследования в трудах международных семи· варов). Кроме того, совершенно пе одно и то же - до­ вольствуемся ли мы определением максимальной длины и даже последнего члена самой длинной возрастающей подпоследовательности последовательности а (внимание: может случиться, что есть много таки.t подпоследователь­ ностей одинаковой длины) и.Ли же мы хотим получить та кже список членов такой максимальной последователь­ ности. Иногда в условие вводят дополнительное ограниче­ ние: число требуемых операций должно быть порядка п * ln (п). Я не уверен, что это действительное ограни­ чение. Если вы найдете решение, то оно, скорее все1'0, будет обладать этим свойством. ??**Головоломка36.Самоедлив:~оеслово. Заглавие вводит в заблуждение". Однажды мы про­ водили эквамен у наших учеников в DEUG по составле­ нию программы, которая сообщает, скрыто ли данное слово в данной фраве, иначе говоря, встречаются ли бук­ вы данно1'0 слова в том же порядке в данной фраве. Так, в следующей фраве (взятой ив ~Ярмарки у скупцов)) Жана Шарля): «J е peux !е donnev l'adresse d'цn excellent cireur de paгquet!}: il se rend а domicile» слово TONDEUSE скрыто; (соответствующие буквы под- . черкнуты), по ни слово GAZON (нет буквы G), пи слово DOMINATEUR (все буквы есть, но в неправильном по­ рядке) не содержатся. Но это пе головоломка, это совсем просто (уж это точно".) . Я спрашиваю вас о другом - найти, какое слово наибольшей длины скрыто одновременно в двух фразах. На самом деле, конечно, речь идет не о сло~е, а ~I\()pee о последовательности букв:: какая наибол-ее JIЛИШiая nоследовательпость букв может бытъ обнаружена в одном и том же порядке в двух фравах. Если это может вам по!dочь, то вот другой пример из «Ярмарки у скупцов»: «А l'oc.casion du 14 juillet, les hommes remplacei;:oцt les crucJies dans les chambitJS!>. --.. --: -- - - - Моя trDoгp!l}lмa сообщает мне, что наиболее длинная послё11:1:-т.а1·елт~ость букв, которая встречается одповре­ МеIЦ;iо » OJl:Roм и том же порядке в обоих отрывках, это наоор JETEOERLARNLECREDASLSAME 98
Вы можете проверить, что эти бунвы действительно встре­ чаются в обеих фраsах (во второй из них они подчерк­ нуты). Но вручную невозможно проверить, что этот на­ бор - самый длинный иs воsможных. Если вы не можете доверять вашей программе, не пишите ее". Если вы сожалеете, что я злоупотребил названием, которое напоминает совсем о другом, а именно, об игре Армана Жаммо: найти наиболее длинное слово, которое можно образовать из 9 данных бунв, то я не sапрещаю вам исследовать также и эту игру. Но тут я вижу два препятствия. Во-первых, с точки зрения процесса ее создания есть очень мало того, что требуется обнаружить или отнрыть (если не пришлось открывать какой-нибудь словарь Скраббля). Далее, нужно ввести в компьютер настоящий словарь, что предполагает большой объе~1 хранения и чудовищный труд отстукивания по клавишам, совершенно лишенный интереса ... ?***Головоломна 37. Белый прямоуголь- ник. Ах, ах! Тут-то я вас и поймал. Вы немедленно вооб­ разили себе какую-нибудь не поддающуюся пересказу историю ... Тю{ое в книгах по информатике бывает редко, но бывает [SIK]. В своем сочинении о языке ЛИСП Ло­ ран Сиклосси должен был использовать многочисленные примеры буквенных цепочек, и все составленные им це­ почки одна смешнее другой. Это и вдохновило меня на предыдущую головоломку. Я предложил своему издателю перевести сочинение Сиклосси, что не должно было быть таким уж трудным, поскольку автор использует фран­ цузские фраsы, чтобы блеснуть учтивостью (иначе он бы говорил это по-латыни). Но Сиклосс:И., ноторый превос­ ходно владеет француsским языном - несмотря на то, что он профессор информатики в Соединенных Штатах,­ sахотел изменить примеры к французсной версии книги, испольэуя «акрофонические перестановки» - перестанов­ ю1 букв или слогов, создающие слова с новым sначением ..• Издатель не согласился, и французская литература по­ теряла прекрасное сочинение о языке ЛИСП ... Если вы читаете по-английски и если вы хотите выучить ЛИСП, поче!\1у вам нельзя развлекаться, учась? Здесь речь идет совсем о другом. Эта sадача была пред­ ложена как одна из четырех тем на конкурсе программи­ рования в АФСЕТ неснолько лет наsад. Вам дана прямо­ угольная решетка для кроссворда. Найдите белый (т. е. не содержащий вычеркнутых черных клеток) прямоуголь- 4* 99
ник наибольшей площади, вписанный в решетку (квадра17 есть частный случай прямоугольника). На рис. 34 есть прямоугольник площади 8 в леноч нижнем углу и есть квадрат площади 9. Это - хороший ответ. Программа,. ноторую вы должны сос'Гавить, долж­ на читать размеры сетки (чисJIО стро1' и столбцов), 3а'Гем­ координа'ГЫ черных полей и, наконец, давать прямоуголь­ нин наибольшей площади, например, уназанием коорди­ нат двух противопололшых вершин. Для программистов на конкурсе АФСЕТ это не было легной задачей. Она оказалась едва ли не наиболее труд­ ной вадачей, будучи единственной задачей, доставившей мне затрудне­ ния (см. головоломку 22, другое уп­ ражнение на том ше нонкурсе). Один из соревнующихся достиг цели, решительно пренебрегая эффектюшо­ стью. Вы-то не очень ограничРны временем (по крайней мере временем размышления или временем програм­ мирования). Попытайтесь составить программу, время вычисления кото­ рой не слишном быстро растет вместе Рис. 34 с размером сетки, rоловоломка38. Матема­ тическая комповиция. Ж.-R. Байиф [ВАf], французский языи которого очень -отточен, представил эту головоломку под названием «ариф.. метическая номповицию> в своей книге, ив которой н ее и заимствую, Композиция состоит ив четырех вопросов, связанных с вычислением площади. Один из вопроtов относится к полной поверхности куба, сторона f{Oтopuro измеряется целым числом метров. Вот ответы ученикuв ва различные вопросы: Альбер 8 16 12 16 Бернар 12 16 12 18 Ил од 12181218 Дени 16181220 Эрнест 8 16 10 16 Фернан 12 12 12 22 Гюстав 16 18 12 20 Анри 8161016 Исидор 16 12 12 20 Жюль20121220 iOO
(Это - величины площадей в квадратных метрах, пред­ ложенные учениками.) Преподаватель ставит 5 за вер­ ный ответ и О за неверный ответ. Один-единственный из учени1юв получил О. Кто оказался первым? Вне всякого сомнения, вы можете сказать больше. Эта головоломка кажется мне особенно подходящей для ее решения на компьютере ... ??Головоломка 39. Другаяголоволомка Да­ вида Гриса. Пусть дан вектор, образованный п целыми числами. Подпоследовательностью этого вектора называется набор элементов, в котором инденсы идут подряд. Найти под­ последовательность с максимальной суммой. Если вы предпочитаете другую формулировку, то найдите индек­ сы i, j, для которых величина ai+ai+1 +...+ан+щ максимальна. Внимание: время вычисления не должно расти намного быстрее, чем п, когда п увеличивается ... Эта головоломка до некоторой степени напоминает головоломку о возрастающих подпоследовательностях, но она гораздо менее сложна. Подумайте: линейная зависи­ мость от п! Да ведь зто, грубо говоря, означает, что каж­ дый элеt>{ент вектора рассматривается только один рав. Вам следует составить цикл ДЛЯ i := 1ШАГ1 ДО п ВЫПОЛНЯТЬ".ВЕРНУТЬСЯ И никаких циклов в этом цикле! В ответе вы получае­ те искомые индексы. Оэадачивающе, не так ли? Я поте­ рял на это немало времени. И тем не менее, какое простое решение! ' Как вы находите?
ЧАСТЬ 11 ПЕРВАЯ ПОМОЩЬ У вас возникли затруднения,- вы не знаете, как приступить к игре или головоJюмке. Я не хочу предла­ гать вам готовое решение, иначе в чем будет удовольствие? Но, вероятно, нижеследующие указания наведут вас на правильный путь. Если бы я мою использовать дискетку вместо книги, я разложил бы эти указания на как можно большее число уровней, чтобы вы были в состоянии брать из них тот строгий минимум, который позволит вам про­ должать решение. Но и в книге вы всегда можете про­ честь только начало и - как только искра вспыхнет - отложить книгу и завершить решение самостоятельно. Некоторые упражнения кажутся мне настолько оче­ видвыми, что я ничего про них H J СI{ажу. Но, конечно, это субъективная точка зрения: они могут не казаться очевидными вам. Может быть, потому, что вы не видите, в чем задача: разберите простые случаи вручную. В лю­ бом случае старайтесь сформулировать задачу с макси­ мальной возможной полнотой, Если и после этого вы по­ прежнему не видите, как вам ее охвзтить, поговорите с друзьями или с приятелями. Я умышленно не собираюсь сообщать вам все. Эта книга написана для того, чтобы вы стали программировать. Вам играть.•• 1. СЛУЧАЙНЫЕ ЧИСЛА Упражнени:е2. Нужно изучить поведение дробной части (х + а) 8.1 когда х меняется от О до 1. Нарисуйте~ хотя бы прибли­ женно.~ кривую_,. представляющую эту функцию. Рассмот­ рите интервал на оси х, в котором значение функции меняется от некоторого целого числа до следующего за ним. Отметьте на кривой точку" в которой ор,р;ината равна этому целому, увеличенному на О,_5. Она разби­ вает область изменения х на два интервала, Равны ли между собой эти две . половинки? EcJIИ одна из них боль­ ше другой - и если это ОР.на и та же nоловивка д.1я 102
всех интервалов - то у вас больше шансов получ;ать числа, меньшие (или большие, вам будет видно самим),. чем 0,5. Но что касается выбора а, то напомним 1 что следует избегать соотношения дробная_часть ((х + а) 8) = х,. иначе вы вместо случайной последовательности получите постоянную последовательность. Проверьте числа х = О, fX=0,5их=1. . УПражнение4. Вы располагаете генератором случайных чисел, даю­ щим число, содержащееся между О и 1.• и вы хотите полу­ чить случайным образом число между 1 и 6, включал границы. Тогда остается сказать, что вам нужно разли­ чать 6 случаев и приписать каждому из случаев значение одного из этих целых чисел. Почему не разделить интервал (0,1) на 6 частей? Или еще по-другому: почему бы не умножить вы­ ше случайное число на 6. Тогда оно окажется в интер­ вале (О, 6), исключая 6. Если вы возьмете целую часть результата, то вы получите целое число от О до 5, вклю­ чая границы, с равными вероятностями для каждого числа ... Завершить следует вам, я уже сказал слишком много! Игра1. Если вы знаете, как сделать предыдущее упражнение,. то это для вас уже не задача. Нужно подделать кости, иначе говоря - сделать так,, чтобы одна из граней вы­ падала чаще остальных. Это должно означать,. таким об­ разом, что вместо того, чтобы делить интервал (О, 1) на 6 равных Частей, нужно взять 5 частей равных между собой, а шестую побольше. Легко! Наиболее простое ре­ шение состоит в умножении случайного числа на целое, большее 6, и в присвоении новых значений грани,; ко­ торую вы решили предпочесть. Элементарно, мой дорогой Ватсон! Игра2. X.-R . Байи упростил вадачу, указав две возможные стратегии: - бросать кость до тех пор, пока не будет достигнута некоторая намеченная заранее сумма (по крайней мере если игрок не будет остановлен по дороге выбрасыванием единицы); i03
- бросать кость определенное число paai намеченное ааранее. В первом случае предположимJ что уже имеющанся у вас сумма равна п и что вы собираетесь осуществить еще одно · бросание. У вас есть один шанс ив 6 получить каждое ив следующих шести чисел: О, п + 2" п + 3, п+4, п+5, п+6. Если вероятный выигрыш не уве­ личивает полного выигрыша (если среднее из этих чисел меньше п), то играть не следует. Бы должны получить п ::::::i; 20. Если вы бросаете кость 6 раа 1 то - поскольку все грани имеют равные шансы выпа ~ть - вы должны uро­ играть. Это не слишком строгое рассуждение1 но корот­ кое... Если единица вам не выпала, ·ro у вас один шано из пяти получить числа от 2 до 6, Что дает в среднем 4. За 5 ходов получаем 20. Это - еще один способ получить оценку для числа ходов. Но есть и другие возможные стратегии. Вы можете, в частnости, решить останавливаться в зависимости от того, какое из двух событий наступает первым: сумма, больiпая 19, или число ходов, равное 5. Испольауйте ваш компьютер, · чтобы проиавести соот­ ветствующие опыты. Если вы хотите взглянуть на это с точки зрения ис­ кусственного интеллекта, то вы можете также снабдить вашу программу механизмом самообучения. Вы поме­ щаете в вашу программу три упомянутые выше страте­ гии. Розыгрыш определяет случайным образом ту, юэ-­ торая будет использована в каждой ив партий. Вначале все три стратегии имеют равные вероятности. Если вы­ бранная стратегия выигрывает, то вероятность ее при­ менения увеличивается. Если она проигрывает, то ее вероятпость уменьшается. Чем больше вы играете, тем чаще компьютер должен выигрывать. После очень боль­ шого числа партий полученные частоты применения стра­ тегий скажут вам, какая из них является наю1учшей. Головоломка1. Это - нетрудная программа, разве что вы не ваяли па себя ааботу четко сфор:11у лировать задачу. Последо­ вательность целых чисел,. порождаемая этой программой~ явJшется так называемой возвратной последовательностьЮt каждый член которой полностью опрелеляется знач~ пием предыдущего члена~ i04
Сказать, что последоватеJ1ьность ui становится периоди­ ческой - то же,. что сказать 1 что существует некоторое р, для которого для достаточно больших i. Но если это выцолняется для данного i 1 то Ui+p+i ...:._ f(Ui+p) = f(Ui) = Ui+i и, слецовательноf Uj+p = и1 для любого /,: большего t. Пусть r - наименьший из индексов, для которых Ur+p =с = Ur• От вас не требуют найти число r, нужно найти только число р. Можно предложить два решения: - если t - достаточно большое число, кратное Ps ТОU2t=U1; - выберите исходное значение d и длину интервала h, Для любого i от d+1 до d+h посмотрите, не равно ли соответствующее значение и числу ud. Если равно" то вы нашли период и все закончилось. Если же ника­ кого равенства не получается;, то либо d меньше, чем rt либо h меньше р,, либо и то, и другое. Попытайтесь сде­ латьтожеещеразсбольшимиdиh. Есть много способов реализовать вторую из этих стратегий. По нрайней мере в некоторых случаях она быстрее первой. Головоломка2. Совершенно ясно, что вы не можете начинать прово­ дить какие-либо статистические подсчеты до того, как вы реализуете т бросаний. Наш маленький вундеркинд хотел бы сделать единственный цикл, в котором т - 1 первых ходов подвергаются специальной обработке. Это - соверri:rенно бесполезная сложность. Составьте первый цикл по данным т первым ходам. Затем - второй цикл~ проводящий статистику. Наш маленький вундеркинд совершил и вторую ошиб­ ку, для меня еще более необъяснимую: он объединил последовательные ходы в таблицу, Но это совершенно бесполезно. В любой момент единственное,. в чем вы нуж­ даетесь, это в результатах т последних бросаний. С каж­ дым новым бросанием результат наиболее старого из учи­ тывающихся ранее бросаний теряет силу. Поэтому вы можете его упразwшть, Если и есть таблица.~. то ее раз­ мерm.i,анеnl 105
Но не очевидно, каким образом хранить в таблице т бросаний. Вы можете п~дставить их в виде т символов, образующих цепочку. На каждом ходе цепочка теряе11 свой последний символ и получает новый первый символ. Но можно сделать еще и по-друrому. Речь идет об «орле» и «решке». Нам нужно только gва различных симвоJ1а , например, О и 1. Эти т символов О и 1 могут рассматриваться как цифры числа в двоичной записи. Тогда вам не нужна ни таблица, ни цепочки символов. В_ соответствии с выбором нужно выполнить либо умно­ жение на 2 (что сводится и одному сложению)~ пибо деле­ ние на 2. Относительные успехи трех ваших решений зависят от используемой вами системы. В зависимости от унрав­ ления1 принятого для таблиц и цепочек" в зависимости 01 искусства программиста, составившего систему интер­ претации вашего языка высокого уровня, · либо таблица одоJiевает цепочки, либо наоборот. В составленной мною системе па яаыке LSE использо­ ваны двоичные числа_, р,ающие несколько лучший резуль­ тат ., чем полученные с помощью цепочки ,, иоторые.t в свою очередь, дают заметно лучший результат~ чем получен­ ный с помощью таблиц. Иrра3. Единt:твенная трудность в этой программе~ перетасо­ внть карты. Н уже упомянул об атом, описывая условия игры. Есть много воаиожных идей~ - приготовить сначала карточную колоду, затем вы­ т::~скивать их иа стопки одну sa другой. В этои CJiyчae у вас будет выбор, как поступать: либо расположить карты в таблицу е 52 поляии, либо создать цепочку ив 52 символов. Но нужно ли это па самом деле? Почеиу бы не исходить из простой начальной ситуации~ упорядочеНRой таблицы или отсортированной цепочки, аатем выбирать элеиевт это­ го множества с помощью случайного бросания, вынимать его из множества и повторять процедуру о меиьmии коли­ чеством элементов. Если так поступать," то применение таблицы становит­ ся тонкой задачей: как изъять элемею ив множества? Его можно изъять сфиаическJD. Все влеиепты, распо­ ложенные выше него, спускаются в таблице ввив на одну ступеньку. Это сохравяе11 порядок оставшихся ЭЛЕr ментов. 106
Но нужно ли это? Почему быt что гораздо проще, не переставить выбранный элемент с последним элементом таблицы в процессе выполнения операции? Rак только мы это обнаружилиr, становится очевпдно,, что в перетасовывании карт~ исходя из начальной коло­ ды, больше никаких трудностей нет: вы размещаете коло­ ду в упорядоченную таблицу из п карт, вы выбираете случайным образом целое число между 1 и п, вы меняете местами соответствующий элемент с элементом п, затем вы уменьшаете п на единицу и повторяете процедуру. Элементарно, когда все испробовано! Игра4. Я уже Дал все необходимые пояснения, кроме порож­ дения лабиринта. Первую попытку я предпринял со сле­ дующии алгоритмом~ - поставить l в начальное положение (правый ниж­ ний угол), - выбрать случайным образом направление перемеще­ ния (целое от 1-до 8); если это перемещение невозможно - перейти к следующему перемещению, пока пе будет най­ дено возможное перемещение; - передвинуть i в соответствии с этим перемещением; - если i оказался па поле прибытия, то все эаковчево,, в противном случае повторить процедуру. Опыт показывает~ что чаще всего эта программа не останавливается. Так как есть основное направление перемещения,; под­ лежащее реализации (диагональ игры), то я изменил слу­ чайный выбор так" чтобы сделать более частными пере­ мещения влево и вверх или вверх и влево. Так как у меня еще были и другие задачи, я решил ос­ танавливать случайный выбор~ ко"'rда i оказывается в ма­ леньком прямоугольнике вверху слева. Полученный ре­ естр (сделанный из таблицы или цепочки символов) дает тогда путь,; ведущий из каждой из точек этого прямоуголь­ ника к полю прибытия. Остальное просто. Игра5. Эта игра пе представляет никаких трудностей. Пусть вы пе пытаетесь гарантировать Топи возможность выхода. В программе - винакой стратегии~ один ход на два поля~ два препятствия па горизонтальной линии па двух сво­ бодных полях (вы выбираете клетку случайным образом. Если опа или ее соседка справа пе свободны, то вы повто- . ряете выбор. Если они свободны - вы _их помечаете. Тем 10~
хуже для Тони, если оп нанрыт), два ,препятствия случай­ ным обравом на двух вертикальных полях. Если вы решили оставить Тони шансы на спасение,; 11ействуйте 1 как в предыдущей программе. Вы случайным обравом выбираете 11уть и обовначаете его так,,. чтобы ни­ Rакое препятствие на него сверху не падало. Но вы не вы- 11одите на экран этих обовначений. 2. ИГРЫ С ЧИСЛАМИ Головоломка3. Л нашел это упражнение в монографии 1 по.священной языку Пролог. Предложенное там решение действует ме- 1rодом проб и ошибок. Но вадача решается намного проще. Rак всегда, полностью определим вадачу. Искомое чис­ по представляется в десятичной системе последователь- 11остью цифр CnCn-1 ••• с15 Умножая на 5.• получаем 5cnCn-1 • •• С3С, Отсюда следует, что с 1 а:: 5. Все цифры с1 точно так же итеративно вычисляются справа налево, обыгрывая ос­ тавшееся от предыдущего умножения <ш уме&: когда вы умножаете крайнее справа 5 на 5, вы получаете 5 единиц, что и дает с1 = 5, и 2 «В уме». Тогда вы можете вычислить с 3 и новую цифру «в уме» и продолжать шаг ва шагом. Остается маленькая вадача о том, как узнать, когда сле­ дует остановиться. Ивучите ее сами; как обычitо, я не хо- 1rел бы сообщать вам все ... Вы можете также действовать слева направо: 5CnC11-1 •• , С3С t ! 5 = CnCn-1 ••• С3С25 Деля левую цифру на 5, вы получар,те Сп= 1. Имея сп, вы можете продолжать деление. И здесь тоже вам нуж­ но будет принимать во внимание перенос результата, по­ лученного при предыдущем делении, и нужно будет внать, ногда остановиться. Эти два метода по существу равно­ сильны . Остальное оставляю исследовать вам. Головоломка4. Обычно я бываю глубоко равочарован тем, что нахожу в книгах по информатике или по математике касательно нвадратных корней. Чаще всего вам предлагают метод 108
Ньютона: пусть вам нужно извлечь квадратный корень из числа х. Вы образуете возвратную последовательность и; по правилу ин~ = (и; + (х/и1))/2. Вне всякого сомнения, вы можете взять и0 = 1 в ка· честве начального значения. Эта последовательность очень быстро сходится к квадратному корню из х. Если,_ напри­ мер, вRять х = 50 и воспользоваться формулой и;+~ = целая_часть ((и; + (х/и;))/2), чтобы иметь дело только с целыми числами, то в качестве последовательных значений и вы получите Uo=1,U1=25,U2=13,U3=8,U4 , 71; U6 """ 7. Чтобы использовать здесь этот алгоритм, вы должны написать программу целочисленного деления двух целых чисел большой длины. Другой способ действия основан на том факте, что раз­ ность двух последовательных квадратов есть нечетное число: (п+1)2 - п2 = 2п+1, так что последовательные разности являются последова­ тельными нечетными числами. Поэтому можно видеть,_ что сумма нечетных чисел от 1 до 2k - 1 включительно есть k 2 • Обратно, если вычитать из п последовательно возрас­ тающие числа, пока это возможно (не допуская, чтобы результат становился отрицательным), тогда искомый квадратный корень есть k, если последнее нечетное вычи­ таемое равно 2k - 1. Таким образом, для 50 50-1=49, .49-3=46; 46-5=41;: 41-7=34,: 34-9=25, 25-11=14~ 14-13=1. Нельзя продолжать" не получая отрицательной раз­ ности. Последнее нечетное вычитаемое равно 13, поэтому корень есть (13 + 1)/2 = 7 (и остаток 1). Этот способ го­ раздо лучше подходит для распространения на случай очень больших чисел, потому что вам требуется реализо­ вать 'l'олько две операции: 109
- прибавить 2 к большому числу; - вычесть одно большое число ив другого. Но число шагов цикла равно искомому квадратному корJiю,- а он может окаваться весьма большим. Можно обобщить предыдущий алгоритм, испольвуя свойства десятичной ваписи чисел. Данное число равделя­ ется на куски по две цифры, начиная справа; ватем мы на­ чинаем вычитать последовательные нечетные числа ив крайнего слева куска: 1909 1809 1509 1009 -1 -3 -5 -7 1809 1509 1009 309 Если это нельвя продолжать дальше, то последнее вы­ читаемое число увеличивается па единицу, сдвигается на . один шаг вправо_; и следом ва ней приписывается едини­ ца. Это - первое нечетное число, которое следует вычи­ тать ив предыдущего остатка. В приведенном выше примере 7 + 1 = 8; приписывая ~ 1 получаем 81 и продолжаем: 309 228 145 -81 -83 -85 228 145 60 Поскольку продолжать дальше вельвя (последнее воз­ можное вычитание ив остатка - это крайнее справа), то последнее ив вычитаемых чисел нужно увеличить па 1~ а ватем равделить на 2, чтобы получить корень. Послед­ ний остаток и есть остаток квадратного корня: 85+1=861 86/2=43, 1909 = (43)2 + 60. Этот алгоритм достаточно прост для программирова­ ния при длинных числах, и он дает вполне равумное вре­ мя вычисления. У вас много вовможностей представлять свои данные. Так как мы оперируем с кусками ив двух цифр, то вы мо­ жете вадавать свои данные таблицами целых чисел в ин- 1rервале от О до 99. Вы можете представлять свои целые числа как цепочки символов, где испольв_уются только числовые символы (цифры) от О до 9. Выбор способа вависит от ваших пред­ почтений и от вовможностей вашей машины оперировать с таблицами и цепочками. Тщательно рассмотрите, какие операции нужно сделать. Вы ничем не ограничены: почему бы пе вапрограммировать и сравнить два равных решения? ,но
Я предложил вам алгоритм без доказательства. По­ этому попытайтесь его проверить ... Я предложил вам алгоритм дл·я десятичной системы счисления. Можно предложить похожий алгоритм для двоичной системы. Тогда не возникнет цикл вычитаний последовательных нечетных чисел из каждого куска;, по­ скольку в куске есть только одно нечетное число: 1. Алго­ ритм упрощается: если можно вычесть нечетное число - мы его вычитаем" в противном случае мы не делаем ничего. Затем сдвигаем,. добавляем 1 и приписываем 1 в конце... Этот алгоритм цамного легче реализовать. Но тогда нуж" но сначала перейти к основанию 2,. а затем преобразовать двоичный результат в десятичный. Вам следует посмот­ реть, что более эффективно ... Головоломка5. Аюrу-ратно поставим задачу. То, что от вас требуется,,­ это не взятая глобально последовательность, а вот что: если начало последовательности выписано, то нужно най­ ти следующее число. Возьмем пример" данный в 'Голово­ ломке 5: какое число следует за 50? Есть ровно три возможности. 1. Число делится на 2. После однократного деления на 2 оно не будет иметь других делителей нуля, кроме 2, 3 и 5. Следовательно, это число - из последовательности. Так как 50 : 2 = 25,: то полученное частн()е ~ольше~ чем 25. Наименьшее число последовательностиr, ~~льшее 25,J есть 27. Таким образом, если следующее за 50 число де­ литсянадва,тооноравно2Х27=54. 2.· Оно делится на 3. То же рассуждение. 50 t 3 = 16,7. Первое число последовательности, большее 16,7, есть 18. Если следующее за 50 число делится-на 3, то это число равно3Х18=54. 3. Оно делится на 5. 50 i 5 = 10. Следующее за 10 равно 1·2r. 5х12=60. Таким образом,. у нас 8 кандидата: 54, 54, 60. Наимень­ шее из этих трех и есть искомое. Мы получили 54, используя только уже вычисленную часть последовательности Хэмминга. Я предложил :ьам идею решения на примере. Вам щr~ дует ее обQбщИт,ь{ по~t_зать,. что это всегда вер:яо.li и со-­ ставить хорошую прогff1'1мму для решения. Головоломка6.
,., Я предлагаю вам начать о образования различных чиr,­ r повых последовательностей" получаемых вычеркиванпем 1 чисел. Бот первые из них: ·1 23!(5р.7//91Л·11#.13ffi1~J;t17~19 2 3 57'~1113?.J1719.ti2525#"2951$35 3 57111317z§2325295'1i'5'57414347ff9 На этом уровне можно поверить 1 что появляется воз- 11ратное соотношение~ во второй последовательности нет четных чисел., в третьей - нет кратны~ трем. Образуем следующую: 25, кратное 5 содержится. Покажем механизм перехода от одной последовательности к другой после­ довательности 3:571113171928252931858741434749; 5:71113172825298187414347 Если вы все это хорошо поняли, то вы теперь должны суметь обобщить. Обозначим через g (t, j) чиоло 1 стоящее ~ последовательности ранга ti которая начинается с g (is О). Число g (t., О) == h (t) и есть счастливое число ранга t. Если вы можете построить g (i + 11 i)t исходя ив g (ii .• . )JJ то вы должны суметь решить задачу. Само собою разуме­ ется., что таблица чисел g не должна участвовать в про­ грамме. Это - только промежуточное средство вычисле­ ния ... Голо.воломка 7. Нужно попытаться сгруппировать эффект неско~ьких пооЛ:едовательных шагов. Нечетное р дает (Зр + 1)/24 но­ !!'орое можно еще переписать в виде 3(р+1)/2- 11 что дает правило: добавить 11 разделить на 2 и умножить па 3"1' уменьшить на 1. Предположим,; что результат нечетен. 3а операцией «уменьшить на 1» ораву же следует операция «добавить 1», и в результате этих двух операций ничто не меняется. Отсюда следует новое правило: добавить 1, пока результат четен~ делить его на 2 и умножать его па 31 112
уменьшить на 1t делить на 2, пока это возможно. Составьте по этому правилу программу и заставьте ее переqислять все величииы, полученные таким образом (все они будут нечетпы. Заметьте, что только первое число в ряду может оказаться кратным трем). Если вы замените 3 на т, то второе правило изменяет­ ся: пока результат четен, деJ1ить его на 2 и умножать его па т. Вернемся к случаю числа 3. Наше правило можно пе­ реписать следующим образом: пусть k - некоторое не­ четное число; тогда 2Pk - 1 дает (3Pk - 1)/2Q, Назовем эту операцию переходом р, q. :Можете ли вы показать, что: если п = 2 по модушо 3, то элемент" следующий за п, равен некоторому элементу, следующему за (2п - 1)/3; если п дает некоторое п при переходе р, q, где q > 1i то число (п - 1)/2 порождает ту же последовательностьr что и п, за исключением, быть может f нескольких первых членов. Любое число вида п = 4k + 1 имеет непосредственно следующее п' < п. Для того чтобы п допускало переход f, 1, необходимо и достаточно., чтобы п имело вид п = k2 - 1i где k = 1 по модулю 4;~ если р нечетно.~: k=3помодулю4,еслирчетно. Если вы хотите проверить с помощью программы, что это свойство выполняется для любого нечетного п в дан­ ном интервале ОТ 3 ДО n, ВЫ можете пробежать ВОО нечет­ ные числа в возрастающем порядке и проверить~ что для наждого ив них зто верно. Но вы можете сначала вычерк­ нуть иэ списка все нечетвые числа, о которых вы знаете, . что их поведение сводится к поведению последовательно­ сти, относящейся к меньшему нечетному числу, поскольку список нечетных чисел пробегается в возрастающем по­ рндке, и зтот случай уже был изучен. Таким образом, остается не больше чисел, чем уже было отмечено. Но построить список априори, без вычеркиваний в бо­ J1ее широком списке, так же трудно, как построить после­ довательность счастливых чисел ... Затем можно пытаться сделать еще один шаг: для лю­ бого не вычеркнутого п вычислить первый следующий з::~ ним элемент. Он больше п (в противном случае п был бы вычер1шут). ЕсЛи он содержится в интервале от 3 до N" 113
то мы ничего не делаем (этот случай будет изучен ниже). Если же он больше N, то мы помещаем его в резерв. Та­ ким образомt мы получим некоторый список чисел, боль­ ших N. Если для К{!Ждого числа из этого списка возврат­ ная последовательность достигает 1" то мы сможем дока­ зать, что это свойство выполняется для всех чисел.,, мень­ ших N, и еще для некоторых других. Конечно( это не доказывает общей теоремы: для любо­ го п предложенная последовательность достигает 1. Но нужно присоединить к делу новую форму рассуждения~ которая потребует серьезных равмышлений и надежных логических оснований для того, чтобы окавалось возмож­ ным поправить дело". Вот,. наконец; последнее свойство, которое вы должнь1 уметь докавывать: не существует пар Pi q, где р и q - на­ туральные числа, для которых п дает п при переходе р, q. Это не овначаетf что не существует периодических после­ довательностей. Про них я сумел доказать только то1.1 факт,: что не может иметь места ци1ш п дает n1 при переходе р, q; п" дает п при переходе р', q~. Как бы то ни было, этого на сей рав недостаточно. Но это полевно, чтобы увидеть~ каким обравом 3 играе'l.1 существенную роль . в втом деле". Зашифрованные операции Общая идея состоит в том,, чтобы перепробовать все вовможНЪiе комбинацииt соrласующиеся с условием, и со­ хранить только те ив них 1 которые удовлетворяют предло­ женной операции. Головоломка 8. Пусть даны вначения D и Е (вначения различны). Иэ них получается У и то" что «в уме». По этой величине «в уме)) Получается вначение N. Так как N + R +«В уме»= = Е (плюсt. быть может .,; 10) и так как Е иввестно, то толь­ ко N можно выбирать проиввольно. Кроме того, нужно,1 чiобы оно отличалось от D .• Е и У и нужно, чтобы R, по­ лученное таким обравом,; отличалось от D, Е, У, N. Если пок~ все идет хорошо, то вы продолжаете выбор. Если уже возникла невовможность,. то вернитесь навад и осуществ:И­ те друrой :выбор N. Если никакой выбор для N не окавы­ вается возможным.~; вернитесь назад и измените выбор Е.•• . 114
Это - одно решение. Но оно может потребовать много времени. Чтобы выиг­ рать время, ограничьте возможные выборы. Очевидно, что значение SEND ограничено числом 9999, как и MOREf и поэтому значение MONEY не может превосходить 19998. Так как это - число из пяти цифр, то М = 1. Это осво­ бождает вас от испытания 1 для D и Е. Если цифра еди­ ниц суммы D + Е равна 1, то этот набор D и Е недопус­ тим. Поставьте 1 на свое место: + SEND IORE 1 ONEY S + 1 + «то, что в уме» дает число., большее девяти Это возможно только в случае, если мы предположим что «В уме» для S кое-что есть: · s+2=10+о. (справа буква О,, а не цифра ноль). S + 2 может превосходить 9 только в случае, если S больше 7. Единственные возможные значения - это S = 81 что дает букве О значение О, S = 9, что дает букве О значение 1. Но 1 уже присвоено букве М. Следовательно, S = В ио=о. Метод, использованный в этом упражнении, имеет очень широкую об.пасть применения. Нужно исследовать все возможности, чтобы выявить те, которые удовлетворя­ ют условию задачи. Мы упорядочиваем их таким образом, чтобы, переходя от одной комбинации к следующей, пе­ ресмотреть их все и ·притом по одному разу. 1. Берем первую комбинацию. 2. Испытываем ее. Если она удовлетворяет требова­ пиям, запоминаем ее значение. 3. Если это - последняя комбинация,. то все значе­ ния записаны и все кончено. 4. Если не последняя, то переходим к следующей ком­ бинации и повторяем, начиная с пункта 2. В данном случае - так как мы уже знаем значения букв S, О, М, остается только три еще не определенных значения: D, Е_, N. Для каждой из них берем постепенно возрастающие значения, изменяя их таким образом, что­ бы сначала возрастало N при постоянных D и Е. Затем 115
меняется Е при постоянном D (а N пробегает все возможны,е значения). Когда все возможные значения для Е испыта­ ны, мы переходим к следующему значению D. Таким образом, D может принимать 7 значений. Для каждого ив них Е может принимать 6 значений. Для каждой такой пары · N может принимать 5 значе. ний. Отсюда следует, что нужно перепробовать 7 Х 6 Х Х 5 = 210 значений, что совершенно не затруднит ком- пьютер ... Головоломка9. Будем действовать, как в предыдущей задаче. Но здесь есть некоторая дополнительная информация. В ус­ ловии участвуют 10 букв: HELPTYOUNG Так как они имеют значения в виде 10 цифр, где каж­ дая цифра участвует и притом только один раз, то H+E+L+P+T+Y+o+u+N+G= = о+1+2+3+4+5+6+7+8+9=45. Если вы учтете очевидные значения букв У, О, Н, то вы сможете дать сначала значения каждому из чисел «в уме». Используя тогда соотношения между значениями букв, заданНЬ1х в зашифрованном сложении, вы сможете получить соотношение между четырьмя буквами и вывес­ ти из него, что Е нечетно. Отсюда вы быстро выведете~ что оно может принимать не более двух значений: 3 и 5. Испытайте их одно за другим." Головоломка10. Здесь снова используются 10 цифр. Бы знаете их сум­ му. Она делится на 9. Вы знаете кое-что о сумме цифр ре­ зультата. Вы легко сможете заменить это умножение сло;нением. В :Нем вы сможе.те определить все величины «В уме». Вам останетея сде.тrать не так уж много попыток ..• ГОЛОВОЛОМКа11. Эта головоломка намного серьезнее. Если вы пойдете по пути систематичес1шх испытаний, то вы рискуете по­ т е рять время :зря. Есть 9! = 362880 перестановок девяти первых цифр. Не все они подлежат проверке, поскольну крайняя слева цифра не может превосходить 3. Но остает­ сп еще очень много во:зможностей. Запишите это символическое умножение и обозначьте его величины «в уме». После умножениа на 3 величина «в 116
уме» может быть только О, 1 или 2. Замечая, что все 9 цифр, отличных от О, использованы, вы можете узнать сумму величин «В уме» (10). Так как 6 не может быть свя­ занос2«вуме»,поскольку3Х6+2=20даетОвка­ честве цифры единиц, а это исключено, то вы сможете та­ ким образом полностью определить величины «В уме», связанные с этими двумя цифрами. Это разрешает задачу о решениях, окапчивающихся на 3. Так как величины «В уме» являются ключом к задаче, составьте :маленькую таблицу, показывающую для каж­ дой цифры, как она может быть получена в качестве цифры единиц произведения некоторой: цифры на 3 с добавле­ нием величины «в уме». Например, 5 можно получить как3х5+о"3х8+1,3х1+i. Если число кончается на 9, то результат кончается на 7, и 2 оказывается «в уме». Можно почти закончить вруч­ ную. Во всявом случае вручную легко найти Rакое-то ре­ шение. Программа для компьютера остается необходимой для того, чтобы найти все остальные решения. Головоломка12. Легко! Чтобы доказать эту теорему, достаточно дока­ зать, что ее утверждение справедливо для любого п, Rрат­ ноrо трем. Давайте-ка их все переберем. Сначала для каж­ дого п вычислим первое число п, сумму кубов цифр чис­ лап. Если п' :меньше п, то дальше идти незачем. Покажи­ те, что п' кратно т.рем. Если оно меньше п1 то оно уже ис­ пытано, и для него результат известен. Можетеливынайтитакоеk,чтоприп>kимеемп'< <п? Если можете, то достаточно проверить искомое свойст­ во для всех п, кратных трем и меньших k. Это делается очень быстро.· Головоломка13. Эти варианты исследуются таким же способом. Проде­ лайте сначала вручную пробы, чтобы увидеть, как ведут себя последовательности сумм кубов цифр для чисел п,, не кратных трем, различая случаи: п на единицу больше кратного трем, п на 2 единицы больше кратного трем. В случае суммы квадратов вы знаете, какой результат нужно доказывать. Это легко". Головоломка14. Ивучаемое Ч!lСЛО имеет вид 1000а + 100Ь + 10с + d при а;>- Ь >с> d. И, так как не все цифры одинаковы~ то непременно а > d. Вы можете доказать 1 что результат первого вычитания 117
кратен девяти~ так что, переходя к первой равности~ вы кqе-что анаете о сумме а+ Ь + с+ d. Каково бы ни было исходное число, первая иа полу­ ченных разностей имеет вид 999и + 90v с v < и,; О < v1 О< и< 9. Так что-не та:к уж много чисел нужно испы­ тывать ... Головолом:ка15. Эта головоломка намного труднее. Исполъауйте все данные аадачи,, хотя и кажется,; что их не слишком много. Господин Р не может найти искомые числа. Следова­ тельно .~ число р не является проиаведевием двух простых чисел - в противном случае их рааложение на иножите­ ли было бы однозначным.· Господин S это знает. Но их сумма s может быть мно­ гими способами предстаВJiена в виде суммы двух чисел. Ни одна иэ этих пар не является парой простых чисел. Это условие гораздо более ограничительно: нужно вычерн­ нуть из списка :воэможных эначений s все такие значения, которые являются суммами двух простых чисел - тако­ вы12(таккак12=7+5),13(11+2).Компьютерпоз­ волит вам составить оставшийся список. Господин Р пе может найти решение 1 так :как его про­ иаведение может быть иногиии разными способами разло­ жено в проиэведение двух чисел. Учитывая,; что именно анает St он исключает все пвры~ сумма которых вычерк­ нута. У него остается в точности одна пара. Каковы про­ иаведения 1: обладающие этим свойством? Наконец. господин S получает решение. Следователь­ но. среди всех пар с суммой s есть только одна пара 1 даю­ щая произведение с упомянутым выше свойством. Коипьютер нужен,: чтобы порождать списки и вычер­ кивать в них. В конце должна оставаться одна и только одна пара. Головоломка16. . Я предлагаю вам решить эту ~~чу в два приема. . 1. Составьте еначала программу по иетоду Полларда- Брента о смаленькими» числамиs иначе говоря~ такими~ что машина представляет их без округления или усече­ ния. Это зависит от иашины. Л па своей машине моrу полу­ чить около 8·106 , что немного. Возникают еще некоторые сомнения, как только принимаются во внимание деления ..• Чтобы узнать, становится ли последовательность пе­ риодической, вы можете ограничиться рассмотрением раз­ ностей а1 - а1 , где t и j меняются в соответствии с вполне определенными законами. Бам следует рассматривать . 118
н.о.д. этих разностей и п. Это невыполнимо для каждой рааности и потребует много времени. Идея в том, чтобы образовать произведение ш1 некото­ рое число этих разностей по модулю п, а затем брать н. о. д. этих разностей и п. Если одна из зтих разностей имеет с п н. о. д., отличный от 1, то для произведения будет выполняться то же самое. Выбор_ числа членов для учас­ тии в произведении предоставляется вашему усмотрению. Если членов слишком мало, то вы вычисляете много н о. д. и замедляете метод. Если членов много, то вы делаете ненужные операцииs вы долго ждете перед тем, как обнаружить делитель". 2. Если зта первая программа уже готова,. переходите к гораздо большим числам. Нужно выполнить следующие операции: произведение двух чисел по модулю п,. н. о. д. двух чиселt числа· п и числаt меньшего п. Настоящая трудность - это произведение по модулю п. Так как к ней часто обращаютеяf то она должна быть оптимальной ... Может окаэаться опасныи пускатьая в этот метод Пол­ nардаr не знаяt является ли щюледуемое число состав­ ным. Используйте для этого тест Ферма. В з1·ом единственную трудность представляет возведе­ ниехвстепеньп- 1поиодулюп. Следовательно, пусть нужно вычислить у = хР. Примем следующую индуктивную гипотезу~ искомый результат имеет вид у =- u,kw. . Еслиkестьнуль,тоuk ==iипотомуу=- wtивсеза­ кончено. Если k не нуль и если k четно~ то uk == u 1<1tt2> = (u2)1t12. Заменяя и на и* и и k па k/2, воэвращаемся к общей ситуации. Если k нечетно" то и• == и * u 11 «1t-1)/2).J w *и" = (w*и) *(ul)<ll-l)/1, Заменимwнаw*и~ и на и*ииkпацелуючасть от k/2. Все это должно проделываться по модулю п. Опера­ ции над k не содержат трудностей. Если числа достаточно малыt. то вы действуете обычныии умножениями: или деле­ ниями. Если же числа пе являются достаточно малыми, то все сводится к предыдущему случаю. Но у вас здесь есть элемент ответа. Я уже говорил ваи1 как можно вычислить 119
у = х1' с помощью бинарного раэложения Pt выполняя умножения только по модулю п. Переделайте то же pac-,J суждение для у = р * Xt, заменяя возведение в степень умножением, а. умножение - сложением. Предположите,; что результат имее~ вид у=k*и+w. Еслиkчетноfтоk*и(k/2)*(и+и)~ит.д. Сложения нужно делать по модулю п., что не требует, впрочем, операции деления ... Я на своем компьютере получил отличные реаультаты для теста Ферма. А метод Полларда-Брента еще остает­ ся очень медленным. Работайте надежно. Можно ли поль­ зоваться программой, в правильности которой вы не уве- рены? · Головоломка17. Подсказка: зта программа сообщает, делится ли rrнa Ь. Головоломка18. Снова подсказка: эта программа выводит НЕТ, если п не является точным квадратом; в противном случае она выводит квадратный корень из п. Но зто из области бес­ полезных подсказок. Rак вы сможете показать, что эта программа действительно делает то, что я анонсировал? Испытав ее? Вы можете испытать все целые? По индукции? Почему бы и нет? Напишите мнеt если по11учится ..• Головоломка19. Не пренебрегайте gрохами информации, которые мож­ но извлечь из текста программы. Вполне правдоподобна гипотеза, что eps - параметр, характеризующий точ­ ность, маленький и потому вещественный. Следователь­ ноt р и q, и - вследствие этого - а и Ь имеют хорошие шансы оказаться вещественными. Примите это как гипо­ тезу" касающуюся типа данных и результата . .Вы не можете исследовать плоскость а, Ь" чтобы уви­ деть, что же именно вычисляет эта программа. Но можно сделать несколько простых замечаний. Пусть f (а~ Ь) значениеf вычисляемое программой. Вы беэ особых усилий сумеете покааать1 что f(а,;Ь)= /(Ь,а),, f (ас,, Ьс) :::; cf (а, Ь) и вследствие этого f (а,; Ь} rз bj (а/Ь,; 1). 120
Но g (х) = f (xi 1) - функция только одного аргумен­ та. Можно ограничиться областью х;:;;;. 1. Я написал про­ грамму, вычисляющую g (простой и очевидный вариан'l! предыдущей программы)~ а затем вычислил g для х=1,2,3, •.., 10, х = 1.1, 1.2, 1.3, •.., 1.9. Природа функции g становится очевидной~ если исхо­ дить из этой таблицы. Уразумев, что именно нужно дока­ зать1 мы справимся с этим без труда. 3. ИГРЫ БЕЗ СТРАТЕГИИ ИграG. Единственная задача; считать белые шашки. На са­ м ом деле,, черные можно получитьt сравнивая шашку на шашкой в тайной комбинации и в комбинации, предло­ женной игроком. Для подсчета беJJых шашек у вас есть много возмож­ ностей. 1. Во время подсчета черных шашек удалите из тай­ ной комбинации и из комбинации, предложенной игро­ ком, находящиеся в соответствии элемен':!'ы (имеющие оди­ наковые значения и одинаковые места). Затем для каждо­ го из элементов, оставшихся в предложенной комбина­ ции1 посмотрите, участвует ли он в тайной комбинации, и ecJIИ да, то учтите его белой шашкой и удалите его из тайной комбинации. Этот метод требу'етJ чтобы вы создали копию тайной комбинации, Это стоит не слишком дорого". 2. Для каждого из возможных значений шашек (6, LСЛИ есть 6 цветов) подсчюайте число шашек зтого цвета в тайной комбинации и в предложенной комбинации. М~эньшее из этих двух чисел равно сумме белых и черных шашек, отвечающих этому цвету (почему?). Так как вы нуждаетесь в подсчете по ~цветам шашек тайной комбинации и так как эти величины не меняются в течение партии, то вам может оказаться полезным сде­ лать этот подсчет до запрашивания первой комбинации игрока, а затем сохранять его в виде таблицы", Иrра7. Для программирования нет совершенно никаких труд­ ностей. Действительно, от вас требуется принять толь­ ко одно решение; как вы представите игру в вашей про­ грамме? f2!
У вас много возможностей. 1. Никакого внутреннего представления игры. Ско­ рость движения машин и интервалы между машинами суть постоянные величины, которые вы можете помес­ тить в таблицу ИJ!И каждый раз пересчитывать. Вы можете задать себе с помощью маленькой таблицы положение крайней левой машины на каждой строке. Все остальное можно отсюда вывести. Но вам придется проделать немало вычислений к моменту вывода на эк­ ран. 2. Можно сохранять каждую строку в памяти в виде цепочки символов (за исключением, быть может, первых символов, крайних слева). Тогда вывод на экран очень прост. Передвижение машин влево можно получить, уда­ ляя заданное число символов в начале цепочки и добав­ ляя столько же символов справа, соблюдая условия пра­ вильного расположения стрелок на правильных местах. Вам не нужно экономить ни время вычисления, ни объ­ ем па:ияти. Выберите решение, которое, как вам кажется.!] проще всего реализовать ... Игра8. Перемещение шадока почти не составляет проблемы~ вы читаете данную в ответ цепочку символов. Если она содержит П, то абсцисса шадока увеличивается на 1~ ит.д. Перемещение многочисленных гиби немного более сложно. Для каждого ив гиби нужно найти ближайший к нему цветок. Если у вас есть таблица, задающая положе­ ния цветов, то вы ее полностью перебираете и отыскивае­ те ближайший. Если у вас такой таблицы нет,, то нужно вертеться кругами вокруг каждого ив гиби, чтобы найти .ближайший цветок. Первое решение кажется лучшим. Но если у вас есть таблица цветов, то нужно_, по ходу движения гиби, исключать один за другим уже сорванные цветки (как вы собираетесь это сделать?). Здесь есть и не­ которое преимущество: цветок может быть сорван только одним ив гиби. :Как только это произошло" цветок боль­ ше не привлекает других гиби. Rог,ца время сбора плодов истекает, вы знаете, сколько цветков исчезло _, и вы слу­ чайным образом добавляете столько же цветков в игру. Вам нужно еще решить, сохраняете ли вы в памяти образ игры (например, в форме цепочки символов или 1аблицы цепочек_, по це~очке на каждую строчку, или дву­ мерной таблицы" дающей содержание каждого поля) или же вы сохраняете только координаты активных элементов f22
(шадока, гиби и цветов). Не принимайте решение наугад. Тщательно обдумайте преимущества и неудобства каждо­ го решения как с точки зрения результатов 1 так и с точки зрения простоты программирования {что должно быть определяющим критерием). Игра9. Мало что можно добавить. Единственная трудность - движение убийц. Они должны стремиться приблизиться к игроку, но это не всегда возможно. Вы легко можете определить направление наилучшего перемещения: это направление_, которое уменьшает скачок координат убий­ цы и игрока. Если такое перемещение возможно" то убий­ ца перемещается. Если оно невозможно" то следует испы" тать блиэкие перемещения. . Вот способ действовать: задайте таблицу 1 определяю­ щую возможные перемещения" помеченные индексами от 1 до В. Желательное перемещение соответствует некото­ рому элементу таблицы" скажем." элементу с номером k. Испытаем тогда перемещение k, затем, если оно невоз­ можно,перемещенияk- 1иk+11эатемk- 2иk+ + 2 ... Когда индекс становится нулем,,'.мы его заменяем на 8. Когда он становится больше восьми1 мы заменяеl.1 его на 1, что сводится к организации таблицы по. круго­ вому списку, Внимание, это допустимо только в случае, если вы правильно упорядочили перемещения В· табли- це." Rак и в предыдущих играх, тщательно продумайте способ представления игры, задайте всю необходимую информацию для упрощения программирования. Не поз­ воляйте себе увлечься оптимизацией времени вычислений или объема требуемой памяти. Эта игра должна легко поместиться на любом микрокомпьютере. Работайте ак­ куратно: если то, что вы запрограммировали.!) не удовле­ творяет правилам игры" то ,ваша игра нечестная, Игр а 10, Добавить нечего, Это проще1 чем в случ:ае убийц, Вы определяете направление перемещения, которое наилуч­ шим образом приближает робота к игроку {перемещение.11 которое уменьшает скачки обеих координат), Вы переме­ щаете робота в этом направлении. Если он попадает в рас­ щелину'· то он исключается из игры. Если он попадает на поле другого робота, то он также исключается. Исполь­ зуйте генератор случайных чисел, чтобы решить~ помещае­ те ли вы в углы новых роботов. Например, если слуЧай­ вое 'IИсло меньше 0!7.i то вы ставит~~~ового робота; в про- 123
тивном случае вы не делаете ничего. Это оаначает, что есть 7 шансов иа 10 увидеть появление нового робота ... Игр а 11. Никаких особенных трудностей, если не считать тех~ Rоторые связаны с. рисунком дороги и положением препят­ ствий. У вас много способов представить игру. Е сли вы испольауете таблицу,. то факт перемещения фигуры оче­ ·видно обяаывает вас проиаводить сдвиги. Если вы исполь­ вуете цепочки символов, то дело упрощается. Вы можете,; например, состыковывать (конкатенировать) рааличные строчки (вначале - пробелы, 4 анака (точка~ авеадочка, О) , код окончания строки) в единую строку, которую вы шдводите на экран кусок аа куском. Чтобы сдвинуть фи­ гуру, вы убираете некоторое количество кусков в начале (определяемое скоростью) и добавляете столько же в кон­ це. Но это неприемлемо, если ваш компьютер не допускает ддинных цепочек (счастливы обладатели LSEI). Чтобы ааставить дорогу повернуть, вы наменяете на 1 число пробелов в начале. Но не выбирайте случайным обрааом одно иа трех чисел: -1 _ , О, 1. (Технически это пегко. Вы выбираете случайным обрааом число в интер­ вале (О, 1), скажем х, а аатем берете целую часть от (3 * • х)" уменьшенную на 1.) Если вы сделаете так, то доро­ r а останется приблиаительно прямой с маленькими коле­ баниями влево или вправо. Задайте фактор поворота t,; принимающий значения -1, О или 1. На каждой новой строке вы увеличиваете на t число пробелов в начале. Чтобы измен:Ить t, вы выбираете случайное число. Вы 2адаете постоянную величину а. Если случайное чис­ i!О меньше а, то вы уменьшаете t на 1, и если это действие да~т вам -2, то вы полагаете t равным 1. Если, напро­ •ив, случайное число больше, чем 1 - а, то вы увеличи- 11аете t 'На 1 и если получаете 2, то ааменяете его на -1. II араметр а вы подберете экспериментально. Для размещения тяжелых грузовиков вы можете слу­ «айвым образом выбирать целое число в иптервале дли­ iJ Ы, большей 4. Если оно примет аначения 1, 2, 3 или 4, :о вы помещаете груаовик в соответствующий ряд, а ес­ .·.: и оно примет большее аначение, то препятствия нет. Чем :!о льше выбранный исходный интервал, тем меньше шан­ о в для появл ения грузовика. Подбери те этот параметр ;у.R спери иептально. Игр а 12. Итак, мы по1юнчили с «м аленышми и грами». Все пре­ ;;..ыдущие требоваш1 лишь немного умения программиро- 1 .:И
вать и немного ловкости. С другой стороны, они требова­ ли большой тщательности, и только хорошие програм­ мисты могли сделать из них что-нибудь красивое и прият­ ное. Ну, а в этой игр~, по моему мнению, нужно действо­ вать более мощными методами. Тщательно проанализируйте способ создания комба­ нации, исходя из 6 шашек. Начало всегда одно и то же. Вы выбираете две шашки, скажем а и Ь, и соединяе­ те их одной из операций: а+Ь,а-Ь,а*Ь,а:Ь. Сложение возможно всегда. Что касается вычитания, то с ним дела обстоят так же, если договориться, что мы всеt'­ Да вычитаем меньшее из большего (это относится R пра­ вильному наименованию чисел, или - Ч'l'О то же - и вэн­ тию той из двух операций (1. -:::- Ь или Ь - а, котора,я дав1' ПОJJОжительный: результат). Эаметим, одпако, что есш1 а = Ь, то знак «-» выбирать нельзя. а * Ь можно вычислять только тогда, когда ни один из двух сомножителей не равен 1. а : Ь ориентировано (как и вычитание). Число Ь не ДОJ1жно быть равно 1. Остаток при делении должен быть нулевым. Все это не очень трудно запрограммировать. Вы слу­ чайным обравом выбираете Две шашки. Затем вы случай­ ным образом вы~ираете знак операции, а если его нель­ вя использовать - вы повторяете розыгрыш знака. В конце концов вы всегда получите хороший знак," Теперь вы получили промежуточпый: результат. Вы можете решить остановиться, а ватем выбрать случайным образом недо;лающие шашки 1 которые не участвовали в (;Чете: 7*75=52583110: вы выводите на экран 13_781075найдено:525. Вы можете выбрать новую шашку и скомбинировать ее с предыдущим результатом 525 - 8 r;:::i 517. Вы с~ова получите промежуточный реsультат, Вы можете выбрать две шашки .и скомбинировать их: 3 * 7 ;;;;::; 21. 125
Тогда вы получите два про111ежуточных результата: 7.75 =525;з...7 =21. Если у вас два промежуточных реэультата, то появля­ ется много воэможностей: - все 6 шаmе.к уже выбраны. Вы .комбинируете меж­ ду собой два промежуточных реэультата и получаете ва­ шу о.кончательную .комбинацию; - даже если не все 6 mame.к испольэоваНЪI, вы може­ те с.комбинировать между собой два промежуточных ре­ Конечное состояние то Начальное состояние зультата и снова получить один-единственныйреэуль· Т2 тат. Но вы можете та.кже выбрать новую шаm.ку и с.комбинировать ее с одним Т1 из двух промежуточных результатов. Вы снова по­ лучите два промежуточных реэультата. Рис. 35 Та.ким обраэом, вы по­ лучаете то, что наэывается .конечным автоматом. Есть четыре воэможных состоя­ ния: начальное состояние, состояние ОДИН, в .котором у вас есть один (и при­ том единственный) промежуточный реэультат. состояние ДВА, в .котором у вас есть два промежуточ­ ных реэультата, .конечное состояние, в .котором у вас есть реэультатJ .который вы рассматриваете на.к достигнутую цель. В вычислениях участвуют три операции. Т2: в'ыбрать случайным образом две mаш.ки и соеди­ нить их случайным обраэом выбранным эна.ком, чтобьi по­ лучить промежуточный реэультат; Т1: случайным обраэом выбрать шаш.ку и соединить ее случайным эва.ком с промежуточным реэультатом; ТО: соединить два промежуточных реэультата между собой случайным обраэом выбранным эва.ком. Рисуно.к 35 дает граф -этого автомата, где стрел.ки по.ка­ эывают операции ., ноторые нужно выполнить, чтобы пе­ рейти от одного состояния .к друl'ому. Ваша проl'рамма должна реализовать этот автомат, причем переходы дол­ жны выбираться случайным обраэом,, если это воэможно. 126
Вы теперь знаете все. :Конечные автоматы часто встре­ чаются в программировании. Запомните этот примерf он имеет очень широкую область применения", Игр а 13. Проблема наиболее длинного пути взятия является ти­ пичной возвратной задачей. :Когда лиса находится в не­ котором положении, нужно испытать 4 возможных на­ правления и для каждого из них увидеть, есть ли курица и свободно ли следующее за ней поле. Это легко! Если вы не обнаружили никакого возможного взятия~ то все закончено. Если вы обнаружили возможное взятие, то результат есть наиболее длинное взятие, возможное при этом новом исходном положении, увеличенное на 1. Но вы можете также действовать итеративным спосо­ бом. Вы делаете первое взятие и продолжаете дальнейшие исследования, исходя из этого поля прибытия. Нужно ис-­ пытать все возможности. Вы снова получаете, таким Qб" разом, тип задач: известный по головоломке 8. Упорядочьте четыре направления перемещения. Вы исходите из не­ которого положения с направлением перемещения i = 1, Если все четыре направления испытаны~ то все закон­ чено. В противном случае вы смотрите, возможно ли взятие в направлении i: - если невозможно~ то вы увеличиваете i на 1 и воз­ вращаетесь для нового цикла; - если возможно, то вы выполняете это взятие; ока­ зываетесь в новом положении и начинаете заново~ исходя из него. Внимание: нужно иметь возможность отменять сде­ ланные вами взятия, потому что они происходят в рамках исследования". Это требует некоторой ловкости. По этой причине рассматриваемая игра - не из самых легких. Остальное вы исследуете совершенно самостоательно. Игр а 14. H1J'Ieгo нового с точки зрения программирования, за исклmчеuием того, что нужно исследовать восемь направ­ лений перемещения вместо четырех. 4. ИГРЫ СО СТРАТЕГИЕЙ Игр а 16. Числа Q11_J>~Гa -:-· Гр ю н д и В больцrин~тnе нижес:л:едуюJДи_х игр два игрока дell;·~ ют ходы по оЧ:ереди. и выигрывает тот.11 кто достигает й.t- ~Щ
которой намеченной в начале игры позиции, В той игре( которую мы обсуждаем сейчас .1 позиция может быть пол­ постью охарактеризована числом оставшихся спичек~ и выигрывающая позиция соответствует числу спичек, равному нулю. Сnраг и Грюнди предложили (соответст- 1нэнно в 1936 и 1939 годах) связывать с каждой игровой позицией неотрицательное целое число следующим об­ разом: - выигрывающей позиции вы сопоставляете О; - данной игровой позиции вы сопоставляете наимепь- mее неотрицательное целое, отпичающееся от чисел, свя­ занных с позициями, которые могут быть достигнуты, ис­ жодя из данной. Образуем числа Спрага - Грювди для втой игры. Позиции О сопоставляется число О.1 SG (О) = О. Исходя ив 11 можно получить О (поскольку мы имеем μраво удалить одну спичну ; *). Следовательно, SG (1) - 11аименьшее неотрицат~пьное цeJioe1 отличное от О., или SG(1) ;с= 1. Исходя из 2, можно получить 1 и О. Следова­ 'l'ельно1 SG(2) - наименьшее неотрицательное целое, от­ оичное от О и 1, поэтому SG(2) == 2. Таи как можно удалять спички вплоть до 6, то точно 'l'a1< же имеем SG(З)=31 SG(4)=4, SG(5)=5, SG(6)=6, Предположим теперь, что имеется 7 спичек. Можно уДаЛить от 1 до 6. Поэтому в результате можно получить от 6 до 1 спичен, но не О. Число SG(7) - наименьшее неот­ рицательное целое_,_ отличное от 1,. 2,. 3, 41 5J. 6 . Следова­ тельно, вто О. SG(7) .=О, А теперь из 8 можно · получить от 2 до 71 поэтому SG(8)- зтоне2,неЗJ. •••1 не6инеOiпоэтомуонораu­ но 1. SG(8) = 1. Теперь вы можете установить общий закощ SG (р) = остаток от деланин р на 7. Rак же выигрывать? Если вы после своего хода можете оставить кучу, для которой число Спрага-Грюнди равно О, то ваш против- ~) Важво и то, что IПIRRJtПX дРУl'ИХ позиций, 1rроме v, ИЗ 1 по­ .пучить нельзя, .... Примеч,, peiJ,
ник не сможет достичь ситуации с чИслом пуль, посколь­ ну по определению число, которое он оставит, отлично от исходного числа. Поскольку он не сможет достичь ситуа­ ции р с SG {р) = O.r, то он и не может выиграть. Ему при­ дется оставить вам ситуацию с SG {р) =1= О, исходя из ко­ торой, вы всегда сможете получить ситуацию с числом Спрага-fрюнди,, равным нулю. Следовательно,: вам нуж­ но оставлять вашему про1·ивнику число. спиче15 с числом SG, равным нулю, иначе говоря, число спичек,; кратное 7. Одно из двух: либо ваш против:Ник не знает этого пра­ виJiа и играет <шо нюху»; при первой возможности вы ос­ тавлнете ему кратное 7 и из ежо;uых рунавиц не выпуска~ те; либо он знает правило и ходит первым; он достигает нратпого 7. Вы не сможете выиграть" если он не рассеян или не сделает ошибки в счете. Но компьютер не рассеян и не делает ошибок в счете {если ваша программа вер­ на)." Игра17. Выигрывающее положение - 31 декабря. Возьмите листок бумаги в клетку. Расположите по абсциссе месяцы, а по ординате дни. Так как 31 декабря выигрывает, то вы обозначаете эту точку числом Спрага-Грюнди О. Ив каж­ дого дня декабря можно получить 31r но также и любой другой последующий день. Поэтому вы приписываете зна­ чение 1 дате 30 декабря,. значение 2 дате 29 декабря, и т. д. То же для любого 31 числа; ив него можно полуЧить 31 чис­ ло всех Последующих месяцев. Поэтому 31 октября полу­ чает1,31августа2ит.д. После этого вы можете закончить значение таблицы и приписать число Спрага - Грюнди всем дням года. Вы уви;.ите также появление дней со значением О, которые являются выигрывающими днями. Напоминаю вам пра­ вило: каждому игровому положению приписывается наи­ меньшее неотрицательное целое значение, отличное от вна­ чепий тех положений,; 1(Оторые можно получить, исходя из данного, т. е. в настоящем случае - от значений тех положений, ноторые расположены правее,, и тех,1 которые расположены ниже. Закон заполнения таблицы достаточно сложен; и я пе пытаюсь вам его сформулировать. :Как только октябрь заполнен, появляется простая закономерность,; которая дает соотношение между номером дня и номером месяца для выигрывающих положений. Даже если вы мало знаете современную математику1 вы слыша1rи разговоры об отношении эквивалентности. S Ж, Арсак 129
Все выигрывающие положения эквивалентны. Игровое положение задается парой д, м~ где д - номер дня,; а м - ноиер месяца. Следовательно, вы должны найти такое отношение эквивалентности для пар натуральных чи­ сел,, чтобы а, м' было не эквивалентно д, м. прим* м.', и д', м было не эквивалентно д, м при д -=F д'. Наконец, для выигрывающей позиции д, м должно быть эквивалентно 31,. 12. Что-то похожее на это можно видеть в програllfмах · лицеев". Я прекрасно понимаю, что календарь осложняет все,. поскольку длина месяца не постоянна и зависит от м, причем к тому же с непростым законом изменения. Но, к счастью, оказывается, что это никак не сказывается на этом замечательном отношении эквивалентности. После всего сказанного вы должны выпутаться из этой задачи .. • Игр а 18. Эта игра - производная от средневе.ковой игры. Сна­ чала попытайтесь достичь 50 с точностью до кратного .7 . Но ка.к только все четыре .карты, имеющие одинаковое значение, оказываются использованными, та.к ситуация сразу меняется. Вот пример на чала партии. Я беру туэа, компьютер то же. Сумма 2. Чтобы получить 8i я беру 6. Rо!lfпьютер берет туза, Сумма 9. Чтобы получить 1.5,, я снова беру 6. Компьютер берет последнего туза. Сумма 16. Теперь остаются следующие карты: 222233334444555566 Так как тузов больше нет, то числа Спрага - Грювди изиенилцсъ •). Теперь из 49 больше нельзя получить 50. SGt50)=Ot SG(49);:::О. *) Читатедь может вернуться к определению чисел Спраrа­ Грюнр и убедиться, что эти числа определяются на множестве иrровых позиций раз и навсеrда, исходя из правил игры, и, разу­ иеетсн, ие моrут иеияться в процессе равыrрывания коВRретной партии. Что же является позицией в этой средневековой иrре? - Позицией является состав вwrожеввы:х: на стол карт, а также их~ ввачения: сколько карт на столе имеет значение 1, сколько карт имеет ввачение 2, и т. д. Сумма, набранная игроками в данный моиевт, равна 84 иинус сумма зиачений карт на столе. Что же имеет в ВИДУ автор квиrи, когда он пишет SG (50)? Почему он прп­ писывает число Спрага~Грюнди не позиции1 а сумие карт этой 180
Из (48) можно получить 50. Поэтому SG (48) == 1. Из 47 мошно получить 49 и 50, но не 48. Поэтому SG(47)=1. Теперь положения, имеющие нулевое SG,- это 4241343326251817 Поэтому я могу взять 2, чтобы достичь 18. Стратегия усложняется, поскольку числа Спрага - Грюнди полностью меняются при удалении каждой кар­ ты. Но это как раз и благоприятствует компьютер.у. Ес­ ли он не может достичь выигрывающего положения, он берет карту, оставшуюся в наименьшем количестве эк­ земпляров. Каждый раз, когда тот или иной тип кар1 ис­ черпывается,~ компьютер пересчитывает заново числа Спрага - Грюнди. Мне придется переписать мою программу в соответст­ вии с этой стратегией. Игр а 19. НИм-сумма. Для меля зта игра - своего рода педагогический вы­ воn. Н чрезвычайно раздражен тем, что все, кто и:;люJ.ае~­ эту игру, ведут себя одинаково: известно, что выигрываю­ щей стратегией является следующая ... Почему она выиг­ рывает? Откуда она вообще взялась эта стратегия? Выписать числа Спрага - Грюнди очень трудно. Попытаемся найти несколько выигрывающих поло­ жений; Если к моменту своего хода я обнаруживаю только од­ ну спичку, то я выигрываю. Если я обнаруживаю единственную кучку, то я тоже выигрываю. Если, кроме одной куч«и, ничего больше нет, то мож­ но положить SG (О) = О (я выигрываю, я взял последнюю спичку), вследствие чего SG (п) = п. Предположим теперь, что у нас две кучки. Если я ос­ 'l'авляю две кучки, в каждой из которых по одной спичке, то я обязательно выигрываю: мой противник должен ввятъ столько спичек, сколько он хочет, но - только из одной позиции? Дело в том, что для всех поющий с набранной суммой 50 число Спраrа-Грюнди одинаково и равно О. :Это п позволяет шшисцтъ равенство SG (50) = О. А что могло бы значить SG (49)? Если бы все повиции с суммой 49 имели одинаковое чттсло SG, мы fiы обовначили его SG (49). Но, увы! Разные позицпn с суммой 49 имеют разные числа Спрага-Грюнди. Так что автор кпиrи дальше р~ссуждает о несуществующих вещах. Я из зтих рассуждений ЩI­ чего полезного извлечь не смог (кроме подозрения, что у автора вет работающей программы, шрающеii в 24 I(арты).- При;-.~еч. ред. s- 1.31
кучки. У него пет выбора, оп может только взять одпу ив спичек~ после чего я вовьму последнюю спичку и выиг­ раю. Если я оставляю две одинаковые кучки по п спичен в каждой, то у моего противника две вовможности: - ваять целиком: одну ив кучекf, я возьму другую и выиграюj - ваять часть одной из кучек и оставить в ней п' спи­ чек. Я вовьму столько же из другой, оставляя ситуацию п' 1 п'. По индукции - я на пути к победе. В наиболее общем случае ситуация хараRтеризуется р целыми числами (р - число кучек). При кащдом ходе из­ меняется одно и только одно из этих неотрицательных це­ лых чисел и оно заменяется меньшим неотрицательным це­ пым числом, которое может быть и нулем. Если мы исхо­ дили ив выигрывающей ситуации, то новая ситуация не является выигрывающей. Если ситуация не является вы­ игрывающей, то всегда можно, уменьшая одно из чисел, получить выигрывающую ситуацщо (по крайней мере, ес­ ли выигрывающая стратеr·ия сущестnует *). "). Попытаемся охарактеризовать числа с помощью иt цифрового представления. Изменить число - значит, из­ менить представляющие его цифры. Если использовать десятичное представление, то у нас в наличии 10 возмож­ пых цифр и их изучение затруднительно. Возьмем двоич­ ное представление, для которого есть только две вовможные цифры: О и 1. Уменьшение числа изменяет по крайней ме­ ре одну цифру этого числа, так что есть по крайней мере одна цифра 1, .вамененная на О, или О, замененный на 1. Этого должно хватить для того, Чтобы заставить перейти от выигрывающего положения к проигрывающему поло­ жению. Число О встречаться не должно, поскольку пусr тые кучки, характеривующиеся нулевыми значениями~ просто не считаются кучками. Хараитериэация выигры­ вающего положения должна быть поэтому связана с еди­ ницами различных чисел, записанных в двоичной системе. Если есть две кучки с одинаковым числом спичек, то ситуация является выигрывающей. Следовательно, како­ во бы ни было число единиц в двоичном представлении *) Можво докавать, что в играх, подобных игре Пима и обыч­ ным шахматам,- в играх с полной информаци ей - выи г рыnаю­ щал стратегия всегда существует. Это - относительно простая теореыа. Другое Дело, что эта выигрывающая стратегия мож011 быть пе очень простой (Ним) или вообще еще ве отнрытой (шахма• ты) . - Пр11 .11е ч. ред. ·· 132
каждого числа, положение является выигрывающим, ес­ ли в ка:кдом разряде наши два числа имеют либо О, либо две цифры 1. Первые выигрывающие комбинации с тремя кучками имеют вид 1, 2, 3, или в двоичной записи 01 10 11, 1, 4, 5, или в двоичной записи 001 100 101 Опять в каждом разряде наши три числа имеют либо О, либо две цифры 1. Я разобрал достаточно случаев, чтобы подвести вас к результату К Бутона {1902): положение является выигрывающим, если в каждом двоичном разря­ де суммарное число 1 двоичных представлений числа спи­ чек в каждой кучке четно. Совершенно очевидно, что нужно совершить прыжок для перехода от случая двух куч или первых примеров в случае трех куч к trаиболее общему случаю. Тут требу­ ется выдумка и.JIИ изобретение. Следует. иметь мужество признать, что некоторые люди имеют настоящий талант изобретать или открывать то., что совершенно не очевидно, и не всегда можно потом сказать: да никаной заслуги в этом нет, это было очевидно. Нет, это остается тайной1 и преподавателя раздражает, если он оказывается вынуж­ ден давать результат, который нельзя легко «переот­ крыты>. Назовем Ним-суммой двух целых чисел р и q число 1 которое вычисляется следующим образом: р и q записываются в двоичной систеМеi сложение выполняется поразрядно, по следующему правилу: О+О=О,О+1=1+о=1, 1+1=О (сложение без переноса в следующий разряд). Рассмотрим игру, образованную объединением п неза­ висимых игр, каждая со щюими собственными правилами. Игра проходит в кучке 1 по правилам R1, в кучке 2 - поправиламR2,... в кучке п - по правилам Rn. В каждой кучке мы располагаем числом Спрага - Грюнди, зависящим от числа спичек в этой кучке. Число Спрага - Грюнди есть Ним-сумма чисел Спрага - Грюнди в каждой кучне." *) :Красиво, не правда ли? *) В частном случае, когда в каждой куч.~>е игра идет по пра­ вилам игры Нима, число Спрага-Грюнди каждой кучки равно просто числу спичек.- Примеч. ред. fЗЗ
Обратимсп R программированию обычной игры города Нима (одно и то же правило для всех кучеR: можно брать стольRо спичеR,. сRольRо пожелаешь, по пе меньше одпой). Вам нужпо вычислить Ним-сумму данной ситуации. Если она равна нулю; то у вас пет шансов: ситуацию при­ дется изменить и она перестанет быть выигрывающей. Вы можете~ например, ваять одну спичRу из самой боль­ шой кучи: это - способ замедлить Rопец, и в:Ы всегда мо­ жете ожидать, что ваш противниR допустит ошибку .• . Если же эта сумма пе равна пулю, то это в точности оз­ начает, что есть раврядыt в которых при двоичном пред­ ставлении единицы встречаются нечетное число раз. Рас­ смотрим Rрайний левый из таRих разрядов. Нужно умень­ шить число единиц в этом разряде. Выберите куЧRу, со­ держащую единицу в этом разряде (все равно каRую: взять ли самую большую, первую или последнюю".). Нужно уменьшить эту кучку па «эту» еJ1,ипицу. !{роме того~ в лю­ бом другом (расположенном правее) разряде, где стоит нечетное число единиц, нужно если в данной Rучке в этом разряде стоит 1.i удалить ее; если в данной кучRе в этом разряде стоит О,; заменить его па 1. Это дает вам новое число спичек в этой RyчRe. Я видел в некоторых Rвигах программы для игры Ним а, в которых после обнаружения ситуации с ненулевой Ним­ суммой испытывались все возможные конфигурации, чтобы найти Rонфигурацию с нулевой Ним-суммой. Над Rем они смеются? В игре Нима вам нужно для каждого хода, делаемого компьютером, получить двоичное представлепие числа спи­ чен в Rаждой кучRе. Вам следует решить, будете ли вы пересчитывать· ero при каждом ходе или вы будете сохра­ нять раэличные представления, так как имея единственное представление, вы после каждого хода должны изменять его". Я полагаю, что вы внаете, как получать двоичRое представление числа. Пусть п=ар2Р+ар-12Р-1+...+а222+а12+а0• Если разделить п па 2, вы получаете в остатке а01 Rрайпюю справа цифру двоичного представлевия 1 u. ч.аст­ ное а1'2Р--1+., .+а22+а1, fз.1
ROTopoe таRже является двоичной записью целого числа, получаемой из предыдущей записи вычеркиванием ее крайней правой цифры. По индУкции (или, что то же самое, рекурсивно или итеративно) вы получите все двоичные цифры числа п справа налево. Восстановление значения числа, исходя ив двоичных цифр, производится в обратном порядке, слева направо, Сначала вы вычИсляете Хо ==ар, а:1==2хо+ар-1 =2ар+ар-1, а:2 == 2х1 + ар-2 = ap"l. 2 + ар-12 + аР-2• и т. д· Последнее х есть искомое значение, Иrра 20. Об этой иrре я вам больше ничего пе скажу. Совершенно в.еобходимо, чтобы вы хотя бы время от времени работали. Впрочем, если я вам ничего не rоворю, то дело, вероятно, в том, что я вам уже достаточно раооказап. Это - новая головоломка: выясните, почему у меня нет нужды что­ либо вам еще говорить ..• Игр а 21. Не протестуйте, я вам помоrу", Что бы вы без меня делали? Но кстати, вужпо быть честным - я был вдох­ новлен кпиrой Роува Болла [BAL]. В начале иrры у вас одва-едивствевная строка: Спраr­ Грювди .... По прошествии ненотороrо времеви она раэби­ вается па мвоrо строк, и связанное с ЩIМИ число Спрага - Грюяди есть Ним-еумм:а чисел Сnрага-Грюнди для каждой строки. Следовательно, вужпо вычислить 'IИсла Сnр11.rа-Грюпди для одной строки, и зтоrо будет доста- 1Гочно. Вот начало: О SG(О)=О Из 1 вы достиrаете О: SG (1) == 1. Иэ 2 вы достигаете либо 1, либо О. Поэтому SG (2) - паи меньшее. целое неотрицательное, от~ое от О и 1; следовательно, SG (2) == 2. Исходя из 3, вы можете получить либо одну строку с 2 спичками (SG = 2), либо одну строку с одной спичкой (SG = 1), либо две строки по одной спичне в каждой (уда­ nив среднюю спичку). Но число SG (1,1) есть Ним-сумма 1 :в 1 и потому равно нулю. Следовательно, SG (3) равно трем. Таким те образом РЫ находит~ 01231432142641 135
Р R. Ги доJ{азал, что начиная с 71, эта последовательность становится периодической с периодом 12. Я яе предстаn­ ляю себе, для чего это может быть вам нужно - разве что, если это доставит вам удовольствие, чтобы передо­ казать его. Задайте номпьютеру табJшцу первых qисел Спрага­ Грюпди, снабдите его Ним-суммой. Оета;1ьное просто. Игр а 22. Rаждая вершина может быть связана с 5 друrи:ми, что создает 6 х 5 = 30 связей. Но каждая из них считается в с Рис. 36 D Рио. 37 дважды (связь между А п В и между В и А). Поэтому есть 15 отрезков, которые нужно провести. EcJJи игра полно­ стью сыграна и все пути пройдены, то у одного из игронов на qертеже должно быть 8 отрезков (у тОI'о, который на­ чинает). Они связывают 16 вершин, и поскольку в игре участвует только 6 вершин, то имеется хотя бы одна вер­ шина, ив которой выходят три отрезка. Пусть В, С и D - достигаемые этими отрезками вершины (см. рис. 36). Либо этот игрок прошел один из путей связывающих эти вер­ шины, и тогда он проиграл. Либо оп ни одного ив них не провел, и тогда их провел его противник и противню( проиграJ1 .•• Может оказа1ься, qто проведено 14 отрезков, пе обра­ зующих треугольников (как показано на рис. 37). В этой позиции можно быть уверенным, что кто начи­ нал, тот и проиграет, поскольку пет возможности свести партию вничью. Число возможных комбинаций очень ве­ лико, и вы н(можете ожидать, что компьютер перепробует все возможные комбинации, прежде чем принять решение. Нужно отказаться от комбинаторных сообра>кений и ИI'­ рать эвристически. Первый ход, если его делает компью­ тер, не важен: все прямые равноценны. После этого у компьютера остается не более 14 возможных линий, и оо 136
их все исследует. Rаждой из них оп сопоставляет вес: О, если эта JlИПия завершает треугольпив из его липисr, и оп тем самым проигрывает; 1, если эта линия завершает треугольник для его противника, так кав опа оставляет противнику шанс проиграть; максимальный вес, если эта линия связывает 'JЩе не использованные вершины. Когда все линии испытаны таким образом, компьютер делает ход с наибольшим весом. Его r,тратегия оцепит шкалу весов, которые вы будете выбирать. Игр а 23. В этой игре вы не можете охарактеризовать ситуации qислом: спичек, оставшихся в кучке, потому ч:го этого не­ достаточно; нужно еще знать, сколько спичек ,тольно что было взято, так как именно это определяет максимальное число спичек, которые вы можете взять. Поэтому нужно определить ситуацию парой р: число спичек, оставшихся в кучке, q: число спичек, которое только что было взято. Полошение О является выигрывающим, каково бы ни было число спичек, только что взятых, чтобы достичь этого состояния» SG(O, q) =О. Исходя из 1, мы всегда проигрываем, поскольку обя­ заны взять единственную оставшуюся спичку: SG(1, q)=1. Если у вас осталось две спички, то всегда мо>RПО одну взять и одну оставить, следовательно, SG (2, q) . -:/= 1, или можно взять две и закончить игру~ SG(2,q)= 2. Начиная с трех, выбор меняется. Для 3, 1 ваш противник может вэять 1 и оставить пару ,2, 1, следовательно, SG (3, 1)-=? 2, либо взять 2 и оставить пару 1, 2, так что SG (3, 1) -=? 1. Но большее ко;~:ичество изымать нельзя. Наименьшее неотрицательное целое, отличное от 1 и 2, есть О: SG (3, 1) =о. Если вы оставляете 3, взяв больше, чем одну спичну, то противник может взять и 3, достигая О с SG (О, 3) = О, и, следовательно, SG\3,q>1)=3. 137
Все, что от вас эдесь требуется - продолжить это изу­ чение достаточно далеко, чтобы дать компь~отеру список выигрывающих положений,- и тогда ваша программа будет непобер,имой. Игр а 24. Я много раа иалагал нижеследующее различным про­ граммистам и каждый раз оставался в недоумении, видя, что они не считают это «очевидным». Вы играете в «Гениального отгадчика», вы ищете неиа­ вестную комбинацию; чтобы сделать это, вы предлагаете комбинации с1 , с2 ,. , . , c1r• Для каждой иа них: вы получаете ответ о числе белых: и черных: шашек: б1.Ч1;б2,ч2;•• ,jбk, Ч1:• Следующая предлагаемая комбинация должна быть та1<ой, которая при сравнении с с1 дает ч1 черных: и б1 белых шашек; , • . ; при сравнении с ck она должна давать чk черных и бн белых: шашек. Почему? Вы ищете неизвест­ ную номбинацию. Но эта комбинация дает при сравнении с номбинацией с1 именно ч1 черных: и б 1 белых: шашеи. Бесполезно искать решение вне множества н.омбинаций, обладающих: этим свойством: там его не может быть *). Следовательно, у вас есть простая стратегия. Допусти­ те, что вы уже каким-то обрааом выбрали х первых комби­ наций, где х фиксировано. Компьютер располагает ана­ чениями ч1 , б1 для i от 1 до х, Вы предоставляете ему воамоr~шость перепробовать все комбинации и запоминать только те, которые дают при сравнении с уже испытан­ ными комбинациями правильные вначения черных: и белых шашек. Таи как воаможных комбинаций много, то нужно по­ пытаться не перебирать их все ааново при каждой следую­ щей попытке. Вы можете, например, начать с первой по­ виции новой Rомбипации. Вы присваиваете ей первый цвет, а ватем смотрите, сколько черных: шаmеп он обра­ зует с уже Испытапвыми номбинациями. Если он дает чер­ ную шашку с комбинацией, с которой ее не следует давать, то этот цвет нужно отбросить, Когда вы уже нашли под- "') Эти рассуждения безусловно справедливы, если в моем рнс­ ПJряжении остался один-единственный Х()Д - 1Гогда этим ходом я хочу «попасть в десятку•, т. е . угадать искомую комбинацию. Если же :rод не последний, то uоя цель - nОJJучить 11:аи можно боль­ ше информации об искомой помбинации . Может случпься, что для этого выгоднее взять 11омбинацию вве множества, описанного авто­ ром.- Примеч, ред, f38
ходящий цвет для этой позиции, переходите п следующей. Она может дать вам слишком много черных шашек, и это событие очень даже вероятно. Мало таких комбинаций, которые червых шашек пе дают совсем, и больше таких, которые дают не более одной. То, что было 3афиксировано для первого цвета, не может быть использовано для вто­ рого, Но заметьте, что у вас есть и другой случай длн от­ брасывания~ если нужно получить три черных шашки при сравнении с некоторой комб:Инацией и если первая позицин никакого вклада не вносит, то необходимо, чтобы вторая позиция вносила свой вклад (предполагая, что есть 4 по­ зиции). Действуя таким обра3ом, вы достигаете в конце концов комбинации с правильным числом черных шашек. Тогда нужно проверить белые. Если они принимают вущ­ вые 3начения для всех предложенных комбинаций, то у вас готово новое предложение, и вы получите либо успех, JIИбо новые элементы для сравнения. Если испытание комбинации потерпело неудачу, то вы переходите к следующей, начиная, если это возможно, с последнего, отступая на одну по3ицию и испытывая сле­ дующий цвет на этой сэ,мой по3иции. Для экономии вычислений вы можете быть 3ашп ере­ сованы в том, чтобы сохранить некоторые ре3ульта rы, по­ лученные во время исследования одной по3иции за другой. Но внимание! Когда вы во3вращаетесь на3ад, нужно зпать, как определить, что нужно сохранить, а что исключить. Исполь3уйте при необходимости и3учение <(ГеIIиальвого ответчика» (игра 6), чтобы выбрать наилучПЦIЙ способ · определения белых и черных шашек. Игр а 25. Как и при игре Сима, вево3можно действовать и3 комби­ наторных соображений, r. е. и3учать при каждом ходе компьютера все окончания всех во3можпых партий. По­ этому нужно в3вешивать ра3личные ситуации и делать юшлуЧПЦIЙ ход. Л предоставляю вам выбор весов". Июра 26. Все то же самое. У вас 7 игровых положений. Поэтому ваша программа должна пробежаться по 7 столбцам и длн наждого И3 них вычислить вес игрового положения. Ход определяется положением с наибольшим весом. Если есть два положения с одинаковым весом, п р~дпочтительвее более высокое. Чтобы определить веса игрового положения, нужно видеть, принадлежит JШ оно отрезку И3 четырех игровых 139
П()ложевии. уже содержащему 3 ваших mamRи tтогда имсп· во таки нужно играть: максимальный вес) или Зmаmки про4 тиввика (максимальный вес минус 1). Если игровое по­ ложение находится иа пересечении двух отрезков, содер­ шащих по две ша.тки противпика и ничего больше, то оно представляет очень большой интерес для хода. Про­ должите этот авалив, и ваша программа будет носить ваш отличительный знак. Совершенно ясно, что для каждого игрового положения нужно звать состояние всех проходящих через него от­ ревков. В этой игре есть 50 равличвых отрезков с 4 поло­ жениями. Выбор ясен: - либо на каждом ходе вы определяете с помощью программы состояние всех отревков, проходящих 'Jерез точку; - либо у вас есть таблица, вадающая состояния всех отрезков. В этом случае нужно обновлять данные после каждого хода. После всего этого вам нужно сделать еще один выбор. Пусть дано игровое положение, вужво узнать список про- ходящих через него отрезков: · - либо вы определяете его с помощью программы, - либо вы его вадаете с помощью таблицы. Поскольку она пе меняется в течение игры, то эта таблица вычисляется раз и навсегда. Поскольку одно и то же игровое полР мошет изучаться несколько рав, то, конечно, более выгодно устроить обра­ щевие к таблице. Но вам придется преодолеть две труд­ ности: число отрезков, проходящих через данную точку, пе постоянно, во меняется от точки к точке, таблицу очень неприятно распечатывать. я вахrисал верную программу. но я сделал немало ошибок при наборе таблицы и приш- лось их исправлять," . Остается способ вычисления состояния отреэка. Я при­ вял следующее соглашение: - поле, ход на которое вевовможев, обозначается О (нулем); - поле, ход на которое возможен, обозначается 1. Так как вужво изучить отр -~экn, проходящие черев игровое поле, то их наименьшее число 1, во может дохо­ дить и до 4. Поэтому нужно быть в состоянии выделять среди них сегмент, содержащий игровое поле и шашку +. Следовательно, придадим такой шашке значение 4. Можо'l' появиться отрезок, содержащий. +++ со значением 13, отличающийся от сегмента с игровым полем и шашкой О. f40
Поэтому я придаю такой шашRР, зяачение 13. В общем, можно в3ять в качестве 3Пачения отрез):(а сумму 3наqеннй пометоR на этом отре3ке. Наконец, нужно аадать таблицу, сопоставляющую вес каждому во3можиому впачению от­ резка. В вашу программу входит тогда .м:ttoro дюшых, но в3а­ меп у вас отличное время ответа. Если у ВfШ.!tЭГО компыоте­ ра память слишком мала, чтобы име'tь возможность со­ хранить все данные, пе храпите их и проделывайте вы­ числения, когда это необходимо. Тогда вы потеряете время па ответ, и выигрыш в пространстве не обявательпо будет слишком большим: ведь вы ммепйте данные программой ..• 5. СТРАТЕГИЯ БЕ3 ИГРЫ (ВЫИГРЫВАЮЩИЕ СТРАТЕГИИ) Игр а 27. Чтобы найти рекурсивное решение в игре НАДЕВАТЬ, нужно действовать по индукции. На3овем НАДЕВАТЬ (п) решение, которое помещает п шашек на первоначально пустое игровое поле. Предположим, qто мы умеем выпол­ нять мдапие игры НАДЕВАТЬ для р, меньших п. Как поставить па место последнюю шашку? Мы не мо­ жем ее поставить, если это поле пе является следующим 3а первым полем, занятым шашкой. Следовательно, для ее помзщепия па место нужно, чтобы в игре участвовала одпа-едипствеппая шашка, шашка с номером п - 1. С помощью НАДЕВАТЬ (п - 1) можно поставить на место все шашки от 1до п - 1. Если мы удалим все ·шашки от 1 до п - 2, то останется только пtашка п - 1, мож­ но будет поставить шашку п, а затем снова надеть шаш­ RИОТ1ДОn- 2) НАДЕВАТЬ(п) = НАДЕВАТЬ(п -1); СНИМАТЬ(п - 2); поместить(п)1 НАДЕВАТЬ(п - 2) То же самое вы должны проделать и для СНИМАТЬ. Эта эапись не учитывает простых частных случаев, ПО3во­ пяющих и3бежать в этом рекурсивном определении пороч­ ного круга: оно должно содержать пе рекурсивные случаи, Определение должно включать п - 1 и п - 2. Вы можете nибо определить игру НАДЕВАТЬ для п = О (ничего не делать) и п = 1 (поставить первую шашку, что всегда B03MOiIШO), либо для п = 1 и п = 2, Вы сами решите, как лучше сделать. Но еще более удивительно и3учепие «итеративной» стратегии для этой игры, т, е. последовательности ходов, 141
приводящих « nыигрышу. Рассмотрим игру НАДЕВАТЬ. Вы увидите, что первый ход предопределен. Используйте "Гот фа1{т, что ход не должен разрушать то, что было сделано на предыдущем ходе. Вы установите, что - вы делаете пе.рвой шашиой один ход из двух, - остальные ходы полностью определены, таи что в игре НАДЕВАТЬ нет нииаиого выбора. Она пол­ ностыо определена на· иаждом ходе: делайте единственно возможный не глупый ход". Для игры СНИМАТЬ есть два способа начать игру: - удалить сначала шашиу 1 (это возможно всегда), - удалить сначала шашиу 2 (это шашиа, иоторая следует за первой шашиой, расположенной на игровом поле). Нииаиого другого выбора сделать уже нельзя, все остальное полностью определено, Выясните, как сделать этот первый выбор. Иrра 28. Есть только одно указание, чтобы помочь вам, если вы не нашли решение: есть промежуточное решение, в ко­ тором шашки перемежаются. Вы: можете составить сна­ чала рекурсивную процедуру, которая их перемежает, а затем рекурсивную процедуру, которая их заново раз­ деляет. Но вы можете сделать это и итеративным спосо­ бом". Игр а 29. Используйте индукцию или ее двоюродную сестру рекурсию. Если у вас на вашем компьютере рекурсивных возможностей нет (бедные владельцы Бейсика."), исполь­ зуйте ее по крайней мере в вашем черновике: хорошая рекурсивная процедура - лучшее из описаний решаемой задачи. Решите сначала задачу с 8 буквами и 10 полями. Рассмотрим теперь более общую задачу. Пусть Х обо­ значает некоторую последовательность пар аб без пустых полей. Используя предыдущий метод (та же последова­ тельность ходов плюс один), перейдите от ситуации •• а6а6Ха6аб 1~ ситуации 6666 • • Хаааа ::~атем решите задачу для Х и отправьте два последних а па их место. 142
Но таким способом вы пе охватываете всех возможны~· случаев. Нужно найти решения в других частных случаях·~ Вы легко найдете, в каких. Игр а 30. _ Это - типичная игра, которая анализируется методом систематического перебора всех возможных решений. Их: гораздо меньше, чем может показаться, до такой степени, Ч70 в наиболее простых случаях все это выполнимо вруч­ ную. Так, для креста на рис. 23 есть (с точностью до сим­ метрий) только три игровых -хода. Если вы поднимете шашку на пересечении двух ветвей креста, то следующие два хода вынуждены и вы проиграли. Если вы спустили шашку до низа креста, то у вас после этого есть выбор между двумя ходами и в любом случае вы проигрываете. Если вы перемещаете шашку на пере­ сечепии двух ветвей креста вправо (или влево), то следую­ щий ход вынужден, а затем у вас есть выбор между тремя ходами, два из которых сразу проигрывают 1 а оставшийся выигрывает. Тогда без колебаний составляйте: - либо рекурсивное решение. У меня есть процедура, которая решает задачу с п шашками. Какова бы ни была начальная конфигурация, для любого возможного хода вы этот ход осуществляете и решаете задачу сп - 1 шаш­ ками; - - либо итеративное решение. Оно отличается от пре­ дыдущего только необходимостью восстанавливать игру при возвращении назад. Это приводит вас к вопросу о представлении игры. Возможностей много ..• Игр а 31. Поскольку рекурсивное решение тащится по всем кпигам, я ero вам здесь и предлагаю: это избавит вас от поисков ..• Нужно перенести диски со стержня номер п (началь­ ного) на конечный стержень номер к. Номер запасного стержня х (хранилища) таков, что п, к, х есть перестановка чисел О, 1, 2, поэтому п +к+ х = 3. Номер запасного стержня равен 3 - п - к. Чтобы решить задачу, перене­ сем п -- 1 первых дисков со стержня н на стержень х спомощьюН(п- 1,п,3- к - н). Затем мы переносим последний диск п с н на к, что обо­ вначается Р(п,п,к). Эта процедура, которая реализует, например, сооб- 143
щспие пИДЕТСнНАк Нанонец, мы переносим п ~ 1 первых дисков с запас­ ного стержня на стержень к: lI(п-1,3-н - к, к). Нужен частный случай, пе являющийся ренурсивньш. Если диен всего один, то можно сразу перенести его от 11, кк: Н(р,н,к)=ЕСЛИр=1ТОР(1,п,к) ИНАЧЕlI(р- 1,н,3- н - к) Р(р,н,к) Н(р-1,3-н - к, к) RОНЕЦ_ЕСЛИ Проще некуда. Как же может случиться, что находят­ ся и такие, кому эта процедура внушает опасения? В том ли дело, что они не видят, как на самом деле двигаются шашки? Или дело в том, что они испытывают сомнения в правильности процедуры? Продумайте это решение: если оно составляет для вас задачу, то тольно потому, что вы не владеете ренурсией, и жаль, что это тап". Число ходов игры ле1·ко выводится из этой процедуры. Обозначим через f (р) число ходов, необходимых для игры с р диенами. Из рекурсивной процедуры следует, что t(1)= 1, t(р)=2•t(р- 1)+1. (Почему?) Исходя из этого, вы можете вычислить f (р) (па самом деле g (р) = f (р) + 1 имеет более простой занон построения, чем f (р). Образуйте сначала этот закон, най­ дите решение, а затем выведите закон для f (р)). Чтобы доказать свойство, касающееся четности дисков, действуйте по индунции по.... ходу вычислений. Предпо­ ложите, что это свойство выполняется для Н (р - 1, ...) . Понажите, что от сюда следует его справедливость и для н (р, ...). У вас не получается? Вот дополнитеJiьная помощь. Нач­ нем с переноса р - 1 дисков па запасной стержень. Пока пе передвинут (р - 1)-й диен, ни один диен не I{ладется непосредственно на диен с номером р, и требуемое свойство выполняется. Рассмотрим момент, ногда р - 2 дисков находятся на одном стержне, диски с номерами р - 1 и р - на другом стержне, а третий стержень пуст, Вы пере- 144
мещаете диен с номером р - 1 . Тепёрь, посколь:ку нужно переместить первые р - 2 дисков на диск с номером р - 1, то диски будут о:казываться на диске с номером р. Если мы помещаем диен с номером q на диск с номером р, то для того, чтобы образовать пирамиду дисков с номерами от q до 1 и иметь возможность переместить диен с номером q + 1, I\оторый отправится на диен с номером р - 1. Но требуемое свойство выполняется для р - 1 дисков, и поэтому четность диска q + 1 не может совпадать с чет­ ностыо р - 1 . Следовательно, она совпадает с четностью р. Следовательно, р и q имеют разные четности. Потренируйтесь в доказательствах такого рода". Игр а 32. . Предыдущее рекурсивное решение имеет ту особенность, что она не вrшючает в ход игры ни:какого представления этой игры. Если вы хотите представить игру на э:кране даже символическим образом, вам придется создавать представление игры самому. Но трудность состоит только в осуществлении видимого представления, потому что нужно учесть все, сказанное выше. Предположим, что нужно выполнить Р (р, н, к). Вы знаете, что нужно осуществить движение, которое вво­ дит в игру диен размера р, покидающий стержень н, с :ко­ торого он отправляется на стержень к. Это означает, что диск р находится на вершине стержня н, в противном слу­ чае его нельзя было бы оттуда взять. Поэтому вы можете не обращать никакого внимания на значение р. Операция Р (р, н, к) на самом деле следующая: снять диен с вершины стержня н и поместить его на вершину стержня к. Если представить игру в виде 3 строк с помощью по­ следовательностей чисел, то, та:ким образом, достаточно снять крайнее правое -число со стро:ки н и присоединить его справа к стро:ке к. Если вы хотите представить стержни верти:кально, создайте, кроме того, внутреннее представление с помощью трех цепочек символов и составьте процедуру вывода на экран. Это, ка:к :кажется, проще всего. Если вы не лю­ бите цепочек символов, используйте три таблицы_, но вы пе выиграете в легкости. Игр а 33. Если ваш :компьютер допускает ре:курсию, заставьте работать рекурсивную процедуру и понаблюдайте за дви­ жением дисков. В противном случае выполните вручную рекурсивную процедуру ДJlЯ маленького п (например 4), 145
' l lTO поможет вам наглядно увидеть то, что уже до:казано: два диена одина:ковой qетности не могут о:казаться друю на друге. Вы должны sаметитьf что - диен с номером 1 перемещается один раз ва любые два хода, - он перемещается ци:кличес:ки 1 причем всегда в одном паправлении, а именно либоо-11 -22 - о". либоО- 22 - 11-О". Следующий ход, перемещающий диен с номером 1 ~ полностью определен. Недостаточно проверить это.1 это нужно доказать. После этого итеративное решение триви· ально. Можете ли вы априори определить перемещение диска с номером 1 в зависимости от четности чис.ла диенов? Можете ли.вы сказать что-нибудь о движении остальных дисков? Пронумеруйте ходы. Диен с номером 1 перемещается в ходах с нечетными номерами. Проверьте,, а затем дока· жите, что диск с помером 2 перемещается в ходах с номе. рами 2.i 6,, 10, ... , т. е. в ходах, номер которых кратен двум, по не кратен четырем. Обобщите. Исходя отсюда,1 вы можете сказать, зная номер хода, :какой диск буде']) перемещаться, с какого стержня он уйдет и куда придет. Красиво, не правда ли? Игр а 34. Существование четвертого стержня не упрощает стра· тегию, даже наоборот. Одна из вовмощпостей состоит в том. чтобы перемещать р верхних дисков, используя 4 стер;кня. ватем оставшиеся диски - используя тоJ1ь:ко 3 стержня (поскольку четвертый стержень блокирован башней са· мых малепьких Дисков). Наконец 1 вы восстанавливаете р маленьких дисков над остальными~ испольэуя 4 стержня. Обозначим черев /4 (р) - число ходов для перемещения р дисков, и~ пользуя ~ стержня; /3 (р) - число ходов для перемещения р дисков.~ и~ пользуя 3 стержня (известное число.~ см. игру 31). Тогда наша стратегия дает f4(п)= /4(р)+/3(п- р)+/4(р). Нужно выбрать значение Р:. которое мивимиаирует эту сумму. 146
Первые несколько значений для /4 получить лег1:.о: /4(1)=1.•. /4(2)=3"/4(3)=5. В этих случаях на самом деле есть только один способ деirствовать. Вычислите сначала на рунах следующие вна­ чения. Воспольвуйтесь вашим :компьютером, чтобы соста­ вить таблицу, дающую последовательные вначения для /4 (п), вместе с оптимальным вначением р для каждого п (оно не всегда одновначно определено. Вы по своему про­ ивволу можете выбирать ив них наименьшее). Игр а 35. Итеративная программа для игры с 4 стержнями есть обобщение итеративной программы для игры с 3 стерж­ нями. Это видно по ре:курсивной форме. Она не идеально проста". Это вамечание повволит вам перейти к любому числу СТе):>ЖНеЙ. Игр а 36. Нужно снова ввять все, что было нами оставлено в игре 23. Предположите.~ что для некоторого р существует такое значение q, что SG (р, q) =О. Покажите, что в этом случае SG (р, q') == О для всех q' < q. Следовательно" если р таково" что SG (р 1 1) = О, то должно существовать некоторое g такое, что SG (р, g) == ·=О, но SG (р, g + 1) :::/=О; g - наибольшее ив значений q, дающих равенство SG (р, q) = О. Нужно построить последовательность р 1 , g1• Вы можете покавать_, что если g1 = 1" то р;н = р1 + 2, втовремякакеслиg1>1"тор;н = Pt+3. Хороший способ действия состоит в том, чтобы опереть­ ся на геометрические рассмотрения. Числа Спрага-Грюн­ ди интересуют нас только с одной стороны- равны они нулю или нет (У нас нет намерения играть несколько игр одновременно, что ивбавляет нас от вычисления Ним-сумм и, следовательно, от заботы о значениях ненулевых чисел Спрага-Грюнди). Число Спрага-Грюнди равно нулю тогда и только тогда, когда невовможен никакой переход R нулевому числу. Но положение р, q допускает переходы к р - k, 1 для k <; 2q. Следовательно, мы получим SG (р, q) = О тогда и толь:ко тогда, когда SG(р- k1k)=1=Одлявсехkот1до2q. Н7
Hapиc~ihe на плосRости две перпепдиRулярпые оси, р RaR абсциссу и q R~li ординату, Обозначьте то-rки с ну· левыми впачениями SG. Рассмотрите те прямыеr RОторые проходят через точRи рсSG (p,f. 1) = О..Нужно ивучить прямые р - k, k, где k меняется от 11 т, е, те.~ которые параллельны биссектрисе q • • • • • • • • 10 • • G • • • б • • • • • 3 • • 2. .• • • • • • • ,. •• • •• •• о35 811131618 '2.6 р Рио. 88 второго и четвертоюо Rоордипатпоrо yrna и прохоnят через l'OЧRyр- 1~1. Мы представили отрезок такой прямой р;ля р !';!;:: 28 (см. рис. 38). Он переСеlЩ'J точку о пулевым впачепием l'l:a вертикали 21 i!!llt 28 - 7, 3пачи.т, нужво ограничить . число k шестью, вадавая g ;;;; 3 при р ;= 28, Для р :::::; 34 диагональ~ прохор;ящая черев 33i 1 про· ходит над всеми отрезнами G Опля р ::р. О и пройдет поетому • пересекая ось q при q =- 34. Цовтому нужно ограничить число k тридцатью тремя И.~ следовательпоJ, взять g ==1 [l::z 33: 2 = 16. , У вас есть также неноторое число таRих PtJ что р;иаго­ валь, выходящая из р 1 - 1,. 1.1 , пе пересеRает никакого, отрезка нулей перед осью q" что иает_ g1 &! (р 1 - 1) : 2. 148
йсходя отсюда, следующие числа р определяются диа­ гоналями, которые перерезают вертикальный отрезок, выходящийизр1, так"чтор- р1<g1= (Pi- 1):2. Тогда можно восстановить первоначальную последова­ тельность" несущую нули, вплоть до (р 1 - 1) : 2. Теперь вы легко сможете доказать" что интересующая нас последовательность р 1 есть последовательность чи­ сел Фибоначчи. Составьте программуt. перечисляющую р 11 g,. 6. КОМБИНАТОРНЫЕ 3АДАЧИ Головоломка 20.Полноерешение. Поскольку 0та задача всюду решена,,, предложим та:кже и здесь решение: 0то избавит вас от поисков других ре­ шений; и, кроме того.• я буду уверен,, что вы посмотрели па все существенные места 0той задачи. Есть книги, ко­ торые ... Но это - совсем другая история. Заметим сначала, что два ферзя не могут находиться на одпой строке (горизонтали) и., поскольку нужно по­ ставить 8 ферзей на 8 строк, то па каждой строке есть ферзь. Поэтому я буду говорить «ферзь k» вместо «ферзь1 стоящий па строке k». Точно также1 есть только один ферзь в каждом столбце. Но совершенно ясно,_ что я пе могу управлять в одно и то же время .равмещепием и по строкам и по столбцам - собственно,. 0то от меня в вадаче и требуется. Я собираюсь поэтому размещать ферзей па последовательных строках, пачиная сверху. Чтобы начать,; я помещаю ферзя в первый столбец на первой строке. Тогда мне остается решить меньшую вадачу: разместить 7 ферзей на 7 последних строка~ шахматной доски"' учитывая, что ферзь стоит на первом поле первой строки. Я получу тогда все решения с ферзем 1 в столб­ це 1. Затем я поставлю ферзя 1 в столбец 2 и разрешу за­ дачус7ферзями,ит.д.- 8рав. Обобщим. Мы собираемся решить частную, по нужную задачу: полагая., что уже есть ферзи, правильно размещен­ ные па строках от 1 до k - 1, и зная их положение" найти все возможные решения, ра..;мещая подходящим образом фервей с номерами от k до 8. Обозначим программу, ко­ торая это делает, через HR (k) *). Стратегия очень прос'Iа: *) Малепы\ая головоломка для знающих фрапцузс:кий (или хо:я бы имеющих словарь}: откуда это обозначение?- Примеч. ред, 149
- мы пробегаем все поля па строке k" - если поле свободно (т. е. не бьется уже поставлен... пыии ранее фервями)" то мы ставим на него ферая k и ре­ шаем ту же аадачу для k+1. При k = 8 аадача проще всего. Не иожет быть более одного свободного столбца. Если он есть.t то мы ставим туда последнего ферая и ааписываем полученное таким обравом решение. Если свободного столбца нет,. то нет и решения. Для аадачи HR (k) необходимо апание состояния игрыr, получающегося после размещения первых k - 1 ферзей. Это предполагает по крайней мере, что иавестны столбцы, аанятые этими ферзями. Может быть, следовало бы скааать больше. Обоаначим символически «аапять k, i» операцию, которая констатирует факт,1, что в стоблце i на строке k помещен ферзь. HR(k, = ДЛЯ i :=1 ДО 8 ВЫПОЛНЯТЬ ЕСЛИ место k~ i свободно ТО аанять k, i ЕСЛИ k = 8 ТО выписать решение ИНАЧЕ HR(k+1) RОНЕЦ_ЕСЛИ освободить ki i RОНЕЦ_ЕСЛИ ВЕРНУТЬСЯ Операция «освободить k, i» отменяет то.~ что делает опе­ рация «аанять k, i». Для решения аадачи нужно наложить последовательность инициалиаации, отмечающую" что ничего не сделано и ни опин фераь в игре не участвует. а аатем выавать HR (1). Эта процедура рекурсивна. так как она обращаетсп сама к себе. Тщательно научите ее. Если вы. исхоците иа rипотеаы, что HR (k + 1) находит и выводит ~е такие решенияf у которых первые k фераей стоят там1.' rде онп поставленыt то у вас не будет никаких аатруднений . в том• чтобы убедиться$ что ата процедура совершенно правильна. Испольауйте крайние случаи: k ;:;;; 8 и начальное обраще­ ниесk::::;1. Если у вас в наличии нет никакого другого яю,~ка, кро­ ме Бейсика,. или если вы раб своего яаыка до такой степени, что не желаете учить что-нибудьt кроме Бейсика1 то вам придется писать итеративное решение. Это сложнее. Будем исходить иа наиболее общей ситуации. Пусть на шахматной A!OCrte уже размещено k - 1 ферэеii, Обовна- 150
чим зто состояние буквой С (в смысле «самое общее состоя­ ние»). Это состояние раскладывается на три подсостояния: - уже размещено по местам 8 фервей (k - 1 = 8): состояние С8; - па строке с номером k есть допустимое место для фервя: состояние СОК; - либо строка с номером k блокирована полностью, либо .все вовможные поля на ней уже исследованы: СВ. Запишем кусок программы 1 который равличает эти !l'ри случая: С: ЕСЛИ k=9 ТО С8 ИНАЧЕ искать первое свободное поле на строке k и придать значение этого поля величине t; ЕСЛИ нет таких полей ТО СВ ИНАЧЕ СОК КОНЕЦ_ЕСЛИ КОНЕЦ_ЕСЛИ Рассмотрим теперь каждое ив подсостояний. СОК: есть свободное место в точке k, t. Туда ставим фервя k и получаем снова самое общее состояние с еще од­ ним размещенным фервем. Формально: СОК:ванятьk,i;k:==k+1;С Если строка k блокирована, а также если она пол­ ностью исследована, то нужно ивменить выбор, который был сделан для фервя k - 1, и передвинуть его на свободное место правее (если оно есть). Это возвращение навад от­ носится непосредственно к ферзю k - 1 и, следовательно, сохраняет только k - 2 первых фервей, что вшывает необходимость уменьшить k на 1. Может случиться, что это приведет нас к k =о .. т. е. может случиrься, чт<> вое места на строке 1 уже исследованы и, следовательно, ра­ бота закончена, что мы обозначим как состояние Я1 конец программы. СВ: k := k-1; ЕСЛИk=ОТОЯ ИНАЧЕ найти место t ферзя k; освободить k, i; найти первое свободное поле на строке k, рас­ .положенное правее i, и придать значение этого поля величине i; ЕСЛИ нет таких полей ТО СВ ИНАЧЕ СОК КОНЕЦ_ЕСЛИ RОНЕЦ_ЕСЛИ t5t
Когда 8 ферзей уже размещены, пужпо запиоьп1атъ реш~пие. Бесполезно искать другое место для вооьмоrо ферзя, потому что если на восьмой отроке и есть свободное место, то только одно. Таким образом, строка 8 оказывает­ ся uолноотью иоол~доваппой и нужно снова размещать 1 предыдущих ферзей. А состояние, в котором строка 8 поJr­ ностью исследована,- это состояние СБ о k = R. -' С8: выписать решение; найти место i ферзя 8; освободить 8, i; k:=8;св Остается пустить этот процесс в ход. В начале пи один ферзь в игре не участвует и, следовательно, k - 1 = О. Нужна инициализация, которая бы это· открыто провоз­ глашала: ПРОГРАММА: k := 1; инициализировать игру: С Объединим куски. Мы uолучим проrрамму" реализую­ щую автомат, как мы уже видели в игре 12. Вы !IЮЖете раосlllатривать имена, написанные проuисными буквами (С,, СВ, СОК, С8, ПРОГРАММА) как метки, uозволяющие отсылать к части uрограммы, в начале которой стоят эти имена со знаком «:» uосле них, и как инструкцию ПЕРЕЙТИ R, если они указаны в конце последователь~ ности операц11й. Поэтому все это непосредственно пере­ водится на совершенно любой язык. 152 ПРОГРАММА: k : = 1; инизиализировать игру; С Ci ЕСЛИk=9ТОС8 ИНАЧЕ искать uервое свободное поле на строке k и придать значение этого поля величине i; ЕСЛИ нет таких полей ТО СБ ИНАЧЕ СОИ RОНЕЦ_ЕСЛИ RОНЕЦ_ЕСЛИ СОИ:запятьk,i;k:=k+1;С СБ:k:=k - 1; ЕСЛИk=ОТОЯ ИНАЧЕ найти место i ферзя kJ освободить k, i; ИСКАТЬ первое свободное иолв на отроке k, расположенное uравее i, и придать значение этого по;~я величине i; ЕСЛИ нет таних uолей ТО СВ ИНАЧЕ COR RОНЕЦ_ЕСЛИ RОНЕЦ_ЕСЛИ
С8: выписать решение; найти место i ферзя 8; освободить 8,; i; k:=8;св Мы можем улучшить эту программу. Неприяттто иметь необходимость находить заново место фервя в стро­ ке, тем более, что внание этого места необходимо длн ны­ вода на экран получепного решения. Заменим i номером с [kJ столбца, где расположен ферзь k. Тогда искать меrто этого ферзя больше не нужно. Именно операция «ванять k1 i» и будет даnать величине с [k1 вначение i, У нас есть двз похожих отрывка в программе~ 11 СВ: иснать первое свободное поле на строке k,i распо­ ложенное правее- i, и придать значение этого поля величине t; ЕСЛИ таких полей пет ТО СВ ИНАЧЕ COR КОНЕЦ_ ЕСЛИ вС: искать первое свободное поле па строке k и придать значение этого поля величине iJ ЕСЛИ таких полей нет ТО СВ ИНАЧЕ COR RОНЕЦ_ЕСЛИ Второй отрывок идентичен первому, если вместо того~ чтобы искать первое свободное поле (что подразумевается как начальный ход), мы потребуем искать первое свобо,!!· ное поле после i, где i придано значение О. Эту общую по­ следовательность команд мы назовем И (от «искаты>). Вот новая программа: ПРОГРАММА: k := 11 инициализировать игру1 С С:ЕСЛИk=9ТОС8 ИНАЧЕ с lk] :=О; И КОНЕЦ_ЕСЛИ И: искать первое свободное поле па строке k после с [k] и придать значение этого поля величине с lkJ1 ЕСЛИ таких полей нет ТО СВ ИНАЧЕ COR RОНЕЦ_ЕСЛИ COR: 2анять k, о[k]1 k:=k+1;С СВ:k:=k -1; ЕСЛИk=ОТОЯ ИНАЧЕ освобо[\ить kJ, с [k) и 153
RОНЕЦ_ЕСЛИ СВ: записать решение; k := 8; освободить kr с[k], СВ Мы можем еще . немного выиграть. Значение 9 для k яе может быть достигнуто иначе нан после равмещепия ферзя па строке 8 с помощью СОК. Вместо того" чтобы проверять справедливость соотвоше11ия k = 9 в С, можно сделать это в COR. Если нужно разместить восьмого фер­ вя, то бесполезно требовать «вапять k, Ь с тем, чтобы сраву после этого освободить указанное поле. Отсюда - новая, еще более простая программа. ПРОГРАММА: k := 1, ипициал:;1вировать игру; С с~о[k]:= О; И И: искать первое свободное поле на строке k после с (kJ и придать значение этого поля величине о [k]j ЕСЛИ таких полей нет ТО СВ ИНАЧЕ СОН НОНЕЦ_ЕСЛИ СОН: ЕСЛИ k = 8 ТО записать решение~ СВ ИНАЧЕзапятьk1о[k];k:::::;k+1;С НОНЕЦ_ЕСЛИ СВ: k:=k-1 ЕСЛИk=ОТОЯ ИНАЧЕ освободить ki с [k]1 И НОНЕЦ_ЕСЛИ Дальше можно выиграть пе таи уж много,, и мы в своих преобразованиях_, направленных па улучшение програм­ мы, остановимся эдесь. ЧитателL мог бы и удивиться моему способу работать: почему пельвя сраву дать хорошую программу? Потому что~ по моему мнению, ее трудно по- 11учить сраву. Я мог бы с помощью мелких замечаний пред­ ставить ее вам беа наних-либо промежуточных рассуж­ дений, Читатель был бы восхищен моей сноровкой, по.t может быть~ ваявил бы.• что программы такого рода ему самому недоступны" и отказался бы и от этого упражнения, в от остальных упражнений ив атого семейства. Если, напротив.~: 11Итатель находит последнюю программу оче­ впдной, то это потому, что его интуиция намного богаче моей, и оп выходит из этой работы ободренный: оп еще бо­ лее ловок, чем автор, браво! И во всех случаях я выигры­ ваю. Перечитаем пашу программу, чтобы лучше попять ее стратегию. Мы начинаем с пустой шахматпой доски. Строч­ на ва строчной мы ищем первое свобоцпое пщ10 и ваппмаем t54
его. Это - цикл, который идет от С к И, затем в COR и sатем в С, и который останавливается, когда либо все ферзи уже размещены (выход в СВ из СОН), либо, что более ве­ роятно, когда одна из строк блокирована (выход в СВ из И). Если строка блокирована (или после того, как решение выписано), -мы поднимаемся строчкой вверх (k :== k ~ 1 в СВ}, освобождая ферзей, пока не окажется -возможным передвинуть какого-то ферзя правее (цикл СВ, И, СВ из И). Rак только оказывается возможным переместить ферзя правее, он туда перемещается и возобновляется спуск. Учитывая все это, мы видим, что наша стратегия доста­ точно проста и выглядит естественной, как только мы к пей привыкаем: ведь привычка - вторая натура, не так ли? Существенное замечание: я говорю о программе так, как будто она закончена. Но еще ничего завершенного нет: вы никак пе можете ввести эту программу в машину,: потому что все записано символически. Нак вы узнаете, является ли поле свободным? Что это такое - занять поле? Такая ситуация не является исключительной: мы можем обсуждать стратегию программы, совсем не обсуждая пред­ ставление данных. Две вещи полпостыо разделены:, - алгоритм или стратегия, которой мы следуем при проведении вычислений; - структуры данпыхf или способ представления эле­ ментов вычислений посредством основных типов, имею­ щихся в распоряжении используемого язы1{а (в основном: числа~ символы 1 таблицы или массивы чисел, цепочки сим­ волов). Это - один ив фундаментальных принципов програм­ мирования: стараться отложить па как можно более позд­ нее время любое решение относительно выбора наиболее удобного представления дапных. Рассмотрите сначала стратегию, которой вы следуете, используя символиче­ ские формулы, которые вы впоследствии разовьете. Есть только две возможности: - либо, как в рассматриваемом случае, вы приходите к цели. Rar{ только этот первый этап пройден, вы спокойно обсуждаете представление данных; - либо вы пе в состоянии добраться до цели вследствие некоторого влияния структуры данных на стратегию. Ta- I{Oe бывает. Rогда вы не можете продвинуться дальше в разработке стратегии, тогда начинайте с выбора пред­ ставления данных, в котором вам послужит все то, что вы уже сделали к этому времени, и вы учтете то, что вао остановило, 155
Программирование всегда должно идти нисходящим путем. Снаqала - алгоритм или стратегия. Потом - структура данных. Посмотрим, какие структуры данных вовможны в на­ шей вадаче. Перваf{, наиболее естественная идея: я пред­ ставляю шахматную доску с помощью квадратной таб­ лицы с 8 строками и 8 столбцами. Я ставлю нули на пус­ тые клетки. Чтобы найти свободное поле на строке, я Перебираю поле за полем на строке, пока не нахожу поле -с нулем. Это просто. Но как теперь ванять поле k, с [k]? Поместив туда вначение k. Это тоже просто. Но фервь, J\оторого нужно разместить, бьет некоторое количество полей, и их уже нельзя будет в дальнейшем занимать. Что бы это учесть, нужно ваписать значение k по всем ранее свободным полям, которые теперь бьет этот новый ферзь. Здесь нужен цикл для занятия полей под ферзем на той же вертикали, а затем два других цикла - для каждой из диагоналей, проходящих через это поле (бесполезно занимать поля строки, потому что строка больше рассмат-· риваться не будет). Это проще всего. Что касается осво­ бождения, то нужно пробежать по шахматной дос1\е и заменить там все значения k нулями. Очень долго ... Но 1•ак же иначе? Если что и составляет существенную необходимость, то именно знание, можно использовать поле или нет. Как бы я поступил при работе вручную? Выяснил бы, есть ли ферзи в том же столбце или на диагоналях, проходящих череэ это Поле. Следовательно, мне достаточно знать состояние занятости столбцов и диагоналей. Я могу найти выход с помощь J трех таблиц: одна - для столб­ цов, другая - для левых диагоналей, третья - для пра­ вых диагоналей. Чтобы узнать, свободно ли поле, я стану выяснять, свободны ли проходящие через него диагонали и столбец. Чтобы занять поле, я отмечу, что его столбец и диагонали заняты. Чтобы ero освободить, я отмечу, qто они свободны. Циклов больше нет. Вот хорошее реше­ ние. Таким образом, нужен вектор с 8 полями, чтобы ска­ зать, свободны ли столбцы. Обозначим этот вектор ст. Тогда ст [i] = О будет означать, что в столбце i нет ни одного ферзя. Его не надо путать с с [k], который отвечает па вопрос, в каком столбце стоит ферзь k. Диагонали характеризуются тем условием, что сумма или равность номеров строки и столбца постоянны. Обо­ значим qepea дп диагонали, соответствующие сумме, дм - диагонали, соответствующие разности. В первом прибли- 156
~нении диагонали, соответствующие полю k, i, суть дп[k+i]идм[k- i]. . Нопри1<k<8,1<i<8суммаменяетсяот2до16, а разность - от -7 до 7. Чтобы остаться в промежутке от 1 до 15 (чего некоторые языки просто требуют), нужно вычитать 1 из суммы и прибавлять 8 к разности, Тогда диагонали, проходящие через k, i, суть дп [k + t - 11 идм[k- i+8]. Операция «искать первое свободное поле ...» реализу­ ется маленьким циклом в программе. Вот·- на псевдо­ Я3ЫКе, используемом в этой книге и близком к Бейсику, LSE и язЫI{У Паскаль,- что из всего этого получается: ТАБЛИЦА с[8], ст[8], дп[15J, дм[151 . k:=1 ДЛЯ j := 1 ДО 8 ВЫПОЛНЯТЬ ст [j] :=о ВЕРНУТЬСЯ для j := 1 до 15 выполнять дп[j]:= О; дм:= О ВЕРНУТЬСЯ С c[k):=O и i:=с[k]+1 выполнять ЕСЛИ i = 9 ТО КОНЧЕНО KOHEЦ_EGJIИ ЕСЛИст[t)=ОИдп[k+i- 1]=ОИ· дм[k- i+8]=ОТОКОНЧЕНО КОIIЕЦ_ЕСЛИ i:=i+1 ВЕРНУТЬСЯ ЕСЛИ i = 9 ТО ПЕРЕЙТИ К СВ КОНЕЦ_ЕСЛИ сок с[k):=i ЕСЛИ k = 8 ТО В9}ВЕСТИ с; ПЕРЕЙТИ К СВ .КОНЕЦ_ЕСЛИ ст[t]:=k;дп[k+t- 1]:=k; дм[k- i+8):={ljk:=k+1 ПЕРЕЙТИ К С свk==k-1 ЕСЛИ k = О ТО ПЕIЩЙТИ К Я КОНЕЦ_ЕСЛИ i:=с[kl;ст[t]:=О.;дп[k+i-1]:=О; дм[k- i+81:= о ПЕРЕЙТИ К И Я КОНЕЦ_РАБОТЫ У вас теперь есть все, что только может быть вам нужно для того, чтобы это заработало на вашем КОll!DЬютере. 157
Что пас!1ется симметрий, то "ПОТ ука:lание. Эта про­ грамма заставляет первого ферзя пробежать всю перnую строну. Но достаточно, чтобы он пробежал половину, а ватем дополнить результат по симметрии. Остановить пробег, когда с [1] достигает значения 4, нелегко, но леrтю вачать пробеr с цифры 5. Ну, уж ·,еперь-то я сказал вам достаточно ... Я не знаю простого решения для симметрии относи­ тельно диагонали. Если вы найдете такое решение, на­ пишите мне". ГОЛОВОЛОМКа 21. Я не вижу способа взяться за эту а ада чу, существенно мличного от предыдущего. Нужно найти нюю1юю границу для числа ферзей. На пустой шахматной доске.ферзь может блокировать 28 полей. Следовательно, нужно по крайней мере 3 ферзя, чтобы блокировать доску. Их нужно не больше 7: если вы уже пытались вручнуrо поставить 8 ферзей, то вы должны были убедиться, что шахматная дос­ ка часто блокируется до того, как мы смогли поставить восьмого ферзя. Точно таи же вероятно, что 6 фервей долж­ но хватить. Поэтому нужно исследовать отрезок от 3 до 6 ферзей. Нет нипакой уверенности в том, что эти ферзи пе долж­ ны бить друг друга. Конечно, на шахматной доске есть поля, которые бьются по крайней мере двумя ферзями. Но нужно иметь возможность ограничить поиск решения­ ми, для которых никакие два ферзя не бьют друг друга, или, может быть, немного проще - решениями, для которых никакие два фервя не стоят на одной строке. Вы размещаете k ферзей. Вы пробегаете шахматную доску в поисках свободного поля, Если его нет, то у вао есть решение. Если свободное поле есть, то вы ставите туда ферзя и начинаете поиск сначала. Бесполезно про­ бегать строки, на которых ферзь уже есть, Это соображе­ ние ускоряет проверку. ГОЛОnОnОМКа 22. Ничеrо трудного. Нужно перепробовать все комби­ нации. Берем какую-нибудь шашку домино в качестве начальной Шашки цепочки и пробуем шашки одну ва дру­ гой. Они вынимаются из хранилища, а ватем отыскивается 11ервая шашка, которую можно связать с данной, тем же способом, которым отыскивалось первое свободное поле па следующей строке. Тщательно выберитевашепредставление шашек домино. t58
ГОЛОВОЛОМКа23. И на этот раэ программирование достаточно просто. Вы эадаете крайние члены последовательности1 а1=О,an= k. С помощью уже проведенного рассуждения вы можете эаф1шсировать а2=1,an-1=k-2. Затем вы размещаете следующие члены в интервале (2, k - 3), например, уплотняя их к началу: а3=2,а4=3,а5=4.•. Вы образуете раэuuсти и, если они дают слишком много повторений (вы можете узнать его, не вычисляя всех раэ­ ностей, что ускоряет тест), вы увеличиваете последний подвижный член an-2 и, когда добираетесь до конца, уве­ личиваете предпоследний подвижный член, затем берете an-2 = an-3 + 1 и продолжаете дальше. · Для последовательности с 5 членами есть только один подлежащий раэмещению член, и все идет очень быстро. Но сложность растет с ростом п очень круто. Если при 5 членах есть только один подлежащий размещению член, то с п = 6 их уже два и задача квадратична. Для произ­ вольного п число подлежащих испытанию случаев имеет порядок пn-4 • Можно, наверное, и еще ускорить. Если даны п и k (значение последнего члена), то известно максимальное число возможных повторений, и можно выбрать наилуч­ шие исходные значения. Если есть право на r повторений, то можно брать не более r - 1 последовательных членов, начиная с а2 , и, если они взяты как исходные эначенил, то права на повторение больш~ нет. Тем не менее эта зада­ ча расходует огромное количество машинного времени ..• ГОЛОВОЛОМКа 24. В этой эадаче я вас полностью предоставляю себе. Прин­ цип все тот же. Но нужно как следует все орГанивовать. Желаю успеха. ГОЛОВОЛОМКа 25. Здесь, наоборот, помощь может оказаться далеко не лишней. Эта программа потребовала от меня массу вре­ мени. Кроме того, это поучительный случай, который я со­ храняю в своих архивах как типичный пример для целого класса задач. Среди информатиков есть два принципиально разных взгляда на программирование. Есть школа, приверженцы 159
которой сначала проделывают всю математическую работу:. они считают, что для того, чтобы написать хорошую про­ rра111му, нужно сначала докавать неко:rорое сnойство дан­ ных, а ватем использовать его для получения ревультата. Сначала сделайте ~атематику, а информатика придет поз­ же. Таким образом, это способствует рассмотрению ин­ форматики как ветви математики. Но есть и другой подход. Напишите сначала програмыу, пусть даще неэффективную. Затем понаблюдайте за ее по­ ведением или постарайтесь прояснить ее действие. С по­ мощью подходящих преобравований сделайте ее более ревультативпой. Довольно часто я получ аю таним образом весьма эффективные результаты, и я убежден, что в этом состоит новый метод совдания алгоритмов. Но бываю'D упорно сопротивляющиеся случаи. Эта головоломка - ОДИН ИЗ НИХ. Начну со следующего замечания: речь идет о том, чтобы образовать все вовможные перестаповни и выбросить все те, rюторые не удовлетворяют условиям задачи. Рассмотрим сначала случай 9 девуmеr> . Обозначим их а,6,в,г,а,е,~с,в,и. Первая прогулка может быть выбрана произвольно. Возьмем: абв вае жви Беря в качестве строк столбцы этой таблицы первой nрогулки.t получаем вторую nрогуш•у: авж бав веи Диагонали приводят к двум оставшимся прогулкам: ааи аеа ггв бги беж вдт Все благополучно. Попробуем теперь 15. Первая прогулка абв где жзи клм 1-(,оп i60
Если вы возьмете в.качестве трех первых строк второй прогулки начала столбцов первой прогулки: а8ж 6дд веи вы пе сможете далее органивовать 6 оставшихся букв в двух строчках, не повторяя пар, Но вы можете сохранить пер­ вые пары в этих трех строках и ввять в качестве послед­ них элементов соответственно ж, к, н. Посредством этого приема получаются в двух столбцах по три неиспользо­ ванных элемента, которые и можно ввять в качестве новых строк. Получается вторая прогулка: ааж ба~ вен 8ло имп Сейчас мы докажем некоторые свойства искомых про­ гулок. Но эдесь я дeJiaIO вa:llf подарок. Мне потребовалось несколько дней, чтобы сообравить все то, что следует ниже. Почему бы вам не предоставить себе несколько дней на равмышление? Тогда аакройте книгу на этом месте". Рассмотрим подмножество ив семи букв а, 6, в, г, а, е, ж. Исходя ив этих элементов, можно образовать 7 * 6/2 = = 21 пару. В первой прогулке участвует 6 ив этих пар: а-6 а-в 6-в в-д г-е д-в Во второй прогулке их пять: а-8 а-ж 8-Ж 6-д в-е что составляет всего 11 пар. :Таким образом, на оставшиеся 5 прогулок остается распределить 10 пар. Но поскольку есть 7 элементов и только 5 строк, то в каждой прогулке будет встречаться не менее двух таких пар. Следователь­ но, в каждой ив оставшихся прогулок встретятся в точ­ ности две таких пары. Обовначим черев х любую ив выде­ ленных букв, а остальные буквы будем обозначать точ­ ками. Ост1вшиеся 5 прогулок имеют вид хх• хх• х х•. х• 6 Ж. Арсак f8f
Но можно еще кое-что уточнить. Рассмотрим только первые 6 букв а, б, в. г, д, е. Они дают 15 пар, из которых 9 реализуются в двух первых прогулках. Таким образом, среди 5 оставшихся прогулок надлежит распределить 6 из них, что означает по одной паре в четырех из них и две в последней,. Поэтому получаем; :сх•хх • хх.хх • хх• :сж.хж. хж•хж.хх• :с••х. х• х••х• • :с••х• х••х. • х•• :с• • х••х х••ж. • Заменим ж на к или н, и получим тот же результат. Покажите самостоятельно, что в конце концов получа­ ются следующие схемы хх•хх.хх • хх•хх• а;ж•хж.хж.хж. хх• хк•хк • хк.х:~ •х.. хн•х"' .хн хпfх х• • х••х• • х• жкн Вам остается расставить сначала а, б, в, г, д, е вместо букв ж, ие воwбновляя уже использованных пар, а затем расставить бу1<вы а, и , .л., м, о, п вместо точек, соблюд~я то же правило. На моем компьютере это отнимает не бо­ лее 3 иинут. Эффект впечатляющий. Здесь мы можем правильно оценить истинную природу комбинаторных задач. Они СJIОЖНЫ - иначе говоря, они требуют много времени для вычислений (именно в этом смысле и употребляется слово ~сложныйl) в информатике). Предварительное доказатель­ ство подходящих свойств позволяет избежать слишком бom.moro ч:исла попыток и, следовательно, уменьшить сложность. Остается то.11ь1<0 найти эти хоропще свойства". Головоломка 26. Пентам:иво является другим примером: этоrо уТ11ерж­ девия. Общая идея решения проста, если учесть все то, что вы уже сделали. Вы рассматриваете прямоугольную область, которая должна быть по1<рыта различными ку­ сочками и в начале игры должна быть обозначена вами как пустая. Вы можете действовать двумя способами: - рассматриваете первое свободное поле и ищете ку­ сок, который можно туда поместить; 162
- берете первый. еще не использованный кусок и пы­ таетееь поместить ·его на игровое поле. Куоон u:ожет быть по-разному ориентирован. Если «I » (прямой брус) может быть размещен в прлмоуrольни­ Rе 3 Х 20 только ·одним способом (параллельно большей стороне), то tF}> (вроде правой нижней фиrуры на рис. 31) может быть ориентировав восемью способами. Это зави­ сит в первую очередь от симметрии куснов. Чтобы не было необходимоет1: определять, :какие ори­ ентации допустимы, вы можете задать - в качестве про­ граммных констант - все эти возможные положения Rаждого нуска. Рис. 39 Вы мо1ш~те ооставить программу без каких-либо хит­ ростей. Кажется, что более эффек'l'Ивно брать первое пус­ тое поЛе и пытаться поместить туда какой-либо нусок. Вы ищете первое свободное поле. Вы рассматриваете пер­ вый еще пе испопьзованвый кусок. Вы исследуете в не­ котором порядке все ero ориентации, чтобы выяснить, приемлема пи какая-нибудь из них - покрывает ли она только свободные поля. Если игра блокирована (никакой EycoR поместить нельзя), то вы удалЯ:ете поопецпий раз­ мещенный нусон и продолжаете поиск, начиная со следу­ ющей ориентации того же куска. Я пробовал сделать тап, И ЭТО СJIИJШ(ОИ ДОЛГО,., Тогда я стал пытаться избежать большого числа ис­ пытавв;й, 11схо;в.я из замечания, сделанного при поС'l'анов­ не задачи: кусок пе цоnжев определять в игре «острово~ с площадью, пе пратвой ПЯ'J.'И. Но определение островков нетрив11uьпо,., Я действую сл.е;цующим образом. Я отыскиваю запол­ нение пряиоугольни«а: паралJJельво меньшей сторояе. Рисунок 39 показывает возможную ситуацию в ходе вы­ nонневuя 8ТОГО ппана. Рассмотрим тогца ковфитурацию, окружающую край­ нее вевое из свобоцпых полей. Обозначив через <сп завя­ 'fЪl.е .. ом п nо.1:агая овобо;цнв:t1 поля точками, мы получим ве более '1 воsможвых ~:пучаев (оови вы привыкJIИ • дво- 6" 163
ичпой нумерации, то это поиажется вам очевидным}: см. рис. 40~ В :крайней : евой ситуации будем искать способ за­ нять свободное поле на верхней строке. Но ни один из кусков ни в иакой иэ их ориентаций не подходит. Вы не мож ете использовать ни крест, ни «F», ни «Z». Кусок «С» можно испОJ1 ьзовать тоJ1ьк о с большей стороной по вертикали ... Я закрепил за ка;кдой ионфи rурацией списО){ допус­ тимых в ней t{усков , и если такие кус ки есть, по,- ,робный х• хх х• хх х• хх х• ·х. х• хх хх х. х• хх х. х. х• х. хх хх Х·Х Рис. 40 список их возмо;1шых ориентаций. Это существенно умень­ шае·r число попыток. Еще оказывается, что вр емя от вре­ мени появдяются острова недопу стимой площади, но они существуют только очень :короткое время. Я узнал э1 о, поскольку я выводил на экран состояние иrры всякий раз, когда в игру входnл новый кусок. Этот способ действия имеет много преимуществ: - очень неудобно иметь программу, :которая работаtЛ несколько десятков минут (порядка 45 на моем микроком­ пьютере), а· мы ничего не знаем о том, что в ней происхо­ дит. Это неудобно :как собственно для работы, так и для того, чтобы сразу же задавать вопросы. А ес1ш, хотя бы ото и было ошибкой набора, вдрую найдется бесконечный цикл ••• - этот вывод позволяет видеть работу компьютера. Видно, :как один за другим исследуются :куски, как ИI'po­ llQe поле более или менее наполняется (иногда вшють .itO одиннадцати :кусков. Если вы пытались решить эту rоловолом:ку вручную, отметили ли вы, какое впечатле­ ние производит нехватка одного :куска? Однако это прос­ то: ecл:tt остается островок площади 5, то он обязательно имеет форму одного из игровых :кусков .•• ). Затем она поч­ J'В nоЛностью опустошается, и возобновляез-ся заполне- nяе .•• Ковечно, вывод на э'Кран требует машинного времени n замедляет работу программы. Всегда будет время о тка­ заться от вывода н(зкран и переделать процесс выполне­ вия программы без вывода на экран, чтобы получить точ­ вое время решения зада'lи. Что бы вывод был 'Красивым, 164
нужно, чтобы рамка оставалась на экране неподвижной. Сделать это более или менее легко в зависимости от си­ стемы программирования, имеющейся в вашем распоря­ жении. Для вывода на экран я не нашел хоро :пего рисунка, потому что у меня нет ни графического, ни полуграфиче­ ского экрана - только алфавитно-цифровой. Каждому нуску я сопоставил букву и вывожу куски на экран в ви-, де подходящим образом расположенных пяти букв. Такой вывод по1~азан на рис. 41. ссхуууу••••••••••••• СХХХУNN••••••••••••• ССХNNN•••••••••••••• Рис. 41 Я представляю игру внутренним образом в виде це­ почки символов по двум причин:ам: - используемый мною язык (LSE) в используемой мною версии является одним из наиболее эффективных языков для работы с цепочками символов. Э:rо почти так­ же быстро, как если использовать таблицы. Я могу очень быстро найти первое свободное место, я могу очень быстро узнать, свободно ли поле (является ли символ на этом месте в цепочке точкой?); - вывод мгновенный: я вывожу на экран три подце­ почки на трех последовательных строках. Остается еще установить немало деталей, касающихся представления кусков. Но вы же не ждете, что я за вас сразу и программу напишу? Головоломка 27. А эта програм~а простая. Вам нужно образовать вы­ ражение вида где операция, обозначенная о, означает либо сложение, либо вычитание. Есть р - 1 знак, кажды;й из которых может принимать два значения. Это дает ~Р-1 возможных значений. Каким бы ни был способ, которым вы их пере­ бираете, вам нужно перепробовать 'их все (по крайней :мере в случае, когда число s таково, что решен~я нет). Два знака «+» И· «-», так чт.о снова двоичная систе­ ма .. Вы может~ воспользоваться этим эамечанием при со­ ставлении программы, Меняем целое число от нуля до . ' 165
2Р t - 1. Для каждого] из значений рассматриваем его двоичное представление. Ставим в выражении «+» на тех местах, гдо стоят нули, и «-» яд местах, где стоя11 единиЦЪI. Но в этом таится опасность побудить некоторых написать программу на языке ассемблеL'а, что было бы ошибкой (по моему мнению. Вы то.rда сплутовали бы. Есть хорошие алгоритмы на развитом языке. Не меняйте условий задачи, вЬIПисывая алгоритм, .который оказался бы необъЯснимым). Вы можете также - и зто, конечно, более эффектив­ ный способ - поставить знаки «+» в начале выражения и исчерпать все комбинации с тем, что осталось, затем за­ менить последний знак «+»на «-»и т. д. С четырьмя чис­ лами вы получите последовательно: +++ ++- +-+ +-- -++ -+- --+ Состояние знаков хранится в таблице или в цепочке. Заметьте, что рассматриваемая задача имеет простое рекурсивное решение, Достаточно испробовать две ком­ бинации: а1 + - любая комбинация, которая может быть со­ ставлена из р - 1 оставшихся шашек, а1 - - любая комбинация, которую можно составить из оставшихся шашек. Должно получитьсю s= а1+- комбинация иэ п - 1 чисел или s = ai- - комбинация из п - 1 'Шсел. Заметки, что разность нужно брать по абсолютному значению. Таким образом, остается искать способ представления s+ а1илиs- а1спомощьюп- 1оставшихсяшашек. Такую процедУРУ легко написать. Таблица чисел может быть глобальной величиной, Чтобы сохранять только п - 1 чit:сел, кроме перво~:о, ltОСтаточяо сказать, что таб­ лица рассматривается, начиная с ивдеса 2. Следователь­ но, нужна процедура, в которой в качестве параметров берутся: индекс, начиная с которого должны рассматриваться чисда, сумма, которую нужно найти. 166
Итеративные формы программы, которые вы сможете написать, суть немедленные переводы на итеративный язык этой рекурсивной формы. головоломка 2в: Решение, набросок которого я привожу здесь, при­ надлежит не мпе. Я нашел его вышедшим из-по;ц пера Николь Брео Поликен и Оливера Герца в журнале «Пер­ сональный компьютер• (L'ordinateur individuel) за март !1983 г. Однако я должен сознаться, что зто решение меня глу­ боко поразило. Программа была действительно очень осорошо написана на языке Паскаль и с большим мастер­ ством были использованы свойства вложения процедур, которые давали :возможность формальные параметры или локальные переменные некоторые из этих процедур рассматривать как гло,бальные параметры для ;цругих процедур. · Я переписал зто решение практичесни без изменений ва LSE83 (намного более структурироваяная форма LSE, соециняющая преимущества структурирования язы­ ка Паскаль с возможностя:1rш манипуляций с цепочками символов, имеющихся в L.SE, и, сверх того, облегчением програм:иирования сверху вниз), и результат немедленно оказался удовлетворительным. Все зто служит прослав­ лению авторов. Как же могло тогда случиться, что пояс­ нения, которые авторы дают к своей программе, до такой степени недоступны пониманию, что мне потребовался большой труд, чтобы достичь понимания их метода? Там, действительно, есть две или три «хитрости», которые 1'0 - раздо больше заслуживали комментария, чем тот факт, что из-за рекурсии результаты записываются в порядке, обратном порядку их получения ... Сохраним предположения работы этих авторов, при­ веденные в условиях задачи. Зачем от них отказываться? Например, такая комбинация, как n = Р1*Р2 + Ps*P4 - РьlРе не сводится пи к одной из предложенных форм. Программа, написанная авторами, рекурсивна, но ее читатеmо доетавляют sатрудвевия две особенности ее написания: - как я уже указывал, некоторые перемевиые, яв­ ляющиеся nокальньтми в одной процедуре, глобальны в другой.•. Коне'IНо, это иожеr быть обнаружено при вни­ мательном чтении текста, но это и требует внимания; 167
- некоторые процедуры мультиформны и дают сове р­ mевно различные результаты в зависиъ10сти от значений формальных параметров, Вернемся к задаче в той форме, в какой она быда по­ ставлена. Что нущно делать? Сначала пройдем по •rаблице шашек от 1 до 6, Для каждой шашки Pt посмотрим, делится ли п на р 1 • Если да, то нужно решать меньшую задачу: образовать чие л о п/р [i) с помощью пяти шашек, получаемых удалением шашки i из набора. Если пне делится ни на одну из шаш ек или если поиск шашки, на которую делится п, потерпел неудачу, то для каждой шашки i ищем решение задачю образовать п + р [i) или п - р [i] с помощью 5 шашек, поJiучаемых изъятием шашки i из набора. Но здесь мы довольствуемся решением, которое должно иметь ){ИД произведения одной из шашек на комбинацию <Iетыр е х остальных. Цитируемые здесь авторы решают эту задачу изъятия некоторых шашек из набора переписыванием начальной таблицы шашек в другую, перепрыгивая через шашi<и, подлежащие изъятию. Я действую по-другому, Я помещаю 6 шашек в табли­ цу из 6 чисел, скажем а. В начале они упорядочены и рас­ положены в неубывающем порядке. Чтобы изънть шашку из этого множества, мне достаточно переставить ее с шестой шашкой, а затем работать с первыми 5 элементами таб­ лицы а. Таким образом, я создаю иве процедуры: процедуру П {р, х), которая ищет способ представить ж с помощью р первых значений таблицы а, причем это решение должно иметь вид произведения одной из шашек на некоторую комбина­ цию остальных (П поставлено для решения в виде Про­ изведения ); процедуру О (р, х), которая ищет решения задачи о формировании х из р первых шашек, в котором результат имеет какую-нибудь из форм, предложенных в формулировке задачи (О - от Общее). Программа довольствуется чтением 6 шашек (в поряд­ ке возрастания) и числа п1 которое нужно найти 1 а затем вызывает О (6, п). 168
Вся задача состоит в том, чтобы поддерживать часть таблицы от 1 до р в неубывающем порядке. Это нетрудно. Вот схематическое описание процедуры П. В нем t яв­ ляется глобальной булевой переменной, которой присво­ ено начальное значение ЛОЖЬ. П(р,х) ЕСЛИ р < 3 ТО упрощенная форма~ КОНЧЕНО КОНЕЦ_ЕСЛИ i :=) выполнять ЕСЛИ х =а [р] ТО t :=ИСТИНА; КОНЧЕНО КОНЕЦ_ЕСЛИ ир := x/(l [р]; и = целая_часть(ир) ЕСЛИи=ирТОО(р-1,и); ЕСЛИ t ТО ВЫВЕСТИ и, '*', а [р), '=', х КОНЧЕНО КОНЕЦ_ЕСЛИ J{ОНЕЦ_ЕСЛИ i:=i-1;ЕСЛИi=ОТО КОНЧЕНО КОНЕЦ_ЕСЛИ переставить (i, р) ВЕРНУТЬСЯ Вы покажете, что часть от 1 до р - 1 остается pacno ложенной в неубывающем порядке. Но при выходе из­ цюша в р стоит элемент, который меньше всех остальных, СJiедовательно, нужно восстановить исходный порядок в части от 1 до р, если t не принимает значения ИСТИНА (з противном случае все кончено). Это вы легко изобретете. Процедура О вдохновляется ·:ой же идеей, но есть два ци1ша: - один, приводящий в р все элементы один за другим; - другой, который приводит :в р - 1 элементы, рас- положенные ниже того, который попал в р. В конце каждого цикла нужно восстанавливать поря­ док. Эти восстановления порядка могут показаться доро­ гостоящими. Они стоят не меньше переписывания одной таблицы в другую со сравнением каждый раз по трем индексам, где добавляются перестановки таб;1ицы в каче­ стве формальных параметров процедуры. Здесь а - гло­ бальная ':'аблица. Наконец, нужно заметить, что эта процедура прекрас­ но подходит для итеративного переписывания, Создаем вектор х, дающий искомое число для каждого р. Как и выше, индексы t и j процедур П и О евязан.ы ер. Наконец, 169
переменную р сделали rлобальной. Мне кажется доста-· точно очевидвыи, что итеративная процедура не пойдет намного быстрее рекурсивной процедуры: придется де­ лать много проверок, которые выполнялись автоматиче­ ски на уровне мацrинного языка, исполняющей системой. Но это и есть способ выйти из положения в случае, если, к несчастью, у нас нет рекурсивности. Если у вас есть предубеждения против рекурсии, то сейчас подходящий момент избавиться от них. И бросьте думать, что рекурсия всегда дорого обходится. Она всег­ да w:кращает время программирования. Неверно, что она всегда приводит к более медленному вр~:числению (эта головоломка и есть пример). Я соглашусь с вами, что она всегда занимает немного больше места .•• Эта процедура, действуя на 6 шашек 1007550251010, быстро находит число 370, но терпит неудачу для 369, 7. ОБО ВСЕМ ПОНЕМНОГУ Головоломка 29. Эта задача таюке не должна была бы излагаться оши­ бающимис , людьми. Я пытался попять, где эти програм­ мисты оступаются. Я считаю, что есть 'две опасностю - прежде всего нет никакой уверенности в том, что поступающее число удастся эффективно разместить меж­ ду Двумя числа:м:и таблицы. Оно может оказаться перед первым элементом и после последнего элемента. Так как эта возможность влечет · появление некоторых особенно­ стей, то ваши программисты начинают с изучения этих случаев, что соврешенно венужно; - далее поиск должен происходить с помощью раз­ деления каждый раз '!'аблицы па две части, Сравниваем х со средним элементом. Если он больше, то нужно искать его место в верхней полутаблице. В противном: случае он - в нижней половине. Но средний элемент - это элемент с индексом k = (1 + п)/2 или, в наиболее общем случае, rде рассматривается кусок таблицы, начинающий­ ся ври кончающийся в q,- элемент с индексом (р + q)/2. :Конечно, рассматривается только целая часть дроби. По этой причине некО'!'Орые проrраммисты опасаются, что зто можеr заспвить обращаться много раз к одному и тоиу же звемевту, и тогда проrрамма пе остановится или может вызвать потерю элемента. f70
Это - пустые опасения. Возьмем как общую следую­ щую ситуацию: пусть мы смогли найти такие два целыж р11q,ЧТО а[р]<х<а[q],причемр<q. Тогда все очевидным образом завершено, если q = р + 1. В противном случае скачоr' между q и р не меньше 2, и так как р меньше q, то, сJiедовательно, элемент с проме­ жуточным номером r = целая_ часть ((р + q)/2) обязательно отличается от элементов с номераr.ш р и q, и вам нечего опасаться. Вы сравllИваете х с элементом с 11ндексом r и в зависимости от результата сравнения бе­ рете r либо как новую нижнюю границу р, ·либо новую верхнюю границу q. Остается одна трудность. Как выбрать р и q, чтобы так пустить в ход процесс, чтобы выполнялось общее двойное перавенствоr Всегда, когда приходится выпол­ нять обращение к таблице, представляет интерес введе­ ние допоJшительны:х элементов, освобождающих от влия­ ния концов таблицы. Введем элеr.1ент с индексом О, мень­ ший, чем любой из тех х, к которым можно обратиться (мы отложим на более поздний срок решение вопроса, как мы можем сделать это эффективно), и элемент с номе­ ром п + 1, больший, чем все возможные х. Тогда х обя­ зательно больше, чем а [О], и меньше, чем а [п + 1]. Тогда мыможем начатьср=Ои q=п+1.Напи­ шите соответствующую программу, вовсе пе заботясь заранее о зиачениях а [О] и а [п + 1] и оставляя в неопре­ делеаном положении задачу эффективного описания таб­ лицы (некоторые языки, такие как Форгран или LSE, ве допускаю·r индекса ноль - один только бог знает nо­ чему ...) . Покажите, что единственвый индекс, д;Ш кото­ рого фактически приходится читать значение элемента таблицы,- это индекс r. Так как r всегда строго содер­ жится в интервале (р, q), причем р не убывает, а q не воз­ растает, то r всегда строго больше О и не меньше п. Таким образом, элементы О и п + 1 никогда пе опрашиваются. Поэтому и нет необходим:ости их материалкзовыва гь. Объявите м:ассив (таблицу) с индексом, пробеrающим. ат 1 до п, и все пройдет без сучка и задоринки ••• Головоломка 30. Это - задача, па которой я заваливаю nрофесс.иона­ лов. СоверЦiеино очевидно 1 что обе депочки символов ию- 171
рают одну и ту же роль. Следовательно, в программе есть симметрия, которая касается ~пособа обращения с этими цепочками. Вот - более или менее символически - про­ rрамма, которую пишу·r профессиона;1ы: 100 i:= О; j :=О. 110 продвинуть i к блюi(айшему символу в цепочке а, не являющемуся прuб ~лом 120 ЕСЛИ мы вышли из а ТО ПЕРЕЙТИ Н 200 КОНЕЦ_ЕСЛИ 130 продвинуть j к ближайшему символу в цепочке ·Ь, не являющемуся пробелом 140 ЕСЛИ мы вышли из Ь ТО ПЕРЕЙТИ Н 300 КОНЕЦ_ЕСЛИ 150ECJlИа[i]=Ь[j]ТОПЕРЕЙТИН110 160 ПЕРЕЙТИ К 800 200 продвинуть j к ближайшему символу в цепочке, не являющемуся пробелом 210 ЕСЛИ мы вышли иа Ь ТО ПЕРЕЙТИ К 900 КОНЕЦ_ЕСЛИ 220 ПЕРЕЙТИ К 800 300 продвинуть i к ближайшему символу в цепочке а, не являющемуся пробелом 310 ЕСЛ [ мы вЫшли из а ТО ПЕРЕЙТИ К \:100 КОНЕЦ_ЕСЛИ 800 результат:= ЛОЖЬ; ПЕРЕЙТИ К 1000 900 результат : = ИСТИНА ....."................... Эта программа понятна. В 150 мходим два символа, ве являющихся пробедами . Если они с;овпадают, то нуж­ но продолжать маршрут, а если они различны, 1·0 и це-­ почки различны {строчка 800). Если в 120 констатируется, что все символы цепочки а уже испытаны; причем каких -либо различий с уже изу­ ченными символами цепочки Ь H L обнаружено, то имеется выбuр одной из двух возможностей (строки 200 и_ 210)! - либо в цепочке Ь нет ни одного символа, не яв­ ляющегося пробелом (что приводит к том:у, что в поис­ ках такого символа мы выходим из Ь), и цепочки сов­ падают (строчка 900), либо мы обнаруживаем в цепочке Ь символ, не являющийся пробелом; Эl'а цепочка включает символы, не входящие в а, и, следовательно, результат есть ЛОЖЬ {строка 800). То же самое происходит, когда исчерпывается ц~почка Ь (из строЧRи 140 перехом осуществляется к строчке 300). 172
Я попытаюсь сделать из зтоI'О головоломку. Еще ие слишком поздно. Найдите ошибку и исправьте ее, Но вы можете составить намного лучшую программу, Головоломка31. Вот несколько идей. Вы можете сначала «отсортиро· ваты> обе цепочки, переставляя символы в каждой из Hl'IX , чтобы они оказались, например, в алфавитном по­ рядке. Когда зто сделано, то цепочки должны оказаться о,:~.инаковыми. Это очень тяжеловесно." Вы можете взять первый символ первой цепочки и по· смотреть, есть ли он во второй цепочке. Если ответ отри· цателен, то цепочки не являются анаграммами друг дру­ га. Если же ответ - «да», то изымите этот символ из вто­ рой цепочки и переходите ко второму символу в цепочке а. Это ведет, по вашему выбору, к рекурсивной или ките­ ративной процедуре. Внимание: если вы смогли полностью пробежать а и не нашли ни одного символа, не попавшего в Ь, проверьте, не осталось ли чего-нибудь в Ь." Вы можете задать таблицу, имеющую столько же по­ лей, сколько может быть различных символов в рассмат­ риваемых цепочках. Если мы имеем дело с текстами и если пробелы считаются, то нужны 33 буквы и пустое место." Вы пробегаете первую цепочку и добавляете 1 в клетке; связанной с каждым встречаемым характером (вы считаете число случаев появления каждого знака), Затем вы пробегаете вторую це:q:очку и все пересчитывае­ те (вычитая, а не складывая). Если в конце вы получае· те таблицу, содержащую что-то кроме нулей, то цепочки не являются анаграмма~m. Конечно, есть и другие способы действовать. Досто· инства каждого из нйх зависят от обстоятельств. Для те1<ста последний способ кажется достаточно хорошим, первый - явно плох. Головоломка 32, То что было только что сказано, остается приемлемым и в этой задаче. Но достоинства р*злi11iных решений мо· гут измениться. Продумайте их. Это nоэволит увидеть, что одна программа никогда не бывает абсолютно лучше другой, Это зависит от данных и часто еще и от исполь­ зуемого компьютера ... rоловоломка33. Есть кар'J'ОЧный пасьянс, который более ИJJИ менее похож на Зт'У вадачу. Выберем из вектора его первы~й эле­ мент и отложим его в cтopotty на запасное поле. Мы мо· щем uоме<?т-'ть на Щ'О место элемент т + 1, который и 173
должен перейти на поле 1. Теперь поле т + 1 свободно. Туда можно перевести элемент, который должен его за­ nолнить. Возьмем конкретный пример: п = 10 и т = 4. Элементы верхней части спускаются на 4 поля, а те, ко­ торые находятся в нижней части, поднимаются на 6 по­ пей. Вот последовательные состояния вектора. Я не пред­ ставляю' здесь запасное поле, которое содержит элемент 1. Я помещаю в эти поля именно номера элементов в ис­ ходной конфигурации: исходноеположение; ~2345678910 234567g910 5234 678910 52349678 10 52 49678310 527496 8310 А теперь имепно элемент 1 должен прийти на свобод­ ное поле, и этот цикл останавливается. Мы убеждаемся, что не все элементы перенесены. Все числа на нечетных местах уже находятся там, где должны находиться, а чис- . ла на четных местах не стронуты с мест. Но можно н~чать новый цикл той же длины, поместив 2 на запасное поле,­ это вавершит работу. Предлагая эту задачу профессиональным программис­ там, я очень редко получал такое решение, потому что им не удавалось выяснить, что мы действительно переме­ щаем таким образом все элементы (в этом можно убедить­ ся, подсчитывая число движений) и нет ли опасности дважды переместить один и тот же элемент, так что конеч­ ное состояние оказалось бы неправильным *). Чтобы навести себя на правильный путь, заметътеt что если верхние элементы спускаются на т полей, то пижние элементы поднимаются на п - т полей. Вы не видите? Есть п полей. Вы работаете в арифме­ rике по модулю п. По модулю п все элементы спускаются па т полей. На этот раз вы должны найти решение., учи­ тывая влияние на ход решения наибольшего общего де­ .ч:ителя т и п". * *) *) При чтении этого абзаца вспоминается ШутRа МаЯRовсного. После рдного из своих выступлений он получил из вала записку: «Мы с товарищем слушали ваши стихи и ничего не поняли•. Мая­ ковсний ответил: «Нужно иметь умных товарищеЮ.- Примеч. ред. ••) Если разрешить перемещать наждый элемент вентора не один рав, а два, то можно найти ивящиое и простое решение, в ·но- 1rором и речи пет ни о наних общих делителях. - Представим себе влемевты вектора расположенными по окружности на равных рас- 174
Головоломка 34. Предположим, что мы уже проделали часть работы. 1 Именно таким обраэом мы всегда должны начинать по­ иск решения. Мы ограничимся здесь случаеЪJ таблицы чи­ сел,, который предоставит нам полную воаможность изу· чепия .различных стратегий и позволит вам записать нес-· колько программ и сравнить их, не эаставляЯ вас пус­ каться в манипуляции с более деликатными цепочками. Следовательно, nредположим" что мы прошли таблицу до номера i включительно. Пусть в пройденной·части мы нашли 1 что элемент со значением х повторялся р раз1 и пусть это - максимальное число повторений. Но нужно еще более уточнить ситуацию в точке ос­ тановки. У нас есть две возможности. - Первая идея: мы останавливаемся в конце равнин­ ного участка. Если i = п, то мы прошли всю таблицу t узнали наи­ лучший равнинный участок, и все закончено. В против­ ном случае мы пробегаем следующую равнину и измеря· ем ее длину r. Если r < р 1 то наилучшая равнина остает­ ся неизменной,; а в противном случае именно последняя равнина и регистрируется заново как наилучшая, и мы воаобновляем движение по таблице. Это просто" и это легко программировать. Запишите это решение, чтобы иметь возможность сравнить его с другими решениями. - Вторая идея: мы останавливаемся в произвольной точке i. Мы оказываемся на некоторой равнине и уже наш­ ли r элементов на этой равнине. Если i = п.~ то проход таблицы эавершен. Мы внаем наилучшую возможную равнину с р повторениями и рав­ нину с r элементами на последнем проходе, Мы берем луч­ шую из этих двух~ и все кончено. В противном случае нужно продвинуться вперед на один элемент. Либо этот элемент равен непосредственно предшествующему элементу; мы все еще находимся на той же самой равнине, длина которой увеличивается. Либо он отлиЧ:ается от предыдущего; тогда оказывается пройденной равнина длины r..: которую при r > р нужно зарегистрировать как наилучшую. С другой стороны, нужно сказать." что новый элемент находится на равнинеJ, которая в данный момент имеет длину 1. стояниях друv от друrа. Нам нужно повернуть ати векторы на уrол. ИспОJiьауйте тот фант, что всякий поворот окрущuости можно получить, вwолвив подряд две осевые свмметрии.-:ПримА, ред, 17~
На первый взгляд, первая стратегия дает uрограммуj · содержащую два вложенных цикла: маленький внутрен­ ний цикл для прохода равнивы и глобальный цикл для прохода всего вектора, равнина за ранниной. Вторая программа содержит толы\о один цшш, пробе­ гающий эл.ементы вектора один за друruм и в нужных мес­ тах исправляющий значение р. СJ1едовательпо,,, эта вто­ рая программа лучше. Но это не все. Не позволяйте обмануть себя видимостью. Обе эти программы пробегают вектор элемент за элемен­ том. Если вы составляете вашу программу на Бейсине или LSE, используя операторы ПЕРЕЙТИ К, а не цик­ лы ДЛЯ или FOR1 то вы убедитесь, что эти два решения почти неотличимы,. а второе решение требует двукратно­ го написания теста 1 сравнивающего r и р,, так что едва ли не чаще эта вторая программа оказывается хуже. Но есть третья стратегия. Восстановим общую ситуа­ цию: мы прошли часть вектора до номера i включительно и определили наилучшую равнину длины р с общим зна­ чением ее элементов .t равным х. Точка остановки произ­ вольна. Известно, что нужно осуществить включение нового элемента. Поставим следующий вопрос: насколько этот новый элемент может и·зменить ситуацию? Ответ: еслн он оказывается принадлежащим равнине с длиной., боль­ шей р. Может ли он оказаться принадлежащим равнине с длиной, намного большей р? Нет, мы бы это уже заме­ тили. , Следовательно.1 новый элемент изменяет ситуацию,, если он принадлежит равпине длипы р + 1. Но такое мо­ жет случиться, если он равен элементуi содержащемусн в р предыдущих полях. В начале ничего не пройдено: i = О,,, и нет ни одного повторения: р = О, i:=О;р:=О ВЫПОJIНЯТЬ ЕСЛИ i = п ТО_КОНЧЕНО КОНЕЦ_ЕСЛИ i:=i+1 ЕСЛИа[i)=а[i- р)ТОх:=ali];р:=р+1 КОНЕЦ_ЕСЛИ ВЕРНУТЬСЯ Красиво, не правда ли? Но можно сделать лучше. Тщательно рассмотрите эту программу. Вы должны . суметь обнаружитьJ, что мож- 176
но перескакивать через некоторое количество элементов без обращения к ним ... Головоломка 35. Не позволяйте себе поддаться впечатлению от ограни­ чений на сложность алгоритма. Вы не можете выделить все возрастающие подпоследовательности, чтобы найти лучшую из них, это было бы слишком длинно.• . и легю) сделать что-нибудь попроще этого. Воспользуемся снова той же самой техникой. Пусть мы прошли вектор вплоть до некоторой точкn. Пусть мы получили соответствующие результаты, но.1 поскольку мы еще не знаем, в какой форме они нужны, мы оставим их па некоторое время неопределенными. В любом случае выглядит вероятным, что мы знаем наибольшую по длине возрастающую подпоследовательность пройденной час­ ти, без которой мы как будто лишены возможности до­ браться до конца вектора ... Rан и выmе, поставим вопрос: насколько изменяет ситуацию появление нового эщшен­ та? Он может продолжить известную нам наиболее длин­ ную последовательность, если он может быть Поставлен в ее конец, и, следовательно, если он больше последнего элемента этой последоватеJrьности. А если зто не так.~ то эту наиболее длинную подпоследовательность он изме­ нить не может. Но он может продолжить более короткую подпоследовательность, которая постепенно может стать более длинной, если она медленнее растет. Рассмотрим, например, последовательность 45382617 Если ограничиться тремя первыми элементами,. то наиболее длинная возрастающая подпоследовательность - это 45 Добавим четвертый элемент, 8. Он может быть присое­ динен к концу этой подпоследовательности и дает возрас­ тающую подпоследовательность длины 31 458 Следующий элемент - 2 - ничего не моояет. Следу­ ющий- 6 - не может быть присоединен к вонцу после­ довательности длины 3, но он :может быть присоединен к концу последовательности длины 2 - последователь­ ности 4 5 ..;_ чтобы дать другую подпоследовательность 177
длины 3: 456 Эта последовательность меньше предыдущей, посколь­ ку ее последний элемент меньше, и поэтому у нее больше шансов иметь возможность продолжаться. На самом де· ле~ 7 может быть присоединено к ее концу~ что дает мак· симальную возрастающую последовательность 4567 Мы уже видим, что нужно уточнить понятие манси· мальвой возрастающей подпоследовательности, ощн:)де­ ляя наилучшую из них: это - такая последовательность, у которой последний элемент - наименьший возможный. В этой строке наилучшая подпоследовательность длины 1 есть элемент 1, наименьший элемент последовательности. Таким образом, мы приходим к следующей идее: предпо· ложим, qто мы знаем последний Элемент наилучшей под· последовательности длины k в пройденной части для JIIO· бого знаqеuия k от 1 и вплоть до максимального значе­ ния т. Новый рассматриваемый элемент изучается с тоqн:и вревия возможности его присоединения к концу подпосле· довательности длины k 1 чтобы превратить ее в подпосле· довательность длины k + 1. Покажите, что если это воз· можно1 то эта новая последовательность лучше, чем пре· дыдущая подпоследовательность длины k + 1. Моiнет случиться также, что этот новый член оказывается мень· ше элемента, образующего подпоследовательность дJ1и· Пh1 1. Тогда он дает лучшую 1 чем предьrдущая1 подпосJ1~ довательность длины 1. Таким образом, вы получаете алгоритм.~; в котором для любого элемента рассматриваемого вектора нужно искuть в таблице последние элементы наилучших подпоследона­ тельностей, и размер этой таблицы равен т. Покажите,. чт~ эта таблица упорядочена. Осуществите в ней поиск места рассматриваемого элемента вектора с помощью дихотомического поиска *) и вы получите алгоритм п~ рядка п ln п. Головоломка 36. Вы можете вдохновиться решением предыдущей за· дачи. Нужно пробежать одну иэ двух цепочек символ *} См, rодовопомну 29.- Примеч, пер, 178
sa символом. Предположим, что мы ее пробежали до не­ :которого i включительно. Нужно осуществить регистра­ цию лучших из наиболее длинных слов в порядке возрас­ IJ'ания длин, содержащихся в пройденном куске рассма'!'­ риваемой цепочки и во второй цепочке в целом. Как оп­ ределить наилучшее слово длины k? Скажем, что это - тан:ое слово, которое имеет наибольшие шансы оказаться продолжаемым, следовательно, такое слово, .у которого положение последнего символа во второй цепочке мини­ мально. Это приводит к рассмотрению того,_ насколько важно знать положение символов во второй цепочке и" следовательно, к заданию наилучших слов списком из положений в цепочке (например, с помощью конкатена­ ции совпадающих с ними символов во второй цепочке). Бесспорной выглядит трудность, связанная с тем1 что одна и та же буква может встречаться во второй цепочке несколько раз. Их нужно рассм0треть все, но их нельзя смешивать между собой. Я уверен, что это вас надолго не задержит. Больше я вам ничего не сообщаю. Ищите дальше сами ... Головоломка 37. Вы можете рассмотреть задачу самым простым спо­ собом. Пусть задан прямоугольник - координатами х1 , у1 и х2 , у2 верхней левой и нижней правой вершины сооТ-: ветственно. Мы выясняем, является ли этот прямоуголь­ ник белым (нет ли внутри черной клетки), и если да, то измеряем его площадь. Мы проделываем это для х 1 , у1 , пробегающих все иг­ ровое поле, а х2 , у2 должны удовлетворять неравенствам х2 > х17 у2 > у1 и пробегать часть игрового поля, удов­ летворяющую этим неравен:ствам. Так как для каждого прямоугольника. вы должны про­ бежать его по всей его площади целиком, то порядок рос­ та программы есть п4 • Но вы можете улучшить программу уже здесь, не рассматривая такпе точки х1 , у1 , которые не могут дать площади прямоугольника, превосходящей уже найденный максимум (это - близкие к правому краю или к нижнему краю точки игрового поля). Вы можете сделать еще лучше, задав лучшую информа­ цию. Предположим, например, что у вас есть вектор раз­ мернос'l'И п, - скажем вектор l такой, что l [iJ есть число последовательных белых полей на строке i, начиная со столбца j. Тогда вы можете легко найти площади белых прямоугольников,_ одна из вершин которых на:ходИтся_ в точке х1 = j 1 у1 == i. Нисколько не более трудно перей- 179
ти и от вектора l для столбца 1 к вектору1 связанному со столбцом j + 1. Этих уиазаний должно быть достаточно для того.~ что­ бы вы сумели получить хороший алгоритм:. Головоломt<а 38. Очевидно, что мы очень многого не знаем. Следовате.~ть­ но, нужно тщательно прочесть условие и выделит:ь 1.н~ е дан ные. Невозможно~ чтобы на иаждый вопрос решитель­ но все учениии ответили неправильно, потому что ес J 1и бы это случилось, то они все получили бы О. Следовате J1ъ­ но, на каждый из вопросов есть правильный ответ.~; иото­ рый либо является 04ним из чисел., входящих в отв еты ученииов,, либо другим <Jнслом (и тогда более или менее все равно каким). Таиим образом1 правильный ответ на первый вопрос может быть одним ив чисел 8 12 16 20 ~ другим числом., скажем 24.1 . чтобы ответы образовывали арифметичесиую прогрессию с разностью 4. Сделаем то же самое для других вопросов . Таним образом1 вы получите" например: R1!812162024 R2:12141618 RЗ:101214 R4:1618202224 Исследуем все полученные из оценои четверни чис • · л~ отводя по строчие для каждой из них, Они образ~ ю·.11 5•4•3•5 """300 строк, Для каждой из них ваша програм­ ма см:отрит1 ~колько учеников получило о! и запомина­ ет только те четверки чисел .~ для которых один и толыю один ученик получил О ( flTO дано в условии). Заметьте к тому же1 что вам сообщено, что ответом на один из воп­ росов должна быть площадь поверхности к уба с целыи ребром.~ следовательно, число вида 6п2~ возможные значе­ ния которого 6" 24." Ни один из ответов не имеет вида 6п2 с целым п. Следовательно" мы должны получить, что .в выделенных четверках есть одна ил и несиольио четве­ рои.t у которых хотя бы одна компонента имеет значение 1 не предложенное ви одним из учеников. Ваша программа легко их найдет (такой набор в точности один). На э1ом основании иы: узнаем правильность всех ответов ва воп­ росы,. остальное просто. При всем: том:1 это - rono»OJlQМ,Ka для нач.~~J!8.ЮЩ~х." 180
Головоломка 39. Эта головоломка сопротивлялась мне много дней и бы­ ла для меня очень поучительной. В условии сказано, что эта, программа должна выполняться за время вычисления, пропорциональное п. Следовательно, и речи нет о том,, чтобы исследовать все суммы подпоследовательностей вектора 1 чтобы выбрать из них наилучшую. Нужно ис­ хитриться. Так же, как мы здесь уж~ упоминали, ответ может состоять в получении свойств подпоследователь­ ности с максимальной суммой. Я совершил ошибку, пойдя по этому пути. Я сказал себе: назовем S (i1 j) сумму элементов вектора с номера­ миОТiДОj: S(i, j)= а1+ai+1 +...+ан+а1. Ее.Ли для некоторой пары i1 j эта сумма максимальна1 to отсюда следует s(i, j)>s(i+1, j) и, следовательно, а1 >О. Точно так же а1 -Р. Щ+i > Р. Если обобщить любое «начало» (левая часть)"'-s (i, j) положительно, и точно так же любой ~шонец» положите­ лен. Можпо продолжать: ai-1 отрицателен." И я та1шм образом не получил ничего. Это пе означает ~вержденпя, что на этом пути нельзя найти решения. Это я его не нашел. Как я уже говорил, вы можете обратиться к матема­ тике за помощыо в решении вашей задачи по информа­ тике *). Но у информатики ес·rь и свой еобственный твор­ ческий дух. Почему бы ему не довериться? Эта задача •) В матема·rи1се дли решения этой задачи есть полевнан фор­ q мула Ньютона- Лейбница: ~ f(х)dx = F(q)-F(р), где F- р функция, оr1ределяе:мая условием F' (х) = f (х), хе [р, q]. Впро­ чем, все эти интегралы нам не понадобятся, так как у этой форму­ пы есть rораздо более простой аналог д11я сумм: ai + ai+I + . , . . , . + а1 = Ь1 -" bi-l • где последоватепьность {Ь} определяется условием, что bk - bk-l = ak для любого k от 1 до п. Последова­ тельность {Ь} легко построить: Ь0 = О, Ьk+l = bk + alt+l' Для последовательности {Ь} задача ставится так: найти такие 1 < J, что равность ь1 - Ьt максимапьна. С этой задачей уже легче спра­ витьсн,- При.меч, ред. 181
сбиваеr вас с толку по причине ограничений на сложность алгоритма. Забудем их. Если вам сказано, qто нужно решить задачу" и вам предоставлена свобода вплоrь до максимальной сложности, что вы будете делать? Вы со­ ставитетаблицуS(i,j)дляi= 1, , •..• пиj=i,; •• ,,п. В sroй таблице вы возьмете максимальный SJ1емент. Чтобы помочь вам1 я предлагаю вам рассмотреть сле­ дующий вектор: 34-82 -375-61 Образуйте треугольную таблицу чисел S (i, j) и запи­ шите ее. Посмотрите, кан каждая строчна образуется из предыдущей. Вы увидите, что только три строчки могут содержать максимаJ1ьное S и, кроме того, не во всей их полной длине, В этом примере максимум нужно искать среди (111:3),(4,, 4:5),(6, 6:9). СледоватеJiьно, есть в точности п значений S, которые нужно рассматривать. Таким способом вы и получаете а.urоритм,, линейный по п. Закончить п.редос1·авляю вам.
ЧАСТЬ III И ЕСЛИ ВЫ ВСЕ ЕЩЕ НЕ НАIИЛИ РЕШЕНИЯ Многие игры или головоломки уЖе не требуют ника­ :ких дополнительных пояснений. Но некоторые иа них еще могут вам сопротивляться. Поэтому следует скааать вам все ... 1. СЛУЧАЙНЫЕ ЧИСЛА ГОЛОВОЛОМКа1. Первая стратегия. Нужно сравнить и21 и и1 • Они равuы, если 2i = i + kp для целого k, следовательно, если i делится на р. Кроме того.• i должно превосходить r. Следовательно, нужно искать наименьшее кратное р1 большее или равное r. Положим v1 = и 21 • Тогда V;+1 = U2i+2 = f(f(и21))=f(f(vi)). Есливыначинаетеиси1=а"товыначинаетеvсv1= =f(а). Таким обрааом, получаем начало программы~ и:=а;v:=f(а) ПОКА и =/= v ВЫПОЛНЯТЬ и:=f(и};v:=f(f(v}) ВЕРНУТЬСЯ 1 ffenepь вы получили два равных элеменrа. Чтобы полу­ чить период, нужно пройти интервал между полученв:ыии числами - например,, начиная с и - считая число эле­ ментов: р:=1;w:=f(и) ПОКА w =/= и ВЫПОЛНЯТЬ w:=f(w);р:= р+1 ВЕРНУТЬСЯ :Мне nрИШJiось рассказать вам все." Вторая стратегия. Начните с d = 1 и h = 1. Если вы не яахо.ците периоди'Пlости в интервале от -d + 1 до 183
d + h (сравнивая и на зтом интервале со аначением и на злементе d, сохраняемым в некоторой переменной, например, х), воаьмите эвачевие и в d + h в качестве нового аначения х, d + h в качестве новоl'о dJ. и уд· войте h. Вы непосредс·rвевно получаете период. Тщательно подсчитайте количество вычислевий f в каждом из этих двух алгоритмов. Второй способ определенно лучше. Игра4. Если вы представляете игровое поле прямоугольной таблицей, то перемещение обозначается изменением ко­ ординат точки: добавJJением или вычитанием чисел 1 или 2. Я рааместил эти добавляемые количества (целые чис­ ла соэнаком) в два вектораDХ,, DY иэ 8 элементов. Одно направление перемещения надается номером поля в э1· ой таблице~ следовательно 1 целым числом от 1 до 8. 2. ИГРЫ С ЧИСЛАМИ rоловоломка3. Остановитесь, когда вы получите 5 в качестве цифры единиц с нулем «в уме». Головоломка 4. Представленный эдесь алгоритм эквивалентен алго­ ритму, который можно найти в старых книгах по арифме­ тике,, и который действует на целые '1Исла 1 разбитые на куски по 2 цифры в каждом куске. Вы можете либо разыскать доказательство в этих книгах1 либо посмот­ реть в моей книге «Основы программированию> 1 как можно доказать, что программа 1 реализующая этот алгоритм~ действительно вычисляет квадратный корень. Но зто рас­ суждение слишком сложно, чтобы воспроизводить его эдесь. Лично я работаю по основанию 10. Я представляю числа цепочками цифр. Присоединить 1 справа легко: это прос'l'о конкатенация. Сдвинуть вправо легко: ис-­ польэуется индекс, сообщающий 1 начиная с какой поsи­ ц1ш нужно урезать. Именно sтor индекс и иэмевяется. Сrшадывать с 2 легко, так как может быть не более одного переноса. Единственная тонкая операция - вычитание. Не проводите сравнения перед вычитанием: оно стоит так же дорого~ как и само вычитание. Сделайте копию той части.~ которая должна была бы быrь изменена при вычитании, и если вы обнаружите, что вы не можете осу­ ществить вычитание,- 11оsыште coxpat:1eнnoe sнаqеаие. 184
Головоломка.5. З'адайте три индекса и три значения: i2i i 8 ,, t1,; х2, х3, х 6• Число i 2 есть индекс элемента посJiедовательности,. который,, будучи умноженным на 2, дает подходящего кандидата на роль ближайшего значения (иначе rоворя1 удвоение числа с индексом i 2 - 1 дает число,, ноторое содержится в уже сформированной части последоватеJ1ь­ ности1 но удвоение числа с индексом i 2 дает число.~ ноторое в сформированной части не содержится). Число х2 поJ1у­ чается удвоением числа· с инденсом i 2 • Вы опредеJiяеrе аналогично i 8 и Хз~ заменяя «удвоение» на «утроение» (произведение на 3 числа с индексом i 3 - 1 содержится в построенной часrи последовательности, а число х8 - утроенное число с индеI{СОМ i 3 - в ней не содержится) .. Наконец~ вы делаете то же самое для i 5 и х 6 • Ближайшее число в последовательности есть наименьшее из чЬсел х2, х3, х6• Назовем его х. Если х = х2, то i2 увеличивается на 1 и х2 пересчитывается. То же самое для i 3 и i 6• ГОЛОВ.ОЛОМКа 7. Возьмем п = 3n 1 +2. Тогда (2п - 1)/3= 2п'+1. По общему правилу, непосредственно следующ11 й за нечетным числом 2п' + 1 элемент равен (3 (2п1 + 1) + +1)/2= 3п 1 +2. Если п дает пе при переходе (р, q), q > 1,,; т. е. если n имеет вид п= (2Р(2Чп,+1)/зР)- 1, то n• = (п - 1)/2= (2Р-1(211п'+1)/3Р)- 1. Как и следовало ожидать,, зто имеет в течности тот смысл.~ что если деление на 3Р можно выполнить нацело.•. то в связи с зтим вознинает соотношение между (р, q) и~. ' Если п" увеличить на 1, а затем умножить на 3Р-1/2Р-•" то получится (211п' + 1)/3. Тогда нужно уменьшить результат на 1, получим (2Чп, - 2)/3. Но это число делится на 2.i таи что с помощью перехода (р - 1, 1) число n• дае11 (2q- 1n 1 - 1)/3. По общим правилам получаем 3 ((2Ч-1п' - 1)/3) + 1 = 2q-1n•J а затем п'1. что и доказывает наше утверждение. Если вы примените это правило перехода к 4k + 1, ' lQ нужно добавить 1.i. 11то дает 4k + 2.1 . делящееся па 2,,, 185
понена4.Делимна2иумножаемпа3,,чтодает6k+3. Уменьшаем на 1 и затем делим па 2., и получается 3k + 1. Если k нечетно, то вто - элемент, следующий за ~; так что за числом :вида 4k + 1 с k нечетным следуют те же величиЯЬI" что и за k. ' Еслиkчетно,то4k+1даетЗk+1, Если существует цикл с единственным переходом р1 q, т. е. n= (2Р(2qn+{)/ЗJI)- f,, то это возможно только :в случае 1 когда сущест:вует та­ ная пара Р,1, q, что число (ЗР -- 2P)/(2P+q - 3Р) целое. Мы показали, что т.акой пары (р, q) нет, fОJIОВОЛОМКа10. 9*АВСДЕ + АВСДЕ = 10*АВСДЕ, что можно за­ писать нак АВСДЕО. Отсюда получаем зашифроваJJное . сложение: + ПШI J ABCDE ABCDEO Это показывает, что А = 1. Далее, :Т + Е не может быть нулем1 следовательно 1 J + Е = 10 и для / есть кое­ что «в уме». Сумма F +А дает АВ с А ..,. ti iraк что сум­ ма F + 11 к которой1 может бытьJ добавлено что-то ~в уме».. должна дать число,, большее 9, Это может быть только:вслучаях1+8+!1"""10,9+t- 10или1+ +9+1=11.Но.,таккакВrpА1тоВ=О, Тогда :в сfмме G + В рассмотрим цифру С как цифру единиц. Так как В = О, то вто означает~ что для G «в умеt кое-что ес1·ь (потому что G =F С). Отсюда получаем схему операции сложения: /(1k1 FGН// 1ОСDЕ 1ОСDЕО Запишем,чтоА+В+С+D+Е+F+G+Н+ +/+J=45,, А=11В=О. Запишем пять операций сложения с учетом переносов в старший разряд: 186
l +Е=10, ~+1+D=10k+Е~ k+Н+С=10+D, 1+G+В=10k' + Cl) k'+ F +А= 10. Сложим их все. Вам остается С+D+Е=17 - 9(k+k'). НоС+D+Енеможетбытьменьше,чем2+3+ 4= = 9iинеможетбытьбольше,чем6+7+9(еслиF=8 иk1 = 1). Не может быть, чтобы у вас одновременно вы­ полнялись соотношения k = k 1 = 1 (что давало бы отри­ цательную сумму С + D + Е). Но не может быть и ра­ венстваk+k' = 1tтаипантогдабылобыС+D+Е= = 17 - 9 = 8, что слитном мало. Следовательно.~. k = = k, = О. Составим окончательную систему l+Е=10ж 1+D+1 =Е,: н+с= 10+ D,; G+1=C., F =9. 3анончите вы с помощью программы. rоловоломка11. Обозначим через а1 цифры исходного числа"' bi - циФ­ ры результата, k 1 - цифры «в уме•: 3а1+k1= Ь1+10~н· Сумма всех а1 равна 45 1 как и сумма .всех ь·1 • Обозна- чим через К сумму всех/k1 : 3*45+!(. = 45+10*КдаетК=10• .Мы знаем, что дает «в уме» наждан цифра' 1 дает 01 2 дает ot 3 дает О'или 1 в зависимости от ТОГОJ что хранится «в уме» над 3. 4 дает 1, 5 дает 1, 6 дает 1~ потому что не может сJ1у­ rшться 3*6 + 2.i . что давало бы «в уме• 2.i но цифру еди- wщ; О; . 7li8и9дают2. Для тoro.J чтобы сумма величин' «В уме» была равна 10.1 нужно~ чтобы 3 давало 1 «в уме». Так нан 3*3 + 1 (с цифрой единиц~ равной О) случиться не может~ то нуж· но,,, чтоб!-11 "в уме» над 3 было 2. Следовательно"' 3 стои~ 187
·слева от 7., 8 или 9. В частности;, 3 не может стоять на правом конце . . О стал ьное просто, если вы будете следовать методу,, укааанному в разделе «Условия». · Вот таблица: Вуме О12· 17о3 247о 3147 4814 5581 6258 7925 8692 9369 Потребуем" чтобы 9 было справа; следовательно, вы­ черкнем 9 иэ этой таблицы, оставив его только в столбце.1 соответствующей тому, что «в уме» О, Цифра 3 трrбует 2 «в уме», чтобы дать 1. Вычеркнем остальные 3 в таблице. Цифра 9 не может быть получена иначе как с помощью 6 и 1 «в уме». Другие 6 вычеркиваем. Цифра 8 получается иэ 2 П(JИ 2 «В уме1>. Нужно ваять 3 числа в первом столб­ це, так что нужно еще одно не равное ни 2, ни 3. Их )Iужно 4 в среднем столбце, так что нужно еще 3 числа, Jie равных 6, которые нужно ваять среди цифр 7,, 4, 1, 8, 5. Два последних числа должны быть вэ.нты иа столбца с нулем «в уме». Когда эти числ-а среди всех воаможных 5удут выбраны, останется расположить их в еоответствии с тем, что должно быть для них «в уме». Эту программу сделать легко. Головоломка12. Если число а1а2 ••• ар (представленное как последо­ вательностьцифр) кратно 3, то и а1+а2+., .+ар !'Ратно 3. Сумма кубов цифр равна а~+1-i.~+...+а~. Нужно покааать, что это число танже 1tратно 3. Дей­ ствуйте по индукции по числу с11агаемых. Предположим, чтодляр=п - 1членов а~+а:+.. ,+а~=(а1+...+ар)3помодулю3; тогда рfi)fевство (а1+...+ар+йп)3= (а1+...+ар)3+~+3(...) доказывает ваше утверждение для. п сдагаемых. \ 188
Возьми1·е число с k цифрами. Сумма кубов его цифр ограничена величиной k*9 3• Но исходное число не может быть меньшеt чем 101с-1 • Следовательно, достаточно~ что­ бы 101н было больше 1 чем k*729t что очевидным образом выполняется при k = 5. Но эта оценка слишком песси­ мистична. Г-оловоломка14. Чнслоt полученное при обращении порядка цифр 1 равно 1000d+100с+10Ь+at и разность этих двух чисел равна 999(а- d)+90(Ь- с). Числа а, Ь, с, d были расположены в невозрастающем порядке,. и они не все равны между собой, так что а стро­ го больше d и а - d не равно нулю. Все остальное просто. ГОЛОВОJIОМКа16. Единственное, Что до сих пор еще не сказано - это способ определять, становится, ли последовательность периодической. Метод Полларда был основан на первой стратегии. Мы выясняем, существует ли а1 с а21 = а1 • Но вычиСJiение f (х) = х2 - 1 по модулю п - дорогое вычисление. Брепт улучшил этот метод, предложив ис­ подьзовать вторую стратегию. Головоломка 17. Эта программа основана на следующих результатах: если Ь нечетно,, п четно, то п делится на Ь тогда и только тогда, когда п/2 делится на Ь; нечетное п делится на Ь тогда и только тогда 1 когда п- ЬделитсянаЬ.Ноп - Ь четно. Дляп=2 77 - 3иЬ=7выполучаете: Число п нечетно. Рассматриваем п - Ь = 21 7 - 10. Оно делится на 2: получаем 276 - 5. Это число нечетно: (2 76 - 5)-7=276- 12. Делимна4:274- 3. Получаем ту же самую задачу, в которой показатель уменьшен на 3. Так как 77 = 3*25 + 2, то мы таким об­ разом доходим до 22 - 3 = 1, которое не делится на 3. Вряд ли вас слишком утомит доказательство того.,, что 2n - 3 никогда не делится на 7•.. Головоломка18. Я не в состоянии рассказать вам, как я получил эту программу, это - очень долгая история, связанная с раз­ ложением целых чисел па мпощители. Может быть"' ког- 189
да-нибудь я ее и· опубликую. Следовательно, будем раз­ бираться в том, что вам дано - в тексте программы. Начнем с нечетного п. В соответствии с инициаливаци· еЙ программы n = 4.р - 1, где р Четно. В ПрОТИВНОМ СЛУ• чае уже последует ответ «НЕТ». Следовательно, рассмот· рите нечетное п.• · являющееся полным квадратом и1 CJie. доnательно, квадратом нечетного числа 2k + 1; (2k + 1)2 = 4k2+4k+1= 4k(k+1)+1. Так как k (k + 1) - проивведение двух последnRа· тельных целых чисел, и из двух последовательных целых чисел всегда есть хотя бы одно четпое число, получаем простой, во интересный результат: любой квr.драт нечет· вого числа сравним с 1 по модулю 8. Таким ~образом, при п отлпчвом от 1 по модулю 8 ивициаливирующая часть программы выводит., что п не является точным квадратом. Посмотрим теперь, что происходит внутри цикла. Делим р на 2, и если ревультат четен., мы удовлетворяем· ся тем, что умножаем а на 2. При зтом действии произв~ дение а•р остается ПОСТ()ЯНВЫМ . Поэтому J{ажется вероят. ным, что в цикле существует инвариантная величина, запись ноторой содержит а*Р в предположении, что р чет по. Если после деления р па 2 ревультат окавывается пе. четным,. то мы вычитаем из зтого ревультата а/2 + Ь. Обовначим новые вначепия а, Ь, р через а', Ь', р' соответ­ сп.~овво: а1 =2•а,pt=р/2-а/2 - Ь,Ь'=а+Ь. Для зтих значений получаем: а'*Р'=а•р -а2- 2а*Ь =а*р -(а+Ь)2+ь2_ = а*р -ь·2+ь2. Это, наконец, дает а'*Р' + Ь'2 ::::: а*р + Ь2• Иивариаптвой величиной цикла оказывается, таким образом, сумма ар + Ь2, приЧем р остается четным. Это обссuечпваетея тем, что в случаях, ногда р/2 нечетно, мы вычитаем Qечетные Ь ив нечетного р/2. Что касается Ь, то он нечетев потому, что он вачипается со ввачепия t1 и к нему прибавляются только четные значения а. · В начале а = 4, р (целая часть дроби (п - 1)/4) четно.!ь=1.tтанчтоар+Ь2= п. f90
Наконец, а, начиная с 4, умножается на 2 при каждом прохождении цикла; Ь начинается с 1, которое меньше соответствующего начального а = 4. Тогда при переходе от а, Ь, р н а''· Ь', р' либо Ь'=Ь,а' =2*а,такчтоеслиЬ<а,тоиbt<а'1 либо Ь" = а+ Ь, а' = 2*а, что также сохраняет справед­ ливость отношения а' < Ь'. Следовательно, вот ситуация 1 которую цикл оставляе11 инвариантной:. п=а*р+Ь2; а - степень двойки~ р четно, Ь нечетноt Ь < а. Кроме того~ мы знаем,. что при выходе из цикла р < а. Если р равно нулю1 то п = Ь2• Тогда мы видим" что п - квадрат числа Ь, которое выводится, и все закончено. Но п может оказаться полным квадратом и тогда" ког­ да р не нуль. Попробуем рассмотреть все возможные слу­ чаи. Положим п = r 2 (r нечетно). Соотношение r2 =ар+ Ь дает r2- Ь2=ар. Положимr+Ь=2и,r- Ь=2v(rиЬнечетяы). Отсюда получаем 4uv = ар. Поскольну r = и+ v, где r нечетно, получаем,; что и и v не могут быть числами одинаковой четности,_ так что одно из них четно" а другое нечетно. Так нак а является степенью двойки" то нечетный сомножитель относится к р. Выявим: его, полагая р = s2 1 " гдеsнечетно,а t>1 (р четно). . Напомним, что а = 211 • В этих обозначениях 4uv = ар . s2k+tt uv = s21c+t-a. Вовможные решения для пары uJ v имеют. вид пар s'21нt-2.1: s•:; '. гдеss=s. 191
Понажем сначала, что s" - меньший иа этих двух элементов пары. Вследствие t > 1 имеем k - t < k + + t-2. Вследствие р < а последовательно выводим s21< 21'; s' s"2 1 < 2k" s's" < 2k-t<21r+1-2<8 1 22k+t-2 (потому что s' нечетен и не меньше 1). Следовательно, нужно взять и = s'21r+н1, v = s''. Покажем теперь, что нужно обязательно вянтъ s' = 1i s' 1 = s.Повыборуииv Ь = 2k+t-2s' - s' 1 <а = 21с. Отсюда получаем: .s" > 2k+1-2s1 - 2"~ и, так ка1;: t;;;;;э.1: s', > 2k--ls' - 2к' s= s's">21'· 1s' 2 - 21ts = 21r- 1s' (s' - 2). Dследствие р = s21 < а= 21 нылодим s< 2k-t <21r-1. Объедпниl'.1 два полученных перавенства: 2k-ls' (s' - 2)<х<21t-1 , поэтому s 1 (s' - 2)<1. Единственное нечетное число s', удовлетворяющее это- м у соотноmению.t это s' - 1. Оледовательво, у нас оста­ ет с я единственная воаможность: и=211+1-1\v= s, Ь=и- v=2k+H- s<а=21t" s > 211+1-2 - 2". Та к к ан s < 2k-t, то t до;1щно быть таким, чтобы 2к-1 > 2k+t-2 _ 2". Поскольку t дошнно быть стро1·0 положительно, то его еданственныии возможпыми значениями являются t = 1 иt=2. Приt=1имеем р=2s, Ь=2н-s=а/2-р/2. Следовательно, если 2Ь = а - Pi ro п - квадрат qи~­ ла(а+р)/2=а -Ь. Приt=2имеем р=4s,Ь=2к-s=а-р/4. t92
Следовательно, если р = 4 (а - Ь), то п - квадрат числаа+р/4=2а - Ь. Этим исчерпываются случаи, ногда п может быть пол­ ным квадратом. Можно спросить себя, могут ли эти различные случаи действительно осуществляться. Заметим, что при вступле­ ниивцинлунасЬ- 1:i;а=4.ПослеэтогоЬможетбыть изменено добавлением а, т. е. нратным числа 4. Следова­ тельно, Ь остается сравнимым с 1 по модулю 4. В трех возможных случаях: р=ofr=ь, р=а-2Ь,r=а-Ь, р=4(а-Ь), r=2а-Ь, первый случай - единственный, в нотором нвадратный норень из п сравним с 1 по модулю 4; два других дают нвадратный норень, сравнимый с 3 по модулю 4. При выходе из цинла равенство п =ар+ Ь2 сучетомсоотношенийр<а,Ь<адаетп<2а11и,:сле­ довательно, при выходе из цинла а2 > п/2. Равенство ар=п- Ь2 даетр= (п - Ь2)/а<п/а. Если онажется, что п/а <а, то непременно р <а и цинл занончен. Чтобы цинл остановился, необходимо, чтобы а2 > п/2, и цинл заведомо останавливается, если а2 >n. Следовательно, все зависит от положения п по отно­ шению н степеням двойни. Существует таное целое п.( что 4ч<п<4ч+1• Возможны два случая. во.:.первыхf может выполнятьu ся неравенство 4q= 22ч<п<22ч+1, итогдадляk= qчислоа2 = 22ч>п/2можетбытьзна­ чением остановни, но в этом нет уверенности. С другой стороны, если 22q+1 < п < 22ч+аf то единственное значение а, удовлеторяющее условию а2 > п/2, есть а = 2Ч+1,; и для этого значения имеем 7 Ж. Арсак 193
а11 > n.t '!ТО rарантирует остановку. Поскольку r = а - - Ь"; то а=r+Ь>r и~ следовательноj а">п. _Во втором случае r=2а-ЬиЬ.<а,_откудаа<2а - Ь=r. Таnм образом 1 все три распознаваемые программой случая являются единственНЬiми возможными исходами программы ,t и каждый из них может произойти. Таким обрааомt перед нами - очень забавный алго­ ритм, который дает значение квадра·тного корня" и кото­ рый определяет случай, когда п не является корнем 1 во в зтом случае не дает никакой дополнительной информа­ ции. Проrрамма заведомо останавливается при а = 2qн, так что число шагов цикла ве больше q - 1 (начивая с 4), причем q - логарифм квадратного корня из п по основанию 2. 'fаким образом,,, получилась программа по­ рядка ln n" что дает ту же сложность" что и обычный алrоритм, действующий кусками по две . цифры. Но для nтого последнеrо алгоритма нужен еще первый цикл, чтобы найти порядок величины п. Головоломка19. Соотношение f (а~ Ь) = f (Ь1 а) следуе11 из самой ини­ циализации р и q: р :=шах (а, Ь); q := min (а,; Ь). Эти две функции симметричны по а и Ь,r и поэтому точно так же симметрична f. При анализе программы мы ог­ раничены действиями, происходящими внутри цикла. Ве­ личивы r и s являются вспомогательными переменнымиf которые ие оставляют нвнаRой проблемы. Трудность вы­ зывают преобразованияt проделываемые над р и q. Чтобы ясно увидеть зту трудность, осуществим введение новых переменных без разрушения старых. Перепишем наш цинл: ПОКА q > eps ВЫПОЛНЯТЬ r:=(q/p)2; s:=r/(r+4) р':= (2*S+1}*р; qr:= s*q р:= р'; q:= q' ВЕРНУТЬСЯ Рассмотрим действия этой программы,. производимые пад данными а., Ь с одной стороны и над ас" Ьс с другой. Коrда 111Ь1 входим в цик.пf то и р, и q умножаютсF1 на с при переходе 011 первого вычисления ко второму. 194
Это не меняет величины r и1 следовательно, ue меняет величины s. Таким образом, р и . q в этих вычислениях умножаются на одни и те же сомножители, так что зна­ чения р' ~ q' во втором вычислении получаются из значе­ ний р, q в первом вычислении умножением их обоих на с. Следовательно, мы еще раз входим в цикл при том же соотношении между входными данными; следовательно, зто соотношение будет иметь место при каждом входе в цикл, и, следовательно, также и на выходе из цикла. Отсюда получаем, что f (ас, Ьс) = cf (а, Ь). Выполнение программы для вычисления g (х) = = f(х,1)сх= 1иeps==10-5даетмнерезультат1равный 1.4142. Дальше считать б~полезно, зто у2. Я немедленно изменяю программу, чтобы она выпол­ няла вывод не только величины g1 но также и g2 • Я полу­ чаю: х g2(х) 12 25 310 417 Нет возможности сомневаться: g (х) = Vх2 + 1. Перенося зту формулу в соотношение. между f и g, мы видим, проделав все вычисления, что f(а,Ь)=fа2+Ь2• «Осталось только» доказать это. Мы не можем дове­ рять заверениям программистов, утверждающих, что их программа делает то-то и то-то. При входе в цикл р и q имеют значения а и Ь в каком-то порядке, поэтому р2+q2= а2+ь2. Что происходит с величиной р1 + q2 после изменений, которым р и q подвергаются в цикле? Вычислим р' 2 + + q'2: р'2+q'2 = (2s+1)2р2+s2q2= s2(4р2+q2)+ +4sp+р2, Вычислим s: r= q2/p2, s= r/(r+4)=q 2 /(q2 + 4p2}i откуда, наконец, 8(4р2+q2)=if'. 7* 195
Воввращаясь отсюда к предыдущему uоотноmению" поu пуча ем р'2+q'I = sq2+4sp2+р2= - = s(4р2+r/)+ра==ра+qi. Таким образом, все кончено ... Это соотношение rаран· тирует, чт0 ра + rf является инвариантом цикла. П рв каждом входе в цикл выполняется соотношение p'l.+rt-а2+ь2. При вы;~соде ив цикла p'l. + rt -= а'/,+ ьа, причем q < ерв. Отсюда следует" 'lто p'l. = (a'l. + b'l.) *(1 - qZ/(a2+ Ь8)}. Сразу получаем, что р:= Jfa2+ь2 с относительной ошибкой 1pi2!(2 • (а 2 + Ь2)). Чтобы получить точность до 10-6 , совершепво ненужно брать eps = 10- 11 ; более 'lем достаточно eps .., .. 0.004 . Эта программа сходится очень быстро. 1. ИГРЫ ВЕЗ СТРАТЕГИИ Игр а 13. Задача о наиболее длинном ввятии не имеет одпоавач­ пого решения. Вот кан ее сделал я - с учетом моих nри­ .11ычек в программировании и упрощений, предоставляе­ мых моим микрономпьютером. Я представил всю игру одной-единс1·венной цепоч­ кой символов с кодами возврата каретии, расположенны­ ми надлежащим образом - так, чтобы визуализация вг­ μы сводилась к визуализации зтой цепочки без какого-ли­ бо дополнительного исмедования. Куры обозначаются 11 этой цепочке присвоенными им буивами 1 лисы - бук­ вами Xi пустые игровые поля обозначаются 1·очками. Остальные символы (пробелы или возврат каретки) пе отвечают никаким используемым игровым полям. Я доба­ вил в начале и в конце по строчке пробелов, 'lТобы не бы­ ло необходимости изучать возможность некоторых пере­ мещений на границе игрового поля. Я ве храню положений лис с помощью двух перемен­ ных. Я отыскиваю их положение в цепочке.~. представдню- t96
щей игру, с помощью функции <шоложение» языка LSE. Это - существенная деталь. Поиск наиболее длинного взятия я осуществляю итеративно. Я образую две це­ почки: - одна из них содержит список кур,: уже взятых при исследовании данного пути (это - последовательность букв взятых кур), - вторая цепочка содержит дуплеты: положение в иг­ ре и рассматриваемое направление (мы осуществляем взя­ тие, исходя из положения х и двигаясь в направлении, обозначенном через i). Находясь в положении х и в направлении i я смотрю. естьликуранаполех+d[i].Еслиеенет.•. то в этом направлении никакое взятие невозможно. Если же такая кура есть, то я смотрю, не содержится ли буква этой куры в цепочке уже взятых кур. Если содержится., то в этом направлении ничего не сделаешь. Если же эта кура еще не взятаt то я проверяю, действительно ли поле х + 2 * * d [ i] содержит именно точку - в противном случае ни­ какого взятия нет. Действуя таким образом, я не сталки­ ваюсь. ни с какими трудностями на краях (там есть пре­ дохранительная строка, и она не содержит ни одной I{уры). Если взятие оказывается возможным, я присоединяю его характеристики к об,еим цепочкам, продвигаюсь на новую позицию и возобновляю изучение взятий.,. исходя из этого нового положения. Я: не изменяю состояния иг­ ры, за исключением того, которое относится к начальному полю отправления лиса (на этом поле лис может оказаться снова. Напротив, из соображений четности мы не можем прийти на поле, занимаемое накой-либо . Из взятых кур). Когда оказывается, что мы достигли ·поля, исходя из которого уже никакое дальнейшее· взятие невозможно, я сравниваю длину цепочки взятых кур .с наиболее длинной y"Re сохраняемой цепочкой и выбираю лучшую из них (нужно смотреть и на цепочку дублетов, чтобы осущест­ вить взятие, обновляя состояние игры, как только наи­ более длинное взятие будет определено). Затем я отменяю последнее взятие (совершенное в этих двух цепочках) и перехожу к следующему направлению, исходя из послед­ него положения. Никакой проблемы с временем вычисле­ ний на моем микрокомпьютере не возникает, даже наобо­ рот. Часто нужно добавлять замедляющий цикл" чтобы предоставить игроку время увидеть 1 что происходит". f97
4. ИГРЫ СО СТР АТЕГИЕ И Иrра19. И вдесь тоже решение неедипствевно. Вот одно ив них, хорошо приспособленное к испольвуемой мною машине., u:a которой деления па 2 не бесплатны (па мой ввгляд, выполняются слишком долго). Нам иввестна верхняя гра­ ница числа спичек в паждой пучке, определщшая приня­ тым вами правилом (я ввял 4 пучки с no крайней мере 16 спичпами). Я рассматриваю двоичные ваписи числа сшrчек в кjчпе, начиная слева. Я вадаюсь числом р = 8. Если число больше или равно 8, то оно содержит 1 в край­ нем .11евом ив вовможпых положений. Тогда я вычитаю 8иазтоrочислаиперехожукр=4. Сначала я опреде.11яю крайнюю левую цифру для числа спичек во всех четырех пучпах. Ив них я удерживаю тоJiь­ ко две вещи: четность этого ч:ис.11а (переменная q1 вначале равная О, изменяется на 1 - q при каждой встрече с еди­ иицей; ревультьт нечетеп, еми в понце получается q = t)J номер последней встреченной кучки, у поторой в дв.нпом положении встретилась единица: Я исследую таким обра­ вом все положения слева направо, попа не встречаю по­ ложение, ДJIЯ которого сумма единиц, стоящих в этом положении, нечетна. Тогда я впаю пучку (ту,~ номер пото­ рой был удержан в памяти), у поторой в втоv положении стоит именно единица. Я убираю ив втой пучки желаемое чисJ10 спичеп, чтобы ата единица исчевла (8 1 если сейчас ивучается крайнее левое положение). Тогда я аналогичным обравом исследую оставшиеся положения, аа исключением того, что я больше не трогаю номера кучев 1 И3 которых я уже брал спичпи. Для паж­ дой оставшейся позиции, вплоть до прайней правой,, я отыскиваю единицы и, если число единиц нечетно,, то я изменяю число спичеп в выбранной пучке. Чтобы уз­ нать, нужно ли добавить или уменьшить, я сохраняю их число перед измепепием в цикле. Если опо больше Pi я вычитаю ив него р,, а если меньше, то я р добавляю (я ставлю О вместо 1 и 1 вместо О). Все вто - очень быстрое вычисление,, по опо требует немного больше строк в про­ грамме. Таи вы леrво достигнете цели. Игр а 20. Я ничего не добавляю, потому rrro зта игра является вариантом пимсвой игры. На паждой строке есть пустые поля1 иrрающве ту же роль, rrro и спичm1 в кучпах ним~ ской игры. Единственная разница состоит в том, что иг­ роп может отступать. Если вы можете достичь выиrры- 198
вающей позиции (такой, что НИМ-сумма пустых полей между игроками па каждой строчке оказывается раВirой пулю) и если противник отступает одной из своих шаn::.ю<, увеличивая число пустот па этой стропе, то вы на столь­ ко же полей продвигаетесь вперед, восстанавливая таким образом предшествующую - и потому выигрывающую - ситуацию. Противник оказывается немного глубже вби­ тым в свой угол и приблизившимся к своей гибели. Если в какой-то момент все промежуточные пустю:е поля про­ падут, то шашки оназываются рядом друг с другом, и ваш противник может только отступать. А вы ва ним сле­ дуете". Игр а 22. Вот шкала весов, предJiоженная А.-П. де Лоашем в книге Шварца [SCHJ: О: отрезок замыкает проигрывающий треугольник, 1: отрезон замыкает треугольник, две стороны кот.о-­ рого принадлежат моему противнику, 2: отрезок замыкает смешанный треугольник (одна ив сторон которого - моя, а другая - моего противника), 3: отрезон соединяет две смешанных вершины (из каж­ дой из них выходит и моя сторона, и сторона моего против­ ника), 4: отрезон соединяет смешанную вершину и вершину 1 из ноторой выходит только одна сторона, 5: отрезок соединяет две вершины, наждая из которых принадлежит тольно одному отрезку, который провел именно я, 6: отрезок соединяет-две вершины, наждая из которых принадлежит тольно одному отрезну, один из которых провел я, а другой - мой противнин, 7: отрезок соединяет две вершины, которые не принад­ лежат проведенным мною отрезкам, 8: отрезон проходит через «чистую» (еще пе исполь­ зованную) вершину, 9: отрезок соединяет чистую вершину с вершиной, не принадлежащей моим отрезкам, HI: отрезок соединяет две чистые вершины. Можно немного упростить этот список, не увеличивая сколько-нибудь серьезно опасность проиграть. Игр а 23. Мы приводим списон выигрывающих позиций, подра­ зумевая при этом,; что если S (р, q) выигрывnет, то выиг­ рывает и S (р, q') для всех q', не превосходящих q. Выбе­ рем. для каждого р наибольшее возможное для пего 199
значение q. 3.•.1 5,2 8,3 11".t Щ,6 16.•.1 18,.2 21,10 24,1 26 .•.2 29,,3 32,.1 34116 37,,1 39_..2 42.i3 44 ,,1 47,.6 50,J Игр а 24. Мне кажется,. что лучше оценивать комбинацию" вы­ числяя число черных шашек, а затем число появлевиЛ каждого цвета в этой комбинации и, наконец, сумму по всем различным цветам меньших (из значений в обеих комбинациях) чисел, получаемых в сравниваемых комби­ нациях (это число равно сумме числа белых и черных шашек). Вы сохраняете число появлений каждого цвета в каждой уже испытанной комбинации в таблице с двумя индексами. Для каждой новой комбинации предложение некото­ рого цвета в некоторой позиции ведет к следующему: - для черных шашек вы можете осуществить сравне~ ние с той же позицией в другой комбинации; - для множества белых + черных шашек: вы полу­ чаете еще и другие появления этого цвета.~ и у вас хранит­ ся число появлений этого цвета в других комбинациях. Поэтому вы можете немедленно остановить испытание с цветом х в положении i, если: либо эта комбинация дает слишком много черных ша­ шек по сравнению с другой комбинацией, либо она еще не дает черных шашек в тот момент,. ког­ да остается ровно столько позиций, сколько нужно для создания тех черных шашек 1 которые остается получить 1 либо она дает слишком много белых шашек, либо она не производит достаточно белых шашек в тот момент,; когда остается ровно столько позиций 1 сколько нужно. Все это означает" что вместо того, чтобы предлагать новую комбинацию всю целиком, а затем сравнивать ~е с уже полученными, вы действуете .•. перебирая позицшо за поэицией" и каждое делаемое в этой позиции предло­ жение немедленно интерпретируется для всех уже изу­ ченных комбинаций. :Когда мы оказываемся заблокированными, нужно воз­ вращаться назад. Нетрудно скорректировать' число появ­ лений рассматриваемых цветов. Нужно пер~оценить уже полученные числа белых и черных шашек. Вьi действуете при этом путем пересчитывания вклада данного цвета в рассматриваемую поэицию. 200
о. СТРАТЕГИЯ БЕЗ ИГРЫ (ВЫИГРЫВАЮЩИЕ СТРАТЕГИИ) Игр а 27. Рассмотрим игру НАДЕВАТЬ. В начале на игровом поле ничего нет. Можно играть только на поле, которое следует за первым занятым полем, а такого поля нет. · Играем на поле 1. · На следующем ходе было бы глупо снимать только что выставленную шашку. Первое занятое полё - первое. Ставим шашку на поле 2. Первое занятое поле - это снова первое поле. Было бы глупо снимать только что выставленную шашку, и поэтому нужно играть на первом поле,, т. е" освобождать его. Теперь первое свободное по­ ле - это поле 2. Было бы глупо возвращать на поле 1 только что снятую шашку. Следовательно, поставим шаш­ ку на поле 3. Никакого выбора ... Чтобы освободить игру на одно поле.• очищаем поле 1. Чтобы освободить игру на_ два поля, мы не можем очистить поле 1, так как тогда мы не могли бы очистить и поле 2. Первое занятое поле - поле 1. Можно очис­ тить поле 2;, а затем поле 1. Для игры с 3 полями, мы очищаем 1, затем ставим 3" ставим снова 1,, очищаем 2, а затем 1. Если п четно., то мы начинаем с удаления шашки 2" в противном случае мы удаляем шаШ!\У 1. Теперь вам не составит ни малейшего труда написать итеративную программу: место := О; игра := пусто выполнять ЕСЛИ поле (1) = пусто ТО поставить (1); место : = место +1 ИНАЧЕ удалить (1); место : = место -1 КОНЕЦ_ЕСЛИ ЕСЛИ место . п ТО КОНЧЕНО КОНЕЦ_ЕСЛИ искать первое занятое поле 1 номер которого дает число i; ЕСЛИ поле (i + 1) = пусто ТО поставить (i + 1)1 место : = место +1 - ИНАЧЕ удалить (i + 1); место : = место -1 КОНЕЦ_ЕСЛИ ЕСЛИ место = п ТО. КОНЧЕНО КОНЕЦ_ЕGЛИ ВЕРНУТЬСЯ ' Для игры СНИМАТЬ вы действуете аналогично. 201
В том, что касается последовательностей чисел, порож­ денных игрой СНИМАТЬ, начнем с рассмотрения кон­ кретного примера. Вот игра СНИМАТЬ для п = 4. 0001 1 0011 3 0010 2 0110 6 0111 7 0101 5 0100 4 1100 12 1101 13 1111 15 Испольвованы все числа, меньшие 8, а ив больших или равных 8 участвуют только 12, 13 и 15. Для обобщения · действуйте по индукции. Игра29.. Вот решение для 8 букв и 10 полей. .. абабабаб 6аа6а6а ..6 6ааб ..аа66 6.. баааа66 6бббаааа.. Присутствие куска Х не меняет последовательности ивмен ений . .. аба6Х а6а6 6ааба6Ха .. 6 баа6. . Хаа66 6.. бааХааб6 66ббааХаа .. Последний перенос пары букв аа слева от Х в свобод­ ные пары справа дает · 6666..Хаааа Теперь вы можете ваняться Х (если для этой комби­ нации вам решение уже иввестно) и получить б666У .. аааа Таким обравом1 остается переместить два а с крайни х полей справа на свободные поля, и все вакончено . Следо­ в а тельно, если вы умеете исследовать комбинацию Х с р парами букв а, 6, то вы умеете исследовать и комбинацию ср+4парами. 202
Л уже предложил вам решение для четырех пар. Та­ ким обравом вы получаете решение для 8, 12,_ ." Главные решения - это решения для 4,; 5,; 6,. 7 пар. Вот одно ив решений для строчки ив 5 пар .. абабабабаб Искомое расположение имеет вид ,бббббааааа., Можно вадаться целью удалить все буквы а (особен­ ную трудность при перемещениях вывывает то, что их число нечетно) ив первой половины (первых 5 повиций,. в которых букв а в исходном положении не столько же, сколько букв 6) . .. абабабабаб баабабаба .. б бааб..абаабб бааббаа .. абб б..ббааааабб бббббааааа .. Предлагаю вам равыграть 6 и 7 пар. Совершенно бесполевно подключать к этому делу ком­ пьютер. А где же программирование, спросите вы? Л от­ вечу, что это упражнение вводит вас в рекурсивные или индуктивные рассуждения. Это овдоровляет :ь:аши спосо­ бы рассуждать ... Игр а 30. Единственная настоящая вадача, если вы работаете итеративным способом - органивовать испытания так, что­ бы иметь вовможность совершенно систематически прово­ дить их и обновлять игру, сохраняя список ходов, чтобы иметь вовможность вернуться навад. Игра имеет ту же конфигурацию, что и для лис и кур. Поле обовначается своим положением в цепочке. Перемеще­ ние в данном направлении реаливуется добавлением неко­ торой константы к данному положению. Таблица ив че­ тырех элементов дает эти константы для всех четырех направлений. Свободное поле представляется точкой,; ва­ нятое поле - крестиком Х • Вы ищете первый крестик в цепочке и вы начинаете с первого возможного перемещения i = 1. Если есть вовможность взятия в этом направлении, то вы регистри­ руете данные Х, i в цепочке или таблице (во втором слу­ чае вы симулируете кучу). Вы выполняете ввятие и ва- 203
чинаете сначала. Если же возможности взятия в данном направлении нет, то вы переходите R следующему i. Если вы достигаете четырех, то с этим кр~стиком все кончено, и вы переходите R следующему. Если их больше нет, то вы возвращаетесь R последней зарегистрированной в куче паре данных х, t, отменяете соответствующее взятие (из­ менение состояния игры) и продолжаете переходом R сле­ дующему i. Вы уже проделали более трудную работу для самого длинного взятия в игре с курами и лисами. Игр а 31. Число ходов f (р) для переноса р дисков получается переносом сначала р - 1 диенов ео стержн.11 d на стер­ жень3- а - d за f (р - 1) ход, затем ив перемещения диска р, что требует в точности одного хода 1 а ватем воз­ вращения р - 1 дисков из запаса на стержень прибытия за f (р - 1) ход, откуда получаем~ f(р)=2*!(р- 1)+1, g(р)=!(р)+1=2*!(р-1)+2= = 2*и(р- 1)+1)=2*g(р- 1). По индукцил g(р)= 2Pg(0). Таккянf(О)=О,g(О)=f(О)+1=1,g(р)=2Р,то, наконец f(р)=2Р -f, Для игры с 50 дисками нужно 250 - d ходов. Но 210 равно 1024, или порядка 108. Следовательно, 250 поряд­ ка 101 '. В часе 3600 сенунд, в сутках 3600 Х 24 == 86400 се­ кунд, ва год получаем 86400 Х 365 - или порядка 3 Х Х 107 секунд~ откуда" наконец, 3 Х 109 секунд ва столе­ тие. Повтому нужно порядка 1015/3 Х 108 , или порядка 8 Х 105 веков для игры с 50 дисками, которая, таким об­ разом:~; требует около 300000 веков ... Вот другой способ доказывать свойство четности. Пусть диски обозначеИЬJ их порядковыми номерами, на­ чиная с первого - самого маленького, и нужно покавать, что два диска с номерами одной четности никогда не попа­ дают вепосредствеяво один на другой. -Опыт показывает1 что для первых вначений п реали­ вация иrры Н (п1 d1 а) дает следующее; 304
- диски" попадающие в основание стержней d и а, имеют ту же четность, что и п, - диски, попадающие в основание вапасного стерж­ ня, имеют другую четность. Предположим, что это свойство -справедливо для п - - 1. Для реаливации Н (п, d, а) нужно выполнить сна­ чалаН(п- 1,d,3 - а - d). В течение этой операции диск п остается в основании начального стержня d и, следовательно, в основании диска d находится диск п и потому диск той же четности, что и п. Диски, которые при этом окавываются в основании стержня прибытия дляпроцедурыН(п- 1,d,3 - а - d), имеют (по пред­ положению индукции) ту же четность, что и п - 1 . Но этот стержень прибытия является для игры Н (п, d;, а) вапасным стержнем, и, следовательно, в основании вапас­ ного стержня окавываются диски, имеющие ту же чет­ ность, что и п - 1 . Наконец, вапасной стержень для иг­ рыН(п- 1,d,3 - а - d) ест_ь а,; в основание ноторого попадают диски с четность ro п - 2J следовательно" с чет­ ностью п. Перемещение диска п со стержня d на стержень а помещает п в основание стержня а, так что при этом свой­ ство четности для а подтверждается. Проверьте, что для стержнейdи3- а - d оно также подтверждается. Для этого равложите Н (п, d, а) на 5 операций~ Н(п-2,d,а) пип-1нв.стержнеd Р(п-1,d,3 -а - d) пнаd, п - 1на3-а-d Н(п- 2,а,3- а - d) Р(п"d., а) пнаа,п- 1на3- а - d Н(п~2_, 3 - а - d, d} Р(п-1,3-а - d,а)пнаа,п-1наа Н(п- 2,d,а). Предположим, что искомое свойство четности выпол­ няется для п - 1 . Тогда остается ваниматься только теми дисками, которые ложатся на диск п. В первой операции диск п - 1 находится на диске п,: они равной четности, и, такuм обравом, вдесь свойство четности выполняется. Во время игры Н (п - 2,_ а, 3 - - а - d) диск п находится на стержне, который для этой игры является вапасныи. Диски, которые в втой игре ложатся в основание этого стержня - и потому ложатся на диск п - имеют четность, противоположную четности числа п - 2i следов~Т9ЛЬВО~ четность~ противоположную
четяости n~ что и проверяет ва втом втапе ваше условие четв:ости. Вы п:егко ваверmите это рассуждение. Равобраявый пример хорошо иллюстрирует тесяую свявь между рекурсиввостью и ренурреятиостью. кото­ рые представляют собою не что иное.. как две немного отлuчающиеся реаливации оцвого и того же рассуждения. Игр а 33. Предположите~, что в Н (п - () d• а) диен 1 переме­ щается всеrда в одном и том те направлении. Для Н (п~ d,, а) вы должны выполнить Н(п- d,d,i3- а - d) Н(п-(,8-а - d., а). Вместо того.~ чтобы непоередотвеяв:о переходить от d к а, вы ооуществп:яете этот переход с помощью стержня 3 - - а - d;,, иначе говоря. вы делаете два перемещения в об­ ратном направлении. Диск 1 продолжает перемещаться :всетда в одном И том же направлении, но это яаправле- 1rиеменяется при переходе от п- f н п. Для п = f этот диск перемеща~ся в направлении от d н а. Это всег­ да буцет так для всех нечетных п.. в то время как для четных п он будет перемещатьоя в направлении от а Бd, Простое итеративное решение имеет следующий вид: исходя иэ четности п определите направление переме­ щения ~иска 1. Начните о 2" - t число ходов ., которые осталось сделать: в&• ЕСЛИ четно (п) ТО 2 ИНАЧЕ 1 ИОНЕЦ_ЕСЛИ dri=;i01 k:=- 2" - t · выполнять а:==d+s\ЕСЛИа>2ТОа;=а-В RОНЕЦ_ЕСЛИ переместить диск 1 с d ва а1 d:==а;k:=k-f · ЕСЛИ k = О ТО КОНЧЕНО RОНЕЦ_ЕСЛИ переместить единственный диск, который можно переместить. кроме диска f kt=k-f ВЕРНУТЬСЯ Вое ДИ6RИ имеют общее СВОЙСТВО: нечетные rо:ки пере­ меЩаЮТСЯ в том же направлении, что и рох ~ а четные ~исии - :в другом направлеяии. В вшnеприведев:яой програим:е етратеrия соверmеивв с точни эреяия испоJ1Иеяия вручную. потому что в каж- 206
дwi данный момент сраау видно.,, накой диск нужно пере­ меститьf если это не самый маленький диск (мен·ьший ив двух остальных дисков перемещается на больший). В нашей программе вам нужно вычислить это движение, Один ив наиболее простых способов состоит в том, чтобы представить игру с помощью вектора, дающего для диска i номер стержня, на котором он находится. Диск, Под­ лежащий перемещению - это наименьший диск,; который находится ие на том же стержне,: что и диен 1,; еледова­ тельно1 номер стержня которого .отличается от d. Этот самый диск перемещается со стержня, на нотором он нах.одиrея - .с ноеро:м х - иастержень3- х - d. Обовначим первое перемещение через 1. Поскольку дисR 1 перемещается один рав в каждой паре ходов (точ­ нее,, перемещается черев ход), то он перемещается в каж­ дый нечетный ход. По индукции покажите, что диск р перемещается в ходы с номерами, которые делятся на 2Р-1 , но не делятся на 2Р (т. е. являются нечетными крат­ ными qисла 2Р-1), Номер k любого хода може~ быть единственным .спо­ собом представлен в виде k = (2r + 1)2P-i, Перемещаемый на этом ходе диск есть диск с номером р, и это - его (r + 1)-е перемещение. Так кан он начинает движение .со стержня О и перемещается в направлении sp (1, если р нечетно, и 2 в противном случае).f то на втом ходе диск перемещается с rsp-гo на (:r + 1)sр-Й стержень~ где ыи числа берутся по модулю 3. Игр а 34. Попытаемся охарактеривовать вначение р, дающее иrре оптимум для данного п. Нам иввестно, что / 3 (п - р):::::;; = 2n-p -1. Должно выполняться 2/4(р- 1)+2n-p+l - 1>2/4(р)+2n-p - 1.!J 2/4(р+1)+2n-p-1' - 1>2/4(р)+2n-p - 1. Удобно пользоваться первыми равностями для функ­ ции /4: d(р)=/4(р+1)- /,(р). Два приведенных выше соотношения могу'!' быть пе­ реписаны следующим обравом: d (р - 1)<2n-p-1, d (р)>2п-р-э. 20'1
Интересно рассматривать даже не d (р), а скорее 2pd (р) == g (р): g(р- 1),,.., 2п-2<,g(р), Можно еще упростить запись, беря не g (р), а вели- чину h(р)=log2(g(р))=р+log2(d(р)). Тоrда получаем h(р- 1)<п- 2<,h(р). При данном п величина р - наименьшее целое, для ко­ торого h больше или равно п - 2 . Приведем здесь первые ив полученных таким образом значений: пqf4рdh ооо 1о 111 2~ 2 3 23 325145 4 9146 513147 6317389 7 253810 8334811 9 415812 1044961614 н6561615 Мы добавили в таблицу переменное q_. связанное с «<треугольными» числами, Для п = q (q + 1)/2 действи­ тельно убеждаемся, что h(р)=h(р- f)+2 в то время как для других п h(р)=h(р- 1)+1. Исходя ив п, можно вычислить q' q = целая_часть ((f8n + f-1)/2). Имеем h (п) = п +целая_часть ((f8n + 1 - 1)/2). Покажите это по индукции. Исходя отсюда~ вычисля­ ется все. Таким образом, если п дано.1. то р - на.имень- 208
шее целое, большее 'или равное (2п- 1 - f8n - 7)/2. Игр а 35. Вовьмем, например, игру с 50 дисками. Она реали­ вуется переносом сначала 40 дисков на вапасной стер­ жень, а ватем 10 последних дисков со стержня О на стер­ жень 1., с испольвованием при этом только трех свободных стержней. Наконец, остается перенести начальные 40 са­ мых маленьких дисков с вапасного стержня на первый стержень, испольвуя все 4 стержня. Чтобы переместить 40 дисков с 4 стержнями, сводим вадачу к перемещению 31 диска с 4 стержнями, а ватем 9 с 3 стержнями". Таким обравом, дело сводится к равбиению 50 дисков на 8 сегментов: сегмент 1t 1 диен номер диска 1 2 3 диска ДИСКИОТ 2до4 36 5 10 46 11 16 57 17 23 68 24 31 79 32 40 810 41 50 Rаждый сегмент перемещается с испольвованием 3 стержней, в чем мы следуем итеративной стратегии, которая уже описана выше. Единственный вопрос - это правильный выбор вапасных стержней. Договоримся работать с тремя стержнями О., 1, 2111 так что стержень 3 остается пустым и служит вапасным стержнем при любом перемещении какого-либо сегмента. Более точно, перемещение сегмента р со стержня d на стержень а осуществляется с помощью ивученной выше процедуры Н, в которой вапасным стержнем является стержень 3. Сегмент 1 перемещается в каждый ив двух ходов под­ ряд (под ходом я понимаю последовательность операций, реаливующих процедуру Н), всегда в одном и том же направлении. Мы сохраняем предыдущую итеративную стратегию, но понимаем ее как стратегию для сегментов. На ком­ пьютере это может пройти очень быстро. Вполне вероит­ но1 что робот может осуществить одно перемещение ва 209
несколько секунд. Тогда яа всю игру потребуется не бо­ лее чем несколько часов." Ur.ра36. Соотяошеяие SG (р,. q) =О овяачает.~ что вы яе мо­ жете достичь ситуацИи с числом Спрага-Грюнди, рав­ ныи яулю.1, удаляя яе более 2q спичек ив кучки с р спич­ ками. Если вы исходите ив SG (р, q' < q)" то вы не мо­ жете удалить столько же спичек и, следовательно " нет опасности" что вы , получите число SG.1 равное пулю. Дредположим, . что SG (Рн 1) =О. · Исходя ив р 1 + 1, я могу удалить 1 спичку и полу­ чить пару Pti 1. Следовательно, SG (р 1 + 1.t q) +О. Исходя ив Pt + 2, я для любого q всегда могу уда­ лить две спичйи.~: яо тогда я получаю SG (р 11 2) + О"' И~ следовательно.~ SG(Pt+2., 1)=О. Если в Pt имеем q1 >1,: то тогда мы этого яе полу­ чимиSG(р1+2.1 1)+О.НовPt+3, удаляяедияст­ веввую спичку_, получаем пару Pt + 2.1 1 с SG =F O.i или же.~; удаляя две спич1ш, получаем пару Pt + 1.f 2 с яену­ левыи числом SG. Следовательно" SG (р 1 + 3.i 1) =О. Все оставшееся уже очеяь хорошо подготовлено. Рас­ смотрите точку Р.• для которой диагональ пересекает ось р =:;;; О .1 яе пересекая положений с яулевыи SG. Эта пря­ мая вадается уравнением х + у ;:::::r р. Ояа пересекает ось :е = {) в точке у == р. Нельвя взять в точности р сfmчек,­ можно яе больше р - 1. Следовательно, в этой точке q = целая_часть ((р - 1)/2). Рассмотрим теперь точку_, абсцисса которой есть чис­ ло Фибоначчи: р = fib (s). Нужяо покаватъ " что прямая х + 'fl ~ fib (s) яе пере­ сенает rочек с яеяулевыми SG:i кроме х ~О. Рассмотрим сна•ала точну а;=fib(s- 1). В этой точке у::::;fib(s)- fib(s- f)==fib(s- 2), Прир~fib(s- 1) q :::::;: целая_часть ((fib (s - 1)- 1)/2). Нужяо показать~ что wiя каждого s цедая_,асть ((fib (s - 1) - 1)/2) < fib (s - 2)JJ 2Ю
или, 'IТО равносильно, fib(s- 1)<2*fib(s- 2)+1. Но fib(s- 1)==,fib(s- 2)+fib(s- 3) и f1Ь(s- 3)<fib(s- 2). Следовательно,,, рассматриваемая диаг(}наль не пере­ секает точек с пулевым SG в fib (s - 1). Она не может пересенать их и между s - 1 и s, поскольку эта часть воспроизводит то" что проиоходит в интервале от 1 до fib (s - 2), а диагональ,, выходящая из fib (s - 2), не пересекает точен с нулевым SG до оси q, Вы бев труда завершите это докавател:ьство. 6, КОМБИНАТОРНЫЕ ЗАДАЧИ Головоломка28. Действител:ъво ли вам что-то еще нужно сообщать? То11~а я немного уточню способ поддержания части от 1 до р в порядке неубывания. Исходим ив упорядоченного по яеубыванию вектора fJii ag, , , •1 ар. Вы последователь­ но заменяете элемент а.,, &леменпми 4t, где i иаправлен по убыванию. Вы последовательно получите ai,а2,•• " ap-i• аР, ai, а2 , •••,, аР, ap-i• ai, а2,, •••,, ар-в• aP-i• аР, ap-s• / По индукции, предположим, что в некоторый момент вы получили после перемены мест элементов с номерами t, р. На следующем ходе вы поменяете местами {Zj-1 и по­ следний член, который равен а 1 • Эта форма остается не­ изменяой1 и первая часть, от 1 до р - 1, остаетоя от­ сортированной в неубывающем порядке. В конце вы по­ лучите Чтобы восе11ановить иоходвый порядок, вы распола­ гаете последвий: Dлемент Яа запасном поле, поднимаете все оетальные элементы ва одну ступень, а затем разие­ щаете содержимое запасного поля яа первом моо'Ее. 211
Это вы делаете только в случае необходимости. Не­ ва qем восстанавливать порядок, когда все закончено. Процедура работает достаточно быстро для того,, чтобы в случае неудачи иметь возможность испытать наличие решения для п - 1;, а затем для п + 1. Таким образом, по прошествии 45 с для каждого кандидата мы получаем в качестве результата - решение.~: если оно существует _, - приближение о точностью · до единицы; если это возможно. Эта программ~ терпит неудачу нрайне редко. В выпусне от 8 марта 1984 года оледующий розыгрыш не был найден ни кандидатами.~: ни БертраномJ, ни кем­ либо из присутствующих~ 501010542 п::с:767. На моем микрокомпьютере нужно 18 а.,, чтобы обна­ ружить, что э'tа задач-а не имеет решения, а затем еще 5 с, 'lтобы получить 50-10 z::40,40*5=200, 10-2q8.1) 200-8=192, 192*4=;768. Для задачи 976431п=795 '!ереа 6 с получается 4*9:::::;:36, 36+1==37, 37*7=259.i 259+6=265, 265*3=795. Наконец, 100508542 п=:631. 3а менее чем 2 с получаем: 9250 - 50 = 9200$ 9200/25 = 368. 7. ОБО ВСЕМ ПОНЕМНОГУ Головоломка31. Программисты обманываются, поскольку они не бе­ рут на себя труд прояснить различные ситуации. В строне 200 мы внаем,. что цепочка а пройдена пол­ ностьюt и исследованы все символы 1 не являющиеся про­ белами. Если в цепочке Ь содержится еще какой-нибудь символ, не являющийся пробелом, то равенств11- цепо­ чек нет. Все в порядке, 212
В строке 300 цепочка а пройдена вплоть до некоторого символа, не являющегося пробелом, и этот символ еще пе исследован. Цепочка Ь пройдена полностью,, и в ней не содержится более ни одного символаJ. не являющегося пробелом. Следовательно,, эти две цепочки равличны. Можно было бы скавать.. что дальнейшее движение по цепочке а бесполевно, но не приводит н ошибне. Но это неверно. Вы остановились на еще пе исследованном сим­ воле, который не является пробелом. Если вы перейдете к следующему символу, не являющемуся пробелом, то данный символ вы потеряете. Если, нак бывает в боль­ шинстве случаев., цепочка а совпадает с цепочкой Ь с точ­ ностью до пробелов эа исключением единственного до­ полнительного символа в конце цепочки, то именно по . этой-то причине и должен быть остановлен пробег цепоч­ ки а. Перемещаясь и не обнаруживая больше символов, не являющихся пробелами, мы получаем сообщение, что цепочки совпадают, а зто неверно. Ясио, что програм­ мисты не принимали во внимание и не ивучали именно этот случай. И никаних оснований поступать таи нет. В этом и состоит преимущество логичесних рассуждений о тексте программы по сравнению с проверной ее пра- вильности с помощью тестирования. · Ваша программа должна сохранять оимметричпую роль обеих цепочек. Не начинайте проверят,ь ревультат пробега цепочки а, не пробен\ав цепочни Ь, и ивучайте обе цепочки равом. Вовьмt:'м общую ситуацию: а пройдена вплоть до i включительно~ Ь пройдена вплоть до , включительно\ обе части совпадают с точностью до пробелов. выполнять продвинуть i на следующий символ в а1 не являю­ щийся пробелом~ продвинуть j на следующий символ в Ь, не являю­ щийся пробелом; ЕСЛИтакихнетваИтакихнетвЬТО r:= ИСТИНА; КОНЧЕНО КОНЕЦ_ЕСЛИ; ЕСЛИтакихнетваИЛИтакихнетвЬТО r:= ЛОЖЬ; КОНЧЕНО КОНЕЦ_ЕСЛИ; ЕСЛИ а[i];р.Ь[j] ТО r :=ЛОЖЬ1 КОНЧЕНО КОНЕЦ_ЕСЛИ; ВЕРНУТЬСЯ 2t3
Эта программа совершенно симметрична относительно аиь". Гоповопомка33. Нужно работать по модулю п. Удобнее всего прону­ меровать элементы ·вектора от О до п - 1. Все элементы спускаются вниз на т по модулю п. Элемент, который переходит в О, имеет номер т; элемент, который пере­ ходит вт, имеет номер 2т по модулю п; элемент, который переходит в 2т, имеет. -номер 3т по модулю п... Таким образом, мы получаем цепочку чисел, кратны.х т по модулю п. Весь вопрос в том, чтобы узнать, порождает ли последовательность чисел, кратных т по ~одулю п,; последовательность всех целых от О до п - 1. Это так, если т и п взаимно просты. В противном случае пусть с ........ наибольший общий делитель т и п: т=т'с,. п =п'с, п'*т=п'.*т'*с=т'*п=Опомодулюп. Эта цепочка возвращается ·в О ва п' = п/с операций. При этом пробегается не весь вектор, а только его эле­ менты, сравнимые с О по модулю с. Беря в качестве исходных элементов различных цик­ лов последовательно целые числа от О до с - 1, вы раз­ местите все элементы вектора, причем каждый из них будет перемещаться в точности один раз ... Гоповоломка34. Рассмотрите более общую задачу, что заставит вас открыть одно ив этих знаменитых «преобразований прог­ раммы»~ столь полезных, когда желательно улучшить уже существующие программы. Обозначим черев t и и два условия,. а через а и Ь - две последовательности инструк­ ций. Вот простой цикл: ПОКА t ВЫПОЛНЯТЬ ЕСЛИиТОаИНАЧЕЬ КОНЕЦ_ЕСЛИ ВЕРНУТЬСЯ 50-4=46,46*2=92,92*8=736J) 100+5=105,; 736- 105=631. Я уже предлагал вам следующий пример: 1007550251010. - Для п = 870 особой трудности нет~ потому что это - кратное десяти. 2t4
Компьютер сообщает мне 75/25 = 3, 50- 3==47, 47*10 = 470, 470- 100 =370. Это уже интересно, потому что это - совершенно не то решение, которое я собирался искать. Чтобы найти 369, нужно обравовать число" не кратное 5,- ',Iего нельвя сделать с помощью какой-либо иэ трех операций +~ -, *• сохраняющих кратность пяти. Сле­ довательно,,; нужно испольвовать деление. Вот решение: 50/10 = 5, 5*75=375, 375 - 10=365, 100/25 = 4, 365+4= 369. Обе представленные вдесь программы не повволяют получить это решение. Действительно, оно ваписывается в виде (50/10) *75 + 100/25 - 10. А число 368? Вы нашли для него реmение? Я ие су­ мел. Но Жак Бейгбеде сообщил мне, что он .получил его делением на 25." 10*100=1000, 1000- 75 = 925, 925*10=9250. Последовательность операций следующая: проверяется условие t, - если оно истинно, то проверяется и, - если и истинно" то выполняется а, и все вовобнов- ляется. Допустим, что условия t и и таковы, что я имею вов­ можность проверить и, даже если проверка условия t дает значение ЛОЖЬ * ). Тогда, пока условия t и и истинны, в цикле выполняется а. Вот другая последовательность, которая может встре- титься: - проверяется условие t, - если оно истинно, то проверяется и,, *) Вот пара условий,' которая не обладает этим свойством: t: :& =/= О; и: sin (1/:&) > О.~ Примеч, ред. 215
- если и ложно, то выполняется Ь.t и все возобнов­ ляется. Таким образом, мы приходим к форме~: для ноторой можно доказать, что она всегда энвивалентна исходной (с точностью до ог-раничения, что должна существовать возможность вычисления и даже в случаеJ. когда t ложно). ПОКА t ВЫПОЛНЯТЬ ПОКА t · И и ВЫПОЛНЯТЬ а ВЕРНУТЬСЯ ПОКА t И НЕ и ВЫПОЛНЯТЬ Ь ВЕРНУТЬСЯ ВЕРНУТЬСЯ Мы перепишем программу для определения равнин" чтобы придать ей форму ПОКА.•. заключенного в скобки ЕСЛИ: i:=1; р:=О; ПОКА i < п ВЫПОЛНЯТЬ ЕСЛИа[i]=а[t- р] ТО x ·:=a[iJ; р:=р+1; i:=i+1 ИНАЧЕ i:=i + 1 КОНЕЦ_ЕСЛИ ВЕРНУТЬСЯ Мы обнаруживаем .t что в нашем случае мы не можем объединить два условия с помощью операции И: если i не удовлеворяет условию, что t не больше ni то нельзя поста.11ить вопрос относительно а [ i]. Обрисуем труд­ ность подходящим образом: - нужно либо добавить в таблицу а поле.,, которое содержит какую-нибудь несущественную для нас величину (мы н этой величине не обращаемся); - либо нужно допустить,,; что операция И не ком­ мутативна. Для вычисления t и и мы вычисляем t~ и если результат есть ЛОЛ\Ь,,; то все кончено и притом с резуль­ татом ЛОЖЬ. В противном случае результат есть зна­ чение условия и. .2 16 Тогда можно использовать наше преобразование: i:=1; р:=О; ПОКА i < п ВЫПОЛНЯТЬ ПОКАi<пИа[i]=а[t- р]ВЫПОЛНЯТЬ х:=а[t];р:=р+1;t:=i+1 ВЕРНУТЬСЯ ПОКАi<пИ а[i]=/=а[i- р]ВЫПОЛНЯТЬ i:=i+1 ВЕРНУТЬСЯ ВЕРНУТЬСЯ
Первый цинл движется по табп:ице а, пока обнаружи­ вается, что элементы равны между собой. Более точно, Р и i ивменяются одинаково, так что равность i - р ос­ тается постоянной. Все элементы а [i] сравниваются с од­ ним и тем же элементом:, и величина х остается постоян­ ной,, равной этому элементу, на протяжении всего цикла. Второй цикл ивменяет t до тех пор, пока не обнару­ жится пара элементов, отстоящих на р + 1. Уточним ситуацию выхода ив первого внутреннего цикла. Мы собираемся найти конец равнины, которая лучше всех предыдущих., мы фиксируем ее длину р и ее вначение х, а t обовначает первый элемент после этой равнины. Мы можем надеяться найти пару j, j - р с а[j]=а[j- р] только пока j - р остается на равнине, которую мы со­ бираемся пройти. Наименьшее соответствующее i значе­ ниеjудовлетворяетусловиюj- р =i,илиj=i+р. Следовательно, можно увеличивать i от р в обоих циклах, не меняя действия программы, что ускоряет ее работу. Чтобы ускорить и первый внутренний цикл, мы при­ своим переменной х ее вначение перед циклом и сохраним ее начальное вначение в j. Так как i - р остается постоян­ ным, то можно вычислить вначение р также и после вы­ хода ив цикла. Начальные вначения суть i = j и р = р0, а конечные вначения i и р удовлетворяют соотношениям i-р=j -р0,откудар=i+Ро-j: i:=1;р:=0 ПОКА i < п ВЫПОЛНЯТЬ х:=а[i];j:=i ПОКА i <пи a[i] = х ВЫПОЛНЯТЬ i:=i+1 ВЕРНУТЬСЯ р:=i+р-j;i:=i+р ПОКАi< п И а[iJ=/= ,i·[i- р] ВЫПОЛНЯТЬ i:=i+1 ВЕРНУТЬСЯ ВЕРНУТЬСЯ Вы можете получить эту программу непосредственно, минуя механивм преобравования программ. Но этот спо­ соб кажется :мне требующим больших умственных усилий. 211.
Может быть, эт@ свяваяо с ходом мыслей, который я при­ обрел, преподавая *). Голо11оломка 35. Хорошенько учтите то, что 11ы вяаете: обовпачим черев и таблицу, которая дает последние элементы наилучших воврастающих последовательностей для (всех вовмож­ яых)ДЛИНОТ1ДОm. Покажем сначала, что и 1 < щн. Предположим, что зто пе так: пусть существует такая последовательность длины i + 1, у которой последний элемент пе больше и1. *) Прочтя весь этот ужас, я решил провести решение, осно­ ванно е па методике из курса проrраммировапия механико-матема­ тического факультета МГУ. Каждой последовательности чисел {ai, а~, ••. , ai} (t;;;;... 1) со­ поставим число lmax, равное максимальной длине равнинного участка этой последовательности . Очевидно, что lmax ({а1 }) = 1. Пусть мы знаем lmax ({~, а2 , ••• , ai}). Как вычислить величину lmax ({ai, ... , 4!, ан1})? Добавление элемента ai+l к последова- !fельпости {ai, а~, •. . , ai} пе затраrивает равнинных участков втой последовательности, кроме, быть может, последпеrо . Если "н~ = а1, то длина этоrо последпеrо участка - назовем ее llaвt ({~ •. , ., а;.}) - увеличивается па единицу. Если величина llast ({а1, , •• , ai, а1н}) окажется при этом больше величины lmax {~, а2 , ••• , а1 }, то это виачит, что последний равнинный участок в последовательности {С]:, 4 2 , ••• , а1 , ai+1 } по крайней мере па 1 длиннее всех предыдущих, и, значит, lmax ({ai, а2 , ••• • • •, а1, ai+l})= llast({aj,а2, ••" а1,ан1}). Введем четыре величины: t - число рассмотренных членов последовательности, lmax - макс~альпая длина равнинного участка для рассмот­ ренных элементов, llast - длина последпеrо равпинноrо участка для рассмотреп­ н ых элементов, xlast - последний рассмотренный элемент последовательности (оп равен а [t)). Теперь приведем без пояснений проrрамму, которая вычислнет lmax ({ai, ••. , an}) по индукции. . t:=1; lmax:=1: llast:=11 oclast:=а[1] йцпокаi<п х:=а[t+1) если х = xlast то llast :== llast + 1 иначе llast : = 1 кесли если llast > lmax то lmax := llast кесли xlast := х t:=t+1 кц вывод lmax Подробнее об этой индуктивной методике можно прочитать в кпиrе: А. r. Куmвирепко, r. в. Лебедев. Проrрашшроваиие ДJIЯ математиков.- М,; Наука, 1988 . - Примеч, ред. 218
Так как эта последовательность воврастает, то ее предr последний элемент меньше ин1 и потому меньше и;. 'I'or- дa, удаляя последний элемент этой последовательности, мы полу1Ц1JIИ бы последовательность длины i с последним членом, меньшим и 1 , что проти:воречило бы предположе­ нию, что и 1 - последний элемент последовательности дливы t с наименьшим вовможным последним элементом. Рассмотрим теперt. следующий элемент х нашего вен­ тора. Равместим его в упорядоченной таблице и. Может случиться, что з~ > Um. Тогда элемент х можно присоеди­ нить к концу пооледовательности длины т; тем самым получилась бы (впервые) воврастающая последовате.~rь­ ность длины т + 1х ноторая вследств~е своей единствен­ ности была бы оптимальна. Если х меньше и~. то им следует sа.иеиитЬ Ui для пост­ роения новой наилучшей последовательности с длиной 1. Если же, наконец, окавывается.• что и;< х < ин1, то х можно присоединить к концу последовательности с дли­ ной i + 1i чтобы получить последовательность с длиной i + 1, которая лучше уже известной~ JiJ поэтому Uiн сле­ дует вамевить ва х, Так как и упорядочена, то вы може­ те раэиестить в ней х с помощью дихотомического поиска. Эта операция требует порядка log11 т действий для т, пе nревосходящих п. Тан нан вам требуется п обращений R таблице, то вы получаете верхнюю границу числа дейст­ вий порядна п lug2 п, что чревмерпо вавышено, ГОЛОВОЛОМRа 36. Предположим, что вы· уже прошли первую цепочку вплоть до ивденса i - 1 и получили наилучшие слова дJ1ины р, меняющейся от 1 до т. Вы рассматриваете сим­ вол в положении i и ищете его в другой цепочке. Его пер­ вое положение j 1 может быть поставлено в нонце некото­ рого слова - снажем, мова длины р1 - и даст слово длины р 1 + 1, которое окажется лучшим, чем преды)!у­ щее: действитеЛ:ьяо,,, если j 1 иожно постави'Iь после слова длины р1,, то &ТО виачит1, что его внач:енис больше поло­ жения пОСJiедиеrо симвОJ1а в наилучшем слове длины р1 ~ во меньше положения последнего символа в слове длины р1 + 1. Рассмотрим теперь второе появление того же символа во второй цепочке: j 1 > j 1• Его нельвя поставить в нонце uова' АПИНЬI р1 + 1,, хотя j 11 и больше 711 потому что это - другое появление того Же символа" и их :ne яужио смешивать. Поwrому достатопо ограничиться по поводу этого поолев:ия СllМВола обращением и таблице 1Вее11астиот-р1+2дот. 219
Головоломка 37. Рассмотрим прямоугольник пробелов, вертикальная граница которого расположена в столбце j и располагаю­ щийся вправо от этого столбца в строках от i 1 до i 2 • Его основание равно inf· (l [i1 : i 2 ]}, а его площадь есть произ­ ведение этого основания на его высоту i 2 - i 1 + 1. Для столбца j нужно найти максимум этой величины, когдаi1меняетсяот1доп- 1(п- числострок},аi2- отi1+1доп. Когда вы переходите к следующему столбцу, N каж­ дое l уменьшается на 1. В строке" в которой стояла еди­ ница, оно становится нулем. Там, где l было равно О, его нужно вычислить ваяово. Вы Ъ{ожете попробовать схитрить при вычислении веnичиlIЫ inl (l). В центральном цикле любое йведение нового чле11а мо- жет только уменыпить значение минимума. Головол·омна 39. Рассмотрим · вначения S для строк i и i' > t. Очевидно s(i,j)=s(t"t' - 1)+s(t', j). Если_S (i, i' - 1) положительно, то S (i_,1) >s (i'~:1) и стро­ ка t остается строкой_, которая может содержать максимум. НоеслиS(i,t' - 1)<О,тоS(i,j)< S(t', 1). Максимум нужно тогда искать либо среди S (i_,- J) для if<i', либо средиS(i'_ , j)дляj>i'. Заметим, что S (t' _ , t') = а[i']. Мы собираемся пробежать строку S (1, ••• ) вплоть до первого индекса i 1 , для которого S становится отри­ цательным. Тогда мы начнем пробегать строку S (i1 + +1, ...),ит.д. Отсюда следует, что в каждый данный момент нужно внать максимальную подпоследовательность в уже прой­ денной части; эта подпоследовательность задается номе­ ром f!ачала r_, номером конца q и своей суммой т. С Дру­ гой стороны, нужно внать наилучшую заключительную подпоследовательность S (k, i - 1), предполагая.~ что век­ тор пройден вплоть до поля i - 1. Обовначим черев s зна­ чение суммы этой заключительной подпоследовательно­ сти. Пусть k - номер строки, дающий этой сумме макси­ мальное значение, а s - сумма всех членов, начиная с k. Если сумма s положительна, то она. и образует мак­ симум на строке с номером k. При переходе к i число а [iJ добавляется к s. Если s отрицательно, то новый эле­ мент с номером t и становится оптимальной строчкой~ и нужно ваять s = а [tJ. 220
В этих двух случаях число s нужно сравнить с опти­ мумом т. Если s окавывается больше, то т нужно ваме­ нить на s. Попытаемся составить программу, исходя ив того, что мы сейчас обсудим. Нужно уточнить предполо­ жение индукции. Предположим, что вектьр пройден от влемента 1 до элемента с номером i - 1 включительно. Мы внаем луч­ шую подпоследовательность в этой qасти: она идет от индекса r до индекса q включительно, и ее сумма равна т: т = S (r, q). С другой стороны, мы внаем наилучшую ваключительную подпоследовательность, кончающуюся ni- 1,т.е.внаемтакойиндексk., что суммаS(k,i - 1) максимальна среди ваключительных подпоследователь­ ностей, Значение суммы S (k, i - 1) равно s, Может слу­ читься, что эта ваключительная подпоследовательность является наилучшей вовможной во всей пройденной части, ивэтомслучаеимеемr= k,q==l-1,.s - т.Влюбом другом случае s<т. Еслиi = п - 1; то весь вектор пройден и получен искомый ревультат r, q, т. В противном случае нужно включить элемент а [i]. Если s отрицательно, то а [i] и образует (как единствен­ ный участник) наилучший ванлючительный отрезок; берем k= i, s = а[t].Впротивноислучае s>Оисуммаs+ +а[t]большеsи больше а[l]1иэтои tЭсть сумма для наилучшего а,аключительного отреэка, который по-преж­ нему начинается с номера k. В этих двух случаях отревок s становится наилучшим отревком, если он окавывается больше т. Для начала можно положиться на пробег вектора, на­ uная с его единственного первого элемента. В этот мо­ мент наилучший сегмент и наилучший ваключительный сегмент - вто одно и то же. d:=1;f:=1;т:=а[11;s:=т;i:=2 ПОRА t < п ВЫПОЛНЯТЬ ЕСЛИs<ОТОk:= t;s:=а[iJ ИНАЧЕs:=s+a(t] КОНЕЦ_ЕСJIИ ЕСЛИs>тТОd:;::;k;f:=t·т:=;s КОНЕЦ_ЕСJIИ i:=i+1 ВЕРНУТЬСЯ Эта програмиа осуществляет пробег вектора а один­ единственпый рав, qто и было предписано в услов1111. Это очень просто.~ но это соверI!Iевво не оt~еuидпо.
СПИСОК ЛИТЕРАТУРЫ Проивведенил, цитируемые в тексте [ARS] Arsac J ., Les Ьases dв la programmation, Paris, Dunod, 1983. [BAI] Baillif J .- С ., Les casse - tete logiques de Baillif, Paris, · Dunod, 1979. [BAL] Ball W. - W . Rouse, Mathematical recreations and essays, Macmillan and С;, London, 1963. fBER] Berloquin Р., Le jardin du sphynx, Paris, Dunod, 1981. ENG] Engel А., Mathematique elementaire d'un point de vue al- gorithmique Paris, Cedic, 1979. [GRI] Gries D., The science of programming, Springer Verlag, New York, 1981. [KNU] Knuth D., The art of, computer programming, Addison Was- ley, 1969. [KUE) Kuenzi N. - J ., Prielipp В. Cryptarithms and other arith- metical pastimes, School science and mathematics associa- tion, University of Wisconsin. [LED] Ledgard Н.- F" ProverЬes de programmation, Paris, Dunod, 1978. [РВВ] Berlioux Р., Bizard Ph., Algorithmiquв Paris, Dunod, 1983. [POL] Pollard J.- М,, А Monte Carlo method for factorization, BIT . 15, (1975), р. 331-384 . [SIK] Siklossy L., Let's tallt Lisp, Prentice Hall, Englewood Cliffs (N. У.), 1976. [SCH] Schwartz В., Mathematical solitaires and games, Baywood PuЬlishing Company, 1978. Для тех, кому нужно пополнить овое обравование в программи­ ровании. Arsac - Mondou О,, Bourgeois - Camescasse, Gourtay М. Premier livre de programmation (ecriture de Ьoucles de prog- grammes). Deuxieme livre de programmation (prooedures, fichiers). Pour aller plus loin en programmation (recursivite, structures de donnees), Cedio - Nathan, Paris, 1982. fl'aurisson А., Petttgutllaume А. А vous de jouer, lntroduction а la science do l'informatique, Modulo Editeur, Outremont, Quebec, Canada,
СОДЕРЖАНИЕ Предисловие • , , , ••• , Обозначения ••• , • , , Ч а Qт ъ 1. УСЛОВИЯ ЗАДАЧ 1. Случайные числа .. ,..•,•,•••• Генерация случайного числа . . . • . . . Непредскавуемые числовые последовательности Авартные игры ........•••.•...••••. Воспроиsводюmя непредсказуемая последовательность ... Друrие азартные игры . , . . . 2. Игры Q числами .....• • .••. Арифметические развлечения . . . . Числовые последовательности • • . . Зашифрованные операции , , . . . . . Доказательства теорем . , .•... Простые числа ......• , •.. Таинственные программы • • • . . . 3. Игры бев стратеrии . •,,,,.. Общиепредложения•• , • • , • • • . . . . . . . . 4. Игры ео Qтратегией •.•••• , •••.••..•... 5. Стратеrия бев игры (выиrрm:вающие стратегии) ••••• Ханойекие баmии. Печальный кавец Паскаля Младшего 6. Комбинаторные вадачи •••••• , • • • • ,,, 7.ОбовQемпонемиоrу,•••••••••••• ••••, Ч а о wъ 11. ПЕРВАЯ ПОМОЩЬ 1.Случайныечисла • • , • , . . 2. Иrры с числами . ••,•.••• . . Зашифроваввые операции • , . • • .. 3.ИгрыбезстратеJ7ИИ , , , •, •• • , 4. И11ры оо стратеrией , • , •• , .••••••.•. 5. Стратеrвя беа иrры (вЬlJП'РываЮщие стратегии) .. 6.Комбинаторныевадачи,,•,•,,,,,,,,, ' . 7.Об0всемп&немвоrу,,•,••,,•,••,,,, Ч а е wiь III. И ЕСЛИ ВЫ ВСЕ ЕЩЕ НЕ НАШЛИ РЕШЕНИЯ 1. Случайные числа . . . . . . . . 2. Иvры е. числами , .... . 3. И11ры tев стратеrии ...... . . 4.И11рыеоетратеrией•••,,,,•••••••., 5. Страте1'ВЯ бев и11ры (выиrрывающие стратегии) 6.Комбинаторныевадачи , 1 • • • • • • , '1 . Обо всем повемвоrу . •.• . . ,Спясовпитературы••,•,,,. ... 3 7 9 9 11 13 15 19 23 23 24 28 30 32 35 38 38 59 70 77 85 94 102 108 114 121 127 141 149 170 183 184 196 198 201 211 212 222