Задача 6 (10 баллов)
--------
На ленте Корректора записано целое положительное число в двоичной
системе счисления. Перевести это число в десятичную систему.

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


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

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

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

Был расчет, что руководитель поможет тем ребятам, которые не знакомы с
понятием позиционной системы счисления, разобраться с этим не сложным
вопросом, таким образом добавив еще больше информатики в занятия по
Корректору.

Алгоритм
--------

Число x = a a ...a   a
           0 1    n-1 n

записанное в позиционной системе счисления с основанием q переводится
в десятичную систему по формуле:

         n        n-1              2        1
x = a * q  + a * q    + ... + a * q  + a * q  + a        (#)
     0        1                n-2      n-1      n

Запись (#) можно переписать со скобками (вынося q за скобки):


x = a  + q(a  + q(a + q(...q(a    + q*a )...)
     n      n-1    n-2        1        0

Последняя запись наводит на мысль о следующем алгоритме вычисления:

x = 0
i = 0
ПОКА i не больше n
{
  x = q*x + a
             i
  i = i + 1
}


Решение для Корректора  (за один проход по записи)
----------------------

ЭТО вход                │
  ПИШИ 0                │Подготовка к работе:
  ОБМЕН                 │x = 0
  ВПРАВО                │
                        │
  ПОКА НЕ ПУСТО         │Цикл по цифрам числа
  {                     │
    ЕСЛИ 0 ТО           │Если цифра 0
    {                   │
      умножить_на_2     │x = q*x
                        │
      ПИШИ 0            │Восстановление цифры на ленте
    }                   │
    ИНАЧЕ               │Если цифра 1
    {                   │
      умножить_на_2     │x = q*x + a
      ОБМЕН ПЛЮС ОБМЕН  │           i
                        │
      ПИШИ 1            │Восстановление цифры на ленте
    }                   │
    ВПРАВО              │Шаг вправо к следующей цифре числа
  }                     │
                        │
  ответ                 │Запись ответа в виде десятичного числа
                        │
КОНЕЦ                   │
                        │
ЭТО умножить_на_2       │Умножить число в ящике на 2
  ЯЩИК-                 │
  ПОКА НЕ 0             │
  {                     │
    МИНУС               │
    ОБМЕН               │
    ПЛЮС                │
    ОБМЕН               │
  }                     │
КОНЕЦ                   │
                        │
                        │Запись ответа в виде десятичного числа
ЭТО ответ               │
 ПИШИ =                 │Подготовка
 ВПРАВО ВПРАВО          │
                        │
 ПИШИ 0                 │Запишем на ленту число ноль и будем прибавлять
 ОБМЕН                  │к нему по единице (процедурой "плюс1"), одновременно
 ПОКА НЕ 0              │заменяя символ в ящике на предыдущий по алфавиту
 {                      │Корректора, пока в ящике не окажется число ноль.
   МИНУС ОБМЕН          │
   плюс1                │
   возврат              │
   ОБМЕН                │
 }                      │
 ОБМЕН                  │
КОНЕЦ                   │
                        │
ЭТО возврат             │Перемещение окошка на младшую цифру
 ПОКА НЕ ПУСТО ВПРАВО   │формируемого числа.
 ВЛЕВО                  │
КОНЕЦ                   │
                        │
ЭТО плюс1               │Добавление к числу на ленте единицы.
 ПОКА 9                 │Окошко смотрит на младшую цифру числа.
 {                      │
   ПИШИ 0               │
   ВЛЕВО                │
 }                      │
 ЕСЛИ ПУСТО ТО ПИШИ 1   │
 ИНАЧЕ         ПЛЮС     │
КОНЕЦ                   │


                        * * *

Алгоритм, описанный выше применила только одна команда 3112. Команда
3101, проявив чудеса рекурсивной хитрости умудрилась решить задачу "в
лоб" за один проход. Остальным для "лобового" решения по формуле (#)
потребовалось, конечно, существенно больше работы Корректора.

Есть решения, которые были порицаемы еще в конкурсе Кукарачи:
программа предусматривает много-много веточек на какое-то определенное
число двоичных разрядов исходной записи. (Как отметил один из авторов,
такую программу всегда можно усовершенствовать, добавив еще одну (две,
три десять...) веточек!)

                        * * *


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

Решение 1
Автор: Кудрявцев Артём
Оценка: 7

описание алгоритма
------------------
Сначала исполнитель записывает в ящик 1 и идет в самый конец записи ,
затем Корректор идет справа налево и проверяет запись пока не пусто :
если 0 , то умножает ящик на два и идет дальше , если 1 , то идет в
конец записи прибавляет к ответу ящик , умножает на два и возвращается
назад . После подсчёта исполнитель проверяет ответ и если он
трехзначный , то он сдвигает запись вправо .
Работает только до 127!!!!!!

комментарий куратора
--------------------
Это решение "в лоб" по прямому определению, формула (#) без всякого
преобразования. Корректору приходится не сладко! В ящике всегда хранится
нужная степень двойки при проходе записи справа налево, а когда в записи
встречается 1, степень двойки добавляется к результату на ленте.


Решение 2
Коллективный труд команды
Оценка: 10

описание алгоритма
------------------
Нам очень хотелось обойтись одним проходом, и, после
мучительных усилий, получилось!

Запись просматривается СЛЕВА НАПРАВО, т.е. со старших
цифр рекурсивной процедурой Из2в10.

ЕСЛИ встречается единица,
  то откладываются операции:
  1) умножения содержимого ящика на 2
  (т.е. получение очередной степени двойки);
  2) сложение содержимого ящика и содержимого ленты
  (она к тому же сразу преобразует число из символьного
  вида в десятичный)
ИНАЧЕ (т.е. если попался нуль) откладывается только умножение
содержимого ящика на 2 БЕЗ ИЗМЕНЕНИЯ будущего результата.

Главная работа начинается после этого (единственного!)
прохода записи, причем из стека отложенные команды "появляются"
в обратном порядке, т.е. удвоение значения очередной цифры происходит
справа налево, что и требуется!

Благодаря небольшим двум хитростям, описанным ниже в тексте программы,
программа верно обрабатывает двоичные числа от 0=0 до 11111111=255

комментарий куратора
--------------------
Рекурсивной хитрости нет предела! Алгоритм производит сильное
впечатление.

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


Описание алгоритма
1) Проверяет, не больше ли 7 старший разряд числа (подсчитывается количество
   цифр в числе)
- если полученное значение меньше 8, то осуществляется перевод,
  иначе выдается сообщение об ошибке.
2) Перевод
   Результат будет накапливаться в ящике (в начале 0)
   Осуществляет поиск единиц в разрядах числа, игнорируя 0 
   (поиск начинается с младшего разряда)
   Для всех разрядов, кроме старшего,  содержимое ящика увеличивается на 
   определеное число, равное степени числа 2, в зависимости от разряда
   Для 1 старшего разряда анализируется накопленная ранее сумма,
   которая не может быть больше 5. Если условие не выполняется, то
   выдается сообщение об ошибке, иначе добавляется к содержимому ящика 64.
3) Справа от числа через знак = резервируется место для ответа (запись 00)
   Пока в ящике не 0, содержимое ящика уменьшается на 1, а содержимое окна 
   ленты увеличивается на 1.
4) Корректировка ответа в случае однозначного числа.     

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

Команда 3104
------------
.\04\04.txt
Оценка:0
Нет решения

Команда 3105
------------
.\05\05.txt
Автор: решение коллективное
Оценка: 7

описание алгоритма
------------------
Помещаем в ящик нуль. Идем на конец записи и пишем = 0 + 1. Двигаясь с
конца в начало записи считаем степени двойки для каждого коэффициента
(в роли счетчика выступает ящик), при этом нули оставляем без
изменения, а вместо единиц записываем число на 1 большее, чем степень
двойки. Двигаясь в конец записи нули игнорируем, а остальные числа
проверяем если число больше, чем 1 то идем в конец записи и умножаем
число на 2 , затем возвращаемся проверяем, если число больше единицы
то умножаем на два иначе движемся дальше.

комментарий куратора
--------------------
Вариация прямого вычисления по определению. Сначала в записи все
единицы заменяются на соответствующую степень двойки (плюс 1). Это
проход справа налево. Затем, при проходе слева направо производится
вычисление с сумматором, расположенным на ленте за двоичной записью.

Алгоритм нельзя назвать оптимальным.

Команда 3106
------------
Оценка: 5





Команда 3107
------------
.\07\07.txt
Оценка: 0
Решения нет.

Команда 3108
------------
.\08\08.txt
Автор: Екатерина Витальевна Мороз.
Оценка: 6.5

описание алгоритма
------------------
Проход по числу определяет степень 2. Когда все степени
определены начинается возведение основы 2 в эти степени.
Результаты сложить. Десятичное число записывается с помощью рекурсивной 
пружины и команды ПОВТОРИ  10 МИНУС. 

комментарий куратора
--------------------
Алгоритм примерно как у команды 3105, но степени двойки выписываются
отдельно на ленту. Двоичное число "0" переводится в десятичное "1".


Команда 3110
------------
.\10\10.txt
Автор: Демидов А. 7 класс
Оценка: 5

описание алгоритма
------------------
Используется алгоритм перевода двоичного числа в десятичное.
- организуем счетчик
-встать на последнюю цифру
    если она 1, то к счетчику добавить 1(процедура ПРИБ1)
    если 0, то перейти к следующей слева цифре
-анализируем вторую цифру
    если она 1, то к счетчику добавить 2(процедура ПРИБ2)
    если 0, то перейти к следующей слева цифре
- и т.д. до пусто слева
Эта программа работает с числами до 63
Можно усовершенствовать и дальше.

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

Команда 3112
------------
.\12\12.txt
Авторы: Толкачев Александр, Громков Сергей.
Оценка: 9

описание алгоритма
------------------

Алгоритм перевода двоичного числа в десятичное

     1011 = 11
         2    10

     записываем двоичное число вертикально

          ┌───┬───┐
          │ 1 │ 1 │ Первую единицу просто записываем
          ├───┼───┤
          │ 0 │ 2 │  Если слева 0 то 1  умножаем на 2
          ├───┼───┤
          │ 1 │ 5 │  Если слева 1 то 2 умножаем на 2 и + 1
          ├───┼───┤
          │ 1 │11 │  Если слева 1 то 5 * 2 + 1
          └───┴───┘
    В программе нет проверки на ошибку из писем электронной
    почты мы поняли, что это не принципиально, а только
    утяжеляет программу.
       Тем более подобный прием приведен а задаче об Автомате
     и Малыше.

комментарий куратора
--------------------
Узнаете? Это алгоритм, который описан куратором. Правда здесь он
"падает с неба". Кроме того, суммирование начинается с единицы, что
переводит двоичный ноль в десятичную единицу.

