Забрать архив

Инструкция по установке задач по программированию.

  1. Поиск задач.
  2. Формат установки задач.
    1. Осуществляем перевод в HTML
    2. Создание или "генерация" тестов
    3. Теперь task.cfg и task.xml
    4. Собираем всё вместе
    5. Папка images
  3. Настройка даты и времени проведения олимпиады, проверка составленных Вами тестов.
  4. Что такое чекер, для чего он нужен и как он пишется.
  5. Регионы-участники ACM.
  6. Системы он-лайн-тестирования.

1. Поиск задач

Поиск задач происходит, конечно же, в Интернете. Смысла, как мне кажется, искать в поисковых системах - нет. Поэтому ниже приведен список ссылок, по которым, возможно, находится всё необходимое:


http://icpc.baylor.edu/past/PastProblems.html
http://www.acm.inf.ethz.ch/ProblemSetArchive.html
http://elena.ait.ac.nz/homepages/acm_contest/SP_History.html#Local_Results
http://www.acm.inf.ethz.ch/EuropeanDivision.html
http://acm.uva.es/problemset
http://contest.felk.cvut.cz
http://acm.baylor.edu/acmicpc

Хотя наиболее важна, скорей всего, вот эта -
http://icpc.baylor.edu/icpc/Regionals/RegionalStats.html

Ещё хотелось бы отметить, что достать условия задач и результаты олимпиады, если и не представляет труда, то тесты порой получить гораздо сложней. Один из возможных способов решения этой проблемы - это написать письмо веб-мастеру сайта, с просьбой переслать тесты нужной Вам олимпиады. Иногда они отсылают Вам тесты, а иногда отвечают, что сделать этого не могут, в любом случае если Вы всё просмотрели и тестов нигде не нашли, то порой это самый последний (а может быть и первый) способ их получить.

В заключение главы - скачивать олимпиады из Интернета, Вы можете с помощью университетской службы докачки файлов - NiGet (в FAQ можете кликнуть на ссылку, которая пропишет Вам в реестре в меню Explorer-a - Download Using NiGet).

2. Формат установки задач.

Ну вот, задачи, тесты и результаты у Вас есть, осталось "всего лишь" поставить олимпиаду на сайт DL. Сейчас, как раз, и будет обсуждаться формат, в котором должна быть олимпиада, чтобы её возможно было повесить на сайт. В первую очередь не помешал бы какой-нибудь конвертор форматов PDF (можете использовать FINEREADER для перевода PDF в DOC) и DOC в HTML, потому что именно в формате HTML должны быть задачи. Лично я ничего подходящего не нашёл, поэтому переводил всё вручную, если же Вы всё-таки сумеете найти какой либо неплохой конвертор, то можете его, безусловно, использовать.

1. Осуществляем перевод в HTML

"Но ведь я же не знаю HTML!" - можете Вы сказать сами себе. Спешу Вас обрадовать, от Вас не потребуется особых знаний этого "языка", всё необходимое для перевода в HTML будет Вам дано, а если захотите изучить его глубже - книг в наше время достаточно. Ну что же начнём.

Во-первых, я настоятельно рекомендую Вам создать следующий файл - FORM.HTML, содержимое которого таково:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Title</title></head>
<body>
<p align=right><u>Input file:1</u><br>
<u>Output file:2</u><br>
<u>Time Limit:3</u></p>
<p>4</p>
<p><b>Input</b></p>
<p>5</p>
<p><b>Output</b></p>
<p>6</p>
<p><b>Example input:</b>
<pre>
 7 
</pre>
<p><b>Example output:</b>
<pre>
 8 
</pre>
</body></html>

для наглядности я текст, который будет отображён на экране выделил – синим цветом. Значение красных цифр будет дано позже. На случай, если Вы не в курсе как данный файл создать: создаёте обычный текстовый файл, копируете содержимое таблицы и сохраняете файл как FORM.HTML. Что в итоге Вы получили, можете сразу же и просмотреть. Теперь поясню смысл некоторых записей (в моём понимании):

Для чего нужен данный файл? Он будет своего рода основой для всех следующих файлов, т.е. у Вас в олимпиаде, к примеру, 8 задач, тогда Вы соответственно переименовываете файл FORM.HTML в 1.html, 2.html, … , 8.html, понятно, что сам файл FORM.HTML Вы не изменяете. Затем вместо:

Вроде бы как с переводом в html разобрались. Поехали дальше.

2. Создание или "генерация" тестов

Теперь, когда все условия соответствуют нужному нам формату, необходимо составить тесты, конечно, они у Вас должны быть. Так если они у меня есть, зачем их составлять? Дело в том, что скорей всего тесты у Вас в не правильном для DL виде. К примеру, я встречался со следующими типами тестов: в условии задачи было сказано, что на входе 1 тест, а у меня в оригинальном тестовом файле несколько тестовых ситуаций, пусть, к примеру N, следовательно нужно составить N входных файлов, такая же ситуация и для выходных тестов (надеюсь понятно). Другой случай, наиболее неприятный, если по условию задачи на входе может быть несколько тестов, и все они "запиханы" в один файл, к примеру, tests.txt. Тогда их разбивка осуществляется чуть сложней, Вы ищете число (в файле tests.txt, название может быть любое) отвечающее за количество тестов, затем это количество тестов копируете, и вставляется в файл. Ваши созданные таким образом файлы, должны иметь имена: 1.in, 1.out, 2.in, 2.out, :, N.in, N.out, соответственно *.in для входных файлов, *.out - для выходных (понятно, что для файла X.in, выходным является X.out, X = 1,2,:,N). Очевидно (по крайней мере, я с этим сталкивался), что для больших тестов, с пару тысяч строчек, разбивание их вручную - удовольствие небольшое, поэтому можете с некоторыми модификациями согласно формату входных данных для определённой задачи использовать следующую программу (можете, конечно, написать свою):

Program GenTest;
Var
  i,k,j,n,m,a:longint;

Procedure Gen(j:longint);
Var s:string;
Begin
  Str(j,s);
  S:=s+'.in';
  Assign(output,s);  Rewrite(output);
End;

Begin
  Assign(input,'tests.txt'); reset(input);
  Readln(k);
  For i:=1 to k do
    Begin
      Gen(i);
      read(A); writeln(A);
      For j:=1 to a do
        Begin
          Read(n);
          Writeln(n,' ');
        End;
      Close(output);
    End;
  Close(input);
End.

Данная программа создаёт K файлов с именами 1.in, 2.in, :, K.in, в которые она записывает A чисел N (разных) и само число A (аналогичным образом можно поступить с выходными файлами *.out). Понятно, что в реальных тестах структура файлов куда сложней, но я хотел показать просто общую идею - способ, с помощью которого можно упростить себе жизнь. Процедура Gen остаётся такой же, изменяется только тело главной программы, причём наверняка, изменяться будут лишь аргументы циклов и ввод, вывод - readln, writeln - соответственно (проверено опытным путём). Вы можете создать EXE-файл данной программы и файл tests.txt:

3
2 3 4
3 4 5 7
1 2

и проверить её работу.

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

3. Теперь task.cfg и task.xml

И так основная "самая тяжёлая" часть работы сделана, осталось совсем чуть-чуть. Помимо условий и тестов, которые Вы нашли в Интернете, Вам нужно ещё самостоятельно создать следующие файлы task.cfg, task.xml (для каждой задачи!), но не волнуйтесь - содержимое этих файлов пару строчек. Давайте вначале рассмотрим формат task.xml:

<task name="The title of the task" ename="The title of the task"
author="Original"  cost="100"  type="1"/>

Вот и всё, в самом деле, ничего сложного – одна единственная строчка. Вместо “The title of the task” необходимо написать имя задачи на английском языке, cost=”100” – означает, что за задачу начисляется 100 баллов (сумма баллов в task.cfg должно соответствовать cost-у), а type=”1” означает, что данная задача – задача по программированию.

Теперь формат файла task.cfg:

input = File(name.in)
output = File(name.out)
time_limit = 25
tests_begin
20
20
20
20
20
tests_end

Необходимые пояснения:

Из нашего примера можно определить, что количество тестов равно 5 и 20+20+20+20+20=100.

Напоследок, следует отметить, что файл task. cfg может иметь немного другую структуру, но об этом попозже. И ещё, возможно более полную информацию Вы сможете найти здесь http://dl.gsu.by/doc

4. Собираем всё вместе

Наконец-то всё у нас есть, осталось всего лишь все наши файла сложить в одну папку, заархивировать WinRar-ом и отослать. Структура папки следующая:


GNY
  2002
    1
      task.cfg
      task.xml
      task.htm
      1.in
      1.out
      2.in
      2.out
      ...
      n1.in
      n1.out
    2
      images
        1.gif
        2.gif
        ...
      task.cfg
      task.xml
      task.htm
      1.in
      1.out
      ...
      n2.in
      n2.out
    3
    ...
    M



Надеюсь, структура папки понятна, но тем не менее поясню, что есть что.

5. Папка images

Что собой представляет данная папка и для чего она нужна – понятно. Вопрос в другом, как прописать в task.htm ссылку на рисунок и как получить необходимые для него атрибуты (об этом ниже). Начнём с ссылки. Всё делается очень просто, в месте, где должен быть рисунок (после некоторого текста, в начале (в конце) задачи), вставляется (имеется в виду в task.htm вставляется) строчка вида:

<center><img src="images\*.gif" Vspace=25 height=342 width=742></center><br>

где *.gif – имя файла (к примеру, 1.gif), height, weight соответственно высота и ширина рисунка (это и есть атрибуты рисунка). Может возникнуть проблема их нахождения, однако она решается очень просто: открывается данный рисунок в Paint-е, затем выбирается вкладку «Рисунок – Атрибуты…» и собственно там и отображается ширина и высота рисунка:


Теперь, когда у Вас уже есть готовая папка, то Вы архивируете её WinRar-ом и получаете архив, для нашего примера это gny.rar (архивируя сам каталог GNY), и именно данный архив Вы и отсылаете на DL.

И напоследок, ссылка помощь по установке задач, расположенная на сайте DL: Установка задач

3. Настройка даты и времени проведения олимпиады, проверка составленных Вами тестов.

После установки олимпиады нужно указать время её проведения, для этого необходимо кликнуть на ссылку “Установки времени”, найти нужную Вам олимпиаду и установить соответствующее время.

Также по возможности необходимо проверить составленные Вами тесты на правильность. Это можно сделать посредством отсылки авторских решений, которые у Вас могли оказаться. Если авторских или каких-либо решений задач у Вас нет, то остаётся надеяться, что тесты разбиты правильно, и проблемы во время олимпиады не возникнут. Также в случае отсутствия решений задач, необходимо хотя бы визуально проверить корректность тестов, имеется в виду, формат входных и выходных данных. Не помешал бы также следующий вид проверки (наверное, точнее сказать НЕОБХОДИМ): послать на все задачи “программу-пустышку” – “begin end.” и получить “не пройден 1-й тест”, в некоторых случаях легко можно добавить пару writeln, чтобы получить “не пройден 2-й тест”. На практике бывали случаи, когда такая отсылка помогла бы избежать проблем с неправильной установкой тестов во время олимпиады.

4. Что такое чекер, для чего он нужен и как он пишется.

Чекер – это специальная программа, которая проверяет, правильно ли решена задача, в случае, если возможны несколько правильных ответов. К примеру, с помощью суммы каких двух чисел можно получить, к примеру, 7. Очевидно, правильным ответом является: 3+4, но в то же время ответ – 5+2 – также является верным. Вот для этого и нужен чекер. Чекер не проводит сравнение того, что записано в *.out с ответом пользователя, он по некоторому правилу (алгоритму), который задаёт автор чекера, сопоставляет ответ пользователя с правильным ответом. В данном случае возможен следующий вариант разрешения проблемы: мы складываем (мы знаем, по условию задачи, что их нужно слаживать) числа в выходном правильном файле *.out, в результате получаем 3+4=7, затем производим сложение чисел пользователя, также получаем 5+2=7, следовательно, поскольку 7=7, то ответ пользователя верный, и мы считаем, что он решил эту задачу.

Что касается написания чекера, то в каждом конкретном случае к написанию нужно подходить по своему, в связи с различными алгоритмами реализации проверки, но общая часть чекера всегда неизменна и выглядит она так:

{ checker.pas BEGIN }
{$A+,B-,D+,E-,F-,G+,I+,L+,N+,O-,P-,Q+,R+,S+,T-,V+,X+}
{$M 65520,0,655360}
var RightAns, UserAns, Res :text;
    n1, n2, s1, s2         :word;
    ans1, ans2             :string;

Procedure OK;
begin
  assign(Res,'$result$.txt'); rewrite(Res);
  writeln(Res,paramstr(4));
  close(Res); close(UserAns); close(RightAns);
  halt(0);
end;

Procedure BAD;
begin
  assign(Res,'$result$.txt'); rewrite(Res);
  writeln(Res,0);
  writeln(Res,'Wrong answer');
  close(Res); close(UserAns); close(RightAns);
  halt(0);
end;

Procedure Init;
begin
  Assign(RightAns,paramstr(2));reset(RightAns);
  Assign(UserAns,paramstr(3)); reset(UserAns);
end;

Begin
  Init;
  read(RightAns,n1,s1);
  read(UserAns, n2,s2);
  if (n1<>n2)or(s1<>s2) then BAD;
  repeat
    read(RightAns,ans1);
    read(UserAns, ans2);
    if ans1=ans2 then OK;
  until eof(RightAns);
  BAD;
End.
{ checker.pas END }

В принципе я думаю текст должен быть понятен, однако:

5. Регионы-участники ACM.


EUROPE AFRICA AND THE MIDDLE EAST
Northwestern
Southwestern
Central
Northeastern
Southeastern
Africa and Arab
South Africa
Asia-Tehran
NORTH AMERICA ASIA
Pacific Northwest
Rocky Mountain
Southern California
North Central
South Central
East Central
Mid-Central
Southeast USA
Northeastern
Great New York
Mid-Atlantic
Aizu
Beijing
Bombay
Kolkata-Roorkee
Dhaka
Guangzhou
Kaohsiung
Manila
Seoul
Tehran
LATIN AMERICA SOUTH PACIFIC
Mexico and Central America
South America
South Pacific

6. Системы он-лайн-тестирования.

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

Понятно, что это не полный их перечень, в наше бурное время развития информационных технологий подобные системы, как мне кажется, появляются довольно-таки часто. В связи с этим, вполне возможно, данный список будет дополняться и изменяться. Также Вам стоит посетить раздел “Ссылки” на сайте DL, где Вы сможете найти более полную и подробную информацию о системах дистанционного образования и системах online тестирования.

Как связаться...

© Copyright