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

Автор rng_58, история, 6 лет назад, По-английски

I'm preparing for upcoming GCJ Finals. This year GCJ supports only Linux, and I want to learn how to compile solutions on Linux (I think I used it 9 years ago in IOI but completely forgot how to do that...).

Suppose that A.cpp, Main.java, A.py are source codes, A.in is the input, and you want to output to A.out.

On Windows+Cygwin, I usually do the following:

  • g++ -Wl,--stack,268435456 A.cpp -O2
  • ./a < A.in | tee A.out
  • javac Main.java
  • java Main < A.in | tee A.out
  • python A.py

What commands do the same things on Linux?

The following things are installed on the machine:

  • Debian Linux 9.4
  • C++ 6.3.0
  • Java 7 2.2.5
  • Python 2 2.7.13
Теги gcj, dcj
  • Проголосовать: нравится
  • +52
  • Проголосовать: не нравится

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

For C++, to obtain the same outcome:

ulimit -s 268435456
g++ A.cpp -O2 -o A
./A < A.in | tee A.out

It may be possible to restrict stack size per app, but I couldn't find how. I'm suggesting ulimit, it sets stack size per bash session, I hope it's similar enough. I believe the other commands will be exactly the same as your Cygwin ones.

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

    Thank you! So, can we assume that "C++ 6.3.0" on Debian Linux means g++?

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

    or use a single command: g++ A.cpp -O2 -o A && ./A < A.in | tee A.out

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

    I think that changing local stack size is a dangerous thing to do unless organizers confirmed that it would be the same on the testing system.

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

    For those who didn't know (like me 5 minutes ago): tee writes to a file and to stdout. And it's named like that because that command has the same effect as a T junction. :-D

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

    Whenever tee is used, I would recommend using it with |&, not just |. It captures stderr as well. If some error occurs and it is not directed to resulting log, this can be very confusing later.

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

Does g++ on Cygwin compile + run?

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

    It just compiles. To run the program "./a" works. (I believe at least one of "./a", "./a.exe", or "./a.out" should work on Linux).

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

      Yeah, I was asking, because < A.in | tee A.out should be part of running, not compiling, right?

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

      a.out is the default output executable if you don't specify it with -o, otherwise the filename is the exact string you passed with -o, no extra extensions (Linux doesn't use .exe, but you can give it whatever extension you want)

      Cygwin shell is almost identical to Linux shell, so you shouldn't have much trouble.

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

Instead of ./a < A.in | tee A.out you can simply write ./a < A.in > A.out

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

    ./a < A.in | tee A.out == ./a < A.in > A.out && cat A.out, it's not the same thing.

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

      Actually two things you printed are also not same

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

        How so?

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

            But for problems where the input is just a file, isn't it the same thing? (assuming the file isn't a FIFO special file) Also, you can replace && by ; in the first example.

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

              If your program crashes on the input file, it also won't show the output. ; is better.

              Although my main issue is that if your program runs for significant amount of time, with tee you will see the output on the run, while with cat only after everything finishes. In the case of GCJ problems, this may mean you notice in time that there is something wrong with your output and have enough time to fix it.

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

So actual software they have, I must say.

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

rm -rf *

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

I do not see any people mentioning the --std=c++11 or --std=c++0x or similar flags. You need these for range-based for loops, which some of us like to use. :)