summaryrefslogtreecommitdiffstats
path: root/šola/p1/wordle/TestSkupno.java
diff options
context:
space:
mode:
Diffstat (limited to 'šola/p1/wordle/TestSkupno.java')
-rw-r--r--šola/p1/wordle/TestSkupno.java136
1 files changed, 136 insertions, 0 deletions
diff --git a/šola/p1/wordle/TestSkupno.java b/šola/p1/wordle/TestSkupno.java
new file mode 100644
index 0000000..1285e08
--- /dev/null
+++ b/šola/p1/wordle/TestSkupno.java
@@ -0,0 +1,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();
+ }
+}