いろはすの競プロ反省会

主に反省してます。たまに役に立つことも書くかも?

チェック用シェルスクリプトを書いてみた

与えられたテストケース群についての、2つのプログラムの出力が同じかどうかをチェックするシェルスクリプトを書きました。 パラメータの値が小さいところで愚直解と一致するかどうか調べたいときなどに有用です。 出力が違った場合、そのときの入力と、2つのプログラムの出力を見ることが出来ます。 MacLinuxなど、Bashが動く環境で是非お試しください。

#!/bin/bash

PROGRAM1="$1"
PROGRAM2="$2"

text=""
while read i; do
    if [ "$i" = "" ]; then
        echo -e "$text"
        out1=$(echo -e "$text" | $PROGRAM1)
        echo "out1: $out1"
        out2=$(echo -e "$text" | $PROGRAM2)
        echo "out2: $out2"

        if [ "$out1" != "$out2" ]; then
            echo "different!"
            exit
        fi

        text=""
    fi
    text="${text}${i}\n"
done

echo "finish."

使い方

次のとおりです(シェルスクリプトの名前をcheck.shとしてます)。

./check.sh [プログラム1の実行ファイルパス] [プログラム2の実行ファイルパス] 

入力は標準入力から受け取ります。 以下、使用例です。

cat input.txt | ./check.sh ./program1 ./program2
python input.py | ./check.sh ./program1 ./program2

一行目はテキストファイルから入力する場合です。 入力ケースは複数含めることが出来ます。その場合、入力ケース同士を空行で区切ってください。 二行目の例はプログラムから入力する場合です。パイプを使ってプログラムの出力をチェックスクリプトに渡します。 この場合も、入力ケース同士は空行で区切ってください。

出力例

こんな感じで出ます。

...

3 2
0 0 0

out1: 6
out2: 6

3 2
1 0 0

out1: 7
out2: 7

3 2
2 0 0

out1: 4
out2: 5
different!