$ 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_PATH
に AtCoder
の解答を管理したいディレクトリパスを指定しています。
# 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;
}