diff options
author | Anton Luka Šijanec <anton@sijanec.eu> | 2023-12-19 23:47:39 +0100 |
---|---|---|
committer | Anton Luka Šijanec <anton@sijanec.eu> | 2023-12-19 23:47:39 +0100 |
commit | 9b8d284981fa0e0a3b4634fec9ae58b04ac10450 (patch) | |
tree | dc5e832547cd994dc2fdf3d7ec93065e3c35bac9 /šola/p1/dn | |
parent | šola (diff) | |
download | r-9b8d284981fa0e0a3b4634fec9ae58b04ac10450.tar r-9b8d284981fa0e0a3b4634fec9ae58b04ac10450.tar.gz r-9b8d284981fa0e0a3b4634fec9ae58b04ac10450.tar.bz2 r-9b8d284981fa0e0a3b4634fec9ae58b04ac10450.tar.lz r-9b8d284981fa0e0a3b4634fec9ae58b04ac10450.tar.xz r-9b8d284981fa0e0a3b4634fec9ae58b04ac10450.tar.zst r-9b8d284981fa0e0a3b4634fec9ae58b04ac10450.zip |
Diffstat (limited to 'šola/p1/dn')
-rw-r--r-- | šola/p1/dn/7/Blok.java | 20 | ||||
-rw-r--r-- | šola/p1/dn/7/Stanovanje.java | 40 | ||||
-rw-r--r-- | šola/p1/dn/7/Test.java | 12 | ||||
-rw-r--r-- | šola/p1/dn/7/Test01.java | 125 | ||||
-rwxr-xr-x | šola/p1/dn/tj.sh | 27 |
5 files changed, 205 insertions, 19 deletions
diff --git a/šola/p1/dn/7/Blok.java b/šola/p1/dn/7/Blok.java index 2ac1863..a646dc9 100644 --- a/šola/p1/dn/7/Blok.java +++ b/šola/p1/dn/7/Blok.java @@ -1,11 +1,23 @@ import java.util.*; public class Blok { - private Stanovanje stanovanje; + public Stanovanje stanovanje; public Blok(Stanovanje stanovanje) { this.stanovanje = stanovanje; } public Oseba starosta() { - return this.stanovanje.starostaSosescine(); + Oseba r = null; + for (Oseba[] os : this.stanovanje.staroste()) { + if (os[0] == null) + continue; + if (r == null) { + r = os[0]; + continue; + } + if (os[0].jeStarejsaOd(r)) + r = os[0]; + + } + return r; } public int[][] razporeditev() { int minx = Integer.MAX_VALUE; @@ -22,12 +34,12 @@ public class Blok { if (tuple[2] < miny) miny = tuple[2]; } - int[][] r = new int[maxx-minx+1][maxy-miny+1]; + int[][] r = new int[maxy-miny+1][maxx-minx+1]; for (int i = 0; i < r.length; i++) for (int j = 0; j < r[i].length; j++) r[i][j] = -1; for (int[] tuple : stanovanje.pozicije()) - r[tuple[1]-minx][tuple[2]-miny] = tuple[0]; // TODO think again + r[maxy-miny-(tuple[2]-miny)][tuple[1]-minx] = tuple[0]; // TODO think again return r; } } diff --git a/šola/p1/dn/7/Stanovanje.java b/šola/p1/dn/7/Stanovanje.java index 30db09f..cafc246 100644 --- a/šola/p1/dn/7/Stanovanje.java +++ b/šola/p1/dn/7/Stanovanje.java @@ -56,19 +56,25 @@ public class Stanovanje { r.addAll(Arrays.asList(stanovanje.stanovalci)); return r.toArray(new Oseba[0]); } - private Set<Stanovanje> soseščina() { - return this.soseščina(new HashSet<Stanovanje>()); + public Set<Stanovanje> soseščina() { // soseščina na globini pravzaprav, slabo sem prebral navodilo sprva + return this.soseščina(new HashSet<Stanovanje>(), 2); } - private Set<Stanovanje> soseščina(Set<Stanovanje> obiskani) { + public Set<Stanovanje> vsa_dosegljiva_stanovanja () { + return this.soseščina(new HashSet<Stanovanje>(), Integer.MAX_VALUE); + } + private Set<Stanovanje> soseščina(Set<Stanovanje> obiskani, int globina) { Set<Stanovanje> r = new HashSet<Stanovanje>(); - if (obiskani.contains(this)) + if (obiskani.contains(this) || globina < 0) return r; - r.addAll(Arrays.asList(this.sosedje)); + if (globina == 0 || globina == Integer.MAX_VALUE) + r.add(this); + if (globina != Integer.MAX_VALUE) + globina--; r.remove(null); obiskani.add(this); for (int i = 0; i < this.sosedje.length; i++) if (this.sosedje[i] != null) - r.addAll(this.sosedje[i].soseščina(obiskani)); + r.addAll(this.sosedje[i].soseščina(obiskani, globina)); obiskani.remove(this); return r; } @@ -89,7 +95,27 @@ public class Stanovanje { r.addAll(this.sosedje[2].pozicije(obiskani, x+1, y)); if (this.sosedje[3] != null) r.addAll(this.sosedje[3].pozicije(obiskani, x, y-1)); - obiskani.remove(this); + // obiskani.remove(this); + return r; + } + public Set<Oseba[]> staroste () { + return this.staroste(new HashSet<Stanovanje>()); + } + private Set<Oseba[]> staroste (Set<Stanovanje> obiskani) { + Set<Oseba[]> r = new HashSet<Oseba[]>(); + if (obiskani.contains(this)) + return r; + r.add(new Oseba[]{this.starosta()}); + obiskani.add(this); + if (this.sosedje[0] != null) + r.addAll(this.sosedje[0].staroste(obiskani)); + if (this.sosedje[1] != null) + r.addAll(this.sosedje[1].staroste(obiskani)); + if (this.sosedje[2] != null) + r.addAll(this.sosedje[2].staroste(obiskani)); + if (this.sosedje[3] != null) + r.addAll(this.sosedje[3].staroste(obiskani)); + // obiskani.remove(this); return r; } } diff --git a/šola/p1/dn/7/Test.java b/šola/p1/dn/7/Test.java new file mode 100644 index 0000000..179cf75 --- /dev/null +++ b/šola/p1/dn/7/Test.java @@ -0,0 +1,12 @@ +public class Test { + public static void main (String[] args) { + Oseba os[] = { new Oseba("anton luka", 'm', 12), new Oseba("bla ck", 'z', 11) }; + Oseba os2[] = { new Oseba("anton luka", 'm', 55), new Oseba("bla ck", 'z', 66) }; + Stanovanje st = new Stanovanje(os); + Stanovanje st2 = new Stanovanje(os2); + st.nastaviSosede(st2, null, null, null); + st2.nastaviSosede(null, null, st, null); + for (Oseba sosed : st.sosedjeSosedov()) + System.out.println(sosed.toString()); + } +} diff --git a/šola/p1/dn/7/Test01.java b/šola/p1/dn/7/Test01.java new file mode 100644 index 0000000..28b3745 --- /dev/null +++ b/šola/p1/dn/7/Test01.java @@ -0,0 +1,125 @@ + +import java.util.*; + +public class Test01 { + + public static void main(String[] args) { + + Oseba a1 = new Oseba("Andrej Antlej", 'M', 67); + Oseba a2 = new Oseba("Ana Antlej", 'Z', 58); + Oseba d1 = new Oseba("Denis Debeljak", 'M', 43); + Oseba d2 = new Oseba("Darja Debeljak", 'Z', 41); + Oseba d3 = new Oseba("Dejan Debeljak", 'M', 14); + Oseba d4 = new Oseba("Diana Debeljak", 'Z', 16); + Oseba e1 = new Oseba("Eva Ertl", 'Z', 23); + Oseba g1 = new Oseba("Gabrijel Golob", 'M', 72); + Oseba g2 = new Oseba("Genovefa Golob", 'Z', 74); + Oseba i1 = new Oseba("Ivan Ilovar", 'M', 52); + Oseba i2 = new Oseba("Irena Ilovar", 'Z', 47); + Oseba i3 = new Oseba("Iztok Ilovar", 'M', 21); + Oseba j1 = new Oseba("Jasna Jarc", 'Z', 45); + + preveri("Oseba/toString", primerjajNiza(a2.toString(), "Ana Antlej, Z, 58")); + + preveri("Oseba/jeStarejsaOd", !a2.jeStarejsaOd(a1)); + + Stanovanje sA = new Stanovanje(new Oseba[]{a1, a2}); + Stanovanje sB = new Stanovanje(new Oseba[0]); + Stanovanje sC = new Stanovanje(new Oseba[0]); + Stanovanje sD = new Stanovanje(new Oseba[]{d1, d2, d3, d4}); + Stanovanje sE = new Stanovanje(new Oseba[]{e1}); + Stanovanje sF = new Stanovanje(new Oseba[0]); + Stanovanje sG = new Stanovanje(new Oseba[]{g1, g2}); + Stanovanje sH = new Stanovanje(new Oseba[0]); + Stanovanje sI = new Stanovanje(new Oseba[]{i1, i2, i3}); + Stanovanje sJ = new Stanovanje(new Oseba[]{j1}); + + preveri("Stanovanje/steviloStanovalcev", sA.steviloStanovalcev() == 2); + + preveri("Stanovanje/steviloStarejsihOd", sA.steviloStarejsihOd(a2) == 1); + + preveri("Stanovanje/mz", Arrays.equals(sI.mz(), new int[]{2, 1})); + + preveri("Stanovanje/starosta", sA.starosta() == a1); + + sA.nastaviSosede(null, null, null, sD); + sB.nastaviSosede(null, null, sC, null); + sC.nastaviSosede(sB, null, sD, sF); + sD.nastaviSosede(sC, sA, sE, sG); + sE.nastaviSosede(sD, null, null, null); + sF.nastaviSosede(null, sC, sG, null); + sG.nastaviSosede(sF, sD, null, sH); + sH.nastaviSosede(null, sG, sI, null); + sI.nastaviSosede(sH, null, sJ, null); + sJ.nastaviSosede(sI, null, null, null); + + preveri("Stanovanje/starostaSosescine", sJ.starostaSosescine() == i1); + + preveri("Stanovanje/sosedjeSosedov", + primerjajTabeliOseb(sG.sosedjeSosedov(), new Oseba[]{a1, a2, e1, i1, i2, i3})); + + Blok blok = new Blok(sD); + + preveri("Blok/starosta", blok.starosta() == g2); + + System.out.println("<soseščina>"); + System.out.println(blok.stanovanje.soseščina().size()); + System.out.println("</soseščina>"); + + System.out.println("<razporeditev bloka>"); + for (int[] line : blok.razporeditev()) { + for (int število : line) { + System.out.print(število + "\t"); + } + System.out.println(); + } + System.out.println("</razporeditev bloka>"); + + preveri("Blok/razporeditev", + Arrays.deepEquals( + blok.razporeditev(), + new int[][]{ + {-1, -1, 2, -1, -1}, + { 0, 0, 4, 1, -1}, + {-1, 0, 2, -1, -1}, + {-1, -1, 0, 3, 1}, + })); + } + + private static void preveri(String besedilo, boolean pogoj) { + System.out.printf("%-29s --> %s%n", besedilo, (pogoj ? "OK" : "napaka")); + } + + private static boolean primerjajNiza(String a, String b) { + if (a == null && b == null) { + return true; + } + if (a == null || b == null) { + return false; + } + return a.equals(b); + } + + private static boolean primerjajTabeliOseb(Oseba[] a, Oseba[] b) { + System.out.println("primerjajTabeliOseb. osebe a:"); + for (Oseba x : a) + System.out.println(x.toString()); + System.out.println("primerjajTabeliOseb. osebe b:"); + for (Oseba y : b) + System.out.println(b.toString()); + System.out.println("</primerjajTabeliOseb>"); + if (a == null && b == null) { + return true; + } + if (a == null || b == null || a.length != b.length) { + return false; + } + List<Oseba> prvi = new ArrayList<>(Arrays.asList(a)); + List<Oseba> drugi = new ArrayList<>(Arrays.asList(b)); + Comparator<Oseba> primerjalnik = + (p, q) -> Integer.compare(p.hashCode(), q.hashCode()); + prvi.sort(primerjalnik); + drugi.sort(primerjalnik); + return prvi.equals(drugi); + } +} diff --git a/šola/p1/dn/tj.sh b/šola/p1/dn/tj.sh index 908f082..4851ec6 100755 --- a/šola/p1/dn/tj.sh +++ b/šola/p1/dn/tj.sh @@ -6,7 +6,8 @@ d=$3 uspelih=0 napa=0 predolg=0 -find $2 -name '*.java' -or -name '*.in' | while read -r f +ura=10s +find $2 -name 'Test[0-9]*.java' -or -name '*.in' | while read -r f do echo -n "$f ... " uspeh=0 @@ -16,21 +17,31 @@ do else stdout=`echo <(java $1 < $f)` fi - out=$(timeout 5s /usr/bin/time --quiet -f %E diff --ignore-trailing-space --side-by-side <(java `grep 'java$' <<<$f > /dev/null && echo $f || echo $1` <$f) `sed -e s/in$/out/ -e 's/Test\([0-9]\)/test\1/' -e s/java$/out/ <<<$f` 2>&1) && uspeh=1 + out=$(timeout $ura /usr/bin/time --quiet -f %E diff --ignore-trailing-space --side-by-side <(java `grep 'java$' <<<$f > /dev/null && echo $f || echo $1` <$f) `sed -e s/in$/out/ -e 's/Test\([0-9]\)/test\1/' -e s/java$/out/ <<<$f` 2>&1) && uspeh=1 koda=$? if [ $uspeh -eq 0 ] then if [ $koda -eq 124 ] then predolg=$(($predolg+1)) - echo "PREKORAČEN ČAS 5s!" - echo "VHOD:" - tac $f | tac + echo "PREKORAČEN ČAS $ura!" + if grep 'java$' <<<$f > /dev/null + then + true + else + echo "VHOD:" + tac $f | tac + fi else napa=$(($napa+1)) echo "NAPAČEN IZHOD! Čas izvajanja: `tail -n1 <<<$out`" - echo "VHOD:" - tac $f | tac + if grep 'java$' <<<$f > /dev/null + then + true + else + echo "VHOD:" + tac $f | tac + fi echo "IZHOD: Levo je vaš izhod, desno je pravilen izhod:" head -n-1 <<<$out grep 'java$' <<<$f > /dev/null && echo -e "PRIPOROČILO: Če DN zahteva razrede (kot recimo DN06), morate imeti v trenutnem direktoriju PREVEDENE .class datoteke vaših zahtevanih razredov. Če so v katerem drugem direktoriju, morate nastaviti CLASSPATH.\nPoleg tega se lahko zgodi, da v direktoriju s testi obstaja TestSkupno.java (kot recimo DN07), ki ga je potrebno prevesti v z javac." @@ -42,4 +53,4 @@ do done echo "uspešnih testov: $uspelih" echo "napačnih izhodov: $napa" -echo "prekoračen čas 5s: $predolg" +echo "prekoračen čas $ura: $predolg" |