version 2.3, 2002/02/04 16:52:37
|
version 3.2, 2013/10/11 15:39:35
|
Line 1
|
Line 1
|
%$Id$ |
%$Id$ |
%$Log$ |
%$Log$ |
|
%Revision 3.2 2013/10/11 15:39:35 boris |
|
%Lev's changes |
|
% |
|
%Revision 3.1 2008-03-23 18:04:51 boris |
|
%documentation update |
|
% |
|
%Revision 3.0 2008-03-23 17:50:50 boris |
|
%Added Lev's corrections |
|
% |
|
%Revision 2.7 2005/02/20 03:24:43 boris |
|
%Wrote readme |
|
% |
|
%Revision 2.6 2005/01/24 03:28:53 boris |
|
%Re-added |
|
% |
|
%Revision 2.4 2002/02/04 16:53:15 boris |
|
%Added numletters |
|
% |
%Revision 2.3 2002/02/04 16:52:37 boris |
%Revision 2.3 2002/02/04 16:52:37 boris |
%Added num |
%Added num |
% |
% |
Line 38
|
Line 56
|
% |
% |
\usepackage[koi8-r]{inputenc} |
\usepackage[koi8-r]{inputenc} |
\usepackage[russian]{babel} |
\usepackage[russian]{babel} |
\usepackage{pscyr} |
\usepackage{t1enc} |
\usepackage{amsmath} |
\usepackage{amsmath} |
\newcommand{\prog}[1]{\ensuremath{\text{{\textsl{#1}}}}} |
\newcommand{\prog}[1]{\ensuremath{\text{{\textsl{#1}}}}} |
|
|
Line 46
|
Line 64
|
|
|
\begin{document} |
\begin{document} |
|
|
\title{Программа для обработки писем в IGP} |
\title{Программа для обработки писем в ИГП и ИЧБ} |
\author{Boris Veytsman, \texttt{borisv@lk.net}} |
\author{Boris Veytsman, \texttt{borisv@lk.net}} |
\date{Февраль 2002} |
\date{Март 2008} |
\maketitle |
\maketitle |
\thispagestyle{empty} |
\thispagestyle{empty} |
\tableofcontents |
\tableofcontents |
Line 60
|
Line 78
|
команды. Прочесть невероятное количество писем, извлечь ответы, |
команды. Прочесть невероятное количество писем, извлечь ответы, |
составить таблицу, да еще Собрание Сочинений\dots{} На это вполне может |
составить таблицу, да еще Собрание Сочинений\dots{} На это вполне может |
уйти целиком рабочий день. Именно с этой целью по предложению Якова |
уйти целиком рабочий день. Именно с этой целью по предложению Якова |
Зайдельмана написана эта программа. |
Зайдельмана написана эта программа. Позднее эта программа |
|
переписывалась при изменении регламента соревнований, добавлении ИЧБ и |
|
т.д. |
|
|
Идея состоит в следующем. Самый важный этап в деятельности дежурной |
Идея состоит в следующем. Самый важный этап в деятельности дежурной |
команды---решить, заслуживает ли данный ответ плюса или минуса. Это мы |
команды---решить, заслуживает ли данный ответ плюса или минуса. Это мы |
Line 76
|
Line 96
|
\item Время от времени создавать список команд, чьи ответы уже |
\item Время от времени создавать список команд, чьи ответы уже |
получены, и слать на информационный лист. |
получены, и слать на информационный лист. |
\end{enumerate} |
\end{enumerate} |
Необходимо учесть еще два важных обстоятельства: |
Необходимо учесть еще несколько важных обстоятельств: |
\begin{enumerate} |
\begin{enumerate} |
\item Команда может прислать несколько писем. В этом случае более |
\item Команда может прислать несколько писем. В этом случае более |
позднее письмо считается более авторитетным, чем более раннее. Мы |
позднее письмо считается более авторитетным, чем более раннее. Мы |
Line 86
|
Line 106
|
корректируя взбрыки e-mailа). |
корректируя взбрыки e-mailа). |
\item Дежурная команда может оценивать ответы параллельно их |
\item Дежурная команда может оценивать ответы параллельно их |
получению. Поэтому нельзя ``забывать'' старые оценки, читая новые. |
получению. Поэтому нельзя ``забывать'' старые оценки, читая новые. |
|
\item В последнее время в ИГП и ИЧБ принято два зачёта: спринт и |
|
стайер. При этом соблюдаются следующеи правила: |
|
\begin{enumerate} |
|
\item Если команда сдала ответ в спринте и не сдала ответ в стайере, |
|
учитывается ответ, сданный в спринте. |
|
\item При равенстве количества ответов в стайере победу в стайере |
|
одерживает команда, показавшая лучший результат в спринте. |
|
\end{enumerate} |
\end{enumerate} |
\end{enumerate} |
|
|
|
|
Line 184 Subject: Otvety komandy "Stop", 222
|
Line 212 Subject: Otvety komandy "Stop", 222
|
|
|
\subsection{Формат таблицы результатов} |
\subsection{Формат таблицы результатов} |
|
|
У таблицы результатов есть два формата. |
У таблицы результатов есть три формата. |
\begin{enumerate} |
\begin{enumerate} |
\item Длинный формат |
\item Длинный формат |
\begin{verbatim} |
\begin{verbatim} |
N 1 2 3 4 5 6 7 8 9 10 11 12 О Р КОМАНДА |
N 1 2 3 4 5 6 7 8 9 10 11 12 О Р КОМАНДА |
111 + + + + + + + + + + + + 12 359 Марсиане |
111 + + + + + + + + + + + + 12.04 359 Марсиане |
436 + + + + + + + + + + + + 12 359 Venera II |
436 + + + + + + + + + + + + 12.02 359 Venera II |
[...] |
[...] |
\end{verbatim} |
\end{verbatim} |
|
|
|
\item Промежуточный формат |
|
\begin{verbatim} |
|
N 12345 67890 12 О Р КОМАНДА |
|
111 +++++ +++++ ++ 12.04 359 Марсиане |
|
436 +++++ +++++ ++ 12.04 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} |
|
|
|
|
\item Короткий формат |
\item Короткий формат |
\begin{verbatim} |
\begin{verbatim} |
N 123456789012 О Р КОМАНДА |
N 123456789012 О Р КОМАНДА |
111 ++++++++++++ 12 359 Марсиане |
111 ++++++++++++ 12.04 359 Марсиане |
436 ++++++++++++ 12 359 Venera II |
436 ++++++++++++ 12.04 359 Venera II |
[...] |
[...] |
Рейтинг |
Рейтинг |
1 2 3 4 5 6 7 8 9 10 11 12 |
1 2 3 4 5 6 7 8 9 10 11 12 |
Line 207 Subject: Otvety komandy "Stop", 222
|
Line 248 Subject: Otvety komandy "Stop", 222
|
В последних графах стоит полное число взятых вопросов и суммарный |
В последних графах стоит полное число взятых вопросов и суммарный |
рейтинг соответственно. В последней строке таблицы---рейтинги |
рейтинг соответственно. В последней строке таблицы---рейтинги |
вопросов. В коротком формате вместо строки с рейтингом отдельная |
вопросов. В коротком формате вместо строки с рейтингом отдельная |
таблица ``Рейтинг''. |
таблица ``Рейтинг''. В графе ``О'' стоят набранные командой очки в |
|
данном зачёте (до десятичной точки) и в предыдущем (после точки). |
|
|
|
При печати незачетных вопросов взятый вопрос помечается буквой |
|
\prog{X}, а невзятый, как обычно, \prog{-}. |
|
|
\subsection{Формат собрания сочинений} |
\subsection{Формат собрания сочинений} |
|
|
Line 217 Subject: Otvety komandy "Stop", 222
|
Line 262 Subject: Otvety komandy "Stop", 222
|
\begin{verbatim} |
\begin{verbatim} |
ВОПРОС NN: |
ВОПРОС NN: |
\end{verbatim} |
\end{verbatim} |
\item По два заголовка подразделов: |
\item По три заголовка подразделов: |
\begin{verbatim} |
\begin{verbatim} |
ЗАСЧИТАНЫ ОТВЕТЫ: |
ЗАСЧИТАНО: |
|
\end{verbatim} |
|
|
|
\begin{verbatim} |
|
НЕ ЗАСЧИТАНО: |
\end{verbatim} |
\end{verbatim} |
и |
и |
\begin{verbatim} |
\begin{verbatim} |
НЕ ЗАСЧИТАНЫ ОТВЕТЫ: |
НЕ ЯСНО: |
\end{verbatim} |
\end{verbatim} |
\item Каждый ответ имеет формат: |
\item Каждый ответ имеет формат: |
\begin{verbatim} |
\begin{verbatim} |
Line 231 s Текст ответа
|
Line 280 s Текст ответа
|
Текст ответа |
Текст ответа |
... [f] |
... [f] |
\end{verbatim} |
\end{verbatim} |
Здесь \prog{s}---один из символов \prog{+} или \prog{-}, |
Здесь \prog{s}---один из символов \prog{+}, \prog{-}, или \prog{?}, |
\prog{f}---частота ответа, которая печатается только если она не равна |
\prog{f}---частота ответа, которая печатается только если она не равна |
единице. |
единице. |
\end{enumerate} |
\end{enumerate} |
|
|
|
По умолчанию, заголовки всех подразделов выводятся даже если для данного |
|
вопроса нет ответов, попадающих в какой-либо подраздел (подраздел пуст). |
|
Это предсказуемо и удобно, но не всегда удобочитаемо с точки зрения |
|
читателя-человека, поэтому по желанию возможна генерация промежуточного |
|
или короткого вариантов собрания сочинений. От описанного выше полного |
|
формата они отличаются режимом печати пустых подразделов: |
|
\begin{enumerate} |
|
\item В промежуточном формате подразделы \prog{ЗАСЧИТАНО} и |
|
\prog{НЕ ЗАСЧИТАНО} показываются всегда (даже пустые), а подраздел |
|
\prog{НЕ ЯСНО}---только если он не пуст. |
|
\item В коротком формате все подразделы выводятся только если они |
|
не пусты (исключения для \prog{ЗАСЧИТАНО} и \prog{НЕ ЗАСЧИТАНО} |
|
не делаются). |
|
\end{enumerate} |
|
|
|
По мнению автора, промежуточный формат представляет собой оптимальный |
|
компромисс между читаемостью и полнотой (и действительно, зачем |
|
печатать пару десятков пустых \prog{НЕ ЯСНО} в официальной сводке, |
|
в которой уже давно все ясно?) |
|
|
|
|
|
|
|
|
\section{Пользовательский интерфейс} |
\section{Пользовательский интерфейс} |
|
|
|
|
|
\subsection{Файл настроек} |
|
\label{sec:conf} |
|
|
|
Настройки программы хранятся в файле \prog{parameters.pl}. Пример |
|
этого файла приведен ниже: |
|
\begin{verbatim} |
|
# В этом файле собраны ЛОКАЛЬНЫЕ параметры -- "настройки" |
|
# |
|
# Количество зачётов |
|
$ROUNDS=2; |
|
|
|
############################################################### |
|
# Следующие настройки индивидуальны для каждого раунда, начиная |
|
# с первого |
|
############################################################### |
|
|
|
# Первый раунд |
|
|
|
# Название раунда |
|
|
|
$NAME[1]="Спринт"; |
|
|
|
# Вопросы раунда |
|
|
|
$MINQUEST[1]=1; |
|
$MAXQUEST[1]=12; |
|
|
|
# Файлы раунда. Следующий перекрывает предыдущий. |
|
# Список заключён в квадратные скобки, отдельные файлы разделены ЗАПЯТЫМИ. |
|
# $FILES[1] = [ "sprint.mail", "sprint-extra.mail" ]; |
|
# |
|
# ВНИМАНИЕ: формат этого параметра изменился с предыдущей версии! |
|
|
|
$FILES[1]= [ 'sprint.mail' ]; |
|
|
|
# Внезачётные вопросы раунда. В квадратных скобках, номера разделены ЗАПЯТЫМИ. |
|
# Во втором раунде эти вопросы тоже будут вне зачёта (но можно будет и |
|
# учесть, см. ниже описание $NOCOUNT[2]). |
|
# $NOCOUNT[1] = []; |
|
# $NOCOUNT[1] = [ 2, 3, 4 ]; |
|
|
|
$NOCOUNT[1]= []; |
|
|
|
|
|
# Второй раунд |
|
|
|
# Название раунда |
|
|
|
$NAME[2]="Стайер"; |
|
|
|
# Вопросы раунда |
|
|
|
$MINQUEST[2]=1; |
|
$MAXQUEST[2]=18; |
|
|
|
# Список заключён в квадратные скобки, отдельные файлы разделены ЗАПЯТЫМИ. |
|
# $FILES[2] = [ 'predvarit.mail', 'osnovn.mail' ]; |
|
# |
|
# ВНИМАНИЕ: формат этого параметра изменился с предыдущей версии! |
|
|
|
$FILES[2]= [ 'stayer.mail' ]; |
|
|
|
# Внезачётные вопросы в этом раунде. В квадратных скобках, через ЗАПЯТУЮ. |
|
# Этот список ДОБАВЛЯЕТСЯ к уже перечисленным в $NOCOUNT[1]. Однако |
|
# если вы хотите исключить какой-то из ранее указанных вопросов (например, |
|
# в гипотетической ситуации "вопрос номер 5 был исправлен слишком поздно, |
|
# поэтому в Спринте не учитывается, а для Стайера используется"), то |
|
# укажите его номер со знаком минус: "3 -5 6" |
|
# $NOCOUNT[2] = []; |
|
# $NOCOUNT[2] = [ 3, -5, 6 ]; |
|
|
|
$NOCOUNT[2]= []; |
|
|
|
|
|
######################################################### |
|
# Теперь общие настройки |
|
######################################################### |
|
|
|
|
|
# |
|
# Адрес листа z-info |
|
# |
|
$address = 'z-info@chgk.info'; |
|
#$address="boris"; |
|
# |
|
# Обратный адрес дежурной команды и ее название |
|
# |
|
$fromaddress = 'Boris Veytsman <borisv@lk.net>'; |
|
$DK = '"Дракоша"'; |
|
# |
|
# $date -- системная процедура, которая вычисляет МОСКОВСКОЕ |
|
# время. В Линуксе zdump это делает хорошо. В других операционных |
|
# системах надо как-то исхитряться... На самый худой конец, используйте |
|
# $date=''; |
|
# |
|
$date = "export TZ='Europe/Moscow'; date"; |
|
|
|
# |
|
# Процедуры, которые печатают заголовок и конец мейла-напоминания |
|
# |
|
sub printheader |
|
{ |
|
print <<"END"; |
|
To: $address |
|
From: $fromaddress |
|
Subject: Svodka |
|
MIME-Version: 1.0 |
|
Content-type: text/plain; charset=koi8-r |
|
Content-Transfer-Encoding: 8bit\n |
|
|
|
Уважаемые знатоки! |
|
|
|
С вами говорит робот команды $DK |
|
|
|
END |
|
print "На момент ", `$date`, "в зачёте '$NAME[$round]' сданы ответы от команд:\n\n"; |
|
} |
|
|
|
|
|
sub printfooter |
|
{ |
|
print <<END; |
|
|
|
-- |
|
Good luck |
|
|
|
-Robot |
|
END |
|
|
|
} |
|
\end{verbatim} |
|
|
|
|
\subsection{Основная программа} |
\subsection{Основная программа} |
|
|
Дежурный по туру складывает все письма в файл. Время от времени он |
Дежурный по туру складывает все письма в файл. Время от времени он |
запускает команду |
запускает команду |
\begin{verbatim} |
\begin{verbatim} |
processmail.pl [-d] [-t table_file] [-m mail_file] [-o results] |
processmail.pl [-d] [-t table_file] [-o results] |
\end{verbatim} |
\end{verbatim} |
где |
где |
\begin{description} |
\begin{description} |
\item[table\_file] файл с предыдущими оценками (по умолчанию |
\item[table\_file] файл с предыдущими оценками (по умолчанию |
отсутствует), |
отсутствует), |
\item[mail\_file] файл с письмами (по умолчанию---стандартный вход), |
|
\item[results] файл с результатами (по умолчанию---стандартный |
\item[results] файл с результатами (по умолчанию---стандартный |
выход). |
выход). |
\end{description} |
\end{description} |
Line 266 processmail.pl [-d] [-t table_file] [-m
|
Line 468 processmail.pl [-d] [-t table_file] [-m
|
|
|
Время от времени дежурный запускает программу |
Время от времени дежурный запускает программу |
\begin{verbatim} |
\begin{verbatim} |
reminder.pl [-t table_file] |
reminder.pl [-r номер_раунда] |
\end{verbatim} |
\end{verbatim} |
Она генерирует список команд, которые имеются в файле с таблицей (по |
Она генерирует список команд, которые имеются в файле с таблицей (по |
умолчанию---стандартный вход), и посылает его на z-info. |
умолчанию---стандартный вход), и посылает его на z-info. |
Line 276 reminder.pl [-t table_file]
|
Line 478 reminder.pl [-t table_file]
|
|
|
Итоговая таблица и собрание сочинений генерируются программами |
Итоговая таблица и собрание сочинений генерируются программами |
\begin{verbatim} |
\begin{verbatim} |
createtable.pl [-d] [-s] [-t table_file] [-m mail_file] [-o results] |
createtable.pl [-d] [-s|-m] [-t table_file] [-o results] |
collection.pl [-d] [-t table_file] [-m mail_file] [-o results] |
collection.pl [-d] [-s|-m] [-t table_file] [-o results] |
\end{verbatim} |
\end{verbatim} |
Ее ключи имеют то же смысл, что и у программы \prog{processmail.pl}. |
Ключи имеют тот же смысл, что и у программы \prog{processmail.pl}. |
Флаг \prog{-s} означает выбор короткой формы таблицы. |
Флаг \prog{-s} означает выбор короткой формы вывода, а флаг \prog{-m} |
|
означает выбор промежуточной формы. |
|
|
\section{Программа} |
\section{Программа} |
|
|
Line 295 collection.pl [-d] [-t table_file] [-m
|
Line 498 collection.pl [-d] [-t table_file] [-m
|
полями: |
полями: |
\begin{description} |
\begin{description} |
\item[\prog{regnum}] регистрационный номер |
\item[\prog{regnum}] регистрационный номер |
\item[[\prog{num}] количество ответов |
\item[\prog{numletters}] количество писем с ответами |
\item[\prog{answers}] ссылка на массив из ответов |
\item[\prog{answers}] ссылка на массив из ответов |
\item[\prog{score}] общий итог |
\item[\prog{score}] общий итог |
\item[\prog{rating}] общий рейтинг |
\item[\prog{rating}] общий рейтинг |
Line 307 collection.pl [-d] [-t table_file] [-m
|
Line 510 collection.pl [-d] [-t table_file] [-m
|
а элементы---опять таки ссылки на хэши следующего содержания: |
а элементы---опять таки ссылки на хэши следующего содержания: |
\begin{description} |
\begin{description} |
\item[\prog{score}] \prog{+}, \prog{-} или \prog{?} |
\item[\prog{score}] \prog{+}, \prog{-} или \prog{?} |
\item[\prog{teams}] массив команд, давших этот ответ |
\item[\prog{teams}] хэш команд, давших этот ответ |
\end{description} |
|
|
|
\subsection{Глобальные переменные} |
|
|
|
Мы используем следующие глобальные переменные: |
|
\begin{description} |
|
\item[\prog{\$MAXQUEST}] максимальное число вопросов |
|
\item[\prog{\$DEBUG}] флаг, показывающий, задана ли debugging mode. |
|
\end{description} |
\end{description} |
|
|
|
|
Line 323 collection.pl [-d] [-t table_file] [-m
|
Line 518 collection.pl [-d] [-t table_file] [-m
|
\section{Благодарности} |
\section{Благодарности} |
|
|
Я благодарен Якову Зайдельману, Льву Горенштейну, Алексу Покрасу и |
Я благодарен Якову Зайдельману, Льву Горенштейну, Алексу Покрасу и |
Дмитрию Рубинштейну за помощь в разработке этой программы. |
Дмитрию Рубинштейну за помощь в разработке этой программы. Версия~3 |
|
программы (поддержка незачетных вопросов и промежуточного формата |
|
таблицы) была написана Львом Горенштейном. |
|
|
\end{document} |
\end{document} |
|
|