Desenvolvendo um autojudge para C/C++
Desenvolvendo um autojudge para C/C++
Enquanto esse upsolving da Sub-Regional 2019 ICPC vem sendo feito, vamos falar sobre outros assuntos.
Vou mostrar aqui então uma ferramenta que eu estou usando para trabalhar no
upsolving. Trata-se de um autojudge que eu criei para auxiliar em problemas
que estavam dando resposta errada.
Como a plataforma URI Online Judge não disponibiliza os casos de testes que
são utilizados para testar o codigo, fui levado a procurar pelas entradas
e saidas da prova, que foram encontradas aqui
Baseado na forma como as entradas e saidas estão dispostas no arquivo comprimido,
pensei em uma forma de testar meu código em todas as entradas, comparar com as
saidas e mostrar o tempo de execução.
A solução foi feita em shell script em um computador com Ubuntu 18.04.
A arquitetura da execução foi feita da seguinte forma:
- Diretorio do problema/
- script.sh
- programa_compilado
- input/
- output/
Note que as pastas input/ e output/ são as mesmas que foram extraidas
O programa_compilado é o executavel do codigo em C/C++
O arquivo script.sh será um shell script com um código semelhante ao código abaixo,
que retorna caso de teste, tempo de execução, avaliação da resposta e mostra
qual a resposta correta e qual foi a resposta retornada pelo código:
#!/bin/bash
PROBLEMA=(letraProblema)
LIMITE=(qtdProblemas)
for ((i=1; i <= $LIMITE; i++))
do
echo Teste: $i
echo
echo Tempo de execucao:
ANSWER=$(time ./main < input/$PROBLEMA_$i)
echo
WAITED=$(cat output/$PROBLEMA_$i)
if [ $WAITED -eq $ANSWER ]
then
echo Resposta Correta
else
echo Resposta Errada
echo Esperava $WAITED, encontrou $ANSWER
fi
echo
echo
done
Antes de executar o código, lembre-se de inserir valores para as variáveis
PROBLEMA e LIMITE.
É isso, com esse código se torna um pouco mais facil resolver problemas que
estejam dando problemas, desde que exista as entradas e saidas dos problemas.
João Vitor Fröhlich (codeforces)