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

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

Так как я недавное решил переключится на C++ для использования в соревнованиях, хотелось бы сказать пару слов на эту тему:

  • "скриптовые" языки, к которым принадлежит Python, сейчас очень активно используются при разработке приложений для Web. Никто не отбирает лавры самого крутого языка для выжимания максимум из железа у C/C++, но, в то же время, говорить, что языки типа Python, Ruby, PHP и прочих — это такое развлечение для тех, кто на самом деле программировать не умеет — тоже неправильно. А это именно то сообщение, котороые посылают контесты, где с этими языками расситывать не на что.

  • Конкретно о Russian Code Cup — проводится под эгидой Mail.ru. Представители Mail.ru, скажите мне, в этой компании всё, что разрабатывается пишется только на Java и C++? или ещё что-то используется? Кажется несколько странным, что в России программируют только на этих двух языках (если не это имелось в виду, то почему название — Russian Code Cup, а не Russian C++ and Java Code Cup ?)

  • хорошему программисту наплевать на язык — он читает документацию и пишет на любом — я с этой формулировкой по большей части согласен, поэтому и переключаюсь на С++. Посмотрим, насколько я хороший программист. Пока моя надежда — добраться до уровня рейтингов в 2000, когда я пообвыкнусь и поучаствую в большем количестве сорвенований.

  • разница между языками типа C++ и Python большая, но ... константа. Насколько оправданы те лимиты, которые устаналиваются для программ на C++? Конкретно для Russian Code Cup, задачка про трёхцветные шахматы — максимальный размер доски — 14*50. При таком размере хорошее решение на С++ требует 0.4 секунды, хорошее решение на Python — 11 секунд. Если убавить размер до 12*50, Python начнёт умещаться в 2 секунды. Существуют ли какие-то "неправильные", brute force решения на C++, которые могут покрыть поле в 12*50 за две секунды? Сомневаюсь. Обычно в соревнованиях идёт речь о экспоненциальной или как минимум в несколько степеней разнице между правильным и неправильным решением. В такой ситуации разница между Python и C++ не принципиальна.

В общем, не хочу разводить "Питон срач", но просто хотелось выговориться. Думаю, что роль скриптовых языков будет постепенно расти, а системных — оставаться на одном уровне, так что в какой-то момент надо будет принимать решение о том, как сделать соревнования доступными для всех. В соревнованиях, где не важна чистая скорость исполнения — типа того же Google Code Jam, Python уже потихоньку приближается к Java в схватке за второе место по использованию.

Если у кого-нибудь есть мысли по этому поводу — приглашаю к вежливому диалогу.

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

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

"Обычно в соревнованиях идёт речь о экспоненциальной или как минимум в несколько степеней разнице между правильным и неправильным решением."

Burunduk1 с тобой бы точно не согласился. :)

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

    он где то крупно проигрывал из-за миллисекунд? Или наоборот? вопрос — имеет ли это смысл? если проводить конкурс по максимальной оптимизации программ в стиле обратного квадратного корня из Quake, то придётся выбирать один язык, иначе невозможно говорить о честности соревнований. или я не про то? :)

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

      Иногда важно и умение оптимизировать код. Поэтому жюри обычно и говорит, что умеет решать задачу на малом числе языков программирования. Что бы обеспечить более менее честность.

»
10 лет назад, # |
  Проголосовать: нравится -24 Проголосовать: не нравится

В задаче с Russian Code Cup тогда бы легко проходило решение за 3nm, а оно существенно легче.

Точно так же и в других задачах если делать специальный TL на Python, то на C++ будут проходить асимптотически неправильные решения.

И вообще, мне непонятно. Правила установлены, соревнования на Codeforces проводятся уже 4 года — все были довольны. И тут вдруг появляются DmitriyH и zholnin, которые судя по цвету ника не могут считать себя экспертами олимпиадного программирования, и начинают диктовать сообществу свои правила соревнований — дескать давайте огромные TL и давайте банить тех, кто смотрит задачи, но не участвует во время соревнования.

Давайте все-таки каждый будет заниматься своим делом — администрация устанавливать правила, а Вы решать задачи по существующим правилам.

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

    вижу оскорбления и попытки превратить все в срач. Я никому ничего не диктую. Я же не сказал какую- то ерунду типа "вы все не правы, если не поменяете правила, я ухожу". вопрос по существу, предложение к обсуждению. Четыре года всем нравилось- не проблема , но мир не стоит на месте. когда то изменения все равно произойдут. все меняется. И разумная администрация должна радоваться открытому обсуждению потенциальных изменений. Не им же одним за всех думать. Да, по поводу цвета ника воспринимаю как личный наезд и оскорбление. Спасибо.

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится -24 Проголосовать: не нравится

    Не горячись, остынь!

    P.S. Кто умеет делать ссылку на аудиозапись из Google Drive так, чтобы при открытии она проигралась? И возможно ли это вообще?

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

      Хорошо, спасибо, буду считать, что меня заметили — хоть и по скандальному поводу.

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

    Диктовать свои правила? Да ладно, люди высказывают свое мнение, довольно конструктивно и понятно. Лично я с автором не особо согласен, но это его мнение, на которое он имеет право. Администрация должна быть заинтересована в этом — любые высказанные замечания и пожелания указывают на возможные проблемы, слабые места, пути улучшения системы.

    А в цвет тыкать — вообще странная идея. Подавляющее большинство пользователей — "не эксперты" в твоем понимании. Хотя в терминах званий DmitriyH даже выше эксперта) Кстати, вангую — zholnin через некоторое время тоже будет) И мнение синих и зеленых — отображает взгляды большинства. Большинства, которое, в отличие от крутого меньшинства — по финалам и онсайтам не ездило; но имеет полное право высказывать свои взгляды, пожелания и предложения. В случае неадекватности — заминусуют, в противоположном случае — возможно, это поможет сделать СF чуточку лучше. Или ты предлагаешь дать право писать комментарии и создавать темы только крутым ребятам, нескольким десяткам топов, а остальным сказать — "массовка, решайте задачи молча"?

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

      Хорошо вангуешь — осталось всего 6 баллов до кандидата в мастера. Можно потом обращаться по поводу Мастера? :)

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

        Ну вот, теперь Вы уже фиолетовый. От души поздравляю!

        Оффтопик: Ваш пример еще сильнее укрепил мое негативное отношение к явлению "новички с многолетним стажем". Это я про тех, кто занимаются СП в течение длительного времени и при этом не вылазят из Div2.

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

          Спасибо за поздравления, главное завтра не провалиться обратно в первый дивизион. :) Но даже если так — главное продолжать учиться и тренироваться и буду постепенно подниматься.

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

          Раздражают люди, которые "типа хотят" соревноваться, "отращивать" рейтинг, показывать результаты, но при этом отказываются пахать. То есть на словах уже гроссмейстер, а тот факт, что большинству людей для достижения хороших результатов помимо соревнований надо МНОГО тренироваться (понимаю, что может и не всем, но большинству), что это реально часы и часы решения задач, переписывания алгоритмов и чтения книжек — это они прикидываются, что не понимают. Вот к таким людям у меня негативное отношение. Причём это касается не только спортивного программирования — это в любой сфере жизни.

          Типичный пример — на GCJ форумах, какждый год после квалификационного раунда влезает какой-нибудь участник и спрашивает "Я прошёл квалификацию, но решил всего одну задачу. Подскажите, что бы такое прочитать перед первым раундом, чтобы пройти дальше. Очень хочется футболку". Обычно нарывается на фразу типа "Тут всего три недели осталось — успеешь прочитать разве что всего Кнута. Удачи!"

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

Тема очень баянистая, на самом деле.

Смотрите: ограничения должны быть подобраны по логике вещей так, чтобы асимптотически правильное и написанное без особых оптимизаций решение на "медленных" языках заходило в ТЛ по крайней мере с двухкратным запасом, а оптимизированное асимптотически неправильное решение на "быстрых" языках превышало ТЛ тоже по крайней мере в два раза. Очевидно, что при стремлении размера входных данных к бесконечности когда-то наступит такой момент, что время работы наших двух эталонных решений будет различаться в нужные нам 4 раза.

Но если "медленный" язык реально очень медленный, то этот нужный нам момент наступит на очень большом размере входных данных. В соревнованиях вроде CodeJam при запуске решения Вы тратите свое собственное время, поэтому Питон там поддерживать очень даже возможно. Но если его поддерживать там, где запуск решения происходит на сервере, то из-за огромных тестов и ТЛов тестирование будет идти слишком медленно.

Извиняюсь за немного сумбурный текст, но, думаю, Вы меня поняли.

P.S. Доступность соревнований для всех — ИМХО, сомнительное преимущество. Тем более, я искренне сомневаюсь в том, что найдется ощутимое количество людей, сильных в алгоритмах и при этом знающих Питон, но не знающих C++/Java.

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

    Проблему разницы "быстрых" и "медленных" языков можно решить просто устанавливая разные тайм лимиты для разных языков. Хотя почему-то никто не использует этот подход =(

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

      Предлагаете для каждого языка ставить свой таймлимит? :)

      Кстати, на опенкапе это еще как используется. Но там список языков не такой внушительный.

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

        Почему-бы и нет ?

        Написать бенчмарки для разных языков, например как тут и выствлять TL пропорционально.

        Например если java в среднем работает в 0.3 раза быстрее чем C++, то и тайм лимит ей соответствующий.

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

          Например, я в том топике про бенчмарки написал комментарий, замечание из которого г-ном Мирзаяновым было де-факто проигнорировано.

          Еще пример: мы выставляем коэффициент для Java. Как бы Вы сравнили производительность с C++: по времени работы сортировки или по времени работы Дейкстры со стандартной приоритетной очередью?

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

            Тут вы правы, когда требуется плодить объекты, время работы сильно зависит от ̶J̶I̶T̶-̶о̶п̶т̶и̶м̶и̶з̶а̶ц̶и̶и рандома.

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

              Где я писал про рандом, я имел в виду как раз не рандом, а средний случай задачи сортировки :).

              UPD. Ой блин, я Вас неправильно понял. Пора спать идти уже...

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

          >java в среднем работает в 0.3 раза быстрее чем C++

          )))))))))

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

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

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

        Я понимаю, что для некоторых языков время сильно зависит от реализации. Например если написать класс Point в java и активно его использовать в узких местах, то можно сильно проиграть, в отличии от C++, в котором такое "нововведение" никак не скажется на времени.

        Однако можно оценить среднюю разницу и применять ко всем задачам.

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

    последнее — про людей не знающих алгортмы — в чем то проблема яйца и курицы. Конечно нет, потому что им негде соревноваться.

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

В соревнованиях, где не важна чистая скорость исполнения — типа того же Google Code Jam — да ладно, иногда на GCJ и на С++ можно написать какую-то ересь, которая обрабатывает large input несколько минут. Задачи разные бывают.

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

    Я про то, что в Google Codejam задачи подобраны так, что почти на любом языке можно написать решение, которое укладывается в лимит. Могу отвечать за Python — я прорешал уже почти всё, что есть у них в архивах — пока только одна задача, которая на мой взгляд нерешаема на Python просто потому что он слишком медленный. Правда эту задачу и во время контеста никто не решил.

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

Хорошо, спасибо все за Ваше мнение, если можно суммирую:

Позиция 1 — C++ это база и любой программист, который достаточно профессионален, его всё равно когда-то изучит. Поэтому нет смысла ориентироваться на разные языки программирования. Я этот подход понимаю и в принципе могу его принять. Меня в этой ситуации больше даже расстраивает половинчатость ситуации — вроде бы языки в списке есть, а решать ими что-то на нормальном уровне нельзя. Было бы лучше просто признать эту позицию и написать чёрным по белому. Это даже больше относится к ребятам типа Russian Code Cup, потому что они просто пишут "участвовать можно на C++, Java, Python, ..."

Позиция 2 — Есть смысл менять правила, но это слишком сложно. Аргумент по поводу того, что иногда N должно быть слишком большой для того, чтобы "выявить" ассимптоматические различия — принимаю. Также согласен, что попытка выставлять разные TL добавляет работы организаторам и может привести к спорам о справедливости соревнования. Использование этой позиции для того, чтобы просто ничего не делать на мой взгляд не очень правильное.

По поводу хороших программистов на Python — да, если мы сделаем Python конкурентноспособным, к нам не придёт ещё один Пётр Митричев или Геннадий Короткевич. Но глядя на этот график:

http://www.go-hero.net/jam/13/round/4 Можно сказать, что программисты уровня evader точно могут подтянуться. (на этом моя "месть" за тыкание в рейтинг закончена). Это довольно серьёзный 2 раунд Codejam, где 45 человек пишуших на Python попали в 500 лучших. Я в том раунде вылетел.

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

Надеюсь никого не обидел — вижу, что тема моя пока оценена в -4, видимо большинство считает её бесмысленно-провокационной. Приношу извинения.

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

Боюсь это очень старая тема и вы вряд ли что-то полезное из неё вытрясти сможете.

К сожалению даже по блогам на CodeForces вы зачастую можете сделать некоторые забавные наблюдения:

  • порой вопрос сводится не к тому как решить задачу а как написать код чтобы она "зашла" в лимиты;
  • с некоторыми задачами бывает забавно — можно пропихнуть неэффективное решение на C, а на Java только эффективное, которое имел в виду автор;
  • топовые участники бывает "переключаются" между парой языков в ходе контеста ради какой-то специфической задачи.

Всё это специфика СП в том виде в котором оно сформировалось — как тот факт что собак на выставках красят "потому что ведь другие тоже красят". Так что тут вы вряд ли что-то поменяете :)

Хорошие новости — как минимум в марафонах на TC питон вполне доступен. Ну или придумайте и реализуйте свой формат соревнований :)

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

    Посмотрите на последний отборочный раунд марафона и там будет заметно как влиял выбор языка ;)

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

Есть такое очевидное высказывание, что инструмент нужно выбирать под задачу.

В промышленном программировании (тот же Web, вами упомянутый) от выбора инструмента зачастую зависит успех предприятия. Ну не выдержит нагрузки ваш сайт на вашем_любимом_скриптовом_языке_на_котором_так_прикольно_писать — предложите меньшему количеству пользователей на него заходить или терпеть загрузки страниц в секунды? Наверно ведь нет. Никого не интересует ваш инструмент/технологии/алгоритмы, интересует только конечный результат. Как говорят в суровом энтерпрайзе — у системы есть два состояния "клиент доволен или клиент не доволен" :-) И если разгневанный клиент говорит "Что за хрень? Почему мой биржевой робот для высокочастотного трейдинга такой слоупок?", то вы ведь не ответите: "Зато всё на крутом Питоне!"

Мы живём в мире ограничений и от того, насколько вы можете удачно подобрать конкретное решение (которое ведёт к заветному результату) к конкретной задаче зависит ваш успех (частичный успех при этом никого как правило не волнует).

Тут ровно та же ситуация — принимаете правила игры на свой страх и риск. Вообще может быть ситуация хуже — рискует не уложиться вообще любое решение, которое не эталонное, но с этим стараются бороться. Но не всегда есть возможность написать несколько решений на разных языках или поставить различные TL в OnlineJudge. Подготовка задачи и без того иногда крайне напряжное занятие, да и авторы бывают разные — кто-то задумывается о таких проблемах, а кто-то просто хочет придумать крутую задачу.

Те подходы, которые сейчас используются авторами, уже весьма устоялись и не вносят лишних затруднений в и так непростой процесс подготовки задач/проведения контестов и дают возможность нам всем радоваться нескончаемым потокам новых идей авторов. Стоит ли усложнять (считай тормозить) процесс появления новых задач/проведения контестов, ради саппорта всех_всех_языков — пока видимо ответ отрицательный.

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

    Ну не выдержит нагрузки ваш сайт на вашем_любимом_скриптовом_языке_на_котором_так_прикольно_писать

    Вы что-то странное говорите. Большой сайт нагрузки на любом языке бы не выдержал если бы не было горизонтального масштабирования.

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

    Покажите мне веб сайт на C++.

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

        Спасибо — буду знать, что такие сайты есть, пусть это и сайт из чёрного списка.

        Но дальнейшие объяснения выглядят немного странно — то есть они пишут, что им нужно быстро обрабатывать большие объемы информации без использования DB. Т.е. либо DB сделана кривовато — без правильно шардинга — либо он имеет в виду технологию типа memcache. Понятно, что если они не хотели пользоваться memcache, и решили написать его сами с нуля — оптимально писать это на C++. Ну и потом раздел про то, что "это не для всех" подробно расписывает многие недостатки. Думаю, довольно общее мнение, что эти недостатки сказываются на RAD. По крайней мере так говорили ребята из курса по SaaS на eDx.

        Потом я таже читал что, например, Facebook допиливал PHP, превратив его в несколько другой язык, больше подходящий для их применения и более оптимизированный по скорости. Естественно они это делали на C++.

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

          какой черный список?

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

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

            Безотносительно того, прав он был или нет. Если не в курсе, то я про недавнюю историю с новым директором Mozilla и травлей, которую инициировал владелец OkCupid.

            Я уже представляю, как в каком-нибудь 2030 году меня откуда-нибудь уволят представители "воинствующих зелёных" за то, что я в 2014 году смотрел Гран При Формулы 1, что очень неэкологично.

            Так что у меня он в чёрном списке теперь — единственная проблема, что я всё равно не пользуюсь сайтами знакомств, так что это никак не влияет на мои действия.

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

              ваш персональный?

              а ну да. есть такое за okcupid. они из своего блога удаляли неблагоприятную информацию для LGBT-апологетики.

              ........... Кстати, в том же блоге oktrends выкладывался еще один интересный график, который впоследствии был удалён. А почему? — он как-то создавал подозрение -- самое простое объяснение по Оккаму -- что мужчины низкого и очень высокого роста, на которых женщины обращают меньше внимания, вынуждены чаще сексоваться с другими мужчинами.

              оригинал(удаленный): http://blog.okcupid.com/index.php/shorter-men-are-more-likely-to-be-gay/

              перепост графика: http://blog.timesunion.com/kristi/shorter-men-more-likely-to-be-gay/24152/

              вебархив: http://web.archive.org/web/20100305142348/http://blog.okcupid.com/index.php/shorter-men-are-more-likely-to-be-gay/

              конечно, эти данные можно объяснить и другими способами, но авторы блога решили просто удалить пост.

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

                Я не против всей этой LGBT темы, пусть кто что хочет, тот то и делает. У меня вообще на эту тему очень специфичная позиция, меня гей-активисты называют гомофобом, а гомофобы — гей-активистом :).

                Пробема тут другого рода — когда какое-то меньшинство борется за свои права, в когда-то наступает момент, когда оно достигло своих целей, но остановиться не может и начинает бороться за притеснение большинства. По твоему посту — LGBT успешно доказали неправильность некоторых научных теорий касательно LGBT. Вроде бы win. Но оставновиться на этом они не смогли и теперь любая теория, которая только затрагивает этот вопрос, объявляется ненаучной и если учёный настаивает на своём праве "объективно изучить вопрос" — устраивается травля.

                Точно также с этими браками — добились в штате Калифорния разрешения заключать однополые браки. Вроде бы win. Нет, не могут на этом остановиться — надо запросить списки жертвователей против закона и проверять всех людей по этому списку на тот случай, если получиться кого-нибудь затравить.

                Так что тут вопрос чувства меры — те, у кого не получается во время остановиться, в какой-то момент очень больно наступают на грабли.

                Несколько нестандартная тема для Codeforces. Можно схлопотать много минусов. Интересно, насколько отрицательным должен быть "Вклад", чтобы админ применил против меня какие-то наказательные действия...

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