プログラミングの問題を読んで、そのためのコードを書いた。ところで、私のアルゴリズムがうまく動作しないようで、別のコードを書いていましたが、それは最適ではありませんが、正しいと思います。
これで、約100個の入力および出力データセットがあり、この入力を2つのC ++プログラムに提供して出力を比較したいと思います。出力に違いがある場合は、私のコードが間違っているかどうかを見てみましょう。
私の問題は、テストケースが多すぎて(約100個)、出力が大きいテキストファイルであるため、直接確認できないことです。 bash関数とコマンドを使用してこれを行う方法を知りたいです。
私の入力テキストファイルは等ですinput1.txt
。input2.txt
私の出力テキストファイルは入力に似ています。私のプログラムはC ++で書かれています。
答え1
テキストファイルを比較する最良の方法は、次を使用することです。diff
注文する:
diff output1.txt output1.txt
品質比較のために、diff
以下を繰り返して呼び出すことができます。
for x in input*.txt; do
slow-program <"$x" >"$x.out-slow"
fast-program <"$x" >"$x.out-fast"
diff "$x.out-slow" "$x.out-fast"
done
上記のコードスニペットが出力を生成する場合は、Expressプログラムに問題があります。 bash/ksh/zsh では、中間ファイルをディスクに保存する必要はありません。しかし、余暇にさまざまな結果を確認することが役に立つ可能性があるため、これは必ずしも良いとは限りません。
for x in input*.txt; do
diff <(slow-program <"$x") <(fast-program <"$x")
done
入力と出力を別々のディレクトリに配置し、再帰比較を実行する方が便利です。
for x in inputs/*; do slow-program <"$x" >"slow/${x##*/}"; done
for x in inputs/*; do fast-program <"$x" >"fast/${x##*/}"; done
diff -ru slow fast
私の提案は、テストを実行して比較を実行するmakefileを作成することです(別のターゲットから)。 (8つのスペースを入れたタブを使用してください。)
all_test_inputs = $(wildcard input*.txt) # relies on GNU make
%.out-slow: %.txt slow-program
./slow-program <$< >[email protected]
mv [email protected] $@
%.out-fast: %.txt fast-program
./fast-program <$< >[email protected]
mv [email protected] $@
%.diff: %.out-slow %.out-fast
-diff $*.out-slow $*.out-fast >[email protected]
mv [email protected] $@
# Test that all diff files are empty
test: $(all_test_inputs:%.txt=%.diff)
for x in $^; do ! test -s "$x"; done
.PHONY: test
make test
すべての入力ファイル(入力ファイルまたは最後から変更されたファイルのみ)を処理し、結果を比較するプログラムを実行します。すべてのテストが正しく実行され、両方のプログラムの出力がすべての場合に同じ場合にのみ、コマンドは成功します。
答え2
prog1
プログラムを と でコンパイルし、 からprog2
出力を生成すると仮定すると、stdout
次のことができます。
#! /bin/bash
for input in input*.txt ; do
./prog1 $input > $input.out1
./prog2 $input > $input.out2
if cmp $input.out1 $input.out2 > /dev/null ; then
echo Programs disagreed on $input
else
echo Programs agreed on $input
fi
done
出力ファイルをバイト単位で比較します。diff
比較用として使用することもできます。
すべての実行の出力は、inputX.txt.out1
名前が一致しないファイルにあるため、.out2
一致しないことを確認できます。