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

6.2.7. Задача 7 (3 балла)  Геометрический цикл.
Средний бал решений: 2.3 (77%)

   Окно установлено  в  центр окружности. Закрасить пробелом все
точки окружности  (кроме центра), если радиус окружности помещен
в клетку-центр в виде  символа  из алфавита Корректора. При этом
числовое значение радиуса равно порядковому номеру символа в ал-
фавите  исполнителя.

   Пример работы программы:

Начальное состояние                 После работы программы
┬─┬─┬─┬─╦═╦─┬─┬─┬─┬─┐               ┬─┬─┬─┬─╦═╦─┬─┬─┬─┬─┐
│░│░│░│░║2║░│░│░│░│░│    ─────>     │░│░│ │ ║2║ │ │░│░│░│
┴─┴─┴─┴─╩═╩─┴─┴─┴─┴─┘               ┴─┴─┴─┴─╩═╩─┴─┴─┴─┴─┘

Решение

   Алгоритм чрезвычайно прост. Скопируем радиус в  ящик и будем
красить точки-клетки  вправо  от  центра окружности, заменяя на
каждом шаге символ в ящике на предыдущий. Когда  символ в ящике
станет  равным  "0",  покраску  надо прекратить и  вернуться  в
центр.
   Аналогично выполняем малярные работы влево от центра.

ЭТО красить           │
    ЯЩИК+             │Запомним радиус, красим вправо
    красить_вправо    │и возвращаемся в центр.
                      │
    ЯЩИК+             │Запомним радиус, красим влево
    красить_влево     │и возвращаемся в центр.
КОНЕЦ                 │
                      │
ЭТО красить_вправо    │
   ВПРАВО             │Красим вправо, уменьшая по дороге
   ОБМЕН              │порядковый номер символа в ящике.
   ЕСЛИ НЕ 0          │Как только символ в ящике станет нулем,
    ТО                │красить больше не надо.
    {                 │
      МИНУС           │
      ОБМЕН           │
      ПИШИ ПРОБЕЛ     │
      красить_вправо  │
    }                 │
   ИНАЧЕ ОБМЕН        │
   ВЛЕВО              │Рекурсивная пружинка для возврата в центр.
КОНЕЦ                 │
                      │
ЭТО красить_влево     │Красим влево, уменьшая по дороге
   ВЛЕВО              │порядковый номер символа в ящике.
   ОБМЕН              │Как только символ в ящике станет нулем,
   ЕСЛИ НЕ 0          │красить больше не надо.
    ТО                │
    {                 │
      МИНУС           │
      ОБМЕН           │
      ПИШИ ПРОБЕЛ     │
      красить_влево   │
    }                 │
   ИНАЧЕ ОБМЕН        │
   ВПРАВО             │Рекурсивная пружинка для возврата в центр.
КОНЕЦ                 │


Погрешности в конкурсных программах
-----------------------------------

"Придирки" к записи текста программы команды 314.

Авторская запись          │А так понятнее      │А можно и так
                          │                    │(для любителей плотных строчек)
──────────────────────────┼────────────────────┼─────────────────────────────
                          │                    │
ЭТО Окружность            │ЭТО Окружность      │ЭТО Окружность
Ящик                      │  Ящик              │  Ящик
ЕСЛИ ПУСТО ТО СТОЯТЬ ИНАЧЕ│  ЕСЛИ НЕ ПУСТО ТО  │  ЕСЛИ НЕ ПУСТО ТО ЕСЛИ НЕ 0 ТО
ЕСЛИ 0 ТО СТОЯТЬ ИНАЧЕ    │    ЕСЛИ НЕ 0 ТО    │  {
  {                       │    {               │    Переключатель
 Переключатель            │      Переключатель │    ЗакрасьОстаток
 ЗакрасьОстаток           │      ЗакрасьОстаток│    Поправь
 Поправь                  │      Поправь       │  }
  }                       │    }               │КОНЕЦ // Окружность
КОНЕЦ // Окружность       │КОНЕЦ // Окружность │
                          │                    │

   Вообще говоря, в  проверке на радиус = ПУСТО нет необходимос-
ти, так как по "геометрии" такой радиус быть не может:
   "Дополнительно будем считать,  что  символ "0" в алфавите Кор-
ректора имеет  порядковый номер 0, символ "1" -  1, символ "a" -
10 и так далее."
   По "геометрии"  не может, а  по "жизни" - сколько угодно, по-
этому - это не минус программе,  а  плюс.  Любая  дополнительная
проверка входных  данных  на  корректность защищает программу от
неверных действий  пользователя  и,  как следствие, улучшает ее,
делает более "живучей".
   Программа куратора на радиусе = ПУСТО говорит "Не могу" и ру-
шится с грохотом на пол, а вот программа ребят спокойно "пережи-
вает" эту ситуацию.
   "Оборонное" программирование или, как  еще  говорят, "защита
от дурака" - это хороший и правильный стиль разработки.


Замечания к решению команды 326.

   Нет описания алгоритма.
   Программа работает  с  исходными данными, которые не соответ-
ствуют условию.
   Первый вариант решения содержит переключатель на 9 положений
(от 1  до 9). Соответственно  для каждого из этих радиусов пре-
дусмотрена отдельная  процедура.  Для радиусов больших 9, прог-
рамма не работает.
   Понятно, что идея с переключателем здесь не проходит.
   Дополнительные замечания:
   - переключатель написан некорректно (без ИНАЧЕ);
   - отсутствуют структурные отступы и строки-разделители проце-
дур;
   Бессмысленные названия процедур (СЕРГЕЙ,  ПАПА1,  ..., ПАПА8,
ЛЬЕ, НЕК) достойно всякого порицания;

Замечания к решению команды 32

Авторское описание алгоритма:
   Значение R помещается  в ЯЩИК, далее Корректрор пишет пробелы
на R влево, используя отложенную команду возврат на  R вправо от
центра.

Комментарий куратора
   Эта программа отличается от всех других.
   Отличается со знаком минус - "ломается" при нулевом радиусе.
   Но и отличается со знаком плюс: - это самая короткая програм-
ма. Программа красит только в одну сторону, а в другую  - красит
энергия сжатой  рекурсивной  пружины. Правда, эту программу тоже
можно улучшить (см. вариант справа).
                                      │
                                      │
Авторский вариант                     │ Модификация куратора
──────────────────────────────────────┼─────────────────────────────────
ЭТО Задача                            │ ЭТО Задача
    ЯЩИК+                             │     ЯЩИК+
    Шаг                               │     ЕСЛИ НЕ 0 ТО Шаг
КОНЕЦ                                 │ КОНЕЦ
//------------------------------------│ //---------------------------------
ЭТО Шаг                               │ ЭТО Шаг
 ВЛЕВО                                │  ВЛЕВО ОБМЕН МИНУС
 ОБМЕН МИНУС                          │  ЕСЛИ 0 ТО ПИШИ ПРОБЕЛ
ЕСЛИ НЕ 0 ТО { ОБМЕН ПИШИ ПРОБЕЛ Шаг }│    ИНАЧЕ { ОБМЕН Шаг }
 ИНАЧЕ { ПИШИ ПРОБЕЛ }                │  // рекурсивная пружинка
 ПОВТОРИ 2                            │  ПОВТОРИ 2
 { ВПРАВО ЕСЛИ НЕ ЦИФРА ТО ПИШИ       │  {
   ПРОБЕЛ ИНАЧЕ ЯЩИК+ }               │    ВПРАВО
КОНЕЦ                                 │    ЕСЛИ НЕ ЦИФРА ТО ПИШИ ПРОБЕЛ
                                      │  }
                                      │ КОНЕЦ
