===== Forendiskussionen ===== [[https://fsi.informatik.uni-erlangen.de/forum/thread/11561-Klausurloesung-WS-13-14-18-02-2014]] ===== Lösungsversuch ===== ==== Aufgabe 1: Wissensfragen ==== **a)** falsch **b)** nein **c)** nein **d)** richtig **e)** 30s **f)** def f: (Int, Int) => Int => Int => Int **g)** falsch ==== Aufgabe 2: Petri-Netze ==== **a)** Verknüpfung von Service aktiv mit Transition t0. Zweiten Ausgang von t0 an Service aktiv setzen. Weitere Transition, die nur Stelle Service aktiv als Eingang hat. **b)** Verknüpfung von Stelle Arbeitspakete jeweils mit Transitionen t1, t2 und t3. Stellenbeschränkung bei A, B, C auf 1 setzen. Verknüpfen von Transitionen t4, t5, t6 mit Stelle Arbeitsergebnisse **c)** * Token in Stelle Service aktiv * Keine Token in Stelle Arbeitspakete * Jeweils ein Token in Stellen A und B * 2 Token in Stelle Arbeitsergebnisse {{:pruefungen:bachelor:pfp:aufgabe_2_petri-netz.png|:pruefungen:bachelor:pfp:aufgabe_2_petri-netz.png}} Endbild EDIT: ich glaube, in Stelle C soll kein Marke sein. EDIT: Bin ich auch der Meinung. **d)** Nein (siehe Ablauf t3 -> t1 -> t1) **e)** e) S = {0, 1, 1}T ; M = {t1: {-1, 1, 0}, t2: {-1, 0, 1}, t3: {2, -1, -1} }T ==== Aufgabe 3: Datei-Suche ==== **a)** activeFolderSearchers = new AtomicInteger(0); Thread t = new FolderSearcher(rootDir); // incrementAndGet() muss vor dem Starten kommen! activeFolderSearchers.incrementAndGet(); t.start(); //t.join(); **b)** if(file.isDirectory()) { Thread t = new FolderSearcher(file); activeFolderSearchers.incrementAndGet(); t.start(); } else if(file.isFile()) { pool.submit(new FileSearcher(file)); } **c)** int i = activeFolderSearchers.decrementAndGet(); if(i == 0){ pool.shutdown(); // Shall only be called once! } ==== Aufgabe 4: Scala - Teilersummen ==== **a)** def construct: (Int => List[Int]) => (List[Int] => Int) => Int => Int = f => s => n => s(f(n)) **b)** def fss: Int => Stream[(Int, Int)] = n => (n, fs(n)) #:: fss(n+1) **c)** def count: (Int, Int) => Int = (n0, m) => fss(n0).take(m).foldLeft(0){ (a, b) => if(b._1 > b._2) a+1 else a; } ==== Aufgabe 5: Schreibtischlauf ==== **a)** * Ausgabe --- Alternative Ausgaben * Question to Deep Thought: --- Keine Alternative * Leerzeile --- Keine Alternative * Answer to the: --- Keine Alternative * Ultimate Question --- Douglas * of Life --- Keine Alternative * Adams --- The Universe * and Everything --- Keine Alternative **b)** * Ultimate Question: * Zeile 7: int counter = 0 => AtomicInteger counter = new AtomicInteger(0); * Zeile 16 & 69: counter++ => counter.IncrementAndGet(); * Zeile 71: counter => counter.get(); * The Universe: * Zeile 30 & 82: synchronized(this) => synchronized(Bar.class) ====Aufgabe 6 (Scala - Ausgehende Kanten) ==== *a) def outEdges: (List[V],G) => List[E] = (vs,g) => g.par.filter(x => vs.contains(x._1) && !vs.contains(x._2)).toList *b) def tree: (V,G) => G = (v,g) => { def helper: List[V] => G = vs =>{ val a = outEdges(vs,g) if(a==Nil)Nil else a.head::helper(a.head._2::vs) } helper(List(v)) } ==== Aufgabe 7 (Backtracking) ==== was hat das hier verloren? ich vermute mal magicSquare aus Aud ? :D [[pruefungen:bachelor:pfp:loesungws13:codezuraufgabe7|>>>code zum selber testen<<<]] **a)** static boolean isSolved(int[][] sq) { int n = sq.length; int checkSum = ((n * n * n) + n) / 2; int rowSum = 0, colSum = 0, diag1Sum = 0, diag2Sum = 0; for(int y= 0 ; y< n; y++){ diag1Sum += sq[y][y]; diag2Sum += sq[n-1-y][n-1-y]; for(int x=0; x < n ; x++){ rowSum += sq[y][x]; colSum += sq[x][y]; } if(rowSum != checkSum || colSum != checkSum) return false; rowSum=colSum=0; } if(diag1Sum != checkSum || diag2Sum != checkSum) return false; return true; } **b)** static boolean solve(int[][] sq, int pos, boolean[] used) { int n = sq.length; int col = pos % n; int row = (pos - col) / n; // Basisfall if(isSolved(sq)) return true; //Rekursion for(int i=0; i < n*n; i++){ if(!used[i]){ used[i]=true; int c=i+1; sq[col][row]=c; if(solve(sq,pos+1,used)) return true; sq[col][row]=0; used[i]=false; } } return false; }