LoginSignup
0
0

atcoder_practice×online-judge-tools/oj サンプルコードを一発でフォルダに配置するスクリプト

Last updated at Posted at 2024-05-01

概要

mookjpさんのatcoder_practiceでテンプレート構築したあと、サンプルコードを手動で取り込むのが面倒だったので、online-judge-toolsで取得して配置するスクリプトを作成してみた。

私の実行環境

Windows11/Ubuntu 22.04.4 LTS(WSL)
atcoder_practiceのinit.shがちゃんと動く環境なら大丈夫なはず。

前提

当然以下2つの準備が必要(手順は割愛)

手順

①atcoder_practiceのinit.shと同じフォルダにget_testcase.shを配置。

get_testcase.sh
get_testcase.sh
#!/bin/bash -e

# ojコマンドで取得したものをatcoder_practiceに適合するように配置するshell

CONT_NM="abc351"
pattern="^[0-9]+$"
MOD_FOLDER="${CONT_NM}"

if [ $# -eq 3 ] && [[ $2 =~ $pattern ]] && [ -d $3 ]; then
  CONT_NM=$1$2
  MOD_FOLDER=$3
elif [ $# -eq 2 ] && [[ $2 =~ $pattern ]] && [ -d $1$2 ]; then
  CONT_NM=$1$2
  MOD_FOLDER="${CONT_NM}"
elif [ $# -eq 2 ] && [[ $2 =~ $pattern ]] && [ -d $2 ]; then
  CONT_NM=$1$2
  MOD_FOLDER=$2
elif [ $# -eq 1 ] && [[ $1 =~ $pattern ]] && [ -d abc$1 ]; then
  CONT_NM=abc$1
  MOD_FOLDER="${CONT_NM}"
elif [ $# -eq 1 ] && [[ $1 =~ $pattern ]] && [ -d $1 ]; then
  CONT_NM=abc$1
  MOD_FOLDER=$1
else
  echo "usage: get_testcase.sh {contest name} {contest number} {folder name}"
  echo "e.g. abc 351 abc351"
  echo "**run ./init.sh first**"
  exit 1
fi

BASEDIR=$(/bin/pwd)

for q in {a..f}; do
  url="https://atcoder.jp/contests/${CONT_NM}/tasks/${CONT_NM}_$q"
  PARENT_FOLDER="${BASEDIR}/${MOD_FOLDER}/$q/question"
  if [ ! -d ${PARENT_FOLDER} ]; then
    echo "run ./init.sh first"
    exit 1
  fi
  if [ -d "${BASEDIR}/test" ]; then rm -r "${BASEDIR}/test"; fi
  oj download "${url}" || exit 1
  if [ -d "${PARENT_FOLDER}/testfiles" ]; then rm -r ${PARENT_FOLDER}/testfiles; fi
  mv test ${PARENT_FOLDER}/testfiles/
  cd ${PARENT_FOLDER}/testfiles
  for i in {1..3}; do
    if [ -f ./sample-$i.in ]; then
       mkdir 00$i
       mv ./sample-$i.in ./00$i/stdin.txt
       mv ./sample-$i.out ./00$i/stdout.txt
    fi
  done
  cd "${BASEDIR}" || exit 1
done

②init.shを動かしてコンテスト用のフォルダを生成する。
③get_testcase.shを動かす

./init.sh github.com/jitaoepsilon/atcoder abc351
# 初回は実行権限の付与を忘れずに
sudo chmod +x get_testcase.sh
./get_testcase.sh abc 351 abc351

補足

引数は何パターンか想定している。

# 適当にフォルダ名を設定していても第3引数に指定していれば動く
./get_testcase.sh abc 351 ABC351
# フォルダ名がabc351 or 351のパターンの場合、第3引数は省略可
./get_testcase.sh abc 351
# abcも省略できるが、フォルダ名は2パターンのみ(abc351 or 351)
./get_testcase.sh 351

今後

以下サイト等を参考にいろいろ引数関係のところを修正したさある。少なくとも以下は対応したい

  • urlを直で指定するオプション
    • 今のところ [a-z]+[0-9]+ のパターンであれば大丈夫なはず
  • フォルダ名を直で指定するオプション(第3引数はオプション化したい)

0
0
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
0
0