AtCoder用C++開発環境 (Mac編)

Contents

概要

AtCoder用のC++開発環境をMac上に構築します。

(2020/4/5更新:C++17環境に更新しました)

 

OS Mac OS X Catalina
IDE Visual Studio Code
コンパイラ (デバッグ時) : Clang++ (Apple clang)
(テストケース実行・提出時) : G++

 

デバッグ環境をGCCで環境構築しようとするとGDB周りで泥沼にはまったので、Clangでの環境構築となります。
(VSCode上にGDBでいい感じにデバッグ環境を構築できた方、やり方教えて下さい)

このページで記述している内容で環境構築を行うことにより、以下の事ができるようになります。

  • VSCode上でのデバッグ(STLのコンテナの値がちゃんと見れる!)
  • AtCoder問題ページに記載されているテストケースによる動作確認
  • VSCodeのコマンドラインからのコードの提出


デバッグの様子

手順

事前準備

  1. App StoreからXcodeをインストール
  2. Homebrewをインストール
  3. Visual Studio Codeをインストール

GCCのインストール

Homebrewを使ってGCCをインストールします。
シンボリックリンクを貼らないと、g++のフリをした Apple clangが呼ばれてしまうので注意しましょう。

brew install gcc
ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc
ln -s /usr/local/bin/g++-9 /usr/local/bin/g++

# 端末を再起動し、GCCが呼ばれているか確認
g++ -v

atcoder-cli

コマンドラインからテストケースのダウンロードやコードの提出ができるようになります。

インストール

下記ページに従ってonline-judge-tools及びatcoder-cliをインストールします。

brew install python3
brew install nvm

mkdir ~/.nvm
echo 'export NVM_DIR="$HOME/.nvm"
  [ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh"  # This loads nvm
  [ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion' >> ~/.zshrc

nvm install node
npm install -g npm

npm install -g atcoder-cli
pip3 install online-judge-tools

acc -v
oj --version

acc check-oj

初期設定

acc login
# ここでユーザー名とパスワードを入力

# ログインできているか確認
acc session

# 新たなコンテスト用ディレクトリ作成時、全問題のディレクトリを一括作成
acc config default-task-choice all

# 設定ファイルのディレクトリに移動
cd `acc config-dir`

mkdir cpp

echo '{                       
  "task":{
    "program": ["main.cpp"],
    "submit": "main.cpp"
  }
}' > cpp/template.json
touch cpp/main.cpp

# templateにcppが表示されるか確認
acc templates

# デフォルトのテンプレートとしてcppを使用
acc config default-template cpp

各コマンドの内容は下記サイトにて確認してください。

Visual Studio Code

プラグインのインストール

必須

  • CodeLLDB … LLDBを使ってデバッグしたときにSTLコンテナ内を見れるようになります。

(任意)

  • C/C++ … 補完がいい感じに働いてくれます。
  • Code Runner … 動作確認に使用します(ビルド&実行を行います)

各種設定

settings.json

{
    "code-runner.executorMap": {
        "cpp": "cd $dir && rm $dir/$fileNameWithoutExt && clang++ -std=c++17 $fileName -o $fileNameWithoutExt && $dir/$fileNameWithoutExt",
    },
    "code-runner.clearPreviousOutput": true,
    "code-runner.runInTerminal": true,
    "code-runner.saveFileBeforeRun": true,
    "lldb.launch.expressions": "native",
}

tasks.json

以下の設定を追加します。

  • clang++でのビルドの設定
  • (ついでにG++でのビルドの設定)
  • テストケースの実行
  • コードの提出
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "g++ build active file",
            "command": "/usr/local/bin/g++",
            "args": [
                "-std=gnu++17",
                "-g",
                "-Wall",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "/usr/local/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "shell",
            "label": "clang++ build active file",
            "command": "clang++",
            "args": [
                "-std=c++17",
                "-stdlib=libc++",
                "-x",
                "c++",
                "-Wall",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "--debug"
            ],
            "group": "build"
        },
        {
            "label": "CheckTestCase",
            "type": "shell",
            "command": "cd ${fileDirname} && rm -f ${fileDirname}/${fileBasenameNoExtension} && g++ -std=gnu++17 ${fileBasename} -o ${fileBasenameNoExtension} && oj test -c \"${fileDirname}/${fileBasenameNoExtension}\" -d ${fileDirname}/tests/",
            "presentation": {
                "reveal": "always",
                "focus": true,
                "panel": "shared",
            }
        },
        {
            "label": "SubmitCode",
            "type": "shell",
            "command": "cd ${fileDirname} && acc s ${fileBasename}",
            "presentation": {
                "reveal": "always",
                "focus": true,
                "panel": "shared",
            }
        },
    ]
}

AtCoder Libraryを使用する場合はSubmitCodeの部分を以下のように設定します。

        {
            "label": "SubmitCode",
            "type": "shell",
            "command": "cd ${fileDirname} && acc submit ${fileBasename} -- -l 4101",
            "presentation": {
                "reveal": "always",
                "focus": true,
                "panel": "shared",
            }
        },

 

launch.json

LLDBでのデバッグ設定を追加します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(LLDB) Debug",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "cwd": "${fileDirname}/",
            "preLaunchTask": "clang++ build active file",
        }
    ]
}

keybindings.json

「Ctrl + Shift + P」から「>Preferences: Open Keyboard Shortcuts (JSON)」を選択し、下記内容を追加します。

[
    {
        "key": "ctrl+t",
        "command": "workbench.action.tasks.runTask",
        "when": "editorTextFocus",
        "args": "CheckTestCase"
    },
    {
        "key": "ctrl+s",
        "command": "workbench.action.tasks.runTask",
        "when": "editorTextFocus",
        "args": "SubmitCode"
    }
]

これにより、main.cppを開いているときに各ショートカットによってテストケースの実行、コードの提出が可能となります。

bits/stdc++.h

clang++でもbits/stdc++.hを使えるようにしたいですよね。下記ページの内容を参考にXCodeのincludeフォルダにstdc++.hを追加します。

cd /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
sudo mkdir bits
cd bits
sudo wget https://gist.githubusercontent.com/reza-ryte-club/97c39f35dab0c45a5d924dd9e50c445f/raw/47ecad34033f986b0972cdbf4636e22f838a1313/stdc++.h stdc++.h

使い方

  1. TERMINALでacc new (コンテスト名)で対象コンテスト用の作業ディレクトリが作成されます。
  2. A問題のmain.cppを開き、コードを書きます。
  3. main.cppがアクティブのタブとなっている状態で、ctrl+tを押すことでテストケースを実行できます。
  4. すべてのテストケースをpassしたら、ctrl+sでコードを提出します。
  5. 困ったらF5でデバッグ開始。

参考