summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2023-12-19 23:47:39 +0100
committerAnton Luka Šijanec <anton@sijanec.eu>2023-12-19 23:47:39 +0100
commit9b8d284981fa0e0a3b4634fec9ae58b04ac10450 (patch)
treedc5e832547cd994dc2fdf3d7ec93065e3c35bac9
parentšola (diff)
downloadr-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
-rw-r--r--šola/p1/dn/7/Blok.java20
-rw-r--r--šola/p1/dn/7/Stanovanje.java40
-rw-r--r--šola/p1/dn/7/Test.java12
-rw-r--r--šola/p1/dn/7/Test01.java125
-rwxr-xr-xšola/p1/dn/tj.sh27
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"