Задание B. "Сканер"

Студенты РГАТА разработали особый сканер, который предназначен для распознавания печатного текста. Это сканер имеет матрицу из 7 чувствительных элементов (нумерация элементов сверху вниз). Он передвигается по тексту слева - направо.
За один такт сканируется один столбец изображения символа, причем пользователь должен выборочно включить показ чувствительных элементов.
Пример. На рисунке черным фоном выделены включенные элементы (0, 1 и 4) второго столбца.
Ниже приводится таблица изображений всех символов (включая пробел).

Участникам предстоит распознать текст, включая как можно меньше чувствительных элементов сканера.
Каждый участник после регистрации первоначально имеет 1000 очков. За каждый включенный элемент сканера с участника списывается определенное число очков. Для участников лиги U стоимость просмотра элемента равна 1. Для участников лиг S и P стоимость включения элемента равна номеру столбца, в котором он находится.
Например, при сканировании 2-го столбца целиком участник лиги U теряет 7 очков, а участники лиг S и P теряют 7*2=14 очков. Так как каждый символ представлен таблицей из 7 строк и 5 столбцов, то полное сканирование символа обойдется участникам разных лиг в 35 и 105 очков соответственно.
Если участник досрочно сообщает очередную распознанную букву, матрица сканера перемещается на первый столбец следующего символа.
За каждую верно угаданную букву участнику начисляется премия в 105 очков. Если на счете участника будет недостаточно очков, то будет невозможно включать чувствительные элементы и придется угадывать буквы вслепую.
Итак, любой символ сканируемого текста представляется таблицей 7x5. В тексте могут использоваться 32 заглавные русские буквы и пробел. Пробел кодируется полностью пустой таблицей. Изображения всех символов доступны участникам через соответствующий массив (описание типов данных и переменных см. ниже).
Решение должно быть оформлено в виде программы на одном из следующих языков: стандартный язык Pascal, Object Pascal (без каких-либо модулей, кроме указанного ниже) или C++ . Служебные функции содержатся в модулях letters.cpp и letters.pas и описаны ниже. Участникам запрещается использовать любые вспомогательные файлы.
Решение может быть дисквалифицировано за нечестную игру (попытка изменения счета, чтение символов напрямую из файла или служебного массива и т.п.).
Программа участника продолжает играть до тех пор, пока ей не будет передан весь текст (служебные модули считывают этот текст из файла letters.txt). Длина текста предположительно будет составлять несколько тысяч символов. Общее время работы программы не должно превышать 5 сек на компьютере типа Pentium III-500MHz.
-------------------------------------------------------------------------
C++ Интерфейс (модуль letters.cpp) для задачи "Сканер" 
 Число букв алфавита:			const int max_letters =33;
 Число строк в изображении буквы:	const int max_line =7;
 Число столбцов в изображении буквы:	const int max_col =5;
 Счет участника (только для чтения!):	long int score;
 Изображения символов:const int Letters[max_letters][max_col][max_line];
 Функция инициализации:
void registration(char *ID,char* Name,int &messageLength)
ID   - идентификатор (регистрационный номер) участника,
Name - имя участника (команды), под которым он будет 
       выступать во время игры. 
messageLength - количество символов в сообщении. 
 Функция посылки распознанного символа:
int sayLetter(char letter)
letter - порядковый номер символа (символ 0 это буква "A", 
                                   символ 32 это пробел). 
Функция возвращает ненулевой результат (true), 
если символ распознан правильно.
Функция также перемещает матрицу сканера на следующий символ. 
Функция сканирования следующего столбца:
char* getNextColumn(char lines[max_line])
Эта функция возвращает указатель на очередной столбец 
изображения символа. Через параметр lines передаются номера 
элементов сканера, которые должны быть включены (программа 
передает массив из 7 символов, в котором символ'1' означает, 
что элемент сканера включен). Если все столбцы одного символа 
были переданы, то функция возвращает указатель на массив 
{0, 0., 0, 0, 0, 0, 0}  (для перехода к следующему символу 
нужно использовать функцию sayLetter) 

Функция завершения игры: void done(void) 
Функция проверки на окончание игры (можно не использовать):
int exitGame(void)
Эта функция возвращает ненулевое значение(true), если всё 
сообщение было передано.
-------------------------------------------------------------------------
Pascal Интерфейс (модуль letters.pas) для задачи "Сканер" 
 Число букв алфавита (включая пробел):	Const max_letters =33; 
 Число строк в изображении буквы:	Const max_line =7; 
 Число столбцов в изображении буквы:	Const max_col =5; 
 Счет участника (только для чтения!):	Var score: longint;
 Изображения символов:
const Images:array[0..max_letters-1,0..max_col-1,0..max_line-1] of byte;
{непустой символ клетки таблицы кодируется ненулевым значением} 
 Процедура инициализации:
Procedure registration(ID, Name: String; Var messageLength:integer);
ID   - идентификатор (регистрационный номер) участника,
Name - имя участника (команды), под которым он будет выступать
       во время игры. 
messageLength - количество символов в сообщении. 
Функция посылки распознанного символа:
Function sayLetter(letter:byte):boolean;
letter - порядковый номер символа (символ 0 - это буква "A", 
                                   символ 32 - это пробел). 
Функция возвращает результат true, если символ распознан правильно.
Вызов функции одновременно перемещает матрицу сканера на следующий 
символ. 
Тип TColumn (один столбец изображения символа):
Type TColumn=Array[0..max_line-1] of byte; ·
Функция сканирования следующего столбца:
Procedure getNextColumn(scaner_in:TColumn; var scaner_out:Tcolumn);
Через параметр scaner_in процедура передает модулю номера элементов 
сканера, которые должны быть включены (массив из 7 байт, в котором 1 
означает, что элемент сканера включен). Через параметр scaner_out 
процедура получает очередной столбец изображения символа. 
Примечание. Значения невключенных элементов сканера в массиве 
scaner_out не изменяются. Если все столбцы одного символа были
переданы, то переменная scaner_out не изменяется. Для перехода к 
следующему символу нужно использовать функцию sayLetter. 
Процедура завершения игры: Procedure done; 
Функция проверки на окончание игры (можно не использовать):
Function exitGame:Boolean;
Эта функция возвращает значение true, если всё сообщение 
было передано.