Поиск задач происходит, конечно же, в Интернете. Смысла, как мне кажется, искать в поисковых системах - нет. Поэтому ниже приведен список ссылок, по которым, возможно, находится всё необходимое:
Хотя наиболее важна, скорей всего, вот эта -
http://icpc.baylor.edu/icpc/Regionals/RegionalStats.html
Ещё хотелось бы отметить, что достать условия задач и результаты олимпиады, если и не представляет труда, то тесты порой получить гораздо сложней. Один из возможных способов решения этой проблемы - это написать письмо веб-мастеру сайта, с просьбой переслать тесты нужной Вам олимпиады. Иногда они отсылают Вам тесты, а иногда отвечают, что сделать этого не могут, в любом случае если Вы всё просмотрели и тестов нигде не нашли, то порой это самый последний (а может быть и первый) способ их получить.
В заключение главы - скачивать олимпиады из Интернета, Вы можете с помощью университетской службы докачки файлов - NiGet (в FAQ можете кликнуть на ссылку, которая пропишет Вам в реестре в меню Explorer-a - Download Using NiGet).
Ну вот, задачи, тесты и результаты у Вас есть, осталось "всего лишь" поставить олимпиаду на сайт DL. Сейчас, как раз, и будет обсуждаться формат, в котором должна быть олимпиада, чтобы её возможно было повесить на сайт. В первую очередь не помешал бы какой-нибудь конвертор форматов PDF (можете использовать FINEREADER для перевода PDF в DOC) и DOC в HTML, потому что именно в формате 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 разобрались. Поехали дальше.
Теперь, когда все условия соответствуют нужному нам формату, необходимо составить тесты, конечно, они у Вас должны быть. Так если они у меня есть, зачем их составлять? Дело в том, что скорей всего тесты у Вас в не правильном для 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
и проверить её работу.
В общем случае следует поступать исходя из специфики задачи, т.е. если у Вас небольшие простые тесты, то может благоразумней переделать их вручную, нежели составлять соответствующую программу. Каждый решает сам, но одно неоспоримо, если тест большой - нужно писать программу, причём порой это можно сделать легко и быстро, а порой нужно потратить больше времени и подумать над структурой программы.
И так основная "самая тяжёлая" часть работы сделана, осталось совсем чуть-чуть. Помимо условий и тестов, которые Вы нашли в Интернете, Вам нужно ещё самостоятельно создать следующие файлы 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
Наконец-то всё у нас есть, осталось всего лишь все наши файла сложить в одну папку, заархивировать 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
Надеюсь, структура папки понятна, но тем не менее поясню, что есть что.
Что собой представляет данная папка и для чего она нужна – понятно. Вопрос в другом, как прописать в 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: Установка задач
После установки олимпиады нужно указать время её проведения, для этого необходимо кликнуть на ссылку “Установки времени”, найти нужную Вам олимпиаду и установить соответствующее время.
Также по возможности необходимо проверить составленные Вами тесты на правильность. Это можно сделать посредством отсылки авторских решений, которые у Вас могли оказаться. Если авторских или каких-либо решений задач у Вас нет, то остаётся надеяться, что тесты разбиты правильно, и проблемы во время олимпиады не возникнут. Также в случае отсутствия решений задач, необходимо хотя бы визуально проверить корректность тестов, имеется в виду, формат входных и выходных данных. Не помешал бы также следующий вид проверки (наверное, точнее сказать НЕОБХОДИМ): послать на все задачи “программу-пустышку” – “begin end.” и получить “не пройден 1-й тест”, в некоторых случаях легко можно добавить пару writeln, чтобы получить “не пройден 2-й тест”. На практике бывали случаи, когда такая отсылка помогла бы избежать проблем с неправильной установкой тестов во время олимпиады.
Чекер – это специальная программа, которая проверяет, правильно ли решена задача, в случае, если возможны несколько правильных ответов. К примеру, с помощью суммы каких двух чисел можно получить, к примеру, 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 }
В принципе я думаю текст должен быть понятен, однако:
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 |
Помимо DL, как Вы понимаете существует множество разнообразных других систем online тестирования. При желании Вы можете проверить свои силы, знания и, возможно, почерпнуть что-либо полезное для усовершенствования DL. Вот некоторый их список:
Понятно, что это не полный их перечень, в наше бурное время развития информационных технологий подобные системы, как мне кажется, появляются довольно-таки часто. В связи с этим, вполне возможно, данный список будет дополняться и изменяться. Также Вам стоит посетить раздел “Ссылки” на сайте DL, где Вы сможете найти более полную и подробную информацию о системах дистанционного образования и системах online тестирования.
© Copyright