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 09:58] – [Aufgabe B6] 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: | ||
| + | ^ Funktion ^ Abkürzung ^ | ||
| + | | `move()`| `m()` | | ||
| + | | `left()`| `l()` | | ||
| + | | `right()`| `r()` | | ||
| + | | `is_in_front_of_obstacle()`| `is_in_front()` | | ||
| + | | `is_left_of_obstacle()`| `is_left()` | | ||
| + | | `is_right_of_obstacle()`| `is_right()` | | ||
| + | |||
| + | {{: | ||
| + | {{: | ||
| + | |||
| + | <code python> | ||
| + | lab_1 = [ | ||
| + | " | ||
| + | " | ||
| + | "tttt ttttttfft", | ||
| + | "tttt t ttttttt", | ||
| + | " | ||
| + | "tttt ffff tfft", | ||
| + | "tttt ffff t t", | ||
| + | "tttt ffff tt t", | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | |||
| + | lab_2 = [ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | </ | ||
| === Aufgabe B8 === | === Aufgabe B8 === | ||
| - | **Optional: | + | **Optional: |
| - | Schreibe *von Hand* einen Code, der den Skunky zum Ziel bringt. Der gleiche Code soll für die beiden | + | |
| + | <code python> | ||
| lab_1 = [ | lab_1 = [ | ||
| " | " | ||
| " | " | ||
| "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 370: | 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", | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | </ | ||
| + | |||
| + | ++++ | ||