「main.cpp を提出」に NO と言いたいだけ.あと,マイナー言語使いを幸せにしたい.
競技プログラミングのプラットフォームとして,大きく二種類に分類したい.何を提出するかによってである.
どちらが良いか?というのは議論の余地がある.
これらで問題を解くときには,通常以下の流れがある:
Google Code JamやKaggle は以下の流れがある:
TopCoder等のプログラム提出では,以下の利点がある:
逆に,以下の欠点がある:
この欠点は,C++等で標準ライブラリのみを使っている場合には問題ないが,例えば
Google Code Jam 等の出力ファイル提出式には以下の利点がある:
逆に欠点として以下がある:
今現在のプログラミングの潮流として, Infrastructure as Code というものがあり,例えば以下のものがある:
Docker は Linux の上で動く仮想マシンのようなもので,コードでインストールしたいパッケージなどを指定する. 仮想マシンといってもとても軽量なので,実行時間などにほぼ影響はない. 後に例がある.
sbt や stack は言語専用のもので,依存関係等を記述できる. ネットからライブラリをダウンロードするmakeみたいなものである. これも後に例がある.
これからの競技プログラミングには,「プログラム提出」と「出力ファイル提出」の利点を合体したものが必要とされている(と思う). そして,これは今流行っている「Infrastructure as Code」的なものである程度解決できるだろう.
提出するものとしては,以下の二つ.(この二つは一緒でも良い?)
この方式の利点としては,
がある.欠点としては,以下がある.
今のファイル,出力提出よりも良いと考えられる.
Scala では,sbt というツールを依存関係等を記述するのに使える.
libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test"
libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.12.5" % "test"
scalaVersion := "2.11.8" // 最新版が使える!やったー
scalacOptions ++= Seq(
"-optimize", // 最適化オプションも使えるよ
)
なお,ファイル構成は以下のようになるだろう.嬉しい副作用として,複数ファイルも扱える.
.
├── build.sbt
└── src
├── main
│ └── scala
│ ├── Geometry.scala
│ ├── Main.scala
│ ├── SegmentTree.scala
│ └── UnionFind.scala
└── test
├── resources
└── scala
├── Test.scala
└── UnionFindTest.scala
なお,コンパイル時間と実行時間を分けたいので,いい感じの方法が必要だと思う
Python で速度を維持するには, numpy などを使いたい. ここでは,Dockerを例として使ってみる.
# これは Dockerfile です
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install python3 python3-numpy
# 自分はnumpy使える
ENTRYPOINT run.sh # ここは良い感じのコマンドにしたい
この環境下では,Numpyが使える.
import numpy as np
...
Docker と Makefile を使う.
# これは Dockerfile です
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install clang++ boost
# 自分はnumpy使える
ENTRYPOINT run.sh # ここは良い感じのコマンドにしたい
CXX = clang++ # コンパイラ指定
CPP_FILE = main.cpp
CFLAGS = -O2 -Wall -std=c++11 -Wall -DDEBUG -lboost # コンパイルオプションも指定,boostも使えるよ
PROGRAM = ./a.out
all: $(PROGRAM)
$(PROGRAM):$(CPP_FILE)
$(CXX) $(CFLAGS) $(CPP_FILE) -o $(PROGRAM)
だれかやってほしい.
どうにも難しいことはいろいろありそうだ.