1: %$Id: process.tex,v 3.0 2008/03/23 17:50:50 boris Exp $
2: %$Log: process.tex,v $
3: %Revision 3.0 2008/03/23 17:50:50 boris
4: %Added Lev's corrections
5: %
6: %Revision 2.7 2005/02/20 03:24:43 boris
7: %Wrote readme
8: %
9: %Revision 2.6 2005/01/24 03:28:53 boris
10: %Re-added
11: %
12: %Revision 2.4 2002/02/04 16:53:15 boris
13: %Added numletters
14: %
15: %Revision 2.3 2002/02/04 16:52:37 boris
16: %Added num
17: %
18: %Revision 2.2 2002/02/04 15:43:34 boris
19: %Added new features
20: %
21: %Revision 2.1 2002/02/04 15:04:53 boris
22: %Started anew
23: %
24: %
25: %Revision 1.9 1998/11/29 21:56:12 boris
26: %Добавил благодарности
27: %
28: %Revision 1.8 1998/11/29 21:50:48 boris
29: %Добавил изменения в формате.
30: %
31: %Revision 1.7 1998/11/17 22:48:33 boris
32: %Отказался от попытки включить программу в файл -- не совместимы с кои-8
33: %:(
34: %
35: % Revision 1.6 1998/11/17 17:02:51 boris
36: % Добавил регистрационные номера в формат.
37: %
38: % Revision 1.5 1998/11/15 04:52:25 boris
39: % Написал интерфейс.
40: %
41: %Revision 1.4 1998/11/15 03:38:25 boris
42: %Написал раздел "Форматы"
43: %
44: %Revision 1.3 1998/11/15 02:35:43 boris
45: %Исправил заголовки
46: %
47: \documentclass{article}
48: %
49: % Руссификация. Бывает и новее...
50: %
51: \usepackage[koi8-r]{inputenc}
52: \usepackage[russian]{babel}
53: \usepackage{t1enc}
54: \usepackage{amsmath}
55: \newcommand{\prog}[1]{\ensuremath{\text{{\textsl{#1}}}}}
56:
57:
58:
59: \begin{document}
60:
61: \title{Программа для обработки писем в ИГП и ИЧБ}
62: \author{Boris Veytsman, \texttt{borisv@lk.net}}
63: \date{Февраль 2005}
64: \maketitle
65: \thispagestyle{empty}
66: \tableofcontents
67:
68: \section{Введение}
69:
70: С тех пор, как количество команд в IGP превысило первый десяток,
71: подведение итогов тура стало тяжким бременем для дежурной
72: команды. Прочесть невероятное количество писем, извлечь ответы,
73: составить таблицу, да еще Собрание Сочинений\dots{} На это вполне может
74: уйти целиком рабочий день. Именно с этой целью по предложению Якова
75: Зайдельмана написана эта программа. Позднее эта программа
76: переписывалась при изменении регламента соревнований, добавлении ИЧБ и
77: т.д.
78:
79: Идея состоит в следующем. Самый важный этап в деятельности дежурной
80: команды---решить, заслуживает ли данный ответ плюса или минуса. Это мы
81: автоматизировать не можем. Но это автоматизировать и не надо. А вот
82: все остальное автоматизировать можно и нужно. Значит, программа должна
83: делать следующее:
84: \begin{enumerate}
85: \item Извлекать ответы из файла с письмами команд
86: \item Записывать их в файл, где все ответы были бы рядом, и было бы
87: оставлено место для оценки
88: \item Читать этот файл \emph{после} того, как дежурная команда
89: проставит оценки и составлять таблицу и собрание сочинений.
90: \item Время от времени создавать список команд, чьи ответы уже
91: получены, и слать на информационный лист.
92: \end{enumerate}
93: Необходимо учесть еще несколько важных обстоятельств:
94: \begin{enumerate}
95: \item Команда может прислать несколько писем. В этом случае более
96: позднее письмо считается более авторитетным, чем более раннее. Мы
97: будем предполагать для простоты, что более поздние письма находятся
98: в файле с письмами позже более ранних. Дело дежурной
99: команды---обеспечить такой порядок писем (может быть, вручную
100: корректируя взбрыки e-mailа).
101: \item Дежурная команда может оценивать ответы параллельно их
102: получению. Поэтому нельзя ``забывать'' старые оценки, читая новые.
103: \item В последнее время в ИГП и ИЧБ принято два зачёта: спринт и
104: стайер. При этом соблюдаются следующеи правила:
105: \begin{enumerate}
106: \item Если команда сдала ответ в спринте и не сдала ответ в стайере,
107: учитывается ответ, сданный в спринте.
108: \item При равенстве количества ответов в стайере победу в стайере
109: одерживает команда, показавшая лучший результат в спринте.
110: \end{enumerate}
111: \end{enumerate}
112:
113:
114: \section{Форматы}
115:
116:
117: \subsection{Письма с ответами}
118:
119: \begin{enumerate}
120: \item Каждое письмо содержит в строке Subject: строку в латиннице:
121: \begin{verbatim}
122: Subject: Otvety komandy "Nazvanie_komandy", NNN
123: \end{verbatim}
124: При этом название команды не должно содержать кавычек, а
125: \prog{NNN}---регистрационный номер команды. Если у команды еще нет
126: регистрационного номера, допускается его НЕ указывать
127: \item В теле письма может быть все, что угодно, вплоть до строки
128: \begin{verbatim}
129: *** "Название_команды", NNN
130: \end{verbatim}
131: При этом название команды может быть как в латиннице, так и в
132: кириллице, но быть \emph{одинаковым} для всех писем от данной команды
133: \item Каждый ответ имеет следующую структуру:
134: \begin{verbatim}
135: #NN. Текст ответа
136: Текст ответа
137: ...
138: \end{verbatim}
139: Здесь \prog{NN}---номер вопроса, а за ним следует текст ответа
140: (возможно, из нескольких строк)
141: \item Ответы заканчиваются строкой
142: \begin{verbatim}
143: ***
144: \end{verbatim}
145: После этой строки может следовать все, что угодно.
146: \item В тексте письма не рекомендуется употребление символов
147: ``\prog{\#}'' и ``\prog{*}'' и \emph{запрещается} их
148: употребление первыми в строке (или после пробелов).
149: \end{enumerate}
150:
151: \paragraph{Пример:}
152: \begin{verbatim}
153: Date: 12 Nov 98 18:31:53 MSK
154: From: Aleksandr Ivanov <ivanov@boga.net>
155: To: catamaran@hal.plmsc.psu.edu
156: Subject: Otvety komandy "Stop", 222
157:
158: Здравствуйте, уважаемые игроки Катамарана!
159:
160: Большое спасибо за вопросы.
161:
162: *** "Стоп", 222
163: #1. Сид
164: #2. Мышка-наружка
165: #3. Ллойд-Джордж
166: #4. В жирафа
167: #5. Шалтай-Болтай, Барклай де Толлли
168: #6. У Геркулесовых столпов.
169: #7. В коров
170: #8. Глокая куздра
171: #9. Александр Македонский и Гордий I
172: #10. Поставить точку над i.
173: #11. Кольцо Нибелунгов, Вагнер, Мефистофель
174: #12. Венера
175: ***
176:
177: Капитан команды "Стоп"
178: Александр Иванов
179: \end{verbatim}
180:
181:
182: \subsection{Формат файла с результатами}
183:
184: Файл с результатами состоит из ответов. Каждый ответ имеет следующую
185: структуру:
186: \begin{enumerate}
187: \item Заголовок
188: \begin{verbatim}
189: #NN. Frequency: f. Score: s
190: \end{verbatim}
191: Здесь \prog{NN}---номер вопроса, а \prog{s}---оценка, один из
192: трех символов: \prog{+}, \prog{-} или \prog{?}.
193: \item Собственно текст ответа:
194: \begin{verbatim}
195: Текст ответа
196: Текст ответа
197: ...
198: \end{verbatim}
199: При этом каждая строка текста начинается с двух пробелов.
200: \item В конце всех ответов идет строка из трех звездочек:
201: \begin{verbatim}
202: ***
203: \end{verbatim}
204: \end{enumerate}
205:
206:
207: \subsection{Формат таблицы результатов}
208:
209: У таблицы результатов есть два формата.
210: \begin{enumerate}
211: \item Длинный формат
212: \begin{verbatim}
213: N 1 2 3 4 5 6 7 8 9 10 11 12 О Р КОМАНДА
214: 111 + + + + + + + + + + + + 12.04 359 Марсиане
215: 436 + + + + + + + + + + + + 12.02 359 Venera II
216: [...]
217: \end{verbatim}
218: \item Короткий формат
219: \begin{verbatim}
220: N 123456789012 О Р КОМАНДА
221: 111 ++++++++++++ 12.04 359 Марсиане
222: 436 ++++++++++++ 12.04 359 Venera II
223: [...]
224: Рейтинг
225: 1 2 3 4 5 6 7 8 9 10 11 12
226: 24 21 34 24 41 43 18 31 26 32 36 29
227: \end{verbatim}
228: \end{enumerate}
229: В последних графах стоит полное число взятых вопросов и суммарный
230: рейтинг соответственно. В последней строке таблицы---рейтинги
231: вопросов. В коротком формате вместо строки с рейтингом отдельная
232: таблица ``Рейтинг''. В графе ``О'' стоят набранные командой очки в
233: данном зачёте (до десятичной точки) и в предыдущем (после точки).
234:
235: \subsection{Формат собрания сочинений}
236:
237: Собрание ответов на каждый вопрос имеет следующую структуру:
238: \begin{enumerate}
239: \item Заголовок раздела
240: \begin{verbatim}
241: ВОПРОС NN:
242: \end{verbatim}
243: \item По два заголовка подразделов:
244: \begin{verbatim}
245: ЗАСЧИТАНЫ ОТВЕТЫ:
246: \end{verbatim}
247: и
248: \begin{verbatim}
249: НЕ ЗАСЧИТАНЫ ОТВЕТЫ:
250: \end{verbatim}
251: \item Каждый ответ имеет формат:
252: \begin{verbatim}
253: s Текст ответа
254: Текст ответа
255: ... [f]
256: \end{verbatim}
257: Здесь \prog{s}---один из символов \prog{+} или \prog{-},
258: \prog{f}---частота ответа, которая печатается только если она не равна
259: единице.
260: \end{enumerate}
261:
262:
263:
264: \section{Пользовательский интерфейс}
265:
266:
267: \subsection{Файл настроек}
268: \label{sec:conf}
269:
270: Настройки программы хранятся в файле \prog{parameters.pl}. Пример
271: этого файла приведен ниже:
272: \begin{verbatim}
273: # Количество зачётов
274: $ROUNDS=2;
275:
276: ###############################################################
277: # Следующие настройки индивидуальны для каждого раунда, начиная
278: # с первого
279: ###############################################################
280:
281: # Первый раунд
282:
283: # Название раунда
284:
285: $NAME[1]="Спринт";
286:
287: # Вопросы раунда
288:
289: $MINQUEST[1]=1;
290: $MAXQUEST[1]=12;
291:
292: # Файлы раунда. Следующий перекрывает предыдущий:
293:
294: $FILES[1]='sprint.mail';
295:
296:
297: # Второй раунд
298:
299: # Название раунда
300:
301: $NAME[2]="Стайер";
302:
303: # Вопросы раунда
304:
305: $MINQUEST[2]=1;
306: $MAXQUEST[2]=18;
307:
308: # Файлы раунда. Следующий перекрывает предыдущий. Файлы разделены
309: # ПРОБЕЛАМИ
310:
311: $FILES[2]='stayer.mail';
312:
313: #########################################################
314: # Теперь общие настройки
315: #########################################################
316:
317:
318: #
319: # Адрес листа z-info
320: #
321: $address = 'z-info@chgk.info';
322: #$address="boris";
323: #
324: # Обратный адрес дежурной команды и ее название
325: #
326: $fromaddress = 'borisv@lk.net';
327: $DK = '"Дракоша"';
328: #
329: # $date -- системная процедура, которая вычисляет МОСКОВСКОЕ
330: # время. В Линуксе zdump это делает хорошо. В других операционных
331: # системах надо как-то исхитряться...
332: #
333: $date = "export TZ='Europe/Moscow'; date";
334:
335: #
336: # Процедуры, которые печатают заголовок и конец мейла-напоминания
337: #
338: sub printheader
339: {
340: print <<"END";
341: To: $address
342: From: $fromaddress
343: Subject: Svodka
344: MIME-Version: 1.0
345: Content-type: text/plain; charset=koi8-r
346: Content-Transfer-Encoding: 8bit\n
347:
348: Уважаемые знатоки!
349:
350: С вами говорит робот команды $DK
351:
352: END
353: print "На момент ", `$date`, "в зачёте '$NAME[$round]' сданы ответы от команд:\n\n";
354: }
355:
356:
357: sub printfooter
358: {
359: print <<END;
360:
361: --
362: Good luck
363:
364: -Robot
365: END
366:
367: }
368:
369: \end{verbatim}
370:
371:
372: \subsection{Основная программа}
373:
374: Дежурный по туру складывает все письма в файл. Время от времени он
375: запускает команду
376: \begin{verbatim}
377: processmail.pl [-d] [-t table_file] [-o results]
378: \end{verbatim}
379: где
380: \begin{description}
381: \item[table\_file] файл с предыдущими оценками (по умолчанию
382: отсутствует),
383: \item[results] файл с результатами (по умолчанию---стандартный
384: выход).
385: \end{description}
386:
387: В этом файле вручную расставляются плюсы и минусы.
388:
389: Флаг \prog{-d} означает ``Debigging mode''. В этом режиме программа
390: печатает массу дополнительной информации.
391:
392: \subsection{Сводка}
393:
394: Время от времени дежурный запускает программу
395: \begin{verbatim}
396: reminder.pl [-r номер_раунда]
397: \end{verbatim}
398: Она генерирует список команд, которые имеются в файле с таблицей (по
399: умолчанию---стандартный вход), и посылает его на z-info.
400:
401:
402: \subsection{Результаты}
403:
404: Итоговая таблица и собрание сочинений генерируются программами
405: \begin{verbatim}
406: createtable.pl [-d] [-s] [-t table_file] [-o results]
407: collection.pl [-d] [-t table_file] [-o results]
408: \end{verbatim}
409: Ее ключи имеют то же смысл, что и у программы \prog{processmail.pl}.
410: Флаг \prog{-s} означает выбор короткой формы таблицы.
411:
412: \section{Программа}
413:
414:
415: \subsection{Внутреннее представление данных}
416:
417: Сведения о командах хранятся в хэше \prog{\%teams} со следующими
418: полями:
419: \begin{description}
420: \item[ключ] название команды
421: \item[элемент] ссылка на анонимный хэш \prog{\%teams\{\$team\}} с
422: полями:
423: \begin{description}
424: \item[\prog{regnum}] регистрационный номер
425: \item[[\prog{numletters}] количество писем с ответами
426: \item[\prog{answers}] ссылка на массив из ответов
427: \item[\prog{score}] общий итог
428: \item[\prog{rating}] общий рейтинг
429: \end{description}
430: \end{description}
431:
432: Сведения о вопросах хранятся в массиве \prog{\%answers}. Его
433: элементы---ссылки на анонимные хэши. Ключи в хэшах---тексты ответов,
434: а элементы---опять таки ссылки на хэши следующего содержания:
435: \begin{description}
436: \item[\prog{score}] \prog{+}, \prog{-} или \prog{?}
437: \item[\prog{teams}] хэш команд, давших этот ответ
438: \end{description}
439:
440:
441:
442: \section{Благодарности}
443:
444: Я благодарен Якову Зайдельману, Льву Горенштейну, Алексу Покрасу и
445: Дмитрию Рубинштейну за помощь в разработке этой программы.
446:
447: \end{document}
448:
449: %%% Local Variables:
450: %%% mode: latex
451: %%% TeX-master: t
452: %%% End:
453:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>