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

Для обозначения цифр римской системы счисления используйте следующие
обозначения:

I - 1  (единица)
V - 5  (пять)
X - а  (десять)
L - (  (пятьдесят)

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


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

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

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

Римская система счисления основана на употреблениии особых знаков для
десятичных разрядов:

I = 1
X = 10
C = 100
M = 1000

и их половин:

V = 5
L = 50
D = 500.

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

Пусть запись числа в римской системе счисления имеет вид:

a  a   ... a  a     (здесь a  - римские цифры)
 n  n-1     1  0            i

Можно предложить следующий алгоритм перевода числа из римской в
десятичную систему счисления.

x = 0 // сумматор, в котором накапливается число
i = 0
ПОКА (i не больше n)
{
  ЕСЛИ a     < a
         i+1    i
  ТО
  {
      x = x + a  - a
               i    i+1
      i = i + 2
  }
  ИНАЧЕ
  {
      x = x + a
               i
      i = i + 1
  }

}

программа
---------

Программа учитывает, что в принятых обозначениях:

I - 1  (единица)     -- 1 символ от символа 0 в алфавите Корректора
V - 5  (пять)        -- 5 символ от символа 0 в алфавите Корректора
X - а  (десять)      -- 10 символ от символа 0 в алфавите Корректора
L - (  (пятьдесят)   -- 50 символ от символа 0 в алфавите Корректора

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



                        * * *


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

Решение 1
Автор решения Казанцев Лёва
Оценка: 9

описание алгоритма
------------------
В программе "Начало" я пишу после числа знак равно и через клетку от
равно число 0, затем возвращаюсь в начало числа и в зависимости от
числа прибавляю к нулю то или иное число. Если число будет состоять из
одного знака, то я сдвигаю его вплотную к знаку равно. Программа
работает с числами от 0 до 89.


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

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

Запись обрабатывается справа налево, результат накапливается в ящике.
1) Сначала, если есть, суммируются единицы
2) Если есть - римская 5 и, если есть, единица перед ней вычитается
3) Если есть - несколько римских десятков,
   затем, если есть - единица вычитается (т.е. IX) ,
   затем, если есть - ещё десятки (как в числе ХХХIХ)
4) Если есть - L или XL, т.е. 40 или 50.
После этих действий происходит "расшифровка" буквенной
записи в десятичную.


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

Обе программы во всю эксплуатируют ограничение, задаваемое на запись
римского числа, длиной алфавита Корректора. Потеря универсальности. Но
выигрыш в быстродействии.

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

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

комментарий куратора
--------------------
Действительно перебор всех возможных ситуаций.

a( - выдает "Не могу"  -- это число XL=45

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

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

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


описание алгоритма
------------------
1. Идем на конец записи, помещаем последний символ в ящик, пишем равно
и символ из ящика на ленту.

2. Возвращаемся на символ, стоящий перед тем который помещен в ящик и
сравниваем их, если символ на ленте меньше символа в ящике, то нужно
символ на ленте вычесть из символа в ящике, а иначе можно эти два
символа сложить. В зависимости от условия выполняем сложение или
вычитание, для этого возвращаемся в конец записи и делаем это
способами изученными в ходе подготовки к турниру. Выполнив сложение
или вычитание с помощью отложенной команды возвращаемся в нужное место
записи и начинаем выполнять пункт два сначала пока не закончится
запись.

3. Преобразовываем полученное число в число, записанное в десятичной
системе счисления способом, описанным в задаче 5.

комментарий куратора
--------------------
Универсальный алгоритм, не привязанный к конкретике среды Корректора.
Его можно легко перенести в другие среды, например Cи, паскаль.

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

описание алгоритма
------------------
Так как в условии написано натуральное число в римской системе
счисления, а не запись в виде римского числа, в решении не
предусмотрены обнаруживание ошибки в виде неправильной записи числа. И
запись аааа1 считает верной.

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

комментарий куратора
--------------------
Программа настроена на специфику среды Корректора.


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

описание алгоритма
------------------
-организуется счетчик
-начинается подсчет результата с поледнего символа
    если очередной символ а или 5, то анализируем символ,
       стоящий левее, если его значение меньше чем а(5), то прибавляем 9(4)
  Используем для этого процедуры ПРИБ4, ПРИБ9.
Программа работает если число 49 записать ХХХХIX.
Можно было бы создать соответсвенно процедуры ПРИБ49, ПРИБ40.

комментарий куратора
--------------------
Программа настроена на специфику среды Корректора.

Команда 3112
------------
.\12\12.txt
Авторы: Бурмистрова Юля, Полянинова Наташа
Оценка: 8

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

комментарий куратора
--------------------
Да, неуниверсальность этой программы немного превышает обычную норму!
