Sab 24 Agosto, 15:14:12 - 2019

Autore Topic: Secondo Assignment: il correttore automatico dei risultati :D  (Letto 10815 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Tom89

  • Professore Ordinario
  • **
  • Post: 703
  • FeedBack: +145/-79
    • Mostra profilo
Secondo Assignment: il correttore automatico dei risultati :D
« il: Ven 06 Novembre, 19:56:19 - 2009 »
Salve,
oggi pomeriggio ho deciso di perdere un pò di tempo dato che non riesco ad essere sicuro dei risultati del secondo assigment svolto...

quindi ho realizzato una Test Suite che me lo dice  ;D
Legge da uno script come realizzare l'automa, gli passa alcune stringhe, e quindi riporta se il risultato è giusto  :sisi:
Codice: [Seleziona]
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

///* ASF TestSuite by Tom89 *///


public class TestSuite {
public class Timer {

public Timer() {
reset();
}

public long currentTime(){
return System.nanoTime();
}

public void reset() {
event = currentTime();
}

public double getElapsedTime() {
return (currentTime() - event)/1000000.0;
}

public void testTime( String caption ) {

System.out.println( caption + ": " + getElapsedTime() + " ms" );

reset();
}

private long event;
}

private StringTokenizer tokens;
private boolean showCorrect;

private String read() {
return tokens.nextToken();
}

public TestSuite( String filename ) {

showCorrect = true;

//carica il file, costruisci la stringa, dalla in pasto al tokenizer
FileReader reader;
try {
reader = new FileReader( filename );
} catch (FileNotFoundException e) {
System.out.println( "*" + filename + ": file non trovato!*");
return;
}

String buffer = "";
try {
int c  = reader.read();
while(c != -1){
buffer += (char)c;
c = reader.read();
}
} catch( IOException e ){
System.out.println( "*" + filename + ": Errore nella lettura del file!*");
}

tokens = new StringTokenizer( buffer );
}

public void runTests() {

//ora cicla aspettando la keyword "test"
String t;
while( tokens.hasMoreTokens() ) {
t = read();

if( t.equals( "testcase" ) )
testcase();
}

}

public void testcase() {
List<ASFNDSolver> solvers = new LinkedList<ASFNDSolver>();

String name = read();
int tests = 0;
int err = 0;

System.out.println( "[test case " + name + "]" );

Timer timer = new Timer();

String t;
while( tokens.hasMoreTokens() ) {
t = read();

if( t.equals( "nascondi_corretti" ) )
showCorrect = false;
else if( t.equals("mostra_corretti") )
showCorrect = true;
else if( t.equals( "automa" ) )
solvers.add( automa( solvers.size() ) );
else if( t.equals("automa_unione") )
aggiungiUnione( solvers );
else if( t.equals("automa_concatenazione") )
aggiungiConcatenazione( solvers );
else if( t.equals("automa_iterazione") )
aggiungiIterazione( solvers );
else if ( t.equals( "test" ) && solvers.size() > 0) {
if( !test( solvers.get( solvers.size()-1 )) )
err++;
tests++;
}

else if( t.equals( "end" ) ) break;
}

System.out.println( "[/" + name + "]: eseguiti " + tests + " tests in " + timer.getElapsedTime() + " ms" );
if( err == 0 )
System.out.println( "\tTest completamente riuscito: complimenti!");
else
System.out.println( err + " TESTS FALLITI!");
System.out.println();
}

public ASFNDSolver automa( int numero ) {

String alfabeto = read();

int n = 0;
ASFNDSolver solver = null;

List<Integer> finali = new LinkedList<Integer>();

List<Integer> start = new LinkedList<Integer>();
List<Character> chars = new LinkedList<Character>();
List<Integer> dests = new LinkedList<Integer>();

boolean reuse = false;
String t = "";

Timer timer = new Timer();

while( tokens.hasMoreTokens() ) {
if( !reuse )
t = read();

if( t.equals( "finali" ) ) {
while( tokens.hasMoreTokens() ) {
t = read();

int i;
try {
i = Integer.valueOf( t );
finali.add(i);
n = Math.max(i, n);
} catch( RuntimeException e ){ reuse = true; break; }
}
}

if( t.equals("transizioni") ) {
while( tokens.hasMoreTokens() ) {
t = read();

int i;
try {
i = Integer.valueOf( t );
start.add(i);
n = Math.max(i, n);
} catch( RuntimeException e ){ reuse = true; break; }

t = read();
if( t.length() > 1 ) { reuse = true; break; }
chars.add( t.charAt(0) );

t = read();
try {
i = Integer.valueOf( t );
dests.add(i);
n = Math.max(i, n);
} catch( RuntimeException e ){ reuse = true; break; }
}
}

if( t.equals("end") ) {
solver = new ASFNDSolver( n+1, alfabeto.toCharArray() );

for( int i : finali )
solver.aggiungiStatoFinale(i);
for( int i = 0; i < dests.size(); ++i )
solver.aggiungiTransizioneND(start.get(i), chars.get(i), dests.get(i));

System.out.println( "Inizializzazione automa " + numero );

break;
}
}
timer.testTime("Creazione automa");

return solver;
}

public void aggiungiUnione( List<ASFNDSolver> solvers ) {
Timer timer = new Timer();
int s = solvers.size();

int i1 = Integer.valueOf( read() );
int i2 = Integer.valueOf( read() );

if( i1 > s-1 || i2 > s-1 ) {
System.out.println("*Errore unione: out of bounds!*");
return;
}

ASFNDSolver a = solvers.get(i1);
ASFNDSolver b = solvers.get(i2);
solvers.add( (ASFNDSolver)a.costruisciAutomaUnione(b) );

System.out.println("Inizializzo automa " + s + ": L(" + i1 + ") U L(" + i2 + ")\t (" + timer.getElapsedTime() + ")" );
}

public void aggiungiConcatenazione( List<ASFNDSolver> solvers ) {
Timer timer = new Timer();
int s = solvers.size();

int i1 = Integer.valueOf( read() );
int i2 = Integer.valueOf( read() );

if( i1 > s-1 || i2 > s-1 ) {
System.out.println("*Errore concatenazione: out of bounds!*");
return;
}

ASFNDSolver a = solvers.get(i1);
ASFNDSolver b = solvers.get(i2);
solvers.add( (ASFNDSolver)a.costruisciAutomaConcatenazione(b) );

System.out.println("Inizializzo automa " + s + ": L(" + i1 + ")  L(" + i2 + ")\t (" + timer.getElapsedTime() + ")" );
}

public void aggiungiIterazione( List<ASFNDSolver> solvers ) {
Timer timer = new Timer();
int s = solvers.size();
int i1 = Integer.valueOf( read() );

if( i1 > s-1) {
System.out.println("*Errore iterazione: out of bounds!*");
return;
}
solvers.add( (ASFNDSolver)solvers.get(i1).costruisciAutomaIterazione() );

System.out.println("Inizializzo automa " + s + ": L(" + i1 + ")*\t (" + timer.getElapsedTime() + ")");
}

public boolean test( ASFNDSolver asf ) {

Timer timer = new Timer();
String t = read();

boolean ref;
if( t.equals("T") ) ref = true;
else if( t.equals("F") ) ref = false;
else {
System.out.println( "*impossibile eseguire il test*!" );
return false;
}

t = read();
if( t.equals( "[stringa_vuota]") ) t = "";

boolean result = asf.accettaSequenza( t.toCharArray() );
boolean correct = result == ref;
if(  correct ) {
if( showCorrect ) System.out.println( "[ok] '" + t + "' e' " + ref + ".\t (" + timer.getElapsedTime() + " ms)" );
}
else {
System.out.println ( "[SBAGLIATO] '" + t + "' e' " + ref + "!" );
System.out.println("            Il valore restituito era '" + result + "'\t (" + timer.getElapsedTime() + " ms)" );
}

return correct;
}
}


Per quanto sia un copia incolla selvaggio lungo centinaia di righe, è facile da usare: semplicemente nel main si usa:
Codice: [Seleziona]
TestSuite suite = new TestSuite( "percorso dello script di test" );
suite.runTests();

E lo script da passare è fatto come questo:
Codice: [Seleziona]
testcase Base
automa ab
finali 0
transizioni
0 a 0
0 b 1
end

test T aaaaaaaaa
test T [stringa_vuota]
test F b
test F aaaaabbaa

automa ab
finali 1 2
transizioni
0 a 1
0 b 2

1 a 3
1 b 2

2 a 1
2 b 3
end

test T ababababab
test T ababab
test F abaababa
test F abababababb
test T ba

automa_unione 0 1

test T aaaaaa
test T ababab
test F abbaab
test F bbbbbb

automa_concatenazione 0 1

test T aaaaaaababababa
test F aaaaaabaabababa
test F abababaaaaaa
test T aaaaaa
end

In cambio voglio solo tonnellate di tests severissimi fatti da voi...

PS: rosico perchè un paio mi vengono sbagliati  :asd:

EDIT1: aggiornato un test sbagliato.
EDIT2: aggiunta qualche altra informazione al test
EDIT3: aggiunto il comando "nascondi_corretti" per vedere solo gli errori
« Ultima modifica: Dom 08 Novembre, 15:22:26 - 2009 da Tom89 »

Agilulfo

  • Visitatore
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #1 il: Sab 07 Novembre, 00:55:46 - 2009 »
grazie tom per il programmino  :)

ecco lo scriptino che ho fatto :P
Codice: [Seleziona]

testcase Base
automa ab
finali 2
transizioni
0 a 0
0 b 0
0 b 1

1 a 2
1 b 2
end

test T aaaaba
test T baaabbbba
test F aaaaaab
test F [stringa_vuota]
test T bbbbbb
test F b


automa ab
finali 2
transizioni
0 a 1

1 a 1
1 b 1
1 b 2
end

test F [stringa_vuota]
test T ab
test T abbbbabaabb
test T aaab
test F aabba


automa cd
finali 0
transizioni
0 c 0
0 d 1

1 c 1
1 d 0
end

test T ccc
test F cd
test F ddcccd
test T dcdcddccccddddddcc
test T [stringa_vuota]
test T cdd


automa_unione 0 1

test T aaaaba
test T aab
test F bbbbaa
test F aaaabaa
test F [stringa_vuota]


automa_concatenazione 0 1

test T aaabaabbbb
test F aaaababbb
test F bab
test T baab
test F [stringa_vuota]

automa_iterazione 0

test T [stringa_vuota]
test T aabbbb
test T abbb
test T baabba
test F baabbaa

automa_concatenazione 1 2

test T ab
test T ababcddc
test F abcd
test F ddc
test F [stringa_vuota]
test F cdab
test F acdcdb
test F cdddcabc
test T aabbccdd

automa_unione 1 2

test T ab
test T cdd
test T [stringa_vuota]
test F abc

end

1° automa: il penultimo carattere è 'b'
2° automa: inizia con 'a' e finisce con 'b'
3° automa: numero pari di 'd' (0 incluso)


PS: tom, il tuo ultimo test dovrebbe essere true se non sbaglio?

Offline Tom89

  • Professore Ordinario
  • **
  • Post: 703
  • FeedBack: +145/-79
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #2 il: Sab 07 Novembre, 01:01:20 - 2009 »
Orcaccia eva l'hai padroneggiato bene lo script  :asd:

Comunque; mi sono reso conto che l'ultimo doveva essere true dopo aver postato; pensavo che per essere true doveva essere almeno aaaaaab ma mi sbagliavo  :asd:

Invece quello di cui non riesco a venire a capo è test T ababab con 0 U 1...
appartiene ad 1 e dovrebbe essere true, ma mi viene sbagliato  >:(

Domani mi provo lo script tuo, se passo tutto si invia  ;D

Offline eafkuor

  • Direttore di Dipartimento
  • ***
  • Post: 1138
  • FeedBack: +173/-54
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #3 il: Sab 07 Novembre, 01:09:15 - 2009 »
Con lo script di tom passo tutti i test, con quello di agilulfo ne sbaglio 3, ma non ho voglia ora di mettermi a controllare :asd:

Offline Tom89

  • Professore Ordinario
  • **
  • Post: 703
  • FeedBack: +145/-79
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #4 il: Sab 07 Novembre, 01:14:24 - 2009 »
Dico, ma siamo sicuri che i test siano tutti giusti?  :asd:

Offline Seril

  • Direttore di Dipartimento
  • ***
  • Post: 2729
  • FeedBack: +263/-467
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #5 il: Sab 07 Novembre, 01:22:08 - 2009 »
omg quale tra i 2 è un tester giusto?

Offline Tom89

  • Professore Ordinario
  • **
  • Post: 703
  • FeedBack: +145/-79
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #6 il: Sab 07 Novembre, 01:27:39 - 2009 »
Sono giusti tutti e due ora  :sisi:

che cavolo continuo a fare 1 errore col mio e 4 con quello di agilulfo  :o

Offline Seril

  • Direttore di Dipartimento
  • ***
  • Post: 2729
  • FeedBack: +263/-467
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #7 il: Sab 07 Novembre, 01:35:51 - 2009 »
bisogna fixare  :sisi:

Offline eafkuor

  • Direttore di Dipartimento
  • ***
  • Post: 1138
  • FeedBack: +173/-54
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #8 il: Sab 07 Novembre, 02:04:08 - 2009 »
uhm cheppalle io faccio 3 errori con quello di agilulfo, domani vediamo un po' che si può fare

Offline MickMad

  • Guru
  • Professore Associato
  • *****
  • Post: 597
  • FeedBack: +54/-28
  • I'm Broken, Inherit My Life, I'm Broken
    • Mostra profilo
    • The-MickMad's Newgrounds Page
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #9 il: Sab 07 Novembre, 08:53:39 - 2009 »
quando uno non sa proprio come buttare le giornate XD
scherzi a parte, ottima idea tom89, vedrò come agisce sul mio ;)


Click Me


Cli

Offline Crabro

  • Direttore di Dipartimento
  • ***
  • Post: 1044
  • FeedBack: +118/-61
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #10 il: Sab 07 Novembre, 09:52:13 - 2009 »
Scusate la mia newranza, ma come si usa??? ???
« Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza fondamentale. La differenza, naturalmente, è che mentre in fisica devi capire come è fatto il mondo, in informatica sei tu a crearlo. Dentro i confini del computer, sei tu il creatore. Controlli – almeno potenzialmente – tutto ciò che vi succede. Se sei abbastanza bravo, puoi essere un dio. Su piccola scala. »
   
(Linus Torvalds)

Offline danewone

  • Ricercatore
  • ****
  • Post: 416
  • FeedBack: +38/-12
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #11 il: Sab 07 Novembre, 10:59:36 - 2009 »
Complimenti tom per il tuo lavoro. grazie...

Offline eafkuor

  • Direttore di Dipartimento
  • ***
  • Post: 1138
  • FeedBack: +173/-54
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #12 il: Sab 07 Novembre, 11:58:10 - 2009 »
Scusate la mia newranza, ma come si usa??? ???
basta mettere questo:

Codice: [Seleziona]
TestSuite suite = new TestSuite( "percorso dello script di test" );
suite.runTests();

dentro un main di prova

Offline Tom89

  • Professore Ordinario
  • **
  • Post: 703
  • FeedBack: +145/-79
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #13 il: Sab 07 Novembre, 12:47:37 - 2009 »
E ovviamente devi creare un file TestSuite.java, copiarci dentro tutto e includerlo nel tuo progetto/compilarlo  :sisi:

Offline Crabro

  • Direttore di Dipartimento
  • ***
  • Post: 1044
  • FeedBack: +118/-61
    • Mostra profilo
Re: Secondo Assignment: il correttore automatico dei risultati :D
« Risposta #14 il: Sab 07 Novembre, 13:00:16 - 2009 »
Allora, ho creato TestSuite.java, poi ho messo il comando che mi avete passato nel programma di prova da me creato e ho creato un file txt con lo script....però non mi torna i risultati...ho fatto qualche cavolata?
« Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza fondamentale. La differenza, naturalmente, è che mentre in fisica devi capire come è fatto il mondo, in informatica sei tu a crearlo. Dentro i confini del computer, sei tu il creatore. Controlli – almeno potenzialmente – tutto ciò che vi succede. Se sei abbastanza bravo, puoi essere un dio. Su piccola scala. »
   
(Linus Torvalds)