JWINF-Trainingsaufgabe "Fischen" (Python)?
Hallo,
ich bereite mich momentan auf den Jugendwettbewerb in Informatik vor. Bei den Trainingsaufgaben bin ich aber auf eine Aufgabe gestoßen, die ich nicht lösen konnte. Gegeben ist das "Insel"-Problem (siehe Aufgabenstellung), bei dem der Roboter die Fische aus den Netzen aufsammeln und auf den Inseln abliefern soll. Soweit nicht sonderlich schwierig, dies lässt sich mit wenigen for-Schleifen und if-Fallunterscheidungen lösen. Das Problem:
- Der Roboter darf nur versuchen einen Fisch abzuliefern, wenn er auch einen Fisch transportiert (genauere Informationen siehe Bild mit "Weiteren Hinweisen"). So erledigen sich Schleifen, wie dass der Roboter sich immer bewegen soll und wenn er auf einem Fisch ist diesen aufsammeln soll und wenn er auf einer Insel ist einen Fisch abliefern soll, da es bspw. vorkommt dass zuerst Inseln kommen und erst danach Fische zum aufsammeln.
- Die Inseln sind "zufälig", bzw. ohne Muster platziert, d.h. Fisch und Insel sind z.B. nicht immer nur 5 Felder voneinander entfernt. KORREKTUR: Die Grafik ist maßstabsgetreu und die Inseln und Fische sind genau auf den in der Grafik angegebenen Felder, ihre Position verändert sich nicht mehr. Nur ich erkenne hier halt kein Muster.
- Man darf nur for-Schleifen und Fallunterscheidungen benutzen, keine while-Schleifen etc.
Ich hoffe dass wer eventuell einen Lösungsvorschlag oder zumindest Tipps und Ideen hat. Vielen Dank im Voraus : )
Ich habe vergessen zu erwähnen: Das Programm ist auf 22 Befehle limitiert!
2 Antworten
So ist die Aufgabe nicht lösbar. Man muss zumindest wissen, wie groß das Feld ist, sonst kann man nicht rechtzeitig die Richtung wechseln. Aber selbst dann bin ich mir nicht sicher, ob es geht. Vermutlich muss man das Feld (ziemlich oft) durchlaufen und dabei jeden Fisch auf dem Weg auf ein dediziertes Feld legen. Dazu bräuchte man aber einen Rundweg, bei dem der Startpunkt egal ist, oder man müsste die Anzahl der Fische kennen.
Die Grafik suggeriert aber, dass jede Zeile genau einen Fisch und eine Insel enthält. Dann sollte es einfacher gehen: Durchlaufe jede Zeile in eine Richtung und fange diesen einen Fisch, und liefere ihn auf dem Rückweg auf der einzigen Insel in dieser Zeile ab.
Das habe ich in meiner Frage in Punkt 2 wohl etwas unglücklich formuliert, also die Inseln und Fische bleiben jetzt so, nur erkenne ich hier hslt kein Muster.
nicht sicher ob das geht,
Du denkst zu kompliziert!
12×: wenn Fisch: fangen; rechts;
12×: links; wenn Insel: ablegen;
oben;
Das ist unabhängig von der Anordnung Fisch/Insel. Es funktioniert immer, wenn
- jede Zeile genau einen Fisch und eine Insel hat oder leer ist
- der rechte und obere Rand leer sind
Die zweite Bedingung kriegt man weg, wenn man etwas Code dupliziert. Aber die erste ist wohl essenziell, weil der Roboter nicht zählen kann und kein Gedächtnis hat.
Vielen Dank für die Hilfe, das wir die richtige Lösung sein. Ich probiere sie nachher mal aus, aber so wird das Problem mit der Reihenfolge ja gelöst 👍
for loop in range(11):
if aufFisch():
fangeFisch()
rechts()
for loop in range(11):
links()
for loop in range(11):
if aufInsel():
legefischab()
rechts()
for loop in range(11): links()
auf jede Zeile erst nach rechts fahren und fische einsammeln falls du auf fische stehst, aber noch nicht ablegen. Danach wieder ganz nach links fahren und jetzt erst anfangen mit fische austeilen indem du nach rechts fährst, danach wieder ganz nach links. Eine Zeile hoch und wiederholen.
Bei diesem Code würde die Figur durchgängig nach links und wieder nach rechts laufen. Man müsste ganz am ende noch einmal oben() anfügen.
Aber trotzdem vielen Dank!
Danke für deine Hilfe. Da bin ich mir aber leider auch nicht sicher ob das geht, weil ja manchmal zuerst ein Fisch und dann eine Insel kommt und manchmal zuerst die Insel und dann der Fisch. 4 mal kommt zuerst der Fisch, 3 mal zuerst die Insel. Ein Muster dazwischen erkenne ich leider nicht, d.h. so etwas wie 1. nur durchlaufen 2. durchlaufen und zurück 3. nur durchlaufen ist nicht möglich.
Natürlich könnte ich mir for-Schleifen jeden dieser Fälle abdecken, aber ich fürchte diese Lösung wäre nicht elegant und würde das Limit von Befehlen überschreiten.
Ein anderes Muster, z.B. die Bahnen nicht waagerecht sondern vertrikal zu ziehen ist auch nicht möglich, da es nur die Befehle "rechts", "links" und "oben" zur Steuerung gibt, nichts wie "unten".
Trotzdem vielen Dank für deine Hilfe 👍
PS: Das Feld ist so maßstabsgetreu, also die Abstände stimmen so alle