競プロの個人的な始め方

注意

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

この文書の内容

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

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
出力

...

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

ICPC台湾2019参加記

チームThinkMETの一員Enderedとして、今回参加しました。

 

[-n日目]

emacsのflymakeをおすすめされる。vimを擁護するのが難しい。悲しい。

https://github.com/Endered/library/blob/master/onsite/vimrc

なので、vimにもflymakeモドキを実装。セーブすると構文チェック後ハイライトしてくれます。

実装が汚いのと、あまりvimを理解していないため、注意。

 

[0日目]

起床後、家を出る。

友人に暴れてこいと言われた、嬉しい。

頑張るぞ〜。

 

tekiheiさんとS_ZKさんと駅で待ち合わせ。

全員集合30分前に集まって、真面目だなぁと思いながら1時間後に電車に搭乗及び出発。

 

DIVINFの人たちと空港で集まって、飛行機に搭乗。

途中mo3tthiさんに神ゲーを進めてもらってインストールしたが、100MBのゲームでインストール数十分、解せない。

 

飛行機の座席にチャット機能があって、先輩たちと談笑。

tekiheiさんとS_ZKさんを巻き込もうとして、間違って関係ない人を誘ってしまう。

すみません。

その後ゆるキャンをみて癒やされてたが、両隣のおそらく中国人が視線をずっとこっちに送ってくる謎が発生。でもゆるキャンは譲れない。

 

ホテルに到着。予想より良い部屋で満足、でもリンスが足りない。就寝。晩御飯は吉野家でした。

 

[1日目]

起床。朝御飯に吉野家に行って豚丼を注文。

紅茶を頼んだら、レモンティーが出てきた。

おいしい。

 

mo3tthiさんのおすすめの神ゲーが面白く一日中していた記憶。

台湾料理を食べたくて店に移動、油そばを食べる。

台湾の人たちの郷土料理愛に敗北。

 

 

〜〜〜〜〜以下、プラクティス〜〜〜〜〜

 

tekiheiさんとmoritaoyさんは問題分を読む作業で私は写経担当。

開始5分程度でvimのエディタを書いて更に5分程度でemacsを写経。

emacslispなので書いてて楽しい反面vimとの相性に苦しむ。

そもそも、エディタの写経が10分近くかかるのはチームとしてよくないなぁと思う。

でもvimは楽しい。

 

写経後問題が渡される。

おそらくD問題を渡され問題分を読むけれどもTOEIC330点の実力にかかれば文章の大半が読めない。

なので、書いてある絵とサンプルで概要をエスパーして書いてみる。「WA」

誤読に気づく(読んでませんが)、修正。「WA」

DPですれば通るでしょう。「WA」

遷移の書き方を間違えてた、修正。「WA」

うん。諦めて、Judgeの許容を調べる。

100億回の計算が通る、びっくり。

ほかチームが、恐ろしい人数Dを解いていて悲しい。と思ったら予選と同じ問題らしい、安心。

〜〜〜〜〜以上、プラクティス終了〜〜〜〜〜

 

 

終了後近くにあった、餃子屋さんで餃子を購入して、配られた弁当と一緒に食べる。

餃子がびっくりするくらい美味しい。

なぜ、倍買おうとしなかったのか悔やむ。

 

DIVINFの人たちも集まり、どうやらOkさんが踊るほど美味しい食べ物が弁当にあるらしいのでtekiheiさんのを拝借して冷蔵庫に保存。

邪念が飛んできたような気がするので、moritaoyさんがtekiheiさんで祓う。

その後DDCCに参加。DとEがパズルと実装だったので通す。105位、嬉しい。

翌日が大会なので就寝。

リンスが欲しい。

 

 

[2日目]

起床。吉野家。牛丼。もちろん紅茶の代わりに味噌汁を注文。

コンテストがあるので急いで移動、1時間待ちぼうけ。暇ぁ。

 

コンテストが15分遅れる、ワクワク。

 

〜〜〜〜〜以下コンテスト〜〜〜〜〜

 

写経。相変わらず、すごく長いテンプレ。

問題Iを渡される。

全探索な気がするので書く。どうしても書けない、悲しい。

 

損切りをして。KHをもらう。

読む、数式を見る。標準入力と標準出力を見る。

大体入力と、出力が二乗に近い感覚がしたので適当にエスパーをすると、解法が生える。やった〜。

通った。

隣でmoritaoyさんが異様なくらいWAを生やしていてWAの歌を歌う。二人で輪唱。

 

次に、HKをもらう。どう見ても蟻本の丸パクリ問題な気がするので書く。2分後にAC。

 

問L、どう見ても凸法は必須なので書く。

しゃくとりをすると、とても早いため、余裕で間に合う。「WA」

どうやら、凸法をして三角形になったときに別の処理がいるらしい。「WA」

???どうして幾何問題なのに小数のフォーマットがあるんだろう???

テレテレ〜to_string〜。「WA」

よく見ると答えがlong longの範囲内でした。「AC」

 

次、B。

直感的に貪欲かなと考え、書く。「WA」

木DPかな。「WA」

伝達ミスに気づく。修正。「WA」

伝達ミスの伝達ミスに気づく。修正。「WA」

 

終了〜

8完で18位。国内1位!でも、ひと桁になりたい。

来年に期待。

〜〜〜〜〜以上コンテスト〜〜〜〜〜

 

終了後、ビュッフェを食べる。

料理に、素の唐辛子と生姜が入ってた。涙が出そう。

夜市へGO。

人多い、匂いやばい、KO。

マンゴージュースが癒やし過ぎて感謝。

お好み焼きをテイクアウト。

 

〜〜〜〜〜帰宅中〜〜〜〜〜

Q:tekiheiさんがABCを参加したそうにしている。私はどうしますか?

A:開始して十数分立っているので、止める。

そしたら、問題を読むだけと言ったので、一安心。

 

〜〜〜〜〜ホテル到着〜〜〜〜〜

ThinkMETのメンバーでテイクアウトしたお好み焼きを食べてみる。

牡蠣入りのお好み焼きなのですが、甘めのソースが牡蠣の内臓の苦味を中和して旨味を引き立てるような味でとても美味しい。最高。

ブログを書くのをおすすめされたので書いてみる。

これくらいに気楽に書けたら大学のレポートも週一でも余裕で出せるのに。

tekiheiさんが何かしていたので聞いてみる。

・・・・・・・・・ABCに提出してた・・・無茶しやがって

 

翌日が5時おきなので早々に就寝。をするつもりでしたが喉が乾き、コンビニで買い物。

 

〜〜〜〜〜コンビニ〜〜〜〜〜〜

0日目にも買い物をしていたのですが、そのとき驚いたこととして、レジ袋が80円くらいだったことでした。

なので、教訓を活かして大量買いを決行。

アイスとお茶をそこそこ取ってレジに行く。

私:"Please bag"

店員:"OK"

レジ:8円増加

 

Oh No

 

〜〜〜〜〜ホテル〜〜〜〜〜

 部屋に冷凍庫がないことに気づき、tekiheiさんにおすそわけしようとする。が、歯磨きをした後だった。

台湾のアイスはとても美味しかったです。

 

[3日目]

起床。着替え。さぁ、日本へ帰ろう。

 

〜〜〜〜〜電車〜〜〜〜〜

mo3tthiさんにおすすめされた神ゲーをする。

〜〜〜ダイマ開始〜〜〜

GolfBlitz ゴルフなのに乱闘に近い要素もあって面白いです。

〜〜〜ダイマ終了〜〜〜

 

〜〜〜〜〜空港〜〜〜〜〜

空港で朝御飯を食べることになり、散策。

ラーメン店らしき店で、天丼という文字が見えたので注文。

ラーメンが出てくる。

う〜ん、美味しい。

 

〜〜〜〜〜空〜〜〜〜〜

CA:"chicken rice or meat source spaghetti"

私:"chicken rice please (お子様ランチみたいだなぁ)"

チキンが添えられた白米が出てくる。

(´・ω・`)

 

ゆるキャンを帰りも視聴、やはりゆるキャンは最高。

 

〜〜〜〜〜日本〜〜〜〜〜

moritaoyさんtekiheiさんS_ZKさんと東京から会津へ移動。

 

ものすごい硬いと有名な東京駅のアイスをもらい、食べる。

硬い、けどその分味がしっかりしているので好みな味でした。

 

先輩にクソゲーを教えてもらい、ずっとぐるぐる回す変な人をしていました。

結果、指紋認証の反応が微妙になりました。

 

晩御飯として、郡山駅近くの混ぜそば店で食べる。

二年ぶりに来たので、同じものを注文。すごく美味しい。

日本の料理を久しぶりに食べて、まったりしました。

 

〜〜〜〜〜郡山駅会津若松駅〜〜〜〜〜

英語の課題が今日締め切りなのを思い出して、急いで解く。なんとか間に合った。

 

クソゲーの雰囲気のするゲームを見つけてそれをインストール及びプレイ。とてもおもしろい。

クソゲーが面白いゲームのときは神ゲーと呼ぶのだろうか。クソと神は紙一重だなぁ。

 

〜〜〜〜〜家(今)〜〜〜〜〜

帰宅後、ブログを書く。

一日で書き方が変わっているような気がするが、成長したのだろうか。

 

友人にあずきバーをもらう。

なにこれ、硬い、歯が痛い、ヤバイ。

 

〜〜〜〜〜終〜〜〜〜〜