Блог пользователя daftcoder

Автор daftcoder, 14 лет назад, По-русски

Привет, я 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)

  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
на delphi можно писать?
14 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
Как по мне, коротко стоит упомянуть о важной вещи - плагинах ТопКодер. Они позволяют хоть и не значительно(в большинстве случаев), но все-таки ускорить процесс решения задач. Почитать о них можно здесь.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я хотел, чтобы о плагинах для каждого языка написал кто-нибудь, у кого большой опыт в работе с ними.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      По сути - два основных варианта.
      Если вы относитесь нормально к тому, чтобы писать прямо в окне арены, то вам нужен KawigiEdit. Это в том случае, если вы готовы жить без автокомплита и дебага. Отличный плагин, позволяет очень легко переключаться между языками, сразу подставляет паттерн.
      Из недостатков - там первая кнопка, что-то типа Generate Code, очищает ваш код. О-о-оочень неприятно бывает :о) Просто случайн можно нажать потому что.
      На настройку с нуля я бы выделил пол часа чтобы успеть гарантированно.

      Если вы хотите писать из среды, вам понадобится File Edit, Code Processor и для C++ - TZTester. Все три в связке. Для C# есть переделанный Петром Митричевым TZTester, что используется для Java я не знаю.
      На настройку с нуля при условии, что все плагины уже найдены, я бы выделил часика полтора до матча, чтобы точно успеть.

      У всех плагинов, ктоме CodeProcessor'а, очень хорошая и понятная документация.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Спс. Надеюсь разберусь с настройкой. %)
      • 14 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        Я пользуюсь очень удобным плагином moj.
        Плюсы по сравнению с TZTester: в студии нормально обрабатываются пустые векторы, выводится погрешность, если ответ - дабл (кстати, считается она как на ТС при проверке), выводится время(уже не помню, есть ли это в тзтестере).
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Спасибо!
          После сессии как раз собирался написать статью про плагины.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              • 13 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Ну вот. Только захотелось похвастаться, как тут же обломали. Что же, бывает :)
                • 13 лет назад, # ^ |
                  Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                  =======================
                  Да не, у тебя (ничего, что на ты?:) там картинок больше. И на хабре. :-)

                  Кстати, я бы в темплейт обязательно добавил #include <cfloat>, так как в задачах с даблами moj генерит is_nan и что-то подобное, и без cfloat оно не скомпилится.

                  А ещё moj адекватно обрабатывает пустые вектора, хотя они и не так часто встречаются.

                  А ещё пользовательские тесты делать легче.

                  По крайней мере это на плюсах.

                  Это в ответ товарищу winger.

                  Но ему наверное не стоит отвыкать от KawigiEdit, так AFAIK как на онсайте вроде как moj не доступен.
                  • 13 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    На ты так на ты.

                    Я долго боролся с ошибками на даблах. Не помог ни <cfloat>, ни <float.h>, ни еще несколько других, подключенных на "а вдруг". Зато помог собственноручный (нагугленный) isnan() и isinf(), который можно увидеть в моем шаблоне ниже класса.
                    • 13 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      ===================
                      Попробуй прибавить к своему шаблону недостающие инклуды из моего, может прокатит. По к райней мере вроде в этой задаче у меня были проблемы с даблами, но я их вроде бы решил. :-)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Насколько я помню, Kawigi дружит с Ctrl-Z. Поэтому кнопка Generate Code отменяема.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          С ctrl+Z дружит. Но Generate Code не отменяется, специально только что проверил.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Вроде же можно пользовать только оффициальные плагины на контестах?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Для джавы использую CodeProcessor + FileEdit + ExampleBuilder, установка подробно описана тут. Правда, в темплейте отсутствовали функции сравнения double'ов, пришлось их добавить ручками. По идее, для остальных языков это тоже должно работать, но я не проверял.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
спасибо за статью.
вопрос: с какого момента идет отчет времени для определенной задачи, после открытия задачи или после начала контеста?

если после открытие задачи, от я придумал схему получения максимального балла за задачу:
просим какого-либо из участников дать нам условие, читаем... решаем... решили!!! ОТКРЫЛИ ЗАДАЧУ(эту же но у себя) и тут же отправили и получили максимальный бал! 
так прокатит???

  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    то есть это - " Очки, которые вы получите за задачу, определяются разностью времени открытия задачи и посылки её (Submit)." я понял, но тогда ведь можно сделать так как я написал? и получить максимальный бал?
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      все понял так можно делать! Но это уже не программирование, это битва за куски рейтинга. И не хорошо так делать, поэтому не надо так делать, нужно программировать.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Сделать можно. :)
    Но это читерство и, скорее всего, тебя забанят.
    Если, конечно, ты не напишешь в комментах:
    // Я собираюсь поставить рекорд по экстремально-быстрому кодингу!
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Всегда очень неуважительно относился к людям, которые "придумывают" такие гениальные планы.
    Любая система отлично работает, пока не появляются такие молодцы. Когда они появляются, системе приходится  меняться, чтобы их наказывать, и эта система теряет удобство для тех, кто играет по правилам, поскольку им теперь так или иначе приходится делать что-то, чтобы показать, что они не читят.

    Общий случай, возможно не совсем применимый к арене.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      Мне кажется, Ght руководствовался не жаждой накрутки рейтинга, а желанием разобраться в том, как работает система =)
      То есть, он hacker, а не cracker =)
14 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
По первой проблеме, если дочитать главную страницу www.topcoder.com, то там внизу будут две большие кнопки: DESIGN и DEVELOP. Хотя прочитать предложение по-английски, конечно, придётся: "Compete in Coding & Software Contests.". Но, если этого не уметь, как потом читать условия задач?..
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ок, спсибо.
    Но всё равно решение проблемы не совсем очевидное ИМХО.
    Там гораздо легче на Get Started нажать.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
У меня вопрос.
Обязательно писать class, public? Для чего?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Нет. Можно писать struct :O)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    На TC нету обычного ввода и вывода(в смысле с консоли или из файла). Ты должен написать класс, содержащий функцию, аргументами которой являются входные данные, а возвращать она должна ответ на задачу.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Да обязательно. Потому что ты реализуешь класс и у их тестера должна быть возможность вызвать названный метод.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
>> После сессии как раз собирался написать статью про плагины.

Аффтар, напиши, пожалуйста, статью, а новички, включая меня, тебя заплюсуют.

Пока нет статьи, у меня есть вопрос. Писал на TC штук 10 матчей в Kawigi Edit - неудобно, что нет дебага ну и подчеркиваний ошибок прям по ходу кодинга, так что решил перейти на связку из трех плагинов.

Прочитал я вот тут http://www.topcoder.com/wiki/display/tc/How+to+install+The+Arena+plug-ins, как делать, поставил, попробовал и сразу нарвался на проблему. Я пишу в Студии, десятой, но наверное это непринципиально. Так вот плагины делают мне просто cpp-файл, а в студии ведь нужно оформлять это дело в виде проекта (нужно?). Нужно ли каждый раз ручками заталкивать файл в проект? Плюс в файле оказалось условие задачи, незакомментированное.

Что делать?
Объясните, пожалуйста, поподробнее стадию после установки плагинов - "18) Enjoy Coding." явно недостаточно. 
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да-да! Аффтар пиши! от меня тоже плюс!
    Я как-то пробовал в 2010 писать, но задрало файлы в проект кидать. А мне подсказки и дополнения нужны, чтобы быстрее писать.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Учитывая, что у тебя на аве девушка, у меня созрел вопрос.

      Кто знает, сколько девушек на CodeForces? Тот же вопрос по поводу ТопКодера.

      Я знаю только Наталью саратовскую, ну не лично, а слышал про нее:)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я ещё знаю её сестру - Polichka и, судя по аватарке, ktuan.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Да ты поищи пару восьмимартовских тредов - там где-то в комментах как раз список местных девушек составляли.
      • 13 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится
        Эгей, а как же Nickolas - по-моему, симпатичный и успешный ветеран обоих сайтов... ;-)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    AFAIK - такого способа нету. Можно зафиксировать название файла, но тогда надо будет его переименовывать после написания задачи. В Java, к счастью, такой проблемы нету - все файлы в папке проекта автоматически в проект добавляются
    По поводу условия - в FileEdit надо из тимплейта вырезать сверху таг, что-то типа PROBLEM_DESCRIPTION
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    По-поводу условия задачи - иди в Options->Editors или типа того, там либо у FileEdit либо у TZTester будет возможность отключить показ условия. Скорее всего это надо идти в настройки FileEdit и убрать там в паттерне условие в начале.

    По-поводу проекта - это не так раздражает, как ты думаешь.
    В общем примерно делаем так:
    До матча (до матча в папке, куда топкодер ложит заготовки, нужна хотя бы одна cpp-шка с прошлого раунда, если нет, надо там создать что-то dummy):
    1. Создаем пустой проект,
    2. Кликаем на нем справа, жмем Alt+Shift+A, идем в папку с cpp-шками от топкодера, и добавляем ее в проект.
    3. Удаляем ее из проекта.
    4. Идем в FAR или проводнике в эту папку и удаляем из нее все исходники (чтобы не сбивали с толку во время матча)

    Во время матча.
    1. Читаем задачу, в студии кликаем на проект, нажимаем Alt+Shift+A, окно Открыть сразу показывает на папку с заготовками - сразу даблкличим на нужную cpp-шку, и пишем ее.
    2. Дописали, сдали, удалили ее из проекта, повторили тоже самое для второй.

    В целом это достаточно быстро все получается.

    Еще кстати там есть дурацкая вещь, когда открываешь задачу повторно в арене, он убивает сгенерированный код снизу. Надо либо создавать backup-ы (есть такая настройка в одном из трех плагинов, думаю в FileEdit), либо надо держать файлы открытыми в студии все, и когда топкодер перезаписывает файл, пересохранять его из студии обратно..
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Как раз надо в файлэдите отключить бекап - тогда он оставляет существующий файл
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        И не удаляет внизу код для тестирования?
        У меня вроде как раз отключены бакапы, но код для тестирования чудесным образом пропадает при переоткрывании задачи, уже отправленной.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Хм, я пользую moj, а не TZTester. У меня не пропадает вроде
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну вроде сделал все так, а при запуске пишет
      "1>LINK : fatal error LNK1561: entry point must be defined"

      Entry Point для плагинов я вводил при установке. В чем тут может быть проблема?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Если это в вижуалки такое - это проблема с вижуалкой. EntryPoint'ы - это для самой арены
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    у KawigiEdit есть кнопочка Save. жмёшь её и пишешь в своей любимой IDE
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я на десять дней уехал отдохнуть от цивилизации.
    А до этого была летняя сессия третьего курса такая сессия.

    Могу сказать, что минут за 20 без проблем настроил связку из трёх плагинов File Edit, Code Processor и TZTester, а потом подгонял под себя шаблон генерируемого кода.

    Потом обнаружил багу в TZTester - при попытке создать пустой вектор он падал. Пока челленджил увидел у кого-то инфу про модифицированный TZTester.

    Потом тут подкинули много новой инфы про плагины и сессия.

    Много времени? Напишите статью сами - поделитесь опытом.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Как устоновить KawigiEdit в интерфейсе?
13 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
Раз уж ты кинул ссылку на этот пост, то и спрошу. А почему на TopCoder никого не находится ни по нику daftcoder, ни по нику dAFTc0d3r?
13 лет назад, # |
Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

  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;
}
};

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
thanks