BMS, Movie, Illustrations, Programming

paiza.​io 及び @​paiza_run で、プログラムにコマンドライン引数を送る

コマンドライン引数を使いたい、と思うこともあまり無いとは思いますが、一応出来たので書いておきます。

paiza.io でコマンドライン引数を使いたい場合

例えば、

#include <stdio.h>
main(int argc,char **argv) {
  for(int i=0;i<argc;i++) {
    printf("argv[%d] == %s\n", i, argv[i]);
  }
}

上記のようなC++コードを実行したいとします。これは、コマンドライン引数を順番に1個ずつ出力するプログラムです。この場合、言語選択をbashにして、

このようなコードを書きます。

echo '#include <stdio.h>' >> s.cpp
echo 'main(int argc,char **argv) {' >> s.cpp
echo '  for(int i=0;i<argc;i++) {' >> s.cpp
echo '    printf("argv[%d] == %s\n", i, argv[i]);' >> s.cpp
echo '  }' >> s.cpp
echo '}' >> s.cpp
g++ -x c++ s.cpp
./a.out 働 き た く な い

こうすると、次のような実行結果が得られます。

出力 :

argv[0] == ./a.out
argv[1] == 働
argv[2] == き
argv[3] == た
argv[4] == く
argv[5] == な
argv[6] == い

解説

Linuxで使われるシェルのひとつであるbashを用いて、ソースコードの出力、コンパイル、実行までを行っています。echo ... >> s.cpp というコマンドで、ソースコードをファイルに出力しています。次に、g++ というコマンドで、s.cppファイルをコンパイルしています。コンパイルに成功すると、a.outという実行形式ファイルが出力されます。最後に、このa.outファイルを実行しています。ちなみに、標準入力も普通に受け取ることが出来るようです。


ヒアドキュメントを使う場合 (5/20追記)

ヒアドキュメントを使うと楽に書くことが出来ます。echo <<EOS ではなく cat <<EOS なので注意して下さい。

cat > s.cpp << EOS
#include <stdio.h>
main(int argc,char **argv) {
  for(int i=0;i<argc;i++) {
    printf("argv[%d] == %s\n", i, argv[i]);
  }
}
EOS
g++ -x c++ s.cpp # ignore \r
./a.out 働 き た く な い

複数ファイル編集を使う場合

paiza.io は複数ファイルの編集が出来るっぽいので、echoを使うよりもs.cpp を書いてコンパイルした方が楽っぽいです。+ と書かれているところをクリックするとファイルを追加できて、File1 と書かれているところをダブルクリックすると、ファイル名の変更が出来ます。


@paiza_run にコマンドライン引数を送りたい場合

Twitterでは140文字しか送ることができないので、少しコードを短くしてみました。また、gccではprintfがビルトイン関数として定義されているそうなので、1行目の#includeも省略します。

すると、次のような結果が得られます。


解説

これも大筋としては先程のものと同じで、ソースコードの書き出し、コンパイル、実行を順番に行っています。Cソースコード中の i; は、グローバル変数の定義です。


他の言語の場合

もしコンパイル及び実行のコマンドが分からない場合、こちらに、AtCoderで用いられるコンパイル時・実行時に使用するコマンドが書かれていますので、これを参考にすれば他の言語でも出来ると思います。


C#

Main.sh :

mcs -warn:0 -o+ -r:System.Numerics Main.cs
mono Main.exe 働 き た く な い

Main.cs :

using System;

class Test{
    public static void Main(string[] argv) {
        for(int i = 0; i < argv.Length; i++) {
            Console.WriteLine("argv[" + i + "] == " + argv[i]);
        }
    }
}

実行結果:

argv[0] == 働
argv[1] == き
argv[2] == た
argv[3] == く
argv[4] == な
argv[5] == い

@paiza_run であれば、次のようになります。(文字数制限が厳しいですが)

@paiza_run bash:echo 'class T{static void Main(string[] v) {System.Console.Write(string.Join("\n",v));}}' >s
mcs s
mono s.exe 働 き た く な い


Python3 (5/17追記)

tr は、文字列を置換するコマンドです。


Scheme (5/17追記)


JavaScript (Node.js) (5/17追記)

さいごに