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

6.2.12. Задача c (5 баллов)  Геометрический цикл.
Средний бал решений: 3.4 (68%)

   Окошко смотрит на ячейку, в которой записан символ, порядковый
номер которого (в алфавите Корректора) задает длину отрезка ab.
Известно, что Pab > 0.
   Построить отрезок на ленте, используя символ  "." для обозна-
чения его  концов и поделить его  пополам, если это  возможно. В
качестве обозначения средней точки использовать символ "#".

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

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

Решение

1) Проверяем длину на четность.
   Проверяем четность по остатку деления на 2: число четное, ес-
   ли остаток равен 0.
2) Если длина - четная, строим и делим, иначе только строим.

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

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


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



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

   Ребята применили  механизм  рекурсивных пружинок не для уста-
новки окна в середину отрезка,  а  для  восстановление  значения
длины отрезка в ящике на правом конце отрезка.
   Деление выполняется  хитрым образом: на ленте формируется ос-
таток, а в ящике - частное  деления.  Остаток  используется  для
проверки четности длины  отрезка, а частное - для установки окна
в середину отрезка.

Замечание к решению команды 324 (и 32).

   Ну, очень хитрый  алгоритм! И описание тоже хитрое. Я ничего
не понял, пока не увидел, что делает программа. А вытворяет она
следующее. Сначала закрашивает отрезок пробелами, а затем зати-
рает пробелы с  концов отрезка к  центру. Понятно, что  если  в
итоге останется один  пробел, то это  и есть центр,  если  нет,
длина отрезка была нечетной. Такое вот  оригинальное деление на
два. Мне оно понравилось.
   Удивительно, но у команды 32 тот же самый алгоритм, что  и у
команды 324. Отличие в мелких несущественных деталях.
