はじめてatcoderのコンテストに 参加してみた。

「競技プログラミングの準備」と調べてみると、アルゴリズムの勉強手法だとか、動作環境のセットアップ手法の解説しか出てこなかった。 ここでは、実際どうやって実行するのか、どういう流れで提出するのか、そのために何を準備するのかを記載する。

大きな流れは以下の通り。

  1. 例を利用したテストケースの準備
  2. コーディング
  3. 実行&自動テスト
  4. 提出

例を利用したテストケースの準備

問題には入力と出力の例が用意されている。 その内容を利用して自動テストを実行できるようにする。

今回のスクリプトでは「input」「answer」というフォルダーに同名のファイルに、入出力を記載する。

フォルダー構成

inputフォルダーにある入力例に対して、テストを実施する。

コーディング

main.pyというファイル名でコーディングを行う。 内容は全量コピペで提出できる内容とする。

実行&自動テスト

ここが本題。 やりたいことは、「テストケースを用いた実行&回答例との一致判定」。

以下のスクリプトを用意し、毎回実行するようにした。

#!/bin/sh
rm output/*

dirpath="./input"
files=`ls $dirpath`

pfinrf "\n"
for file in $files;
do
    printf "=====${file}=======\n"

    input="${file}"
    output="${file}"
    answer="${file}"

    python main.py <input/${input} | tee output/${output}

    if [ -e answer/${answer} ]; then
        diff -u output/${output} answer/${answer} >tmp
        if [ $? -eq 0 ]; then
            printf "\nCA\n"
        elif [ $? -eq 1 ]; then
            printf "\n--- diff output answer --------------------\n"
            cat tmp
            printf "\nWA\n"
        fi
        rm tmp
    fi
done

入力例が複数あっても、回答フォルダーに同名のファイルがあればテストできる。

以下のコマンドで実行を行う。

./run.sh

今後の課題

  • 典型的な入力処理のテンプレート化
  • 入出力例の取得自動化

問題サイトをスクレイピングすれば、入出力例を自動で取得できる気がする。