Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:algorithmen_i_sca [2024-12-05 10:17] – [Aufgabe B8] sca | gf_informatik:algorithmen_i_sca [2024-12-20 09:38] (aktuell) – [Installation] sca | ||
---|---|---|---|
Zeile 185: | Zeile 185: | ||
1. und ziehe es in den vorbereiteten Ordner. | 1. und ziehe es in den vorbereiteten Ordner. | ||
1. Öffne nun deinen Ordner mit VSCode und beginne darin zu arbeiten. | 1. Öffne nun deinen Ordner mit VSCode und beginne darin zu arbeiten. | ||
+ | |||
+ | Christmas Edition: | ||
+ | {{ : | ||
=== Erste Schritte mit dem Skunky === | === Erste Schritte mit dem Skunky === | ||
Zeile 346: | Zeile 349: | ||
=== Aufgabe B7 === | === Aufgabe B7 === | ||
- | Schreibe *von Hand* einen Code, der den Skunky zum Ziel bringt. Der gleiche Code soll für die beiden Labyrinthe unten sowie alle äquivalenten funktionieren. | + | Schreibe *von Hand* einen Code, der den Skunky zum Ziel bringt. Der gleiche Code soll für die beiden Labyrinthe unten sowie alle äquivalenten funktionieren. Programmiere den Code dann am Schluss am Computer. |
Verwende dazu die folgenden Funktionen. Auf Papier dürfen auch die folgenden Abkürzungen verwendet werden: | Verwende dazu die folgenden Funktionen. Auf Papier dürfen auch die folgenden Abkürzungen verwendet werden: | ||
Zeile 357: | Zeile 360: | ||
| `is_right_of_obstacle()`| `is_right()` | | | `is_right_of_obstacle()`| `is_right()` | | ||
+ | {{: | ||
+ | {{: | ||
<code python> | <code python> | ||
Zeile 397: | Zeile 402: | ||
" | " | ||
"t t t t t f t", | "t t t t t f t", | ||
- | "t t t t | + | "t t t tf t t fft", |
- | "t t t t tttttt | + | "t t ft tttttt |
- | "t t | + | "t t f t t t", |
- | "t t | + | "t t ft t t ttt |
- | "t t t t t | + | "t t t tft |
"t t t tft t ttttt", | "t t t tft t ttttt", | ||
" | " | ||
Zeile 410: | Zeile 415: | ||
" | " | ||
" | " | ||
- | "t t | + | "t t |
"t t t t t | "t t t t t | ||
- | "t t t t ttttttt | + | "t t t |
- | "t t t t | + | "t t |
"t t t t t | "t t t t t | ||
- | "t t | + | "t t ft t t |
- | "t t | + | "t t ft t t |
- | "t t | + | "t t f t t |
- | "t t | + | "t t ft t t t fffff t", |
- | "t t | + | "t t ft tft t ttttttt", |
" | " | ||
" | " | ||
] | ] | ||
</ | </ | ||
+ | |||
+ | === Aufgabe B9 === | ||
+ | |||
+ | Der Code unten (muss aufklappen) erzeugt ein zufälliges Labyrinth, in welchem genau ein Weg von links nach rechts zum Ziel führt. Der Funktion in der Zeile `lab = create_random_world_with_path(20, | ||
+ | |||
+ | * Wert 1 (hier 20): Anzahl Zellen in $x-$Richtung | ||
+ | * Wert 2 (hier 5): Anzahl Zellen in $y-$Richtung | ||
+ | * Wert 3 (hier 25): Wert zwischen 1 und 100, je kleiner, desto mehr Abbiegungen im Weg | ||
+ | |||
+ | Auftrag (wenn räumlich möglich): | ||
+ | |||
+ | 1. Baue Labyrinth mit Stühlen nach. | ||
+ | 1. Arbeite in kleinen Gruppen. | ||
+ | 1. Auf *Papier*: Schreibt Code, der Skunky für jedes solche Labyrinth zum Ziel führt. | ||
+ | 1. Probiert Code im echten Labyrinth aus, verbessert gegebenenfalls. | ||
+ | 1. Schreibe Code in Python. Jede(r) schreibt *eigenen* Code. | ||
+ | |||
+ | ++++Code| | ||
+ | <code python> | ||
+ | ### IGNORE CODE FROME HERE ... | ||
+ | from skunky import Skunky | ||
+ | import random | ||
+ | from itertools import groupby | ||
+ | |||
+ | def create_random_world_with_path(n_x_tot=20, | ||
+ | n_y = n_y_tot - 2; n_x = n_x_tot - 2 # remove frame | ||
+ | |||
+ | # create list describing path | ||
+ | path = [random.randint(0, | ||
+ | while True: | ||
+ | if x > n_x: break | ||
+ | # first two entries must be identical | ||
+ | if len(path) < 2: path.append(path[-1]); | ||
+ | # avoid changing lane if not at least 3 identical ones | ||
+ | if len(set(path[-3: | ||
+ | # check if switch lane or not | ||
+ | p = random.randint(1, | ||
+ | if p < probability_same: | ||
+ | else: | ||
+ | if path[-1] == 0: path.append(1) | ||
+ | elif path[-1] == n_y - 1: path.append(n_y-2) | ||
+ | else: path.append(random.choice([path[-1]-1, | ||
+ | |||
+ | # convert path list into world map | ||
+ | world = [[' | ||
+ | x = 0 | ||
+ | for i,y in enumerate(path): | ||
+ | world[y][x] = ' ' | ||
+ | if y == path[i-1] and i > 0: | ||
+ | for i in range(n_y): world[i].append(' | ||
+ | x += 1; world[y][x] = ' ' | ||
+ | |||
+ | world[path[0]][0] = ' | ||
+ | |||
+ | # add frame around world and convert into string list | ||
+ | for w in world: w.insert(0,' | ||
+ | world = ['' | ||
+ | world.insert(0,' | ||
+ | return world | ||
+ | |||
+ | ### IGNORE CODE UNTIL HERE. BELOW WRITE YOUR OWN CODE | ||
+ | lab = create_random_world_with_path(20, | ||
+ | |||
+ | fritz = Skunky(world_map=lab, | ||
+ | |||
+ | # here add your code | ||
+ | |||
+ | fritz.show_indefinitely() | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | === Aufgabe B10 === | ||
+ | |||
+ | Stelle dir vor, dass eines Tages dein Überleben davon abhängt, ob du aus einem Labyrinth herausfindest oder nicht. Wie gehst du vor? Es gibt einen einfachen Algorithmus, | ||
+ | |||
+ | 1. Arbeite in 2er Gruppe | ||
+ | 1. Holt beim Lehrer einen Ausdruck des folgenden Labyrinths: | ||
+ | {{: | ||
+ | 1. Verwendet ein kleines Objekt als Skunky ... | ||
+ | 1. ... und versucht verschiedene Ideen heraus, mit der der Skunky *systematisch* aus diesem und (fast) jedem anderen Labyrinth herausfindet. Findet eine Strategie / einen Algorithmus. | ||
+ | 1. Diskutiert eure Strategie mit dem Lehrer. | ||
+ | 1. Sobald ihr das OK vom Lehrer habt: Implementiert euren Algorithmus für den Skunky und probiert diesen für verschiedene Labyrinthe aus. | ||
+ | |||
+ | === Optional: Aufgabe B11 === | ||
+ | |||
+ | Ziemlich anspruchsvoll. Es hilft auch, wenn man schon weitere Programmierkonzepte wie Listen kennt. | ||
+ | |||
+ | 1. Mit dem Algorithmus der letzten Aufgabe findet man aus fast allen Labyrinthen heraus. Es gibt aber solche, für die dieser Algorithmus nicht funktioniert. Für welche? | ||
+ | 1. Ein Beispiel ist das Labyrinth unten. Hole beim Lehrer einen Ausdruck und versuche, einen Algorithmus zu finden, der den Skunky aus diesem (und jedem anderen Labyrinth) herausbringt. | ||
+ | 1. Implementiere den Algorithmus als Code. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ++++Code Labyrinth| | ||
+ | |||
+ | <code python> | ||
+ | lab = [ | ||
+ | " | ||
+ | " | ||
+ | "t t ttttt ttt t", | ||
+ | "t t t tttgt t", | ||
+ | "t t t t t t t", | ||
+ | "t t | ||
+ | "t ttttt tttt t", | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | "tf ttt ttt t tt", | ||
+ | " | ||
+ | "tf t ttt t t t", | ||
+ | " | ||
+ | "tf tttttt tt tt", | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | ++++ | ||
+ | |||