🏃‍♂️

[Docker+Python+pahcer] AtCoder AHC 向けの環境を構築する

に公開

目的

  • 長期AHCに備えて、ローカルでテスト実行を簡単に実行できる環境の構築を目指す
  • 今後、PCを変更する際などに備えてDocker上で構築し、再セットアップが容易な状態を目指す

構築する環境の概要

  • VSCode上でpythonのコードを実行できる
  • pacherを導入し、手元で繰り返しテストできる

環境

  • MacBook Air M1チップ

手順

事前インストール

作業用フォルダを作成

  • atcoderフォルダを作成し、その直下に.devcontainerフォルダを作成
  • 最終的なフォルダ構成は以下のようになります。
.
└── atcoder/
    ├── .devcontainer/
    │   ├── Dockerfile
    │   └── docker-compose.yml
    └── atcoder_ahc/
        └── ahc048/
            ├── main.py
            ├── pahcer_config.toml
            ├── pacher/
            │   └── summary.mdなどテスト結果
            └── tools/
                ├── src
                └── in

Dockerfileの作成

  • 現在のジャッジ環境であるpython3.11.4をベースとして作成
    使用できる言語とライブラリの一覧を参考にライブラリバージョンを指定
    ※余談ですがいつもこのページを検索して探していますが、AtCoderのサイトからどうやって確認するのが良いのだろう…と思っています。
  • rustは RUN apt-get update && apt-get install -y cargo で簡易的に追加したところバージョンの問題でpacherが動かなかったため、rustupを利用するようにしています。
Dockerfile
# pythonの公式コンテナを軸に環境構築
FROM python:3.11.4

ARG USERNAME=vscode
ARG GROUPNAME=${USERNAME}
ARG USER_UID=1000
ARG USER_GID=${USER_UID}

RUN apt-get update \
    && groupadd --gid ${USER_GID} ${GROUPNAME} \
    && useradd -s /bin/bash --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} \
    && apt-get -y install sudo \ 
    && echo ${USERNAME} ALL=\(ALL\) NOPASSWD:ALL > /etc/sudoers.d/${USERNAME} \
    && chmod 0440 /etc/sudoers.d/${USERNAME}

# Python3, PyPy3の環境想定
RUN apt-get update && \
    apt-get install -y python3-pip pypy3 nodejs npm

# AtCoderでも使えるPythonライブラリをインストール
RUN pip install -U pip && \
    pip install numpy==1.24.1 scipy==1.10.1 scikit-learn==1.3.0 \
    numba==0.57.0 networkx==3.0 more-itertools==9.0.0 

# ac-library-pythonを追加
RUN pip install git+https://github.com/not522/ac-library-python

# 最新版の Rust を rustup でインストール
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
# PATH を適切に通す(Rust/Cargo を使うため)
ENV PATH="/root/.cargo/bin:${PATH}"

RUN cargo install pahcer --locked

docker-compose.yml の作成

docker-compose.yml
version: "3"
services:
  python:
    build: ./
    image: atcoder_ahc
    container_name: atcoder_ahc
    tty: true
    volumes: 
      - ../../atcoder_ahc:/atcoder_ahc
    environment:
      - TZ=Asia/Tokyo

Dockerの起動

Docker Desktopが起動していることを確認の上、docker-compose.yml上で右クリック
→Compose up

コンソール上でログが流れ終わったことを確認後、VSCode左下の「><」のようなマークを押下、
実行中のコンテナーにアタッチして接続

pahcerが動くことを確認

  • 任意のAHCコンテストで動くことを確認する (ex:AHC048)

  • コンテストページからローカル版のツールをダウンロードの上、配置する

  • READMEに沿ってコマンドを実行する

    • AHC048の場合はスコアが「小さい」方がよく、「python」で回答する
    • pahcer init -p ahc048 -o min -l python
  • main.pyに実装を行う

  • テスト実行は pahcer run
    以下のようにコンソールにログが出力されたら終了、pahcerフォルダ以下に詳細なログが出力される

    Average Score          : 737,355.26
    Average Score (log10)  : 5.77347
    Average Relative Score : 100.000
    Accepted               : 100 / 100
    Max Execution Time     : 1,852 ms
    
  • 完了!

参考

以下を利用&参考にさせていただきました。ありがとうございます。
https://github.com/terry-u16/pahcer
https://qiita.com/gomatofu/items/1adae9b7cd79b0f8044f
https://qiita.com/hinamimi/items/b3dd159f956628cebdbb

余談

AHC048で手元でのテストがうまくできず苦しんだので、環境を構築しました。
次回08/01からの長期AHCで実際にコンテストで利用してみて、環境のアップデートを繰り返していきたいです。

Discussion