summaryrefslogblamecommitdiffstats
path: root/šola/p1/wordle/TestSkupno.java
blob: 1285e088fe77abce4a9f166b4151ec15db8d4bee (plain) (tree)







































































































































                                                                                                                                

//
// 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();
    }
}