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

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

Сегодня на Тимусе стало доступно сразу несколько новых компиляторов:

  • Go 1.0.3
  • VB.NET 2010
  • Python 2.7
  • Python 3.3
  • Ruby 1.9.3
  • Haskell 7.6.1

Справка по ним еще не дописана. Для справки нам нужны самые простые решения задач 1000. A+B Problem и 1001. Обратный корень и самые эффективные решения задачи 1001. Обратный корень. Если вы пишете на этих языках и хотите помочь Тимусу, то оставляйте свои варианты решений в комментариях к этому посту.

UPD. По многочисленным просьбам добавил еще и MinGW gcc 4.7.2. Опции компилятора такие же как на Codeforces.

UPD 2. Какие вы знаете отличия MinGW g++ от Visual C++? Было бы неплохо дополнить нашу справку.

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

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

Планируется ли появление GNU C++? Не совместимости с Visual Studio раздражают сильно. Я верю что его поддержать не сильно сложнее, чем все выше перечисленное.

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

    А какую его реализацию под Windows вы бы предпочли?

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

      Ну я пользуюсь MinGW. Других у людей не встречал, хотя наверное они существуют. Тут в частности тоже он используется.

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

        Добавил MinGW gcc 4.7.2

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

          А можно ли тогда заодно добавить и GCC в режиме C++11? Ничего делать не надо, просто скопировать строку запуска для g++ и добавить к ней -std=c++11 или -std=gnu++11.

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

            Добавил для gcc -std=c11 и для g++ -std=c++11.

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

              c++11 и просто c++ надо делать разными языками, т.к. они не совместимы друг с другом.

              Например, вывод double в c++ — printf("%lf", x), а в c++11 — printf("%f", x).

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

              UPD: хотя, под убунтой вроде работает и "%f" и "%lf". Видимо, это специфика MinGW под Windows.

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

                Нет, это неверно. Во всех версиях как C, так и C++ вывод double в printf() осуществляется через %f. Да, это не совпадает со спецификатором для double в scanf().

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

                  Да, действительно надо выводить double через "%f".

                  Но почему-то до c++0x везде "%lf" тоже работал.

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

                Спасибо за информацию. Буду настраивать два отдельных языка.

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

Кто нибудь покажите пожалуйста как осуществить ввод данных на Python 3.3 в задаче 1001

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

Круто! А на поддержку scala можно надеяться?

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

Думаю стоит добавить это в справку о C++.

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

Про отличия MinGW от Visual.

  1. %lld/%I64d. Под MSVC работают то ли оба, то ли только первый, то ли в зависимости от версии. Под виндовым g++ работает только второй.
  2. long double — действительно long.
  3. Стек не выставляется из программы, должен быть выставлен на уровне строки компиляции.
  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится

    Самое бесящее меня отличие, это то что MinGW не понимает подряд идущие угловые скобки, типа как:

    pair<int,pair<int,int>>
    

    постоянно надо пробелы вставлять. В студии с этим все ок.

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

      И между прочим, в отличии от студии он делает это в соответствии со стандартом. Если -std=c++0x, то опять таки, в соответствии со стандартом не ругается.

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

    Запустил на Тимусе

    #include <stdio.h>
    int main() {
        long long x = 1ll << 60;
        printf("%lld %I64d\n", x, x);
        printf("%d %d %d\n", sizeof(int), sizeof(long), sizeof(long long));
        printf("%d %d\n", sizeof(double), sizeof(long double));
        return 0;
    }
    

    Выход:

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

      Видимо начиная с какой-то версии g++ тоже научился обрабатывать оба варианта. Правда на %lld все равно кидает warning, что "А я не знаю что это такое".

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

        Кстати, На КФе такой же вывод, несмотря на предупреждение

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

          Не уверен что на всех серверах так, но тем не менее спасибо за коммент.

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

            А вот, если на разных серверах одинаковый код выполняется по-разному, эт очень плохо

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

              i+= ++i + ++i;

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

                убедил, бывает UB.

                Однако, судя по всему, в c++ 11, lld уже должен быть по стандарту.

                draft 3242: Table 86, § 22.4.2.1.2

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

Обратный корень, простое решение, Haskell:

main = interact $ 
  unlines . reverse . map (show.sqrt.fromInteger.read) . words

Обратный корень, эффективное решение, Haskell: http://hpaste.org/82623 (по неизвестным причинам парсер CF слетает на этом коде).

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

A+B Problem, Haskell:

main = do
  [a, b] <- (map read . words) `fmap` getLine
  print (a+b)
»
12 лет назад, # |
Rev. 4   Проголосовать: нравится +4 Проголосовать: не нравится

В MinGW и Visual C++ некоторые вещи реализованы по-разному. Был случай: я решал задачу С отсюда. Послал по привычке в G++ -> получил ТЛ. Долго сидел и не мог понять почему (решение вроде бы очевидное). Потом (не помню почему) послал этот код под вижаком и получил АС. Через 10 минут я написал в блог вопрос, почему, вроде бы тормозной Visual C++, сработал быстрее чем G++? Но, увы, меня потролили, заминусовали, а ответ так и не дали.

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

Почему-то не нашел такого комментария:

Спасибо!

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

GCC теперь представлен в четырех вариантах:

  • GCC 4.7.2
  • G++ 4.7.2
  • GCC 4.7.2 C11
  • G++ 4.7.2 C++11

Изменилось поведение тестовой программы:

#include <stdio.h>
int main()
{
   long long x = 1ll << 60;
   printf("%lld\n", x);
   printf("%I64d\n", x);
   return 0;
}

Выход на GCC:

0
1152921504606846976

Выход на GCC C++11:

1152921504606846976
1152921504606846976