Recent am invatat niste chestii foarte misto la faculta care pot fi aplicate cu succes la ONI pentru scrisul rapid al generatoarelor si evaluatoarelor. Provocare pentru cei care n-au ce face: faceti aceleasi chestii pe windows.
Prima chestie pe care e bine s-o aveti in minte e ca nu trebuie sa memorati pasii/comenzile pentur scrierea unui generator, fiecare comanda are pe linux un manual complet de folosire. Puteti sa-l accesati asa:
man comanda
.
Prima data incepeti prin a genera un numar de teste(de ex 100):
//generator pentru problema max square #include <fstream> #include <ctime> #include <cstdlib> #include <cstdio> using namespace std; int n; int main() { for(int t=1; t<=100; ++t) { char in[55]; ofstream g(in); sprintf(in,"%d.in",t); n=rand()%50+1; g<<n<<'\n'; for(int i=1; i<=n; ++i) { for(int j=1; j<=n; ++j) g<<rand()%100-rand()%100<<' '; g<<'\n'; } } }
Acum trebuie sa generam .ok-urile cu un program brut si pe urma sa verificam daca outputul programului bun coincide cu cel din ok. In bash putem redirectiona fisiere catre stdin si stdout catre un fisier(ca si la freopen).
g++ brut.cpp#compilam programul, va genera executabilul a.out for i in {1..100}; do ./a.out < $i.in > $i.ok done
Avand fisierele .ok trebuie sa verificam ca programul sa produca acelasi output.
g++ bun.cpp for i in {1..100}; do echo $i #ce test a fost verificat ./a.out < $i.in > output diff $i.ok output#in caz ca fisierele difera va aparea un mesaj done
In caz ca vrem sa afisam doar testele pe care pica putem modifica scriptul in felul urmator:
g++ bun.cpp for i in {1..100}; do ./a.out < $i.in > output if ! diff -q $i.ok output then echo "testul $i pica" fi done