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

Автор heimdall, история, 8 лет назад, По-русски

Очень часто на многих олимпиадах бывает так, часто "бегаешь" от написания одной задачи к отладке/написанию/тестированию другой. Особенно сильно заметно, когда ты пишешь код на ACM-ке и у тебя 5 функций вида solA() solB() ...

Собственно вопрос, как лучше всего хранить несколько решений в одном файле и при этом минимизировать количество изменяемых строк между той версией, что сдаешь, и той, что пишешь?

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

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +19 Проголосовать: не нравится

Ответ: не надо писать решения двух задач в одном файле.

Действительно. зачем? Выигрыша от этого нет абсолютно никакого. Все современные IDE и редакторы позволяют открыть несколько файлов сразу, а путаница добавляется. И две глобальных переменных с одним именем не создашь (у меня редкая задача обходится без глобального массива a). Если называть файлы a.cpp, b.cpp и т.д., то сложности с выбором правильного никакой не будет.

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

  • »
    »
    8 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +19 Проголосовать: не нравится

    Согласен с комментарием выше, но если сильно хочется, то можно применить пространства имен:

    Код
    1. Нужно не забывать менять содержимое мэйна (вызывать правильный метод).
    2. Нужно сделать все правильно с шаблоном, если вы используете его (скопировать его в каждое пространство имен? тогда проблема с дефайнами. Скорее всего нужно будет применить компромисс, оставив часть шаблона действительно глобальным, а часть — дублировать)

    Где-то в правилах КФ был пункт, что нельзя обфусцировать решения. Считается ли это обфускацией?

    Плюс, можно так получать решения задач. Примерный порядок действий:
    1. Пользователь X решил все задачи. Соответственно, его решение по A содержит только исходники задачи A, но его посылка по E содержит исходники всех задач.
    2. Я решил A, B. Засылаю лажу по E, лишь бы претесты прошло.
    3. Я блокирую задачу E.
    4. У меня есть решение задач C, D из исходника задачи E.

    Даже если я не планировал обманывать таким образом систему, вполне может сложиться ситуация, когда я решаю A, B, D и нет идей на C (да, бывает). И если я знаю крутой тест или крайний случай в D, я могу пойти хакать и случайно увидеть решение задачи C.

    [troll_mode on] Есть ли здесь нарушение правил? [troll_mode off].

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Проблем с шаблоном никаких не будет. С дефайнами их вообще быть не может, потому что дефайны ничего не знают о неймспейсах. С typedef-ами проблем тоже не будет, потому что во внутреннем неймспейсе видны все символы из всех внешних, если их не переопределить. Так что шаблон ни в каких случаях копировать не надо.

      (Точнее, так: я не могу придумать случаев, когда одной копии шаблона в глобальном неймспейсе недостаточно.)

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится +10 Проголосовать: не нравится

        (Точнее, так: я не могу придумать случаев, когда одной копии шаблона в глобальном неймспейсе недостаточно.)

        Разные типы данных для INF. Да, он у меня в шаблоне :)

        • »
          »
          »
          »
          »
          8 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится

          Аргумент принят.

          Хотя, опять же, у нас в команде часто используется int inf = 1e9 и i64 infl = 1e18 :)