%$Id: process.tex,v 2.3 2002/02/04 16:52:37 boris Exp $ %$Log: process.tex,v $ %Revision 2.3 2002/02/04 16:52:37 boris %Added num % %Revision 2.2 2002/02/04 15:43:34 boris %Added new features % %Revision 2.1 2002/02/04 15:04:53 boris %Started anew % % %Revision 1.9 1998/11/29 21:56:12 boris %Добавил благодарности % %Revision 1.8 1998/11/29 21:50:48 boris %Добавил изменения в формате. % %Revision 1.7 1998/11/17 22:48:33 boris %Отказался от попытки включить программу в файл -- не совместимы с кои-8 %:( % % Revision 1.6 1998/11/17 17:02:51 boris % Добавил регистрационные номера в формат. % % Revision 1.5 1998/11/15 04:52:25 boris % Написал интерфейс. % %Revision 1.4 1998/11/15 03:38:25 boris %Написал раздел "Форматы" % %Revision 1.3 1998/11/15 02:35:43 boris %Исправил заголовки % \documentclass{article} % % Руссификация. Бывает и новее... % \usepackage[koi8-r]{inputenc} \usepackage[russian]{babel} \usepackage{pscyr} \usepackage{amsmath} \newcommand{\prog}[1]{\ensuremath{\text{{\textsl{#1}}}}} \begin{document} \title{Программа для обработки писем в IGP} \author{Boris Veytsman, \texttt{borisv@lk.net}} \date{Февраль 2002} \maketitle \thispagestyle{empty} \tableofcontents \section{Введение} С тех пор, как количество команд в IGP превысило первый десяток, подведение итогов тура стало тяжким бременем для дежурной команды. Прочесть невероятное количество писем, извлечь ответы, составить таблицу, да еще Собрание Сочинений\dots{} На это вполне может уйти целиком рабочий день. Именно с этой целью по предложению Якова Зайдельмана написана эта программа. Идея состоит в следующем. Самый важный этап в деятельности дежурной команды---решить, заслуживает ли данный ответ плюса или минуса. Это мы автоматизировать не можем. Но это автоматизировать и не надо. А вот все остальное автоматизировать можно и нужно. Значит, программа должна делать следующее: \begin{enumerate} \item Извлекать ответы из файла с письмами команд \item Записывать их в файл, где все ответы были бы рядом, и было бы оставлено место для оценки \item Читать этот файл \emph{после} того, как дежурная команда проставит оценки и составлять таблицу и собрание сочинений. \item Время от времени создавать список команд, чьи ответы уже получены, и слать на информационный лист. \end{enumerate} Необходимо учесть еще два важных обстоятельства: \begin{enumerate} \item Команда может прислать несколько писем. В этом случае более позднее письмо считается более авторитетным, чем более раннее. Мы будем предполагать для простоты, что более поздние письма находятся в файле с письмами позже более ранних. Дело дежурной команды---обеспечить такой порядок писем (может быть, вручную корректируя взбрыки e-mailа). \item Дежурная команда может оценивать ответы параллельно их получению. Поэтому нельзя ``забывать'' старые оценки, читая новые. \end{enumerate} \section{Форматы} \subsection{Письма с ответами} \begin{enumerate} \item Каждое письмо содержит в строке Subject: строку в латиннице: \begin{verbatim} Subject: Otvety komandy "Nazvanie_komandy", NNN \end{verbatim} При этом название команды не должно содержать кавычек, а \prog{NNN}---регистрационный номер команды. Если у команды еще нет регистрационного номера, допускается его НЕ указывать \item В теле письма может быть все, что угодно, вплоть до строки \begin{verbatim} *** "Название_команды", NNN \end{verbatim} При этом название команды может быть как в латиннице, так и в кириллице, но быть \emph{одинаковым} для всех писем от данной команды \item Каждый ответ имеет следующую структуру: \begin{verbatim} #NN. Текст ответа Текст ответа ... \end{verbatim} Здесь \prog{NN}---номер вопроса, а за ним следует текст ответа (возможно, из нескольких строк) \item Ответы заканчиваются строкой \begin{verbatim} *** \end{verbatim} После этой строки может следовать все, что угодно. \item В тексте письма не рекомендуется употребление символов ``\prog{\#}'' и ``\prog{*}'' и \emph{запрещается} их употребление первыми в строке (или после пробелов). \end{enumerate} \paragraph{Пример:} \begin{verbatim} Date: 12 Nov 98 18:31:53 MSK From: Aleksandr Ivanov To: catamaran@hal.plmsc.psu.edu Subject: Otvety komandy "Stop", 222 Здравствуйте, уважаемые игроки Катамарана! Большое спасибо за вопросы. *** "Стоп", 222 #1. Сид #2. Мышка-наружка #3. Ллойд-Джордж #4. В жирафа #5. Шалтай-Болтай, Барклай де Толлли #6. У Геркулесовых столпов. #7. В коров #8. Глокая куздра #9. Александр Македонский и Гордий I #10. Поставить точку над i. #11. Кольцо Нибелунгов, Вагнер, Мефистофель #12. Венера *** Капитан команды "Стоп" Александр Иванов \end{verbatim} \subsection{Формат файла с результатами} Файл с результатами состоит из ответов. Каждый ответ имеет следующую структуру: \begin{enumerate} \item Заголовок \begin{verbatim} #NN. Frequency: f. Score: s \end{verbatim} Здесь \prog{NN}---номер вопроса, а \prog{s}---оценка, один из трех символов: \prog{+}, \prog{-} или \prog{?}. \item Собственно текст ответа: \begin{verbatim} Текст ответа Текст ответа ... \end{verbatim} При этом каждая строка текста начинается с двух пробелов. \item В конце всех ответов идет строка из трех звездочек: \begin{verbatim} *** \end{verbatim} \end{enumerate} \subsection{Формат таблицы результатов} У таблицы результатов есть два формата. \begin{enumerate} \item Длинный формат \begin{verbatim} N 1 2 3 4 5 6 7 8 9 10 11 12 О Р КОМАНДА 111 + + + + + + + + + + + + 12 359 Марсиане 436 + + + + + + + + + + + + 12 359 Venera II [...] \end{verbatim} \item Короткий формат \begin{verbatim} N 123456789012 О Р КОМАНДА 111 ++++++++++++ 12 359 Марсиане 436 ++++++++++++ 12 359 Venera II [...] Рейтинг 1 2 3 4 5 6 7 8 9 10 11 12 24 21 34 24 41 43 18 31 26 32 36 29 \end{verbatim} \end{enumerate} В последних графах стоит полное число взятых вопросов и суммарный рейтинг соответственно. В последней строке таблицы---рейтинги вопросов. В коротком формате вместо строки с рейтингом отдельная таблица ``Рейтинг''. \subsection{Формат собрания сочинений} Собрание ответов на каждый вопрос имеет следующую структуру: \begin{enumerate} \item Заголовок раздела \begin{verbatim} ВОПРОС NN: \end{verbatim} \item По два заголовка подразделов: \begin{verbatim} ЗАСЧИТАНЫ ОТВЕТЫ: \end{verbatim} и \begin{verbatim} НЕ ЗАСЧИТАНЫ ОТВЕТЫ: \end{verbatim} \item Каждый ответ имеет формат: \begin{verbatim} s Текст ответа Текст ответа ... [f] \end{verbatim} Здесь \prog{s}---один из символов \prog{+} или \prog{-}, \prog{f}---частота ответа, которая печатается только если она не равна единице. \end{enumerate} \section{Пользовательский интерфейс} \subsection{Основная программа} Дежурный по туру складывает все письма в файл. Время от времени он запускает команду \begin{verbatim} processmail.pl [-d] [-t table_file] [-m mail_file] [-o results] \end{verbatim} где \begin{description} \item[table\_file] файл с предыдущими оценками (по умолчанию отсутствует), \item[mail\_file] файл с письмами (по умолчанию---стандартный вход), \item[results] файл с результатами (по умолчанию---стандартный выход). \end{description} В этом файле вручную расставляются плюсы и минусы. Флаг \prog{-d} означает ``Debigging mode''. В этом режиме программа печатает массу дополнительной информации. \subsection{Сводка} Время от времени дежурный запускает программу \begin{verbatim} reminder.pl [-t table_file] \end{verbatim} Она генерирует список команд, которые имеются в файле с таблицей (по умолчанию---стандартный вход), и посылает его на z-info. \subsection{Результаты} Итоговая таблица и собрание сочинений генерируются программами \begin{verbatim} createtable.pl [-d] [-s] [-t table_file] [-m mail_file] [-o results] collection.pl [-d] [-t table_file] [-m mail_file] [-o results] \end{verbatim} Ее ключи имеют то же смысл, что и у программы \prog{processmail.pl}. Флаг \prog{-s} означает выбор короткой формы таблицы. \section{Программа} \subsection{Внутреннее представление данных} Сведения о командах хранятся в хэше \prog{\%teams} со следующими полями: \begin{description} \item[ключ] название команды \item[элемент] ссылка на анонимный хэш \prog{\%teams\{\$team\}} с полями: \begin{description} \item[\prog{regnum}] регистрационный номер \item[[\prog{num}] количество ответов \item[\prog{answers}] ссылка на массив из ответов \item[\prog{score}] общий итог \item[\prog{rating}] общий рейтинг \end{description} \end{description} Сведения о вопросах хранятся в массиве \prog{\%answers}. Его элементы---ссылки на анонимные хэши. Ключи в хэшах---тексты ответов, а элементы---опять таки ссылки на хэши следующего содержания: \begin{description} \item[\prog{score}] \prog{+}, \prog{-} или \prog{?} \item[\prog{teams}] массив команд, давших этот ответ \end{description} \subsection{Глобальные переменные} Мы используем следующие глобальные переменные: \begin{description} \item[\prog{\$MAXQUEST}] максимальное число вопросов \item[\prog{\$DEBUG}] флаг, показывающий, задана ли debugging mode. \end{description} \section{Благодарности} Я благодарен Якову Зайдельману, Льву Горенштейну, Алексу Покрасу и Дмитрию Рубинштейну за помощь в разработке этой программы. \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: