Achtung: Koordinaten sind verschoben. siehe unten.
Nachdem in lezter Zeit die Beschwerden immer lauter geworden sind,
dass es hier zuviele Informatiker-Caches gibt, die nur von
Informatikern gelöst werden können ( ich will hier keinen Namen
nennen
), dachte ich: "leg doch mal einen Informatiker-Cache, den auch
Nichtinformatiker lösen können!"
Ja da nehmen wir doch ein dem Fachgebiet ureigenes Thema: die
Turingmaschine
-- ab jetzt abgekürzt mit TM. Wie typisch für Informatiker, sind
TMs sowohl ziemlich nutzlos, als auch ziemlich praktisch. Eine TM
kann nämlich so gut wie nichts und das macht sie so praktisch. Wenn
man nachweisen kann, dass etwas mit einer TM lösbar ist oder nicht,
erlaubt dies Aussagen über das Problem auf welche IT-Forscher
scharf sind wie Nachbars Lumpi. Soweit wollen wir hier nicht gehen.
Wir benutzen eine TM um uns die Koordinaten eines Caches erzeugen
zu lassen.
Wie funktioniert jetzt so eine TM? Man kann sich eine TM als
langes Band vorstellen, auf welchem etwas gespeichert werden kann,
sowie einen Schreib/Lesekopf, der etwas vom Band liest und wieder
darauf schreibt und anschliessend den Schreib/Lesekopf bewegen
kann. Das Ganze wird vervollständigt durch ein Programm, bzw. eine
Zustandstabelle, welche abgearbeitet wird.
Wir brauchen hierzu keinen Computer, sondern können selbst die
TM spielen, indem wir einen langen Streifen kariertes Papier nehmen
und eine Kombination von Bleistift und Radierer als Schreibkopf
benutzen. Bitte fangt hier nicht ganz links an, sondern lasst ca. 6
Felder frei. Insgesamt brauchen wir um die 100 Felder. Ihr müßt
also ein bißchen kleben.
Wir verwenden hier die einfachste TM, die es gibt. Die TM kennt
genau zwei verschiedene Symbole: ein leeres Feld [] und einen
Strich |.
Wie wird jetzt ein TM-Programm abgearbeitet? Hierzu hat die TM
einen aktuellen Zustand, ganz am Anfang des Programmes nimmt man
hierfür einfach den ersten Zustand in der Tabelle (hier
S01). Man hat also einen aktuellen Zustand und der
Schreib/Lesekopf steht an einer bestimmten Stelle. Auf dieser
Stelle ist jetzt ein Symbol, entweder ist das Feld leer, oder da
steht ein Strich. Wir schauen jetzt beim aktuellen Zustand in der
Tabelle nach: hier gibt es zwei Einträge für das, was zu tun ist,
abhängig vom Symbol an der aktuellen Bandpostion. Steht an der
aktuellen Bandposition ein Strich, dann nehmen wir den Eintrag der
Spalte "Input |", andernfalls nehmen wir den Eintrag der
Spalte "Input []". Z.b. bei leerer Bandposition und aktuellem
Zustand S01 bedeutet dies: "write |", also mache einen
Strich in das leere Feld, "move R", bewege dich eine Bandstelle
nach rechts, "=> S44" und mache mit Zustand S44
weiter.
Entsprechend bedeuten die Anweisungen "write []": lösche bzw.
radiere das Feld, "move .": bleibe an der Stelle, "move L": bewege
dich eine Position nach links.
Dieses wird solange fortgeführt, bis man den Zustand HALT
erreicht. Damit ist die Aufgabe eigentlich erklärt. Doch halt: bei
nur zwei Symbolen, wovon eines einfach ein leeres Feld ist, wie
kann ich da Koordinaten erkennen? Die werden einfach durch die
Anzahl an Strichen vermerkt. Da wir kein unterschiedliches Zeichen
für 0 und einen Abstand zwischen zwei Zahlen haben, müßt ihr
wissen, wie Koordinaten aussehen, um das Ergebnis korrekt zu
interpretiern.
Ein []||||[]||||||||[][]|[] kann sowohl 48 1 bedeuten, als auch
4801. Es ist also darauf zu achten, wo die Nullstellen zu erwarten
sind.
Jetzt viel Spass beim Abarbeiten eines Turing-Programmes.
State |
Input [] |
Input | |
S01 |
write |
move R
=> S44 |
write []
move .
=> S44 |
S02 |
write []
move R
=> S16 |
write |
move R
=> S02 |
S03 |
write |
move L
=> S36 |
write |
move R
=> S24 |
S04 |
write []
move R
=> S33 |
write |
move R
=> S26 |
S05 |
write []
move R
=> S14 |
write |
move R
=> S05 |
S06 |
write []
move R
=> S34 |
write |
move R
=> S19 |
S07 |
write |
move L
=> S07 |
write |
move R
=> S12 |
S08 |
write |
move R
=> S45 |
write |
move R
=> S08 |
S09 |
write |
move R
=> S36 |
write |
move R
=> S09 |
S10 |
write |
move R
=> S50 |
write []
move .
=> S50 |
S11 |
write []
move R
=> S37 |
write |
move R
=> S11 |
S12 |
write []
move R
=> S07 |
write |
move R
=> S14 |
S13 |
write []
move R
=> S11 |
write |
move R
=> S13 |
S14 |
write |
move L
=> S12 |
write |
move R
=> S23 |
S15 |
write |
move R
=> S32 |
write |
move L
=> S15 |
S16 |
write |
move R
=> S28 |
write []
move .
=> S28 |
S17 |
write |
move L
=> S27 |
write |
move R
=> S53 |
S18 |
write []
move R
=> S41 |
write |
move R
=> S08 |
S19 |
write []
move R
=> S06 |
write |
move R
=> S05 |
S20 |
write []
move R
=> S56 |
write []
move R
=> S44 | |
State |
Input [] |
Input | |
S21 |
write []
move R
=> S51 |
write |
move R
=> S21 |
S22 |
write |
move R
=> S16 |
write []
move L
=> S22 |
S23 |
write []
move R
=> S12 |
write |
move R
=> S55 |
S24 |
write |
move R
=> S03 |
write |
move .
=> S52 |
S25 |
write []
move R
=> S31 |
write |
move R
=> S25 |
S26 |
write []
move R
=> S04 |
write |
move R
=> S09 |
S27 |
write |
move R
=> S17 |
write []
move .
=> S17 |
S28 |
write |
move L
=> S16 |
write |
move R
=> S30 |
S29 |
write |
move R
=> S52 |
write []
move L
=> S29 |
S30 |
write |
move R
=> S13 |
write []
move R
=> S22 |
S31 |
write |
move L
=> S54 |
write |
move R
=> S31 |
S32 |
write |
move L
=> S15 |
write |
move R
=> S51 |
S33 |
write |
move L
=> S33 |
write |
move R
=> S39 |
S34 |
write |
move L
=> S34 |
write |
move R
=> S47 |
S35 |
write []
move R
=> S02 |
write |
move R
=> S51 |
S36 |
write []
move R
=> S40 |
write []
move L
=> S36 |
S37 |
write []
move R
=> S27 |
write |
move R
=> S37 |
S38 |
write |
move L
=> S48 |
write |
move R
=> S60 |
S39 |
write |
move R
=> S33 |
write |
move R
=> S04 |
S40 |
write []
move R
=> S03 |
write |
move R
=> S03 | |
State |
Input [] |
Input | |
S41 |
write []
move R
=> S46 |
write |
move R
=> S18 |
S42 |
write []
move R
=> S39 |
write |
move R
=> S42 |
S43 |
write |
move R
=> S27 |
write []
move L
=> S43 |
S44 |
write |
move L
=> S01 |
write |
move R
=> S20 |
S45 |
write []
move R
=> S21 |
write |
move R
=> S45 |
S46 |
write |
move L
=> S46 |
write |
move R
=> S56 |
S47 |
write |
move R
=> S34 |
write |
move R
=> S06 |
S48 |
write |
move R
=> S38 |
write |
move L
=> S38 |
S49 |
write []
move R
=> S25 |
write []
move R
=> S10 |
S50 |
write |
move L
=> S10 |
write |
move R
=> S47 |
S51 |
write |
move R
=> S15 |
write []
move R
=> S35 |
S52 |
write |
move R
=> S59 |
write []
move .
=> S59 |
S53 |
write |
move R
=> S42 |
write []
move R
=> S43 |
S54 |
write []
move L
=> S49 |
write |
move L
=> S25 |
S55 |
write []
move R
=> S58 |
write |
move R
=> S55 |
S56 |
write |
move R
=> S46 |
write |
move R
=> S41 |
S57 |
write |
move R
=> S49 |
write []
move R
=> S29 |
S58 |
write []
move R
=> S38 |
write |
move R
=> S58 |
S59 |
write |
move L
=> S52 |
write |
move R
=> S57 |
S60 |
write []
move R
=> S48 |
write |
move L
=> HALT | |
Nach der Turingberechnung gibt es noch eine Verschiebeung, die
durch das Neuauslegen des Caches zustande kommt:
Final Nord= Turingresultat - 00 00.026, Final Ost: Turingresultat +
0 00.001.
Der Hint gilt fuer das Turingresultat, nicht fuer die
Finalkoordinaten.