summaryrefslogtreecommitdiffstats
path: root/šola/p1/wordle/TestirajVse.java
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2024-02-02 12:49:38 +0100
committerAnton Luka Šijanec <anton@sijanec.eu>2024-02-02 12:49:38 +0100
commit53b31c6ea98363871c7c6bdb8e662ad825e3f47a (patch)
treeafb56424b413287bb9189a014475286bf06dc706 /šola/p1/wordle/TestirajVse.java
parentla2kol (diff)
downloadr-53b31c6ea98363871c7c6bdb8e662ad825e3f47a.tar
r-53b31c6ea98363871c7c6bdb8e662ad825e3f47a.tar.gz
r-53b31c6ea98363871c7c6bdb8e662ad825e3f47a.tar.bz2
r-53b31c6ea98363871c7c6bdb8e662ad825e3f47a.tar.lz
r-53b31c6ea98363871c7c6bdb8e662ad825e3f47a.tar.xz
r-53b31c6ea98363871c7c6bdb8e662ad825e3f47a.tar.zst
r-53b31c6ea98363871c7c6bdb8e662ad825e3f47a.zip
Diffstat (limited to 'šola/p1/wordle/TestirajVse.java')
-rw-r--r--šola/p1/wordle/TestirajVse.java112
1 files changed, 112 insertions, 0 deletions
diff --git a/šola/p1/wordle/TestirajVse.java b/šola/p1/wordle/TestirajVse.java
new file mode 100644
index 0000000..c5bbc4c
--- /dev/null
+++ b/šola/p1/wordle/TestirajVse.java
@@ -0,0 +1,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);
+ }
+}