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

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

"Язык - мясистый снаряд во рту, служащий для подкладки зубам пищи"

(с)Даль

 

Каждая команда выбирает свой язык программирования, которого придерживается до победного конца. А какой язык выгоднее выбрать? Мы программируем на Java, т.к. данные язык содержит много плюсов, самый глобальный из них, наверное, это длинная арифметика. Но как я писала в прошлом посте, есть очень много проблем на контестах с Java. И к сожалению, они не только в Таганроге встречаются, но и на четвертьфиналах. Как в этом посте: http://alexbakhturin.blogspot.com/2009/10/09.html

Конечно всегда надо иметь план B, знать другой язык. Но в свете событий на контестах, может лучше совсем отказаться от Java?

 

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

15 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится
Ну честно говоря, все описанные в том блоге проблемы - это скорее вина организаторов. Но также есть некоторый момент неаккуратности в команде.

Короче говоря, это не повод отказываться от Java, просто стоит быть внимательнее =) ну и организаторам тоже стоит... Но у нас, в Саратове, таких проблем нет, все чОтко ;-)
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Мы всегда пишем на Java. Контестов, на которых с ней проблемы, не так много, зато плюсов у нее немало.
Из того что так сходу вспоминается: мощная стандартная библиотека (BigInteger, коллекции, регулярные выражения, парсеры и т.д.), более строгий контроль ошибок (например проверка выхода за пределы массивов по-умолчанию), многие типовые ошибки запрещены синтаксически (присваивание в условии if'а)
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
На школьных олимпиадах организаторы иногда дают машины, на которых компиляция кода (С++)  в VS или CodeBlocks занимает от 3 до 10 секунд (!). Что посоветуете делать в таких случаях? Может быть есть способы ускорить процесс? И расскажите - не бывает ли таких проблем с Java ?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Компиляторы у java очень хорошо оптимизированны.
    Это кстати позволяет постоянно компилировать код и подсвечивать в редакторе ошибки компиляции, так автоматически делает большая часть IDE для java
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Интересно, если на компьютере компиляция олимпиадной задачи C++ занимает 10 секунд, то как на нём Эклипс работать будет?
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Не по теме, но всё же. Интересно, что будет с Java после покупки Sun Oracle-ом?...
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ничего плохого явно не будет, у Oracle половина продуктов на Java ориентирована. Они в частности поэтому Sun и купили )
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Вполне может получиться, что обещанная в скором времени Java 7 - станет платной для коммерческого использования.
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        В любом случае есть OpenJDK, который под GPL
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Согласен. Но это решает проблему, только если рассматривать ее с точки зрения участия в олимпиадах (хотя никогда не пользовался OpenJDK). А вот для разработки коммерческого ПО использовать GPL - опасное дело.
          • 15 лет назад, # ^ |
              Проголосовать: нравится +12 Проголосовать: не нравится
            Там GPL с linking exception для библиотеки, так что ничего страшного для разработчика комм. ПО в OpenJDK нет
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Тогда это меняет дело. Спасибо за ценную ифнормацию!
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Не в коем случае отказываться не надо. Я бы посоветовал знать все языки в необходимом объеме, а вообще если жюри хорошее и квалифицированное - то они про каждую задачу должны гарантировать, что решение задачи существует на каком то языке (возможно на некоторых, а еще лучше - на всех).
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я ошибаюсь, или всё же жюри должно гарантировать, что решение задачи есть на ВСЕХ предложенных языках?
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Должны конечно, только вот не все так делают)
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Точно не знаю насчет всех языков - но если мне не изменяет память, на одном из официальных соревнований (вроде бы полуфинале) жюри гарантировало существование решений для всех задач именно на Java, то есть про C++ ничего не говорилось. Хотя я думаю, что например на открытом кубке - не всякую задачу можно сдать, скажем, на Ruby :-)
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Уточню: на всех предложенных в правилах языках. Opencup проходит по правилам ACM. Собственно, решение на Ruby и не нужно :)
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Во первых, вопрос видимо поуже, чем в заголовке - на чем писать: на Java или С++? Я написал на Java довольно много кода за свою жизнь и язык этот (платформу) очень люблю. Но задачи на контестах я пишу на С++. Вот почему.
  • - Более короткий и естественный синтаксис делает программы элегантнее и проще для восприятия. Например, сравните counter.put(names.get(i), counter.get(names.get(i)) + 1) и counter[names[i]]++. А если counter.get(names.get(i)) == null? А если names.get(i) == null? Думаю, что append-ы StringBuilder-а против конкатенации плюсиком std::string-а тоже проигрывают в читаемости.
  • - Дополню пункт выше - операция квадратные скобки в моем мозгу отлично инкапсулирует взятие по ключу и не важно у кого: массива, динамического массива, строки или ассоциативного массива.
  • - Все-таки, в большинстве задач если тупо переписать решение с С++ на Java, то разница скорости выполнения составит 25%-100%. По закону Мерфи иногда именно их и не хватает.
  • - На С++ можно писать без среды (довольно полезное умение), на Java у меня руки устанут.
  • - Конкретно в контестах иногда хочется передавать что-нибудь по ссылке для изменения то, что в Java является Immutable. Например, swap(int&a, int&b). Хотя, конечно, это все обычно решается.
  • - В контестах checked exceptions только мешают - получаются довольно громоздкие прототипы с throws Exception.
  • - Больший расход памяти - ну-ка сравните Array<Integer> и vector<int>?
  • - Вполне дурацкая библиотека чтения через Streams/Readers - что приводит к тому, что у каждого в решении на Java свои методы nextToken() и nextInt(), которые манипулируют со всякими StringTokenizer и т.д. Но и это вроде работает не быстро. Замечу читать scanf-ами вполне просто и естественно (хотя конечно это наследие C).
  • - Поощряю далеко не все макросы, но в макросе forn(t, n) вероятность сделать ошибку в три раза меньше, чем в for (int t = 0; t < n; t++). Так как фраза for (int i = 0; i < n; i++) была набрана уже столько раз, что набирается автоматом и перепутать где-нибудь i и t очень просто.
    С другой стороны замечу, что чем качественнее подготовлен контест - тем меньше влияют многие из описанных проблем. Поэтому если есть регулярные внутренние тренировки высокого качества (или просто подготовленные с мыслью о Java), то это одно (именно так, например в ИТМО или у нас), а если нет - то увы.
  • 15 лет назад, # |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Если брать C++ или Java - скорее дело вкуса, но видимо лучше знать на приемлемом уровне оба языка. Мы пишем на C++, при необходимости (ради готовой длинной арифметики) переходим на Java.