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

Автор SyFy, 14 лет назад, По-русски
Обфускация кода.
Можно ли правилами КодФорса?
Думаю, что нельзя, но в правилах (а их вообще я толком не нашел, нет нужного так всем FAQ) это не отмечено.

А в новом формате КодФорса, обфускация может спасти от взломов.
  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Думаю раз не запрещено значит можно. А что в этом такого?
14 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится
Ну будет запрещена, наверное. А в правилах это не отмечено, потому что да, их еще нет.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А смысл? Уж лучше больше закодить, или больше похакать.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Если не взломают, так на систестах упадёшь. Тебе жалко 100 баллов кому то отдать, за влом гавнорешения? На таблицу итоговую это мало как повлияет.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      А теперь представь, что это правилами разрешено, и половина народу стала обфусцировать свой код. Тебе все еще будет не жалко?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Не там написал, еще раз:
      Ну на реальном контесте: да, жалко 100 баллов. Пусть лучше на систестах упадет.
      Правда лучший вариант, если жаль это написать без ошибок.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Тут конечно есть еще такой момент, когда ты не уверен в решении, и хочешь, чтобы твой код взламывали. Тогда, понятно, обфусцировать невыгодно :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Ну на реальном контесте: да, жалко 100 баллов. Пусть лучше на систестах упадет.
Правда лучший вариант, если жаль это написать без ошибок.
14 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится
Обфускация будет запрещена
  • 14 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится
    А как это будет контролироваться?
    • 14 лет назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится
      Я думаю, по заявкам слушателей будет проверятся и злодеи будут дисквалифицироваться. Лишь бы мои перменные в стиле c, cc, ccc, cccc не показались кому-то обфусцированием :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        А есть еще подлые вещи типа в начале кода

        const int O = 1;
        const int l = 0;


        дальше где-то в начале мейна
        if( blabla ) return l;

        чувак открывает и думает - вот это нишутя, зачем он единицу возвращает надо же ноль, и как бы дальше печаль
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Такой вопрос, немного оффтоп, но по смежной теме: Стоит ли использовать всякие привычные, понятные и удобные, например, дефайны в каких-либо больших и серьёзных проектах? Или лучше не стоит, чтобы потом не искать всякие нетривиальные баги?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Думаю не стоит.. ибо не красивый это код... Люди стремятся к объектности - объекстность делает код красивым, а дефайны, имхо, вообще в гавно код превращают
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Неужели это говнокод (ссылка)? :(
      Там всего лишь один дефайн.
      #define loop(i,a,b) for(int i=a;i<b;++i)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        И в коде это выглядит вот так:
        loop ( i, 0, c.size() )
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Не знаю.. может многие со мной и не согласятся, но мне очень не нравятся дефайны. Помимо некрасивости, их очень сложно челленджить.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Да, я считаю, что это плохой код. Строка с loop ничем не лучше, чем строка с for — ни краткости, ни понятности, ни выразительности не прибавилось. Зато при компиляции со всеми предупреждениями g++ 4.x тебе скажет, что ты сравниваешь знаковый тип (i) с беззнаковым (.size). А значит, когда тебе действительно понадобится получить полезную информацию из предупреждений (в других местах программы что-то будет не работать), ты потратишь дополнительное время на то, чтобы разобраться, откуда в этом месте кода предупреждение. Поскольку оно надёжно обфусцировано дефайном, времени уйдёт больше, чем на аналогичную запись с for-ом.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Если ты хочешь, чтобы кто-то когда-то понял твой код — его нужно делать максимально понятным. А даже на топкодере дефайны у всех разные (бывают версии FOR, FORN, REP, заводящие переменную цикла, а бывают — нет; тип этой переменной тоже не все задают одинаковый; цикл бывает до n и до n - 1; ...).

    У меня встречный вопрос: в чём смысл таких дефайнов? Они более выразительны? Их быстрее набирать? Один раз запомнив, их легче читать? А может, наоборот, это чтобы на челлендже вас другие читать не стали?

    Если стандартные средства Си (без дефайнов) так уж неудобны — возможно, вам больше подойдёт другой цельный язык, более понятный, интуитивный и богатый, чем костыли к Си, которые у всех получаются разными?
    • 14 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      > Зато при компиляции со всеми предупреждениями g++ 4.x тебе скажет, что ты сравниваешь знаковый тип (i) с беззнаковым (.size).
      Это точно. :)

      > Поскольку оно надёжно обфусцировано дефайном...
      Цель усложнения кода не преследую.

      > У меня встречный вопрос: в чём смысл таких дефайнов?
      Лично для меня в скорости. Впрочем сейчас ещё не поздно переучиться быстро писать обычный for. :-)

      Gassa, спасибо за конструктивную критику.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        >> Поскольку оно надёжно обфусцировано дефайном...
        > Цель усложнения кода не преследую.
        Дык, оно само так получается. В данном случае будет так:

        a.cpp:12: warning: comparison between signed and unsigned integer expressions

        Смотришь на 12 строку, а там нет оператора сравнения. Нужно найти (4 строка) и прочитать (увидеть знак <) дефайн, чтобы понять. И не просто прочитать 4-ю строку, а подставить глазами вместо b то, что указано в 12 строке. На это тратится время и внимание.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Да, что-то в этом есть.
          • 14 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится

            У нас в команде принято писать 

            #define forn(i, n) for(int i = 0; i < int(n); ++i)

            При компиляции ничего не дает. Главное достоинство в том, что переменная i пишеться только один раз и это спасает от ошибок типа

            for(int j = 0; j < n; ++i)

            В олимпиадах полезно. А в больших проектах - нельзя

            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Буду подсаживать свою команду на этот дефайн. :D
              Спасибо.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Еще один вопрос. Разрешен ли prewritten code?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Помню такой вопрос уже где-то поднимался и ответ был "Да".
    • 14 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Нашел я этот пост. Если память мне не изменяет, это последнее упоминание prewritten'a на Codeforces. При этом ответа на вопрос я там не увидел - только предложения.

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

Ок. Я прочитал все комментарии и у меня остался один вопрос.

А что такое обфускация?

Создание умышленно непонятного кода? 

А можно примеры?

  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    > Создание умышленно непонятного кода?
    Да.

    Нагуглил вот такой пример: ссылка. Поржал от души. :D
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ха) да, реально поржать можно) код классный)
      А вот мне интересно, на ТопКодере обфускация вообще возможна? Введены ли какие-то штрафы за это или там просто до этого так сказать не додумались?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Додумались. Там она, если не ошибаюсь, запрещена.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Когда-то давно это обсуждали на форуме и там даже поднялся случай, после которого и был введен запрет на обфускацию)

        Дело было лет 7 назад, в одном из 1XX SRM, где один товарищ написал код вроде такого:

        int foo() {
            if (var == l) {
        
            }
        //много кода
        }
        private int l = 0;
        
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    А вот это мне и моему сокоманднику нечего было делать и мы решили немного изуродовать алгоритм Диница. Не знаю, почему на codepad'е оно не компилируется, на том онлайн джадже, куда оно сдавалось с компиляцией проблем не возникало.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      Красотище))
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Странно, а может и не странно, что оно сдалось.
      #define llll1l1l break
      #define llll1l1l 63<
      Ему ешё почему-то long long не нравится... А вообще, конечно, красотища... :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      на ideone компилируется))

      http://ideone.com/gzXVd
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Существуют соревнования по обфускации кода. Например: www.ioccc.org. Прочитать про это соревнование можно здесь.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вопрос соответственно возникает: а когда будет создан КодФорсовский собственный ФАК? 
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Он уже создан - http://mirror.codeforces.com/blog/entry/417.
    Сейчас правда ещё пополняется. :-)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      упс)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      FAQ из пяти(шести) вопросов - это конечно жесть)
      Я про нормальный и полный ФАК. Который можно было бы, как на ТопКодере найти на главной или на странице соревнований.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Блин, он будет на главной. А ты его напишешь?

        Сейчас потихоньку разные вопросы собираются как раз в ту тему, которую мы указали.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Так давайте дружно соберемся и напишем его, а уже со временем и некими изменениями будем дополнять существующих ФАК.
          Просто новичкам, которые недавно пришли, стоило бы ознакомиться с правилами.
          Простой пример с той же обфускацией кода. ФАКа нет, а он на контесте запутал код, наказание явно должно последовать, а потом слышим "А я не знал! А где про это было написано?"

          Посты ведь не все подряд читают, да и много их тут.
          Много и тех постов, которые давно канули в лету.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ну вот. Если что-то такое важное увидим - в FAQ.

            Всему своё время.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ну предлагай, что еще добавить :) Обфускация сейчас и не актуальна, все равно рейтинговые контесты по правилам ACM.
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Возможно скоро будет первый реитинговый контест по системе Codeforces.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Пропиарюсь. Или вопрос про официальные правила?