3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

競プロerのための環境構築(mac, c++)

Last updated at Posted at 2020-04-20

0. はじめに

この記事では,macで競技プログラミング(通称: 競プロ)を快適に(?)楽しむための環境構築について書いていきます。とくに自分がつまずいたところと,それの解消方法を書いていきます。

設定すること

  • ローカルでコンパイルできるようにする
  • 自動でテストするようにする
  • Terminalからsubmitできるようにする

Requirements

  • c++で競技プログラミングをしようと思っている
  • モチベがある

自分の(この記事で目指す)環境について

OS: macOS
エディタ: CLion(学生は無料!)
コンパイル/テスト: Terminal / online-judge-tools(後述)
提出: online-judge-tools


この記事では,以下のプログラムをベースに話を進めていきます。

main.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  cin >> n;
  cout << 1+n << '\n';
}

1. ローカルでコンパイルできるようにする

まずはgccのインストール

C++のプログラムをコンピューターが実行できるようにするためには,プログラムをコンパイルすることが必要です。そこで,XCodeをダウンロードしました。これでターミナルからg++ main.cppとコンパイルできるはず!!(出来ません)
コンパイルが出来なかった理由は,#include <bits/stdc++.h>を使おうとしていたからです。ローカルで設定する必要があります。
そのために,

  • stdc++.hを作る
  • CPLUS_INCLUDE_PATHの編集

をします。

stdc++.hの作成

AtCoderのディレクトリの中に,includeディレクトリを作成し,その中にbitsディレクトリを作成し,stdc++.hファイルを以下の内容で保存しました。

stdc++.h
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> 
#include <utility>
#include <tuple>
#include <cstdint>
#include <cstdio> // printf
#include <map> // map
#include <queue> // queue, priority_queue
#include <set> // set
#include <stack> // stack
#include <deque> // deque
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <bitset> // bitset
#include <iomanip> // setprecision
#include <numeric> 
#include <cctype> // isupper, islower, isdigit, toupper, tolower

~/Desktop/AtCoder/include/bits/stdc++.hという状況。
(AtCoder以外のコンテストに出たいときにデスクトップがコンテスト名だらけにならないために, Desktop/Competitive-programming/AtCoderとかの構成の方が拡張性に優れていると思います)

CPLUS_INCLUDE_PATHの編集

Terminalを開いて,ホームディレクトリでvim ~/.zshrcと入力し,.zshrcを編集します。

.zshrc
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/Users/名前/Desktop/AtCoder/apg4b/include/

.zshrcに上記を追記します。
これで,ローカルでコンパイルできるようになりました!嬉しいですね。
APG4b 付録1.コードテストの使い方

コンパイル(Terminal)
g++ main.cpp
実行(Terminal)
$ ./a.out
7
8

となるはず。

2. 自動でテストするようにする

[online-judge-tools] (https://online-judge-tools.readthedocs.io/en/master/introduction.ja.html)を使います。
そのためには,brewをインストールする必要があります。
brewの公式ページにある以下のコマンドをターミナルにコピペ。

Terminal
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

その後,Pythonとonline-judge-toolsをインストールします。

Pythonをインストール(Terminal)
brew install python
online-judge-tools(Terminal)
pip3 install online-judge-tools --user

これで, main.cppがあるディレクトリに行き,テストケースをダウンロードし,main.cppをコンパイル後,ターミナルでoj t ./a.outとすればテストできます。
また,

alias test='g++ main.cpp && oj t'

こうすれば,コンパイル→テストまでを自動で実行できます。嬉しいので,alias test='g++ main.cpp && oj t'.zshrcに早速追記します。

【読者への宿題?】

コンテスト名と 問題名(a,b,c,d,...) もしくは 解く問題の数を入力したら自動でコンテストのディレクトリやファイルの作成,テストケースのダウンロードをそれぞれしてくれるスクリプトを作成しても単調な作業をすることを防げます。

3. Terminalからsubmitできるようにする

oj submit main.cpp

2.で[online-judge-tools] (https://online-judge-tools.readthedocs.io/en/master/introduction.ja.html)をダウンロードしたので,これで提出できます。一刻をも争う大会なので,数文字で提出できるのは嬉しいですね!(同ディレクトリ内で異なるURLからテストケースをダウンロードした場合,URLをその都度,指定する必要があります)

4. 設定ファイルの中身

実際のファイルの中身を紹介します。本記事で紹介していないことも使っています。

.zshrc
**.zshrc**
.zshrc
# colors
autoload -U colors
colors
PROMPT='%K{235}%F{255}%2~ %B%k%F{red} %#%f %b%f%'

# PATHS
export LSCOLORS='exfxcxdxbxegedabagacad'
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/Users/HOGEHOGE/Desktop/AtCoder/apg4b/include/

PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/HOGEHOGE/Desktop/AtCoder/online-judge-tools:/Users/HOGEHOGE/Library/Python/3.8/bin:$PATH"
export PATH

# suggestions
autoload -U compinit
compinit
setopt correct
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

# suggestions
source ~/developer/zsh-autosuggestions/zsh-autosuggestions.zsh
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# alias
alias compile='g++ -std=c++17 -O2 ${1:-main.cpp}'
alias odl='oj dl'
alias gotoContest='cd Desktop/AtCoder/Contest/ && ls'
alias ls='ls -F -G -1'
alias tree='tree -N -A -C'
alias rell='/Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/HOGEHOGE/Desktop/AtCoder/Library/contest_oj.py'

# functions

function test() {
  g++ -std=gnu++17 -O2 -Wall -Wextra main.cpp && oj t -i && rm ./a.out
}

function submit() {
  oj submit $1 ${2:-main.cpp} -y -w 0.00
}
stdc++.h
**stdc++.h**
stdc++.h
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> 
#include <utility>
#include <tuple>
#include <cstdint>
#include <cstdio> // printf
#include <map> // map
#include <queue> // queue, priority_queue
#include <set> // set
#include <stack> // stack
#include <deque> // deque
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <bitset> // bitset
#include <iomanip> // setprecision
#include <numeric> 
#include <cctype> // isupper, islower, isdigit, toupper, tolower

/* DEBUG */
#pragma once
using namespace std;

string to_string(const string& s) {
  return '"' + s + '"';
}

template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}

template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

void debug_out() { cerr << endl; }

template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}

#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
デバッグ用のコードについて

stdc++.hにデバッグ用のコードを置くことで,ファイルごとにデバッグ用のコードを記述する必要がなくなります。上記のstdc++.hをプリコンパイル1して使っています。ちなみにstdc++.h内のデバッグ用のコードはtourist由来です(問題があったら削除します)。

5. 参考資料

1) C++入門 AtCoder Programming Guide for beginners (APG4b)

1.1) APG4b 付録1.コードテストの使い方

2) VisualStudioで競技プログラミングの環境を作る(MacとC++) - Qiita

[3) online-judge-tools] (https://online-judge-tools.readthedocs.io/en/master/introduction.ja.html)

4) 江添亮のC++入門
プリコンパイルについて知りたい時に使いました。

  1. コンパイルにかかる時間を短縮するために使いました。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?