summaryrefslogtreecommitdiffstats
path: root/šola/p1/wordle/TestirajVse.java
blob: c5bbc4cbcfbc90ec9d5d908bd5772d6beaaa08a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

//
// Program za testiranje stroja z vsemi besedami iz slovarja (v nekem
// naključnem vrstnem redu). Zagon:
// java TestirajEno <imeStroja> <semeNaključnegaGeneratorja>
//

import java.util.*;
import java.lang.reflect.InvocationTargetException;

public class TestirajVse {

    // kazen za neveljavno izbiro ali prekoračitev števila poskusov
    private static final int KAZEN = 200;

    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("Zagon:");
            System.err.println("    java TestirajVse <imeStroja> <semeNaključnegaGeneratorja>");
            System.err.println();
            System.err.println("Na primer:");
            System.err.println("    java TestirajVse Tekm_12345678 12345");
            System.exit(1);
        }

        String imeStroja = args[0];
        int seme = Integer.parseInt(args[1]);

        // Preberemo slovar iz datoteke TestSkupno.SLOVAR.
        Set<String> besede = TestSkupno.preberiSlovar(TestSkupno.SLOVAR);
        if (besede == null || besede.isEmpty()) {
            System.exit(1);
        }

        // Ustvarimo objekt podanega stroja.

        Class<?> razred = null;

        try {
            razred = Class.forName(imeStroja);
        } catch (ClassNotFoundException ex) {
            System.err.printf("Ne najdem razreda %s.%n", imeStroja);
            System.exit(1);
        }

        Stroj stroj = null;

        try {
            stroj = (Stroj) razred.getDeclaredConstructor().newInstance();
        } catch (NoSuchMethodException ex) {
            System.err.printf("Razred %s nima privzetega konstruktorja.%n", imeStroja);
            System.exit(1);
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException ex) {
            System.err.printf("Ne morem ustvariti objekta razreda %s.%n", imeStroja);
            System.exit(1);
        } catch (ClassCastException ex) {
            System.err.printf("Razreda %s ne implementira vmesnika Stroj.%n", imeStroja);
            System.exit(1);
        }


        // Stroj inicializiramo.
        stroj.inicializiraj(besede);

        // Pripravimo premešan seznam vseh besed.
        List<String> lstBesede = new ArrayList<>(besede);
        Collections.shuffle(lstBesede, new Random(seme));

        // Stroj preizkusimo z vsemi besedami (v vrstnem redu, kot ga določa
        // seme naključnega generatorja).

        int vsotaStPoskusov = 0;
        for (String beseda: lstBesede) {
            int stPoskusov = preizkusiEno(stroj, beseda);
            System.out.printf("%s -> %d%n", beseda, stPoskusov);
            vsotaStPoskusov += stPoskusov;
        }

        System.out.printf("Vsota: %d%nPovprečje: %.4f%n",
                vsotaStPoskusov,
                ((double) vsotaStPoskusov) / besede.size());
    }

    //
    // Podani stroj preizkusi s podano besedo in vrne število poskusov,
    // ki jih je potreboval, da je besedo uganil. Če stroj besede ni
    // uganil v dovoljenem številu poskusov ali pa če je izbral
    // neveljavno besedo, vrne TestSkupno.KAZEN.
    //
    private static int preizkusiEno(Stroj stroj, String beseda) {
        int stPoskusov = 0;
        String izbira = null;
        String zadnjaIzbira = null;
        List<Character> odziv = null;

        while ( stPoskusov < TestSkupno.MAKS_ST_POSKUSOV && (izbira = stroj.poteza(odziv)) != null ) {
            zadnjaIzbira = izbira;

            try {
                odziv = TestSkupno.izracunajOdziv(beseda, izbira);
            } catch (TestSkupno.WordleIzjema ex) {
                odziv = null;
            }

            if (odziv == null) {
                return KAZEN;
            }
            stPoskusov++;
        }
        return (beseda.equals(zadnjaIzbira)) ? (stPoskusov) : (KAZEN);
    }
}