Командная работа (решение олимпиад прошлых лет)

Работа с архивами олимпиад

Архивы с прошедшими олимпиадами (условия, тесты, решения) можно найти на сайтах (список неполный).

Список будет пополняться ;)

Содержимое архива

Задача, как правило, содержит тесты, решения жюри, условия и чекер (checker) - программу для проверки ответа на однин тест.

1. Компиляция чекера

Чекер на Delphi

Обычно файл сheck.dpr, может быть check.pas (на Borland Pascal).

Для компиляции нужна библиотека testlib.pas, которую, как правило, можно найти там же в архиве.

Для компиляции можно: положить testlib.pas в ту же папку, что и check.dpr и выполнить команду dcc32 check.dpr.

Пример чекера check.dpr (русские буквы должны быть в DOS-кодировке cp866):

{$APPTYPE CONSOLE}
Uses TestLib, SysUtils;

{ Чекер для задачи A+B (вывести сумму чисел, без длинной арифметики) }
var A,B,C,J : int64;
begin
  A := inf.readLongint; { Число A из входного файла }
  B := inf.readLongint; { Число B из входного файла }
  C := ouf.readLongint; { C (Contestant) - ответ участника }
  J := ans.readLongint; { J (Jury) - ответ жюри, может не использоваться! }
  if C <> J then { Wrong Answer }
    Quit(_WA,Format('%d + %d = %d, а выведено %d',[A,B,A+B,C]));
  Quit(_OK,''); { Тест пройден! }
end.

Чекер на С/C++

Обычно файл называется check.cpp. Для компиляции чаще всего нужна библиотека testlib.h (Mike Mirzayanov), с сайта http://code.google.com/p/testlib/.

Для компиляции можно использовать строку вида:

g++ -x c++ -O2 -Wall -Wl,--stack=67108864 check.cpp -o check.exe

Пример чекера check.cpp:

#include "testlib.h"

int main( int argc, char *argv[] ) {
  setName("Чекер для задачи A+B");
  registerTestlibCmd(argc, argv); // Обработка параметров командной строки
  int a = inf.readInt(), b = inf.readInt(); // Чтение исходных данных
  int pa = ouf.readInt(); // Ответ участника
  int ja = ans.readInt(); // Ответ жюри
  if (ja != pa) // Wrong Answer
    quitf(_wa, "%d + %d = %d, а выведено %d", a, b, ja, pa );
  quitf(_ok, "ans = %d, a=%d,b=%d", pa, a, b); // Тест пройден
}

2. Прогон на всех тестах с контролем времени и памяти

Для этого можно использовать программу run.exe, которую удобно поместить в папку с решением и тестами. По-умолчанию программа ищет решение solution.dpr, компилирует его Delphi (dcc32), и запускает на всех тестах (01, 02,... до 99) используя имя входного файла input.txt, а выходного output.txt. Для изменения этих настроек можно запустить программу run c параметрами командной строки или создать файл task.cfg. Пример файла task.cfg:

InputFile := bubble.in;
OutputFile := bubble.out;
CheckResult := true;

3. Сборка условий задач (если они формате TeX)

Под Windows можно использовать MikTex - http://miktex.org. В разделе Download выберите подходящую версию. После установки удобно указать автоматическую доустановку пакетов.

Для сборки можно использовать bat/cmd файл следующего вида:

@echo off
set CURRENT=ИМЯ_TEX_ФАЙЛА
latex %CURRENT%
dvips -t landscape %CURRENT%
dvipdfm -p a4 -l %CURRENT%