競プロの個人的な始め方

注意

この文書は、競プロの環境構築やコーディング方法について説明する際に、口頭での説明よりも効率が良いであろうと思い、書かれた文書です。急ぎで書いたものなので、文章の雑さ等が有ります。筆者の主観的な理解を元に書かれるので、内容の誤り等はご容赦ください。また、必要と思った部分を加筆していく形式、を考えているので大幅な改変等あると思います。

この文書の内容

筆者が情報系の分野で一番悩むことは、「次に何を学べばよいのだろう」ということです。そのため、この文章の一番の目的は、読者に色々な物の名前を知ってもらうことです。殆どの場面で内容を深堀しません。ただ、文章に出てくる単語を検索すると、欲しい情報が簡単に出てくるはずです。

OS選択

以前に比べ、WSLが出てきたおかげでWindowsでも競プロが楽になりましたが、高度なことをするとWSL独自の設定が必要とされて、それの対応に時間と知識を必要とします。WSLの設定を行える自信が無い方はubuntuを入れて競プロをするのをおすすめします。macは利用をやめたのでわかりません。

Windows

Windowsで競プロをする方法は大まかに2つに分けられます。

  • VSCodeを用いてコーディング
  • WSLを用いてコーディング

1.については筆者があまり用いないので説明できません。そのため、2.についての説明を行います。

WSLの種類

WSLにはWSL1とWSL2と呼ばれる分類が有りますが、以下のような特徴があります。

  • WSL1: 環境構築が楽, 実行速度が遅い
  • WSL2: 環境構築が大変, 実行速度が早い

細かい部分が違いますが、競プロをする場合は上の認識でいいです。WSL1の実行速度が遅いというのは、本来の3,4倍位は実行時間が長いと考えていいです。WSL2は環境構築が大変ですが、実行速度が早いのでマラソン等を行うなら必須かと思います。ここでは、WSL1についてのみ説明します。

WSL1の環境構築

検索すれば情報が沢山出てくるので、その手続きに従ってubuntu環境のインストール及び実行確認をしてください(要加筆)。

次のソフトはWSLを用いる上で、よく使うのでインストールしておいたほうが良いです。

vcxsrv

X転送をWindows上で行うものですが、後述するGUIを用いるソフトはこれがないと動作しないので入れるほうが便利です。(後、大学の課題を家でできるようになります)

これ以降はubuntu上で行う設定と殆ど同じなのでubuntu編を参照してください。

ubuntu

これ以降はubuntu(もしくはWSL上のubuntu)で環境を構築する方法についてを説明していきます。

aptコマンド

とりあえずaptコマンドについて知りましょう。aptコマンドは、ソフトウェアをCUI環境でインストールするためのコマンドです。g++というソフトをインストールするときには次のようにします。

sudo apt update # sudo apt install をする前に必要とします。installできるソフトウェアについてなどの情報を得ます。
"パスワードを入力"
sudo apt install g++ # g++をインストール
"なにかしらの英文"(Y/n) # ここで (y or Y or 何も入力しない) + enterをすることによってインストールが出来ます

ここで先頭に来るsudoというのは、コマンドを偉い人視点で実行するために使うコマンドです。aptコマンドは使い方を間違えると大変なことになるので、sudoによって偉い人視点での許可を、普通は必要とします。sudoを用いて間違えたことをすると、簡単に環境が壊れるので使うときは慎重になりましょう。ここのg++という部分を好きなソフト名にすることによって必要なソフトをインストールしていきます。

エディタ

ここではvimemacsvscodeそれぞれについて説明します。 vimemacsは利点と欠点が逆の関係に近いので、両方を扱えることを個人的には推奨します。

vim

非常に単純な仕組み(浅い部分は)で操作できるので学習が容易です。とりあえず、初めて触るエディタとして選ぶのにいいと思います。

ubuntu環境だと標準で入っているので、ターミナルでvimと入力したら実行できると思います(終了する際には:qと入力してエンターを押してください)。操作方法はこれが非常に良い内容なので基本と初級編辺りを読んだらいいです。マニュアルを読む上で大事なのは、自分が使いたい内容を適宜学ぶことです。でないと、膨大な情報を解釈するのに多大な時間を費やしてプログラミングを開始できません。

vimを学ぶ上でいずれvimrcという存在に出会うことになると思います。ある意味、これがvimをエディタとして大成させた理由の大部分を占める、と言って過言ではないほど扱えた際の利点が多いです。私のvimrcを置いておくので、意味を学んで自分のvimrcに活かしてください。

emacs

自分でこのエディタを改造して行くつもりが無いならvimを学ぶことを推奨します。その程度に、このエディタの初期設定は貧弱だと思いますし、改造した際の便利さはvimを上回ると思います。実際、筆者は1年間vimで開発をしながらemacsについて勉強して、先月ほどからemacsをメイン開発環境に移行しました。

インストールは以下のコマンドで出来ます。

sudo apt update
sudo apt install emacs

ただ、ここでインストールされるのは最新版ではありません。

最新版には便利な機能もあるので、インストールしたい際はこの記事ubuntu欄のdockerファイルを読んでください。よく読むと、ターミナルに入力するコマンドと同じような書き方をされています。

vscode

情報がたくさんあり、操作も一番簡単です。ここではインストールする方法だけを説明します。ここの.debと書かれた部分をクリックすると、~~.debという名前のファイルがダウンロードされます。ダウンロードされたファイルをファイルソフト上でダブルクリックすると、インストールするための画面が出るのでinstallを押してください。

番外編(spacemacs)

spacemacsはemacsを土台として魔改造されたエディタです。非常に洗練された設定のもとで操作できるので、一度触ってみる価値が有ります。芸術品と思えるキーバインドでエディタを操作できるので、知識として触れておくべきです。

私のエディタの設定の殆どは、spacemacsの便利だと思った機能を再現する部分で構成されています。

プログラミング

これ以降は実際にプログラミングをする上で知っておくべきことを、筆者の独断と偏見を交えて説明していきます。

プログラミング言語

C++Pythonを基本的には競プロのために知っておくべきです。それぞれの特徴は以下のようになります。

  • C++: 実行速度が早い、標準で入っている機能が便利。
  • Python: 実行速度が遅い、大きな整数 (264 以上) を扱う際に便利。

このPythonの実行速度が遅いというのは、ICPCで使った際にTLEになることが普通というものです。例外として、実装が軽くて大きな整数を扱う、時にはPythonの独壇場になるので学んでいて損が無いです。

make

コンパイル言語で競プロをするなら使い方について知っておくべきです。Makefileという名前のファイルに以下のように書きます。

"好きな名前": "ソースコードのファイル名"
    "コンパイルするコマンド"

例えば、C++言語のmain.cppというソースコードg++コンパイルするには次のようになります。

a.out: main.cpp
  g++ main.cpp

その上でmakeとターミナルに入力するとコンパイルされます。makeコマンドは最後のコンパイルからファイルが編集されていないと、コンパイルされないので時間の節約になります。また、makeという短いコマンドで長いコマンドを指定することも可能なので、ストレス軽減に良いです。

サンプルを試す方法

プログラムを実行してサンプルを試す際、毎回コピー&ペーストをするのは何かと不便です。なので以下のようにして入力ファイルを作ります。

cat > 入力ファイル名 
"適当な入力"
"Ctrl + D"

こうして作成した入力ファイルを次のようにして試します。

./a.out < 入力ファイル名 #C++の場合
python3 main.py < 入力ファイル名 #Pythonの場合

サンプルを簡単に試せるというのは大事なことです。試すのが不便だと、サンプルを試さずに提出する、ということをする人がいる位なので大事です。

シェル

ubuntu環境ではシェルスクリプトを用いて、面倒なことを自動化するプログラムを簡単に書くことが出来ます。次のような手順を考えてみましょう。

  1. ソースコードをmakeでコンパイルする
  2. 拡張子が.inである入力ファイルを列挙する
  3. それぞれの入力ファイルの名前とa.outの入力としたときの出力の対を列挙する

このような手順を自動化するために、次のようなシェルスクリプトtest.shという名前で置いてください(hoge.shなどでも可)

#!/bin/bash
make
for name in *.in
do
    echo $name
    ./a.out < $name
    echo
done

そして実行するために以下のようにします。

chmod u+x test.sh # 1度すればそれ以降は不要
./test.sh

すると以下のように表示されます

ファイル名1.in
出力

ファイル名2.in
出力

...

シェルは強力なので簡単な書き方は覚えておきましょう。