hene

hene.dev

$ atcoder <atcoder_url> で、すぐに問題を解く

$ atcoder <atcoder_url> で、すぐに問題を解く

AtCoder の問題を解くたびに、ファイルを作成するのがめんどくさかったので、自動化しました。

利用の流れ

  • 下記コマンドを実行
    • ${ATCODER_PATH}/abc/269 のディレクトリを作成
    • atcoder.template.cpp の内容で、${ATCODER_PATH}/abc/269/a.cpp が作成される
    • VSCode で、${ATCODER_PATH}/abc/269/a.cpp を開く
$ atcoder https://atcoder.jp/contests/abc269/tasks/abc269_a

実装

dotfiles 配下に下記ファイルを置いています。

.atcoder.zshrc

環境変数で ATCODER_PATHAtCoder の解答を管理したいディレクトリパスを指定しています。

# AtCoder の URL からファイル作成
function atcoder() {
    [[ -z "${ATCODER_PATH}" ]] && echo "Error: ATCODER_PATH need to be specified" && return 1

    [[ $# < 1 ]] && echo "$0 <atcoder_url>" && return 1
    local ATCODER_URL=$1

    if [[ ! $ATCODER_URL =~ ^https://atcoder.jp/contests/.*/tasks/.*$ ]]; then
        echo "Error: invalid atcoder_url"
        return 1
    fi

    local CONTESTS_PATH=$(echo $ATCODER_URL | sed "s|^https://atcoder.jp/contests/||;s|/tasks/.*$||")
    local CONTEST_TYPE=$(___atcoder_contest_type $CONTESTS_PATH)
    local CONTEST_NAME=$(echo $CONTESTS_PATH | sed "s/^${CONTEST_TYPE}//")
    local PROBLEM_NAME=$(echo ${ATCODER_URL: -1} | tr "123456789" "abcdefghi")
    local PROBLEM_FILE_NAME=$(echo "${ATCODER_PATH}/${CONTEST_TYPE}/${CONTEST_NAME}/${PROBLEM_NAME}.cpp")

    mkdir -p $(dirname $PROBLEM_FILE_NAME)

    if [[ ! -e $PROBLEM_FILE_NAME ]]; then
        cat $DOTFILES_PATH/zsh/.my_functions/atcoder/atcoder.template.cpp > $PROBLEM_FILE_NAME
    fi

    code $PROBLEM_FILE_NAME
}

# コンテストのタイプを取得
function ___atcoder_contest_type() {
  local CONTESTS_PATH=$1

  case "${CONTESTS_PATH}" in
      abs* ) echo "abs" ;;
      abc* ) echo "abc" ;;
      arc* ) echo "arc" ;;
      agc* ) echo "agc" ;;
      ahc* ) echo "ahc" ;;
      * ) echo "contests" ;;
  esac
}

atcoder.template.cpp

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

int main()
{
  int N;
  cin >> N;

  cout << N << endl;

  return 0;
}

関連記事