## Kara Algorithmen
Ein _Algorithmus_ ist eine eindeutige Vorgehensweise zur Lösung eines Problems. Du hast bereits einige Algorithmen ausprobiert und sogar selber einige umgesetzt, z.B. zum [[verzweigungen#aufgabe_c2blaetter_verteilen|Verteilen von Blättern]], dem [[logik#aufgabe_d1tunnel_markieren|Markieren eines Tunnels]] oder dem [[variablen#aufgabe_e2blaetter_zaehlen|Zählen von Blättern]].
Zentral dabei ist, dass diese Algorithmen nicht nur in der vorgegebenen Kara-Welt funktionieren, sondern die richtige Lösung auch dann liefern, wenn die Welt anders aussieht - zum Beispiel wenn mehr oder weniger Blätter vorhanden sind. Ein Algorithmus, der für [[variablen#aufgabe_e2blaetter_zaehlen|Aufgabe E2]] einfach die korrekte Zahl `34` ausgibt, genügt diesem Kriterium kaum.
In diesem Kapitel werden wir unsere Python-Kenntnisse vertiefen und auf algorithmische Probleme anwenden.
#### Aufgabe F1: Wand folgen
Kara wacht eifersüchtig über ihren Blättervorrat. Schreibe Python-Code, der Kara immerzu um die Bäume herumlaufen lässt.
**Hinweis**: Das Programm hört von sich aus nie auf, muss also aktiv unterbrochen werden, um es zu stoppen.
TTTTTTTTTTTTTTT
T T
T TTTTT T
T TTLLLTT T
T TTLLLLT> T
T TLLLTT T
T TLLLT T
T TLLLT T
T TTTLLLTT T
T TLLLLLLT T
T TLTTTLTT T
T TLT TTT T
T TTT T
T T
TTTTTTTTTTTTTTT
while True: # endet nie!
if not kara.treeRight():
# der rechten Wand folgen
kara.turnRight()
kara.move()
else:
# rechts ist ein Baum
if not kara.treeFront():
kara.move()
else:
kara.turnLeft()
++++TOC|
* (already covered):
* leaf counting
* tunnel detection
* wall following
* longest tunnel finding
* leaf ratio & comparisons (more / less)
* distance between two leaves
* filling a rectangle with leaves
* Boustrophedon field sweep
* alternating pattern sowing
++++
#### Aufgabe F2: Längster Tunnel
Schreibe Python-Code, um den Länge des längsten Tunnels auszugeben. Ein Tunnel ist definiert als eine gerade Strecke, bei der links **und** rechts ein Baum steht. Am Ende wird die Länge des längsten Tunnels auf der Konsole ausgegeben. Kara stoppt, wenn Sie auf einen Baum trifft.
**Tipps:**
* Merke dir den bislang längsten Tunnel (Rekordhalter) in einer Variable (zu Beginn `0`).
* Merke dir die Länge des aktuellen Tunnels in einer Variable.
* am Ende jedes Tunnels vergleichst du den aktuellen Tunnel mit dem bisherigen Rekordhalter und setzt ev. diesen eventuell auf den neuen Höchstwert.
* Vergleiche kannst du mit dem Operator `>` oder `<` anstellen, also `if laenge > rekord:`
* danach wird die aktuelle Länge auf `0` gesetzt.
TTTTTTTTTTTTTTTTTTTTTT
T T
T TTTT TTTTTT T T
T> T
T TTTTTTTT TT TT
T T
TTTTTTTTTTTTTTTTTTTTTT
record = 0
length = 0
while not kara.treeFront():
if kara.treeLeft() and kara.treeRight():
length = length + 1
kara.putLeaf() # optional
else:
if length > record:
record = length
print("Neuer Rekord:", record)
length = 0
kara.move()
print("Rekord:", record)
assert "4" in output_lines()[-1]