今日初めてパソコンを触る高校生が競技プログラミングをはじめるまでの手順

ここでは、今日パソコンをはじめて触る高校生が、コンピューターの使い方や、プログラミングの基礎を学び、競技プログラミングの最初の問題を解いて楽しめるようになるところまでを解説します。

競技プログラミングは競技スポーツとしての側面もありますが、パズルを解く感覚で楽しむ趣味としても最高の趣味だと思います。技術的な高みを目指すのも良いですが、とりあえずゲームのようにエンジョイできるようになることを目指すのがこの手順となります。

では、競技プログラミングを行うための環境の構築を進めていきます。

|![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/2382/6753f693-2114-83a4-7be6-78e411c9b6f4.png)|
|:---:|
|最終的にセットアップする環境の様子|

# 基礎となるプログラミングの知識を学ぶ方法

まず、N予備校 プログラミング入門コース (2016年度版でも2017年度版でもOK) を、2章4節04.標準出力まで学びます。N高等学校の生徒さんなら高校のマイページで登録したニコニコアカウントを利用すれば無料で利用できます。詳しくはネット学習ハンドブックの30ページを見てください。なお、N高等学校の生徒さんでない方でも、月額1000円で学習することが可能です。

N予備校 プログラミング入門コース (2017年度版)
http://www.nnn.ed.nico/courses/170/chapters

----------

- 1章 はじめよう
  - 01.プログラミング体験をしてみよう
  - 02.はじめてのHTML
  - 03.さまざまなHTMLタグ
  - 04.HTMLで作る自己紹介ページ
  - 05.はじめてのJavaScript
  - 06.JavaScriptでの計算
  - 07.JavaScriptで論理を扱う
  - 08.JavaScriptのループ
  - 09.JavaScriptのコレクション
  - 010.JavaScriptの関数
  - 11.JavaScriptのオブジェクト
  - 12.はじめてのCSS
  - 13.CSS を使ったプログラミング
  - 14.Web ページの企画とデザイン
  - 15.診断機能の開発
  - 16.診断機能の組込み
  - 17.ツイート機能の開発

- 2章 準備しよう
  - 01.LinuxというOS
  - 02.コンピューターの中身
  - 03.ファイル操作
  - 04.標準出力

-----------

全部で 21節分 です。ここまでで JavaScript の基礎と、プログラミングの基礎が学べ、さらにLinuxというOSが利用できるようになり、VS Codeを利用して仮想環境のLinux上のファイルを共有フォルダから利用できるようになります。またよく競技プログラミングで利用される標準出力も理解することができます。

すでに存在している2016年度版の生放送授業のアーカイブを見ながら進めるとだいたい40時間程度、教材だけを見ながら進めればだいたい10時間程度で学べる内容となっています。

なお、第1章の部分は書籍化されている、[高校生からはじめる プログラミング](https://www.amazon.co.jp/dp/4046019557/‬)の内容となっています。


# プログラミング言語C++のためのコンパイラg++のインストール

g++とは、Linuxなどで利用されるプログラミング言語C++のコンパイラです。正確にはGCC(the GNU Compiler Collection)といいます。コンパイラとはソースコードをコンピューターが理解できる形式に翻訳してくれるプログラムです。競技プログラミングでは、一般的にはプログラミング言語C++が利用されています。ここではこのコマンドをインストールしていきます。

なおここからは、N予備校でLinuxの環境をインストールしていることを前提として進めていきます。

Windows では、管理者として立ち上げたコマンドプロンプトへ、以下を入力します。

```
cd %USERPROFILE%\vagrant\ubuntu64_16
vagrant up
```

RLogin を起動し、 vagrant と書いてある行をダブルクリックします。

Mac では、「ターミナル.app」より以下を入力します。

```
cd  ~/vagrant/ubuntu64_16
vagrant up
vagrant ssh

```

無事、Ubuntuのコンソールを起動できたら、以下のコマンドでg++をインストールしましょう。

```
sudo apt-get install g++
```

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


```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  binutils cpp cpp-5 g++-5 gcc gcc-5 libasan2 libatomic1 libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev libgomp1
  libisl15 libitm1 liblsan0 libmpc3 libmpx0 libquadmath0 libstdc++-5-dev libtsan0 libubsan0 linux-libc-dev manpages-dev
提案パッケージ:
  binutils-doc cpp-doc gcc-5-locales g++-multilib g++-5-multilib gcc-5-doc libstdc++6-5-dbg gcc-multilib make autoconf
  automake libtool flex bison gdb gcc-doc gcc-5-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan2-dbg
  liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg glibc-doc libstdc++-5-doc
以下のパッケージが新たにインストールされます:
  binutils cpp cpp-5 g++ g++-5 gcc gcc-5 libasan2 libatomic1 libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev
  libgomp1 libisl15 libitm1 liblsan0 libmpc3 libmpx0 libquadmath0 libstdc++-5-dev libtsan0 libubsan0 linux-libc-dev
  manpages-dev
アップグレード: 0 個、新規インストール: 26 個、削除: 0 個、保留: 29 個。
37.2 MB のアーカイブを取得する必要があります。
この操作後に追加で 139 MB のディスク容量が消費されます。
続行しますか? [Y/n] 
```
と表示されますので、そのまま `Y` と入力してインストールを行います。

```
...
gcc-5 (5.4.0-6ubuntu1~16.04.4) を設定しています ...
gcc (4:5.3.1-1ubuntu1) を設定しています ...
libc-dev-bin (2.23-0ubuntu7) を設定しています ...
linux-libc-dev:amd64 (4.4.0-78.99) を設定しています ...
libc6-dev:amd64 (2.23-0ubuntu7) を設定しています ...
libstdc++-5-dev:amd64 (5.4.0-6ubuntu1~16.04.4) を設定しています ...
g++-5 (5.4.0-6ubuntu1~16.04.4) を設定しています ...
g++ (4:5.3.1-1ubuntu1) を設定しています ...
update-alternatives: /usr/bin/c++ (c++) を提供するために自動モードで /usr/bin/g++ を使います
manpages-dev (4.04-2) を設定しています ...
libc-bin (2.23-0ubuntu7) のトリガを処理しています ...

```

以上のように表示されます。ここで言って止まればインストール成功です。


```
g++ --version
```

というコマンドを実行して、バージョンが


```
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

のように表示されれば、g++のインストール成功です。


# AtCoderで初めての競技プログラミングにチャレンジ

AtCoder はお手軽に競技プログラミングを楽しむことができるサービスです。定期的に競技プログラミングの大会を開いているほか、過去問を楽しむことができます。

https://atcoder.jp/

以上にアクセスして、 AtCoder のアカウントを作成しましょう。
「ログイン」ボタンを押したページの「新規登録」からアカウントを登録できます。

AtCoder Regular Contest という初心者向けのコンテストと、AtCoder Regular Contestと AtCoder Grand Contest という慣れている人向けのコンテストが日々開催されていますが、ここでは AtCoder Beginner Contest の過去問からやっていくのがおすすめです。

http://abc001.contest.atcoder.jp/

にアクセスして過去の問題を楽しんでいきましょう。これは001番の問題ですので、これが解けたらURLの数字の001を002にして次をやっていきます。A, B, C, D と問題がありますが、最初はA, B ぐらいの問題が解けるだけで十分ですので、いろいろな番号の問題をやってみるとよいと思います。本来は時間制限がありますが、最初は気にしなくてよいでしょう。

ここでは、「問題」タブの「A - 積雪深差」が、最初の問題となります。

内容を見てみると

> ある時刻の積雪深 H1 と その 1 時間前の積雪深 H2 が与えられます。この時、この 1 時間の積雪深差 H1 − H2 の値を計算して出力してください。


と書かれています。


入力例

```
15
10
```

を標準入力で受け入れたら、

```
5
```
15 - 10 である5を標準出力で返せばよいわけです。


標準入力を受け、標準出力で返すプログラムを書く必要があります。シェルプログラミングでも書けるのですがここでは実行速度が出るC++を利用してみましょう。競技プログラミングではこの実行速度が重要になってきたりもします。

Ubuntu コンソールにて以下のようにして、フォルダとソースコードのファイルを作成していきます。


```
mkdir -p ~/workspace/abc
cd ~/workspace/abc
touch abc001_1.cpp
```

これで、`abc001_1.cpp` ができますので、ここに C++ のソースコードを書いていきます。
すでに、workspaceフォルダはホストのフォルダで共有されていると思いますので、abcフォルダをプロジェクトフォルダとして VS Codeで開き、 `abc001_1.cpp` ファイルを編集します。

すると、「このファイルの種類には拡張機能 'C/C++' が推奨されます」と表示されますので、「今後表示しない」ボタンをクリックしてください。

その後、 `abc001_1.cpp` を編集していきます。

最初の問題は、

```cpp
#include <iostream>

using namespace std;

int main() {
    int h1;
    int h2;

    cin >> h1;
    cin >> h2;

    cout << h2 - h1 << endl;
    return 0;
}
```

以上のような解答を書いています。(*わざと間違っています!*)


C++はコンパイル言語といって、実行前に実行用のファイルにコンパイルしてやる必要があります。 Ubuntu コンソール上で、以下のように実行してコンパイルを行います。

```
cd ~/workspace/abc
g++ abc001_1.cpp
```

すると、 ls コマンドで見てみると、

```
ubuntu@ubuntu-xenial:~/workspace/abc$ ls
a.out  abc001_1.cpp
```

以上のように、 `a.out` という実行ファイルができていると思います。
これが実行ファイルとなります。

```
./a.out
```

以上のようにコマンドを打つと実行することが可能です。

入力がもとめられるので

```
15
10
```

と改行をしながら入力してみましょう。

すると、

```
-5
```

と表示されたのではないでしょうか。どうやら間違っているようですね。自分で直してみましょう。

なお、ファイルから標準入力させてやることもできます。abc001_1_in_1.txt というファイルをabcフォルダ上に作成して、以下のような内容にしてみましょう。

```
touch abc001_1_in_1.txt
```

でファイルを作り、VS Coddeで編集して

```
15
10

```

以上を入力しておきます。これで大丈夫です。
そして、この内容を受け取って `a.out` を実行するときには、

```
./a.out < abc001_1_in_1.txt
```

と入力することで、実行可能です。Tabキーでファイル名の補完が効くので利用すると便利です。

```
-5
```

と表示され、先ほど標準入力を手入力またはコピペ入力したのと同じとなります。ソースコードを直して、

https://abc001.contest.atcoder.jp/submit

の提出タブから、先ほどのソースコードを直したものを入力してみましょう。間違っているところの修正は自分でコードを直してチャレンジしてみましょう。

問題は「A - 積雪深差」、言語は「C++14 (GCC5.4.1) 」で問題ありません。コピペでコードを入力できたら「ソースコードを提出する」ボタンをクリックします。

状態が WJ(Wait Job - 待ち状態) から、AC(Accepted - 受理)になれば成功です。間違っている場合は WA(Wrong Answer - 間違い) と表示されます。詳細を見ると何が間違ったかを見ることもできます。

このようにして、競技プログラミングを楽しんでいくことができます。


# 競技プログラミングのためのプログラミング言語C++の学び方

基本的にはJavaScriptと、制御構文(if, for)などは一緒ですが、変数宣言、関数宣言 が異なります。

- [C++0x基礎文法最速マスター](http://faithandbrave.hateblo.jp/entry/20100201/1264997004)

以上のエントリーが、C++の文法を数十分でとりあえず理解するには良いです。

あと、様々な標準ライブラリという便利機能を、 `#include <iostream>` のように読み込むことで利用することができます。coutやcinと書かれた関数は、iostreamの機能を利用しています。

それらについては、

- [cpprefjp - C++日本語リファレンス](https://cpprefjp.github.io/)

以上のページがおすすめです。ここで様々なライブラリの使い方やその関数のインターフェースについて解説されています。

またより文法について学びたい際には、

- [C++プログラミング入門](http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/CPPPUBLISH.html)

がおすすめです。以上にある文法を学べば、競技プログラミングを学ぶ際に必要な文法ぐらいまでは理解することができます。


# 競技プログラミングをより深く知りたい

競技プログラミングを楽しむにはAtCoderおすすめですが、

- [AOJ: Aizu Online Judge](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja)

という会津大学が行っている競技プログラミングのサイトもあります。こちらの「問題セット」も最初からやってみると大変学びがあるでしょう。AtCoderとは違う趣向の問題をやりたい際には、オススメです。

また本で学びたいという方には、

- [プログラミングコンテストチャレンジブック](https://www.amazon.co.jp/dp/4839931992/)

この本がオススメです。大変難しいですが海外の競技プログラミングサービス、TopCoderやGoogle Code Jamなどをやっていくまでに学ぶことが詰まっています。

# さいごに

以上が、「今日初めてパソコンを触る高校生が競技プログラミングをはじめるまでの手順」となります。ぜひ、趣味として競技プログラミングを楽しみながら、プログラミングの技術を高めてもらえると幸いです。