프로그래밍 문제를 읽고 그에 대한 코드를 작성했습니다. 그런데 내 알고리즘이 제대로 작동하지 않는 것 같아서 또 다른 코드를 작성했는데, 최적은 아니지만 맞다고 생각합니다.
이제 약 100개의 입력 및 출력 데이터세트가 있고 이 입력을 두 개의 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
일치하지 않는지 확인할 수 있습니다.