summaryrefslogtreecommitdiffstats
path: root/šola/p1/wordle/TestSkupno.java
blob: 1285e088fe77abce4a9f166b4151ec15db8d4bee (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

//
// Konstante, metode in razredi, ki jih uporabljamo pri obeh načinih testiranja.
//

import java.util.*;
import java.io.File;
import java.io.FileNotFoundException;

public class TestSkupno {

    // datoteka z besedami
    public static final String SLOVAR = "slovar.txt";

    // največje dovoljeno število poskusov
    public static final int MAKS_ST_POSKUSOV = 100;

    // slovenska abeceda
    public static String ABECEDA = "abcdefghijklmnoprstuvz";

    //
    // Razred za tvorbo lastnih izjem.
    //
    public static class WordleIzjema extends RuntimeException {
        public WordleIzjema(String sporocilo) {
            super(sporocilo);
        }
    }

    //
    // Prebere slovar in vrne množico njegovih besed.
    //
    public static Set<String> preberiSlovar(String slovar) {
        Set<String> besede = new TreeSet<>();

        try (Scanner sc = new Scanner(new File(slovar))) {
            while (sc.hasNextLine()) {
                String beseda = sc.nextLine().strip();
                if (beseda.length() > 0) {
                    besede.add(beseda);
                }
            }
        } catch (FileNotFoundException ex) {
            System.err.printf("Datoteka %s ne obstaja.%n", slovar);
        }
        return besede;
    }

    //
    // Vrne odziv za podani par besed
    // <prava>: pravilna beseda
    // <izbrana>: strojeva izbira
    //
    public static List<Character> izracunajOdziv(String prava, String izbrana) {
        int n = prava.length();

        // Preverimo <null>, dolžino in sestavo (<izbrana> lahko vsebuje samo
        // male črke slovenske abecede).

        if (izbrana == null) {
            throw new WordleIzjema("Metoda <poteza> je vrnila <null>, čeprav odziv ni bil enak ['+', '+', ..., '+'].");
        }

        if (n != izbrana.length()) {
            throw new WordleIzjema(String.format("Metoda <poteza> je vrnila besedo napačne dolžine (%d).", izbrana.length()));
        }

        for (int i = 0; i < n; i++) {
            char znak = izbrana.charAt(i);
            if (ABECEDA.indexOf(znak) < 0) {
                throw new WordleIzjema(String.format("Metoda <poteza> je vrnila besedo z neveljavnim znakom (%c).", znak));
            }
        }

        List<Character> odziv = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            odziv.add('-');
        }

        List<Character> lstPrava = string2lstchar(prava);
        List<Character> lstIzbrana = string2lstchar(izbrana);

        // Poiščemo pravilne črke na pravilnih mestih.

        for (int i = 0; i < n; i++) {
            if (lstPrava.get(i) == lstIzbrana.get(i)) {
                odziv.set(i, '+');
                lstPrava.set(i, '#');
                lstIzbrana.set(i, '_');
            }
        }

        // Poiščemo pravilne črke na napačnih mestih.

        for (int ixIzbrana = 0; ixIzbrana < n; ixIzbrana++) {
            char crka = lstIzbrana.get(ixIzbrana);
            if (crka != '_') {
                int ixPrava = lstPrava.indexOf(crka);
                if (ixPrava >= 0) {
                    odziv.set(ixIzbrana, 'o');
                    lstPrava.set(ixPrava, '#');
                    lstIzbrana.set(ixIzbrana, '_');
                }
            }
        }

        // Na ostalih mestih je odziv enak '-'.

        return odziv;
    }

    //
    // Vrne seznam znakov podanega niza
    // (npr. "znanka" -> ['z', 'n', 'a', 'n', 'k', 'a']).
    //
    public static List<Character> string2lstchar(String niz) {
        List<Character> rezultat = new ArrayList<>();
        int n = niz.length();
        for (int i = 0; i < n; i++) {
            rezultat.add(niz.charAt(i));
        }
        return rezultat;
    }

    //
    // Vrne niz, sestavljen iz znakov iz podanega seznama
    // (npr. ['z', 'n', 'a', 'n', 'k', 'a'] -> "znanka").
    //
    public static String lstchar2string(List<Character> seznam) {
        StringBuilder sb = new StringBuilder();
        for (char znak: seznam) {
            sb.append(znak);
        }
        return sb.toString();
    }
}