Привет, я dAFTc0d3r. Я хочу немного рассказать про то, как участвовать в соревнованиях TopCoder Algorithm.
Что же такое TopCoder в принципе?
TopCoder is a company which administers contests in computer programming (Wiki).
Да, TopCoder проводит соревнования, причём совершенно различных видов: Algorithms, Design, Development, Marathon Matches, Studio, Architecture, Assembly, Testing, Bug Races.
Первое, с чем мы сталкиваемся, когда заходим на сайт топкодера (topcoder.com) - что делать? Куда дальше идти? Когда я регистрировался (что было в 2007 году) такой проблемы вроде не было. Если честно, я до сих пор не знаю, как сейчас самому дойти до правильного ответа - topcoder.com/tc.
Вторая проблема – регистрация. Хотя, в принципе, она вполне решаемая с помощью хорошего переводчика.
Третья проблема – запуск арены, через которую производится участие в соревнованиях Algorithm.
Насколько я помню, решение – установка Java Web Start.
Сама же ссылка на арену скрывается под текстом O(n) в левом верхнем углу сайта.
Когда мы решили первые три проблемы, запустили арену, вошли под своим пользователем, мы можем потренироваться. Это будет очень полезным.
Пусть наш язык – C++. Откроем одну из тренировочных комнат: Practice Rooms --> SRMs --> 609-624 --> 614 - SRM 448 DIV 2.
Далее мы попадаем в окно комнаты соревнований.
Выбираем задачу, пусть это будет 250я задача
Открывается окно Coding Phase (аа! сколько окон!). Сверху справа выбираем плагин и язык. В поле Problem Statement находится условие задачи. Понимаем условие задачи, читаем Defenition (в каком виде требуется отправить решение), обязательно читаем Constraints – ограничения, и смотрим Examples.
Мы должны посчитать сумму карт для игры Блэк Джек. Карта задаётся двумя символами – рангом и мастью. От нас требуют написать класс TheBlackJackDivTwo, содержащий public метод int score(vector <string> cards).
Пишем решение задачи:
http://codepad.org/EMkgXA2X
Пытаемся его скомпилировать. Успешно.
Далее проверяем свой код на тестах из условия (Test). Так же можно ввести свой тест, который будет соответствовать ограничениям, и увидеть, какой результат выдала программа.
Завершаем работу с задачей нажатием на кнопку Submit и закрытием окна Coding Phase.
Так как это комната для тренировок – решение можно сразу протестировать, выбрав Practice Options --> Run System Test.
При верном решении цифры 250 загорятся зелёным, при неверном можно будет увидеть тест, на котором программа отработала некорректно.
Теперь поговорим о формате соревнований TopCoder Algorithm.
Соревнование называется SRM - Single Round Match. Расписание SRMов можно увидеть здесь, или, например, используя различные готовые календари (пример). Матч длится 1 час 35 минут. На решение задач (Coding Phase) даётся 1 час и 15 минут, 5 минут (Intermission) даётся на передышку и подготовку тестов для третей части - Challenging Phase.
Перед началом соревнований участники распределяются на комнаты, в каждой комнате присутствует не более 20 человек. Во время Фазы Челленджа вам разрешается смотреть код других участников твоей комнаты, который они отправили по каждой из задач. Если вы видите, что решение какого-либо участника не является полным, вы можете попробовать обломать его программу, подобрав такой тест, на котором решение либо выдаст неверный результат, либо не завершит свою работу корректно или не уложится по времени.
За успешную попытку челленджа вам начисляется 50 дополнительных очков, за неуспешную – снимается 25. Челленджить с отрицательным количеством очков нельзя!
На контесте предлагается три задачи, которые обычно стоят 250, 500 и 1000 очков. Очки, которые вы получите за задачу, определяются разностью времени открытия задачи и посылки её (Submit). Существует возможность повторной отправки задачи – в этом случае время пересчитывается, относительно времени последней посылки, и снимается 10% очков за каждую повторную посылку, но вы получите как минимум 30% очков задачи.
После Challenging Phase происходит System Testing Phase, где все выдержавшие челлендж решения тестируются на заранее приготовленных тестах + тестах, которые успешно уронили чужие решения в предыдущей фазе. Если задача была решена верно – вы сохраняете свои очки по ней, в противном случае вы получаете 0 очков за неё.
Затем все участники сортируются по количеству очков, набранных за контест, и идёт пересчёт общего рейтинга участников. Все участники разбиты на 2 дивизиона: 1200 и больше очков рейтинга – I Дивизион, меньше 1200 – второй.
Надеюсь эта статья поможет кому-либо испытать новые ощущения от решения задач.
Искренне ваш, пока ещё жоолтый,
dAFTc0d3r.
UPD. Часть #2: Плагины для C++ и внешней среды разработки (MS Visual Studio)
Именно благодаря топкодеру я начал писать на C++. :)
Вроде ещё Питон.
Если вы относитесь нормально к тому, чтобы писать прямо в окне арены, то вам нужен KawigiEdit. Это в том случае, если вы готовы жить без автокомплита и дебага. Отличный плагин, позволяет очень легко переключаться между языками, сразу подставляет паттерн.
Из недостатков - там первая кнопка, что-то типа Generate Code, очищает ваш код. О-о-оочень неприятно бывает :о) Просто случайн можно нажать потому что.
На настройку с нуля я бы выделил пол часа чтобы успеть гарантированно.
Если вы хотите писать из среды, вам понадобится File Edit, Code Processor и для C++ - TZTester. Все три в связке. Для C# есть переделанный Петром Митричевым TZTester, что используется для Java я не знаю.
На настройку с нуля при условии, что все плагины уже найдены, я бы выделил часика полтора до матча, чтобы точно успеть.
У всех плагинов, ктоме CodeProcessor'а, очень хорошая и понятная документация.
После сессии как раз собирался написать статью про плагины.
Да не, у тебя (ничего, что на ты?:) там картинок больше. И на хабре. :-)
Кстати, я бы в темплейт обязательно добавил #include <cfloat>, так как в задачах с даблами moj генерит is_nan и что-то подобное, и без cfloat оно не скомпилится.
А ещё moj адекватно обрабатывает пустые вектора, хотя они и не так часто встречаются.
А ещё пользовательские тесты делать легче.
По крайней мере это на плюсах.
Это в ответ товарищу winger.
Но ему наверное не стоит отвыкать от KawigiEdit, так AFAIK как на онсайте вроде как moj не доступен.
Попробуй прибавить к своему шаблону недостающие инклуды из моего, может прокатит. По к райней мере вроде в этой задаче у меня были проблемы с даблами, но я их вроде бы решил. :-)
Но это читерство и, скорее всего, тебя забанят.
Если, конечно, ты не напишешь в комментах:
// Я собираюсь поставить рекорд по экстремально-быстрому кодингу!
Любая система отлично работает, пока не появляются такие молодцы. Когда они появляются, системе приходится меняться, чтобы их наказывать, и эта система теряет удобство для тех, кто играет по правилам, поскольку им теперь так или иначе приходится делать что-то, чтобы показать, что они не читят.
Общий случай, возможно не совсем применимый к арене.
То есть, он hacker, а не cracker =)
Но всё равно решение проблемы не совсем очевидное ИМХО.
Там гораздо легче на Get Started нажать.
Обязательно писать class, public? Для чего?
Horuka
По-поводу проекта - это не так раздражает, как ты думаешь.
В общем примерно делаем так:
До матча (до матча в папке, куда топкодер ложит заготовки, нужна хотя бы одна cpp-шка с прошлого раунда, если нет, надо там создать что-то dummy):
1. Создаем пустой проект,
2. Кликаем на нем справа, жмем Alt+Shift+A, идем в папку с cpp-шками от топкодера, и добавляем ее в проект.
3. Удаляем ее из проекта.
4. Идем в FAR или проводнике в эту папку и удаляем из нее все исходники (чтобы не сбивали с толку во время матча)
Во время матча.
1. Читаем задачу, в студии кликаем на проект, нажимаем Alt+Shift+A, окно Открыть сразу показывает на папку с заготовками - сразу даблкличим на нужную cpp-шку, и пишем ее.
2. Дописали, сдали, удалили ее из проекта, повторили тоже самое для второй.
В целом это достаточно быстро все получается.
Еще кстати там есть дурацкая вещь, когда открываешь задачу повторно в арене, он убивает сгенерированный код снизу. Надо либо создавать backup-ы (есть такая настройка в одном из трех плагинов, думаю в FileEdit), либо надо держать файлы открытыми в студии все, и когда топкодер перезаписывает файл, пересохранять его из студии обратно..
У меня вроде как раз отключены бакапы, но код для тестирования чудесным образом пропадает при переоткрывании задачи, уже отправленной.
А до этого была летняя сессия третьего курса такая сессия.
Могу сказать, что минут за 20 без проблем настроил связку из трёх плагинов File Edit, Code Processor и TZTester, а потом подгонял под себя шаблон генерируемого кода.
Потом обнаружил багу в TZTester - при попытке создать пустой вектор он падал. Пока челленджил увидел у кого-то инфу про модифицированный TZTester.
Потом тут подкинули много новой инфы про плагины и сессия.
Много времени? Напишите статью сами - поделитесь опытом.
Дадад, primorial, палево)
I'm trying to compile my solution for (Practice Rooms --> SRMs --> 609-624 --> 614 - SRM 448 DIV 2 : 500) but there are 2 errors
TheCardShufflingDivTwo.java:3: illegal start of type public: TheCardShufflingDivTwo.java:14: <identifier> expected };
please can you help me with problem.
here is my code
class TheCardShufflingDivTwo
{
public:
int shuffle(int n, int m)
{
int res=1;
for(int i=0;i<m;i++)
{
if((res*2)%n==0)res=n;
else res=(res*2)%n;
}
return res;
}
};