Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Altklausur 30.7.2013
Ich hätte mal eine Frage zur Aufgabe 6 der im Titel genannten Klausur.
Bei Aufgabe a) muss man die Funktion getFreeColor: List(Color) => Color implementieren. In der Aufgabenstellung steht, man solle lediglich aus Vorlesung und Übung bekannte Klassen und Funktionen verwenden. Jetzt bin ich mir nicht sicher, ob meine Lösung gültig wäre. Sie sieht wie folgt aus:
def getFreeColor: List(Color) => Color = { // runde Klammern, weil sonst die Formatierung des Forums spinnt
cs => (for { x ← List.range(0,cs.max+1); if(!cs.contains(x)) } yield x).min
}
Ist vielleicht nicht die cleverste Lösung, aber da es in der Klausur ja auch darum geht, die Aufgaben relativ schnell zu lösen und diese Lösung mir als erstes einfiel, ist es eben so ![]()
Ist es in Ordnung auch Funktionen zu verwenden, die man eben kennt, weil man sich ein wenig mit der API beschäftigt hat, auch wenn die Funktionen eventuell nicht in der Übung und Vorlesung gezeigt wurden?
def getFreeColor: List[Color] => Color = cs => (0 to (cs.foldRight(0)((x,y) => if(x >= y) x else y) + 1)).dropWhile(cs.contains(_)).head
max kannst du mit foldRight(0)((x,y) => if(x >= y) x else y) ersetzen.
Ansonsten aufpassen mit List.range das ist exklusive der oberen Grenze. Deswegen geht deine Lösung mit folgendem Aufruf kaputt:
getFreeColor(List(0,1,2))
Ah, stimmt. Danke! War ich wieder zu unvorsichtig.
Eine Lösung mit foldRight hatte ich mir im Nachhinein auch noch zurechtgelegt, allerdings is diese hier mit dropWhile deutlich eleganter ![]()
Ich häng noch an der 5c)
Und zwar verstehe ich nicht wie dieses foldLeft funktioniert…
Ich habe bisher nur eine alternative Lösung:
def oddCount: (Int, Int) => Int =
(n,k) => {
def help: List[Int] => Int =
xs => xs match {
case Nil => 0
case x::xs if(isEven(x)) => help(xs)
case x::xs if(!(isEven(x))) => 1 + help(xs)
}
help(f(n).take(k).toList)
}
Kann mir einer erklären wie ich das mit foldLeft mache?
Völlig ungetest:
def oddCount: (Int, Int) => Int =
(n,k) => f(n).take(k).foldLeft(0)((a,b) => if (isEven(b)) a + 1 else a)
Meine Lösung sieht wie folgt aus:
def oddCount: (Int,Int) => Int = {
(n,k) => f(n).take(k).toList.foldLeft(0)((count,x) => if(isEven(x)) count else count+1)
}
list.foldLeft(ys)(f(x,y)) wendet die Funktion f auf jedes Element y von list an. Dabei ist ys der “Startwert” und x der Akkumulator.
Du kannst dir die Funktion oddCount umgeschrieben auch ungefähr so vorstellen:
(Parameter nun als List geschrieben, da die Funktion f(n).take(k).toList nunmal eine Liste hergibt.)
def oddCount: List[Int] => Int {
case Nil => 0
case x::xs => if(isEven(x)) 0 + oddCount(xs) else 1 + oddCount(xs)
}
Ich hoffe das ist ungefähr richtig erklärt, bin selbst noch nicht ganz hundertprozentig durch mit diesen Foldoperationen.
danke euch beiden, habs verstanden ![]()
Hups ich hab einen evenCount gemacht ![]()
@pall: die toList sind unnötig, take(k) gibt bereits eine Liste zurück.
@kronos: geht auch ohne? Praktisch
Hab mich dabei wohl von der Angabe beeinflussen lassen, auf der steht nämlich als Beispiel f(5).take(6).toList
Behauptet zumindest die Doku
Kann jemand von euch vielleicht seine 5a) Lösung mal posten? Ich bekomme das gecurriedte construct(i)(e,o) einfach nicht gebacken. Es scheitert an der Syntax.
construct sieht bei mir so aus:
def construct: (Int => Boolean) => ((Int => Int), (Int => Int)) => (Int => Int) = i => (e,o) => n => {
if(i(n)) e(n) else o(n)
}
meine Aufgabe 6 b)
def colorGraph: List[Node] => List[Coloring] => List[Coloring] = ns => cs => {
if (ns.length == cs.length) cs // hier gibt es doch fuer jeden Knoten eine entsprechende Faerbung (oder? 0.o)
else if (cs.contains((ns.head._1,_))) colorGraph (ns.tail) (cs)
else colorGraph (ns.tail) (nextFreeColor(cs,ns.head)::cs)
}
Keine Ahnung ob ich dieses Color/Coloring-foo richtig verstehe … :-/
Waere nett wenn jmd. seinen Senf dazugeben koennte.
edit:
Sieht bei mir auch so aus, bis darauf, dass ich
def construct: (Int => Boolean) => ((Int => Int),(Int => Int)) =>[b] Int => Int = i[/b] => (e, o) => n => { ...
ohne Klammern hab, gibt’s da eine sinnige Begruendung fuer die Klammern?
Hier mein Lösungsansatz für die Aufgaben 1 bis 3:
Aufgabe 1 (Wissensfragen):
a) richtig
b) richtig
c) falsch
d) falsch
e) falsch
f) 48s (5*6+18)
g) richtig
h) falsch
Aufgabe 2 (Petri-Netze):
a)
- Neue Stelle p5 in der Mitte einfügen
- Pfeile von je t1 und t3 auf p5
- Pfeile von p5 auf je t2 und t4
b)
S = [0 1 1 0 0 0]^T, A = [-1 -1 0 0 1 0], B = [1 0 0 -1 0 0], C = [0 0 1 0 -1 0],
D = [1 0 -1 0 0 0], E = [0 1 0 0 1 -1], F = [0 0 0 1 -1 0]
c)
Nein (T2 in T6 frisst Token)
d)
T4 -> T5 -> T1 -> T4 -> T6
Aufgabe 3 (Pipeline):
1:
1. for (int i = 0; i < nStages; i++) {
2. boolean lastThread = (i == threads.length -1); //gegeben
3. BlockingQueue<Integer> inQueue = queue[i];
4. BlockingQueue<Integer> outQueue = queue[i+1];
5. threads[i] = new StageThread(i, inQueue, outQueue, lastThread);
6. threads[i].start();
7. }
2:
1. Integer value = inQueue.take(); // inQueue.poll(60, SECONDS); ?
3:
1. outQueue.put(runStage(value));
4:
1. if (!lastThread) {
2. shutdown();
3. }
4. thread[i].join();
Bitte melden, wenn ich wo schrecklich gefailed habe.