Robot Karol: Ziegelstapel der Höhe nach sortieren: Unterschied zwischen den Versionen
Zeile 34: | Zeile 34: | ||
==3. Vergleichen zweier Stapel== | ==3. Vergleichen zweier Stapel== | ||
+ | |||
+ | Um zwei Stapel zu vergleichen, vor denen Karol steht, bleibt ihm nichts anderes übrig, als von beiden Stapeln gleich viele Ziegel abtragen, bis einer der beiden Stapel leer ist. Dann weiß er, auf dem leeren platz war zuvor der kleinere Stapel. Karol kann die abgetragenen Ziegel hinter sich parken. | ||
+ | |||
+ | Anweisung gleicheweglegen | ||
+ | //Karol steht vor zwei Stapeln und überprüft den vorliegenden und den linken Stapel | ||
+ | //Solange beide Stapel Ziegel bergen, legt er von jedem Stapel einen Ziegel hinter sich | ||
+ | //Am Ende ist einer der beiden Reststapel leer | ||
+ | //Karol steht am Ende immer am rechten Stapel | ||
+ | MarkeSetzen | ||
+ | solange IstMarke tue | ||
+ | wenn NichtIstZiegel dann MarkeLöschen *wenn | ||
+ | LinksGehen | ||
+ | wenn NichtIstZiegel dann | ||
+ | RechtsGehen MarkeLöschen | ||
+ | sonst | ||
+ | RechtsGehen | ||
+ | *wenn | ||
+ | wenn IstMarke dann | ||
+ | Aufheben LinksDrehen LinksDrehen Hinlegen | ||
+ | RechtsDrehen Schritt RechtsDrehen | ||
+ | Aufheben LinksDrehen LinksDrehen Hinlegen | ||
+ | LinksDrehen Schritt LinksDrehen | ||
+ | *wenn | ||
+ | *solange | ||
+ | *Anweisung | ||
Version vom 18. April 2021, 01:15 Uhr
>>> zurück zur Übersicht von Robot Karol
Es gehört zu den wichtigsten und am häufigsten gestellten Aufgaben, irgendwelche Objekte zu sortieren. Da man oft große Datenmassen sortieren muss, ist es auch äußerst wichtig, möglichst schnelle Sortiermethoden zu entwickeln. Dabei ist für die Geschwindigkeit natürlich entscheidend, was der Sortierer alles kann. Und da sind wir beim Knackpunkt.
Karol kann recht wenig.
- Karol kann sich zum Beispiel nichts merken (alles, was er früher schon einmal angeschaut hat, muss er immer wieder anschauen)
- Karol kennt keine Zahlen, kann keine Zahlen vergleichen.
- Karol kennt nur seine unmittelbare Nachbarschaft.
... und so wird eine einfache Sortieraufgabe zu einer knackige Sache!
1. Sortieridee
Wenn Karol an der unsortierten Ziegelstapelreihe (von rechts nach links) vorbei läuft, kann er nur benachbarte Stapelhöhen vergleichen. Karol sieht nicht - wie Du - "auf einen Blick" den kleinsten Stapel! Also wird er an der Stapelreihe vorbeigehen und immer nur benachbarte Stapel richten, also vertauschen, wenn sie in falscher Ordnung stehen.
Dann wandert aber nur der kleinste Stapel ganz nach Süden bei einem Durchlauf. Also muss er mehrmals an allen vorbei. Beim zweiten Durchlauf werden schon die beiden kleinsten Stapel im Süden in richtiger Folge stehen, u.s.w..
Und auch, um zwei benachbarte Stapel zu vergleichen, muss Karol Ziegel abtragen, bis einer der beiden Stapel leer ist und dann sehen, was wo übrig bleibt, denn Karol kann keine Zahlen vergleichen. ... also lass uns ganz am Anfang beginnen:
2. Einfache neue Bewegungsanweisungen
Da wir sehr häufig einen Sidestep links oder rechts (immer wieder) brauchen, wollen wir folgende neuen Anweisungen vereinbaren:
Anweisung LinksGehen LinksDrehen Schritt RechtsDrehen *Anweisung
Anweisung RechtsGehen RechtsDrehen Schritt LinksDrehen *Anweisung
3. Vergleichen zweier Stapel
Um zwei Stapel zu vergleichen, vor denen Karol steht, bleibt ihm nichts anderes übrig, als von beiden Stapeln gleich viele Ziegel abtragen, bis einer der beiden Stapel leer ist. Dann weiß er, auf dem leeren platz war zuvor der kleinere Stapel. Karol kann die abgetragenen Ziegel hinter sich parken.
Anweisung gleicheweglegen //Karol steht vor zwei Stapeln und überprüft den vorliegenden und den linken Stapel //Solange beide Stapel Ziegel bergen, legt er von jedem Stapel einen Ziegel hinter sich //Am Ende ist einer der beiden Reststapel leer //Karol steht am Ende immer am rechten Stapel
MarkeSetzen solange IstMarke tue wenn NichtIstZiegel dann MarkeLöschen *wenn LinksGehen wenn NichtIstZiegel dann RechtsGehen MarkeLöschen sonst RechtsGehen *wenn wenn IstMarke dann Aufheben LinksDrehen LinksDrehen Hinlegen RechtsDrehen Schritt RechtsDrehen Aufheben LinksDrehen LinksDrehen Hinlegen LinksDrehen Schritt LinksDrehen *wenn *solange
- Anweisung
//Westseite Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt LinksDrehen //Südseite Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt LinksDrehen //Ostseite Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt LinksDrehen //Nordseite Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt LinksDrehen
Version 2: Mit Wiederholungen alles einfacher, flexibler und übersichtlicher gestalten
Sieh' Dir mal das Programm unten genau an! Es hat dieselbe Wirkung, wie der "irre" Befehlstext oben. Ist er nicht 10x einfacher zu verstehen, 10x übersichtlicher? Du kannst offensichtlich auch Befehle hintereinander schreiben statt nur immer untereinander. Dadurch werden auch Sinn-zusammenhängende "Codeschnipsel" leichter erkennbar.
Außerdem musst Du nur eine Zahl ändern, wenn Karol die Strecke nicht 4x sondern vielleicht 10x oder 200x gehen und ziegeln soll.
Aber: Karol geht immer stur 4x nach vorne, Kann also nur 5x5 Schwimmbäder bauen. Wenn man aber vorher nicht weiß, wie groß das Grundstück des Kunden ist, sollte man sagen können: Gehe und ziegle sooft wie nötig - also bis zur gegenüber liegenden Wand ...!!!
wiederhole 4 mal Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt Hinlegen Schritt LinksDrehen *wiederhole