Задача 1  (5 баллов)
--------
На ленте записана последовательность нулей и единиц. Выяснить, какая
цифра встречается чаще. Разместить ее справа от записи числа через
пустую клетку. Если число нулей и единиц одинаково, в качестве ответа
записать символ "=".

Длина последовательности меньше длины алфавита Корректора. В начальный
момент окошко расположено перед записью числа.

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

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

решение куратора
----------------

Предчувствуя рекурсивные пружинки, ради одного прохода, куратору
захотелось придумать алгоритм, основанный на другой идее. Получились
качели.

алгоритм (однопроходной)
~~~~~~~~
Пусть длина последовательности меньше половины длины алфавита
Корректора. Перед работой записываем в ящик символ "ш", расположенный
в середине алфавита. Каждый раз, когда встречаем 1 применяем к ящику
ПЛЮС, иначе МИНУС. Если в итоге в ящике окажется символ "ш",
записываем в качестве ответа символ "=", Если в ящике окажется символ,
расположенный правее "ш" -- записываем "1", иначе -- "0".


ЭТО вход

 // подготовка

 ПИШИ ш
 ОБМЕН
 ВПРАВО

 // проход записи                      
                                       
 ПОКА НЕ ПУСТО
 {
   ЕСЛИ 1 ТО { ОБМЕН ПЛЮС ОБМЕН }
   ИНАЧЕ     { ОБМЕН МИНУС ОБМЕН }
   ВПРАВО
 }
                                       
 // запись ответа

 ВПРАВО                                
 ПИШИ ш
 ЕСЛИ       Я=Л ТО ПИШИ =
 ИНАЧЕ ЕСЛИ Я>Л ТО ПИШИ 1
 ИНАЧЕ             ПИШИ 0

КОНЕЦ

Пусть теперь длина последовательности может быть больше половины длины
алфавита Корректора. Придется внести в программу дополнительные
проверки на досрочный выход из цикла (если вдруг придется "добавлять"
единицу к последнему символу алфавита или "отнимать" единицу от
первого символа алфавита). Так как нет возможности досрочно выйти из
цикла ПОКА, то придется от него отказаться и использовать рекурсию:

ЭТО вход
 ПИШИ ш
 ОБМЕН
 проход
КОНЕЦ

ЭТО проход
 ВПРАВО
 ЕСЛИ ПУСТО ТО ответ
 ИНАЧЕ ЕСЛИ 1 ТО
 {
   ОБМЕН
   ЕСЛИ @ ТО { финиш ПИШИ 1 }
   ИНАЧЕ { ПЛЮС ОБМЕН проход }
 }
 ИНАЧЕ
 {
   ОБМЕН
   ЕСЛИ ПУСТО ТО { финиш ПИШИ 0 }
   ИНАЧЕ { МИНУС ОБМЕН проход }
 }
КОНЕЦ

ЭТО ответ
 ВПРАВО
 ПИШИ ш
 ЕСЛИ       Я=Л ТО ПИШИ =
 ИНАЧЕ ЕСЛИ Я>Л ТО ПИШИ 1
 ИНАЧЕ             ПИШИ 0
КОНЕЦ

ЭТО финиш
 ОБМЕН
 ПОКА НЕ ПУСТО ВПРАВО
 ВПРАВО
КОНЕЦ

Однако, все же можно построить универсальную программу и с циклом
ПОКА:

ЭТО вход
                                       
 // подготовка

 ПИШИ ш
 ОБМЕН
 ВПРАВО

 // проход записи                      

 ПОКА НЕ ПУСТО
 {
   ЕСЛИ 1 ТО
   {
     ОБМЕН
     ЕСЛИ НЕ @ ТО ПЛЮС
     ОБМЕН
   }
   ИНАЧЕ
   {
     ОБМЕН
     ЕСЛИ НЕ ПУСТО ТО МИНУС
     ОБМЕН
   }
   ВПРАВО
 }
                                       
 // запись ответа

 ВПРАВО                                
 ПИШИ ш
 ЕСЛИ       Я=Л ТО ПИШИ =
 ИНАЧЕ ЕСЛИ Я>Л ТО ПИШИ 1
 ИНАЧЕ             ПИШИ 0

КОНЕЦ

Замечание 1.
В "стандартном" алфавите Корректора 71 символ. Центральный символ
существует, и он есть символ "ш". Если в алфавите четное число
символов, то в качестве "центрального" можно брать любой из двух
символов ближе других расположенных к "геометрическому" центру.
Программа все равно будет работать. Можно в этом убедиться на примере
алфавита из 3 и 4 символов (длина последовательности в этом случае не
может быть больше 2 и 3 символов соответственно по условию задачи).

Замечание 2.
Недостатком приведенного решения является присутствие в нем
"магического" символа "ш", который может меняться при разных длинах
алфавита Корректора. Однако этот символ легко вычислить автоматически
при помощи такого кода:

ЭТО центр
 ЕСЛИ НЕ @
  ТО
  {
    ПЛЮС
    ЕСЛИ НЕ @ ТО ПЛЮС
    центр
    МИНУС
  }
КОНЕЦ

Если Вы запустите эту программу, то получите в первоначально пустой
ячейке ленты центральный символ алфавита (в нашем случае символ "ш").

Тогда последняя программа перепишется следующим образом:

ЭТО вход
                                       
 // подготовка

 центр
 ОБМЕН
 ВПРАВО

 // проход записи

 ПОКА НЕ ПУСТО
 {
   ЕСЛИ 1 ТО
   {
     ОБМЕН
     ЕСЛИ НЕ @ ТО ПЛЮС
     ОБМЕН
   }
   ИНАЧЕ
   {
     ОБМЕН
     ЕСЛИ НЕ ПУСТО ТО МИНУС
     ОБМЕН
   }
   ВПРАВО
 }

 // запись ответа

 ВПРАВО
 центр
 ЕСЛИ       Я=Л ТО ПИШИ =
 ИНАЧЕ ЕСЛИ Я>Л ТО ПИШИ 1
 ИНАЧЕ             ПИШИ 0

КОНЕЦ

В этой программе мы ушли от магического символа "ш". Символ "@"
магическим не является -- это последний символ алфавита --
естественный параметр среды исполнителя.

Замечание 3.
Когда мы добавили в программу вычисление среднего символа алфавита (а
это происходит дважды), то возникает вопрос, является ли этот
однопроходной алгоритм более оптимальным по отношению к
двухпроходному? Ответ неоднозначный. Зависит от "веса" шага прохода.


                       * * *

Все конкурсные решения -- двухпроходные. Первый проход -- считаем
единицы, второй -- нули. Сравниваем результаты.

Только два решения составляют исключение: они решают задачу за один
проход записи. При этом единственном проходе единицы (или нули)
подсчитываются в ящике, а для подсчета нулей (единиц) используется
рекурсивная пружинка.

Это решения Гуреева Дениса (команда 3101) и Кати Мороз (команда 3108).
Решение Кати, несмотря на общую с Денисом пружинистую идею, выглядит
просто идеально. Именно поэтому Катя получает за задачу чистые 5
баллов, а Денис только 4.5. Остальные решения оценены в 3 балла
(согласно критерию).

Команда 3101
------------
.\01\01.txt
Оценка: 4.5

Решение 1
Автор-Лысяк Павел
Оценка: 3

описание алгоритма
------------------
Задача решается в два прохода: сначала исполнитель считает количество
единиц с помощью процедуры Ищи_1, затем идёт в конец текста и
выкладывает полученную сумму. И опять идёт в начало записи, но уже
считает нули с помощью почти такой же процедуры Ищи_0.

Потом, когда на ленте записано количество единиц и нулей, исполнитель
сравнивает их!!! На мой взгляд, это самый простой алгоритм.

комментарий куратора
--------------------

Это, конечно, самый простой алгоритм, но не самый эффективный!
Замечаний к программе нет никаких. Все разумно и правильно.
Оценка "3" -- согласно критерию.

Решение 2
---------
Автор - Гуреев Денис                
Оценка: 4.5

описание алгоритма
------------------
Эту задачу я решил с помощью одного прохода.
Во время прохода корректор считает количество 1 с помощью ящика, а 0 с
помощью рекурсии (отложенной процедуры Ноль). После того, как
корректор дойдет до пусто, он пишет количество единиц на ленту, а
затем с помощью процедуры Ноль вычитает из этого числа единицу столько
раз, сколько было нулей в записи. Если нулей оказывается больше, то
исполнитель пишет ПУСТО и не вычитает единицу.

программа
---------
ЭТО Вход
    ПИШИ 0                         Записываем 0 в ящик
    ОБМЕН                              
    Считай
    ЕСЛИ 0                             
     ТО ПИШИ =                     Пишем какая цифра 
     ИНАЧЕ ЕСЛИ ПУСТО ТО ПИШИ 0    встречается  чаще
     ИНАЧЕ ПИШИ 1                  в записи   
КОНЕЦ // Вход                          

ЭТО Считай
    ВПРАВО
    ЕСЛИ НЕ ПУСТО                      
     ТО {                              
         ЕСЛИ 1
           ТО {                        
               ОБМЕН              Увеличиваем количество      
               ПЛЮС               найденных на данный момент     
               ОБМЕН              единиц в ящике на одну   
               Считай
              }
           ИНАЧЕ {
                  Считай          Переходим в процедуру Считай
                  Ноль            и откладываем отложенную команду Ноль
                 }
         }
     ИНАЧЕ {                           
           ВПРАВО                 Пишем количество              
           ОБМЕН                  единиц на ленту
          }                            
КОНЕЦ // Считай                        

ЭТО Ноль
    ЕСЛИ НЕ 0
     ТО {                              
         ЕСЛИ НЕ ПУСТО                 
          ТО МИНУС                 Вычитаем из количества единиц единицу
        }                              
     ИНАЧЕ ПИШИ ПУСТО                  
КОНЕЦ // Ноль                          

комментарий куратора
--------------------

Этот алгоритм мне нравится больше. Во-первых, он более оптимальный
(однопроходной), во-вторых, он более "идейный"!

Команда 3102
------------
.\02\02.txt
Авторы решения: Богатырев Геннадий
Оценка: 3

описание алгоритма
------------------
1) Подсчет числа единиц в заданном числе, результат накапливается в ящике
2) Количество единиц в виде символа алфавита записывается на ленте справа
   от числа через пустую клетку
3) Возврат к началу числа
4) Подсчет числа нулей в заданном числе, результат накапливается в ящике
5) Сравнение содержимого окна ленты (кол-ва единиц) и ящика (кол-ва нулей)
6) Оформление результата

комментарий куратора
--------------------

У Геннадия "стандартный" двухпроходной алгоритм. В качестве флага (для
ориентировки исполнителя) использован символ "|". Но в этом нет
необходимости. Символ ПУСТО, как флаг, ничем не хуже.


Команда 3104
------------
.\04\04.txt
Коллективное решение
Оценка: 3

описание алгоритма
------------------
Отсутствует.

комментарий куратора
--------------------
Двухпроходной алгоритм. Сначала считаются нули, потом единицы и
результаты сравниваются.

Замечание. Конструкция типа:

ЕСЛИ 0
  ТО
    {
     ОБМЕН
     ПЛЮС
     ОБМЕН
    }
  ИНАЧЕ
    СТОЯТЬ

совершенно эквивалентна такой:

ЕСЛИ 0
  ТО
    {
     ОБМЕН
     ПЛЮС
     ОБМЕН
    }

Эта запись выглядит более привлекательно в таком виде:

ЕСЛИ 0 ТО { ОБМЕН ПЛЮС ОБМЕН }

Команда 3105
------------
.\05\05.txt
Автор: Дмитриева Ксеня
Оценка: 3

описание алгоритма
------------------
Считаем количество единиц в записи (Цифра_1). Для этого помещаем в
ящик нуль и увеличиваем содержимое ящика на единицу, если в записи
встречается единица. Записываем содержимое ящика на ленту через пробел
от записи. Возвращаемся на начало записи (На_начало). Аналогично
считаем количество нулей в записи (Цифра_0). Сравниваем записанное на
ленте количество единиц и записанное в ящик количество нулей
(Сравнение). В зависимости от результата сравнения помещаем в ячейку
0,1 или =.

комментарий куратора
--------------------
Двухпроходной алгоритм. Замечаний по программе нет.


Команда 3106
------------
.\06\06.txt
Оценка: 3
Двухпроходной алгоритм. Замечаний по программе нет.


Команда 3107
------------
.\07\07.txt
Автор решения Смирнова Е.
Оценка: 3

описание алгоритма
------------------
Отсутствует.

комментарий куратора
--------------------
Двухпроходной алгоритм. Текст программы плохо структурирован.
Комментарии отсутствуют.

Команда 3108
------------
.\08\08.txt
.\08\0812.kor

Автор решения: Екатерина Витальевна Мороз
Оценка: 5

описание алгоритма
------------------
Пройти по записи вправо считая одновременно единицы и нули. Используя
для этого счетчик-ящик и рекурсивную пружину, которая по окончанию
записи, пишет результат командой ПЛЮС. Сравнить записанный результат с
ящиком, в зависимости от результата записать ответ.

комментарий куратора
--------------------
Отличный однопроходной алгоритм. Красивая идея с пружинкой.

программа
---------
// Организация счетчика в ящике и
//подходы к этапам подсчета,сравнения  
ЭТО Подход                             
 ПИШИ 0                                
 ОБМЕН                                 
 Подсчет                               
 Сравни                                
КОНЕЦ
                                       
// Работа двух счетчиков               
ЭТО Подсчет                            
 ВПРАВО                                
 ЕСЛИ 0 ТО { Подсчет ПЛЮС } ИНАЧЕ      
 ЕСЛИ 1 ТО { ОБМЕН                     
              ПЛЮС                     
             ОБМЕН Подсчет }           
 ИНАЧЕ { ВПРАВО ПИШИ 0 }               
КОНЕЦ                                  

// Сравнение результатов двух счетчиков
//-------------------------------------
ЭТО Сравни
 ЕСЛИ Я<Л ТО ПИШИ 0 ИНАЧЕ              
 ЕСЛИ Я>Л ТО ПИШИ 1 ИНАЧЕ              
 ПИШИ =                                
КОНЕЦ                                  

Команда 3110
------------
.\10\10.txt
Авторы: Чернышов Д. и Щукин М. 7 класс
Оценка: 3

описание алгоритма
------------------
- в ящик записывается 0 (счетчик)

- проходим первый раз цепочку, и если 1, то увеличиваем
  счетчик на 1 ( т.о. накапливаем с счетчике количество единиц)
  процедура Работа_1

- через пробел вправо записываем кол-во единиц на ленту.
- возвращаемся назад в начало цепочки

- проходим цепочку второй раз и также подсчитываем кол-во 0
  Процедура Работа_2

- стать на ленте на число единиц

- сравниваем Я и Л
   если Я<Л, то записываем на ленту 1
   если Я>Л, то записываем на ленту 0
   если Я=Л, то записываем на ленту =
   
комментарий куратора
--------------------
Двухпроходной алгоритм. Программа хорошо структурирована и понятно
написана.

Замечание. Конструкции-переключатели:

ЕСЛИ Я=Л ТО ПИШИ = ИНАЧЕ
ЕСЛИ Я>Л ТО ПИШИ 0 ИНАЧЕ
ЕСЛИ Я<Л ТО ПИШИ 1

гораздо лучше записывать так:

ЕСЛИ       Я=Л ТО ПИШИ =
ИНАЧЕ ЕСЛИ Я>Л ТО ПИШИ 0
ИНАЧЕ ЕСЛИ Я<Л ТО ПИШИ 1

Одна проверка явно лишняя и можно записать так:

ЕСЛИ       Я=Л ТО ПИШИ =
ИНАЧЕ ЕСЛИ Я>Л ТО ПИШИ 0
ИНАЧЕ             ПИШИ 1


Команда 3112
------------
.\12\12.txt
Авторы решения: Борисов Саша - ведущий,
Белова Таня, Помысухин Денис - помощники.
Оценка: 3

описание алгоритма
------------------
   1. Подсчитываем число единиц в записи
   2. Записываем это число справа от записи
   3. Подсчитываем число нулей
   4. Идем на то место где находятся единицы
   5. Сравниваем число в ящике (нули) с числом на ленте (1)
   6. Записываем результат

комментарий куратора
--------------------
Двухпроходной алгоритм. Программа хорошо структурирована и понятно
написана.

Замечание. Конструкции-переключатели:

 ЕСЛИ Я>Л
  ТО    ПИШИ 0
  ИНАЧЕ
 ЕСЛИ Я<Л
  ТО    ПИШИ 1
  ИНАЧЕ ПИШИ =
КОНЕЦ

гораздо лучше записывать так:

ЕСЛИ       Я>Л ТО ПИШИ 0
ИНАЧЕ ЕСЛИ Я<Л ТО ПИШИ 1
ИНАЧЕ             ПИШИ =

Сразу видно, что это один переключатель, а не цепочка условных команд.

Команда 3114
------------
.\14\14.txt
Авторы решения: не указаны
Оценка: 3

описание алгоритма
------------------
Отсутствует.

комментарий куратора
--------------------
Обычная двухпроходная схема. Текст программы вызывает нарекания: нет
структурных отступов и отделений процедур друг от друга.
