                     Решения задач
                     -------------

5.2.4. Задача 4 (5 баллов)
Средний бал решений: 4.4 (88%)

  Введем такое определение числа.
Определение 1
-------------
<число> ::= <цифра> | <число><цифра>
<цифра> ::= 0 | 1

   Задание. Напишите программу для Кукарачи, которая проверяет,
является ли запись на его поле числом в смысле определения 1.

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


  Решение.

   Число, в смысле определения 1 - это любая последовательность
из нулей и единиц.
   Будем проверять по одному символу, пока число не закончится:

ЭТО Проверка              │
 Шаг                      │Обработка одного символа
 ЕСЛИ  ПУСТО  ТО Число    │Символа уже нет, значит запись - число
 ИНАЧЕ ЕСЛИ 0 ТО Проверка │Символ = 0, проверяем дальше
 ИНАЧЕ ЕСЛИ 1 ТО Проверка │Символ = 1, проверяем дальше
 ИНАЧЕ Ошибка             │Символ не 0, и не 1 - ошибка!
КОНЕЦ                     │

   Обработка одного символа  - это смещение его вверх в соседнюю
строчку:                            ┌──────────┐         ┌──────────┐
                          │         │          │         │ за       │
ЭТО Шаг                   │ До:     │ ¤запись  │         │  ¤пись   │
 ВНИЗ                     │         │          │Или так: │          │
 ВПРАВО                   │         │  з       │         │ зап      │
 ВВЕРХ                    │ После:  │  ¤апись  │         │   ¤ись   │
КОНЕЦ                     │         │          │         │          │
                          │         └──────────┘         └──────────┘

   Если при очередном "толкании" вверх обнаружилось, что толка-
ли "воздух", работа программы заканчивается: запись на поле яв-
ляется числом:
                                   ┌───────────┐
                          │        │  запись   │
ЭТО Число                 │ До:    │        ¤  │
 ВВЕРХ                    │        │           │
КОНЕЦ                     │        │  запись¤  │
                          │ После: │           │
                                   └───────────┘

   Если символ, который исполнитель толкнул вверх, не 0, и не 1
- это ошибка! Надо идти в 10 строку, но прежде  придется "почи-
нить" запись на поле:

ЭТО Ошибка
 ПОКА НЕ ПУСТО Шаг
 ПОВТОРИ 8 ВНИЗ
КОНЕЦ
                            * * *

   Программа написана,  она  кажется  простой и понятной, но...
она неверная. Заметим, что в  силу  определения  1 число должно
состоять по крайней мере из одной "цифры". Однако в случае пус-
той записи, Кукарача не смещается в 10 строку, значит программа
содержит ошибку, которая исправляется отдельной проверкой  пер-
вого символа записи.
   Совершить эту ошибку было бы гораздо  сложнее при построении
диаграммы переходов:

            ПУСТО
          ┌───────> (ответ число)
          │
 ┌──── (число) <──────  (вход)
 │     ^   │      0,1      │все
 │ 0,1 │   │               │остальное
 └─────┘   │               V
           └──────────>  (ошибка)
            все
            остальное

   Перевод диаграммы в программу:


ЭТО вход                           │Состояние (вход).
 шаг                               │Смотрим первый символ.
 ЕСЛИ        0 ТО число            │Символ "0" и "1" переводят проверку
 ИНАЧЕ ЕСЛИ  1 ТО число            │в состояние (число).
 ИНАЧЕ            ошибка           │Любой другой символ - ошибка.
КОНЕЦ                              │
                                   │
ЭТО число                          │Состояние (число).
  шаг                              │Смотрим следующий символ.
  ЕСЛИ       ПУСТО  ТО ответ_число │Запись проверена - это число!
  ИНАЧЕ ЕСЛИ 0  ТО число           │
  ИНАЧЕ ЕСЛИ 1  ТО число           │Символы "0" и "1" допустимы в числе,
  ИНАЧЕ ошибка                     │Любой другой символ - ошибка.
КОНЕЦ                              │
                                   │
ЭТО ответ_число                    │Состояние (ответ число).
 ВВЕРХ                             │Устанавливаем исполнитель в конец
КОНЕЦ                              │записи.
                                   │
ЭТО ошибка                         │Состояние (ошибка).
 ПОКА НЕ ПУСТО шаг                 │Выравниваем остаток записи и
 ПОВТОРИ 8 ВНИЗ                    │спускаемся в 10 строку
КОНЕЦ                              │
                                   │
ЭТО шаг                            │Проверка следующего
 ВНИЗ ВПРАВО ВВЕРХ                 │символа
КОНЕЦ                              │

                          * * *

   Все работающие решения, присланные на конкурс в той или иной
мере повторяют первый вариант решения куратора.
