Aufgabe 5.3

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.

Aufgabe 5.3
Hi,

hat jemand rausgefunden, wozu in Zeile 1 des Templates GridRiddleSolver.java folgender Import stattfindet:
import java.util.Arrays;

Meines Achtens werden weder Funktionen aus der Bibliothek benötigt, noch dürfen wir diese nutzen → oder mache ich es mir und der RunTimeEnvironment hier unnötig schwer? :slight_smile:

Danke & schönes WE
TU


Damit kann man Arrays.toString() verwenden, um die Aufgabe besser testen zu können.


@Chayyam: Na klar… dann hab ichs sogar genutzt… und mir die Frage gestellt, als die Debugging-Zeilen wieder auskommentiert waren… thx für die Info… stand da total auf dem Schlauch. :slight_smile:


Ich möchte nicht unbedingt einen weiteren neuen Thread für die Aufgabe aufmachen, deshalb frag ich jetzt hier.
Wenn ich GridRiddleExamples ausführe, bekomme ich folgende Fehlermeldung:

Exception in thread "main" java.lang.VerifyError: Inconsistent stackmap frames at branch target 125 in method GridRiddleExamples.printGrid([[CZ)V at offset 111

Kann mir jemand erklären, wie ich das beheben kann? Und was das genau bedeutet?


Ich würde auch gerne noch eine Frage ergänzen:

Wird ein Performancecheck analog dem auf dem Übungsblatt vorgegebenen als öffentlicher Testfall im EST durchgeführt oder muss man (wenn man bisher alles auf eigenen Systemen entwickelt hat) für diese Aufgabe einen Account im CIP-Pool erstellen, um den Test auf dem Referenzsystem selbstständig durchzuführen?


Ich habe auch noch eine Frage, vielleicht ist euch auch so etwas unterlaufen. Ich habe nämlich zunächst eine Methode geschrieben, die so lange versucht, Wörter ins Feld einzufügen, bis eine bestimmte Anzahl Wörter nicht eingefügt wurde. Wenn ich als Anzahl 5 zurückgebe, dann wird bei “easy” so etwas gemacht:

Nicht eingefügt: [STRAFE, KONSERVE, ORDNER, ERNTEMOND, SPRINGER]
grid:

T O U R I S M U S B E W A C H U N G E E C E T O L A U S B U B H I T F E I A N L A S S A B R E D E S D N E S C A K R I E G E N P E K T O N E P H R A S E P O S T K A R T E B T P L A P P E R E R R E I S E W E G E A A E E R Z E N G E L G G A K E Z I E U T E O S N T I N U S S T O R T E G A L E R I S T

Das stimmt zwar nicht mit der Lösung überein, aber es wäre eine mögliche Lösung für 5 leere Felder und 5 nicht eingefügte Wörter. Konvergiere ich die Anzahl gegen 0, so passiert Folgendes schon bei Länge 4:

Nicht eingefügt: [TOURISMUS, POSTKARTE, GEAEST, SCHLEPPE]
grid:

T R B E W A C H U N G E E E T O L A U S B U B I T F E I A N L A S S A B R E D E S D N S C A K R I E G E N E K T O N E P H R A S E P T K R R B O T O P L A P P E R E R S P R I N G E R E A D A T S E R Z E N G E L N G R E I S E W E G K E E Z A R I N U S S T O R T E F V O N T I E R N T E M O N D G A L E R I S T

Ab einer bestimmten Länge (spätestens 0) passen also alle Wörter, aber es entsteht ein Problem, dass zufällig ein Buchstabe eingefügt / nicht richtig gelöscht wurde, wo keiner hingehört (in diesem Fall ist das das “R” unter dem “P” von “Phrase”). Kann dieser Fehler dadurch entstehen, dass man simultan 2 Einträge löschen will und dann nicht richtig löschen kann? Oder ist einfach unplace falsch programmiert? Denn wenn ich dann noch weiter gegen 0 runtergehe, bleibt nur noch der Buchstabe R da.


Ist Laufzeit ein Bewertungskriterium? Das sah mir so sehr nach Nebnesatz aus…


Laufzeit ist immer ein Bewertungskriterium (sonst muss man gar nicht Backtracking machen, sondern nur die 24! Optionen durchprobieren) und Nebensätze sind sehr klausurrelevant, was man an left outer join und Mapping 8a-d in KonzMod-Klausuren oder an leicht veränderten Zusatzaufgaben in AuD-Klausuren sieht.

0 oder ‚0‘ ?
Hallo,

ich habe zur Teilaufgabe b) ebenfalls noch eine Frage:

Ich habe jetzt auch tatsächlich den Wert 0 zu gewiesen,
mein Übungsgruppenpartner ( oder heißt es Gruppenübungspartner=)
ist jedoch der Meinung, dass man hier ‚0‘ zu weisen soll,
also den ASCII-Code des Zeichens Null.

Was meint ihr?

beste Grüße

s)


Man beachte die sprachliche Äquivalenz: 2x „Wert 0“
In der Aufgabestellung steht explizit nichts von char „NUL“ oder der ASCII-Ziffer ‚0‘ oder…


Ich habe endlich den Grund für das fehlende Löschen meiner Variablen gefunden. Und zwar habe ich in der Methode placeWord genau dann “true” übergeben, wenn alle benachbarten Zeichen in der anderen Richtung nicht leer waren. Das führt dann aber dazu, dass das Zeichen nicht gelöscht wird, wenn Folgendes vorliegt:

B L A _ _
_ _ S T R
_ _ 0 _ _
_ _ 0 _ _
_ _ 0 _ _

Auch wenn bei “AS” kein Wort vorliegt (mit “0” meine ich die Kästchen, wo ein Wort sein soll, mit “_”, wo keins hingehört), wird beim Löschen von “BLA” das “A” nicht gelöscht. Was ich jetzt stattdessen überprüfen würde, ist, ob an einem Kästchen ein Nachbar anliegt. Aber wie kann man das machen, wenn man kein gridSpec zur Verfügung hat? Ich würde ja gridSpec in placeWord einbauen, aber dann hätte ich 0 Punkte auf Signaturveränderung

Ariadne-Faden
Hey,

ebenfalls eine Frage zu der Aufgabe deswegen stell ich sie auch gleich hier:

Sollen/müssen wir in der Aufgabe einen Ariade-Faden benutzen und wenn ja, könnte mir jemand einen kleinen Hinweis geben was ich darin speichern könnte.

Mein jetztiges Problem ist einfach dass ich mittels Backtracking das Gitter “Baby” ohne Probleme und schnell lösen kann, bei Level Easy die Rechendauer aber exorbitant groß wird.

Hat jemand ein ähnliches Problem bzw wie habt ihr es gelöst :slight_smile:


Backtracking ohne Ariadne-Faden? Wie sähe das aus???


Kannst du vielleicht algorithmisch beschreiben, wie du es gelöst hast, dass bei dir das „Baby“-Gitter passt? Ich hätte die Aufgabe ungefähr so gelöst:

Gehe aufs erste gridSpec-Feld.
Finde alle wordSpec-Einträge, die ins Feld passen.
Untersuche, ob für einen der Nachbarn des Anfangsfeldes keine Lösung möglich ist.
Wenn keine Lösung möglich ist, lösche den Eintrag und kontrolliere den nächsten.
Ansonsten iteriere so lange, bis keine Wörter mehr eingefügt werden müssen und bis alle gridSpec-Felder besetzt sind.

Zum Testen empfiehlt es sich, die Rekursionstiefe (also das Wort „keine“ / alle) auch mal zu variieren.

Im Prinzip hätte man also bei dem Algorithmus 2-3 zusätzliche Methoden neben den bereits implementierten benötigt: die Methode zur Berechnung der Anzahl Nachbarn, die Methode zur Berechnung der passenden Wörter und die Methode zur eigentlichen Rekursion (evtl. macht man das in der solveRiddle-Methode, ich hätte aber lieber eine Hilfsmethode implementiert).

Das Problem ist, dass der Algorithmus bei nicht zusammenhängenden Graphen versagt. Dazu entstehen Schwierigkeiten beim Implementieren von placeWord, da dort gridSpec als Parameter fehlt. Es muss also irgendwelche besseren Lösungen geben, die ich aber nicht kenne.


Hallo,

ich bin beim Versuch diese Aufgabe zu lösen
nun auf den Foliensatz Nummer 5 gestoßen,
Folie 109. Möglicherweise ist die Aufgabe
dieser Übung, den Programmtext, den man da
sieht, entsprechend anzupassen:

Was ich hier nun nicht verstehe, ist, was es genau mit der Variablen c
auf sich haben soll:
Ich denke das soll eine potentiell einzusetzende Ziffer sein,(im Beispiel gehts um ein Sudoku)
aber müsste es dann nicht heißen
candidates an der Stelle i
statt
c
?

beste Grüße

s)


Ja, das ist ein Fehler (da stand mal eine “foreach”-Schleife, in der das c definiert wurde).
Da fehlt ein int c = candidates[i];


klingt gut


Bitte nicht in die iterative Denkweise verfallen!
Aber so ähnlich… Aufgabenstellung bis zum Ende lesen (ab „Hinweis zur letzten Teilaufgabe […]“ und mind. bis „[…] über EST ab.“) und die Folie(n) der Vorlesung, deren wichtigster Inhalt oben gepostet wurde, zu Rate ziehen.
=> Der „Ariadne-Faden“ muss dann nicht mehr explizit implementiert werden, sondern ergibt sich implizit durch die Rekursion („der Faden steckt im Stack und wird von der JVM verwaltet“).

s/iteriere/rekursiere
s/und bis/oder bis

wozu?

„Sie dürfen bei Bedarf private Hilfsmethoden ergänzen.“
=> Aber eine genügt, die der [m]solveRiddle[/m] weitere Parameter verpasst, um die Rekursion besser zu steuern.

Siehe Grumpy Cat…
[m]placeWord[/m] und [m]unplaceWord[/m] heißen nicht nur ähnlich, sie haben mehr gemeinsam - nutzt diese Ariadne-Stütze (aka Hänsel&Gretel-Krümel)!


Wieso prüfst du überhaupt „in der Umgebung“ des gerade betrachteten Wortes?
Bitte das Zusammenspiel (und die Reihenfolge der Aufrufe) von [m]placeWord[/m] und [m]unplaceWord[/m] nochmal gründlich überdecken.
Vllt. hilft es, sich die [m]main[/m] nochmal Schritt für Schritt anzuschauen, insbesondere das Einfügen/Löschen von [m]wordsSpec[wordsSpec.length - 3][/m] und [m]wordsSpec[6][/m] sowie die Verwendung von [m]placementH[/m] und [m]placementV[/m] ebenda…

Edith ergänzt:

Signaturen unter keinen Umständen verändern - niemals nie!


Habe auch ein Problem mit der Aufgabe. Habe das ganze wie in den Folien geschrieben implementiert.
Mein state besteht dabei aus den noch einzufügenden gridSpec und wordSpec Einträgen. Die Bedingung wann die Lösung bestimmt wurde, wurde ja bereits in vorherigen Einträgen hier geschrieben, deswegen gehe ich darauf auch nicht ein.
Solange man noch nicht fertig ist, wird jetzt ein gridSpec Eintrag herausgenommen und eben alle möglichen Kandidaten ausprobiert. Der Trick besteht dann eben darin, dass die backtrack Methode eben mit den specs ohne die momentanen Einträge ausprobiert wird. Beim rückgängig-machen werden die Einträge wieder dazu genommen (an der richtigen Stelle) und das Wort aus dem grid entfernt.

Klingt meiner Meinung nach plausibel, wurde mir in der Rechnerübung heute so auch als “müsste eigentlich klappen” abgesegnet.
Allerdings rechnet er ewig und kommt auf keine Lösung. Er konnte bisher maximal 16 Einträge eintragen. Ich bin mir sicher, dass der Algorithmus in endlicher Zeit eine Lösung finden würde, von 300ms ist das ganze aber sehr weit entfernt.