OoK!

Flockyflo

Lieutenant
Registriert
Okt. 2008
Beiträge
977
Hallo,
Kennt sich irgendjemand von euch mit der esoterischen Programmiersprache OoK! aus?
Ich wollte die Sprache lernen und hab mich schon etwas durchs I-Net durchgelesen, jedoch finde ich kein gute Tutorial um das „Hello World“ verständlich erklärt zu bekommen.
Auf Wikipedia steht zwar der Code, jedoch ist er sehr verwirrend, da mit Schleifen gearbeitet wird, die für mich irgendwie an der Stelle keinen Sinn ergeben.
Evtl. hat sich ja schon mal jemand von euch mit der Sprache beschäftigt und könnte mir den Sinn der Schleifen erklären ;)

Um diesen Code geht es:
Code:
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook.
Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?
Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook.
Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.
 
Geh einfach mal Schritt für Schritt das Programm durch und führe es quasi per Hand aus, dann solltest du ja sehen, was es tut :)

Im übrigen ist Ook! eigentlich Brainfuck mit umbenannten Befehlen. Vielleicht wird es ja einfacher zu verstehen, wenn du die - wesentlich kompaktere - Brainfuck-Syntax benutzt.
 
Den Code hab ich bereits in die Brainfuck Symbolde umgewandelt und per Hand und Papier das meiste schon herausgefunden. Nur ich hätte jetzt nach meinem Stand der Kenntnis einfach hoch und runter gezählt und die entsprechenden Ziffern dann ausgegeben.
Im Hello World Code befinden sich aber 4 Schleifen und ein paar hin und her Zeichen die für mich absolut keinen Sinn ergeben.

Ich kann ja mal das Posten was ich bisher gemacht habe:
Von Wikipedia:
Ook! Brainfuck Beschreibung
Ook. Ook. + den Wert der aktuellen Zelle um 1 erhöhen
Ook! Ook! - den Wert der aktuellen Zelle um 1 verringern
Ook. Ook? > eine Zelle nach rechts gehen
Ook? Ook. < eine Zelle nach links gehen
Ook! Ook? [ Schleifenanfang - die Schleife durchlaufen solange der Wert der aktuellen Zelle ungleich 0 ist
Ook? Ook! ] Schleifenende - beendet die Schleife, wenn der Wert der aktuellen Zelle gleich 0 ist
Ook! Ook. . den Wert der aktuellen Zelle ausdrucken
Ook. Ook! , einen Wert von der Tastatur in die aktuelle Zelle einlesen

Code:
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.
>@abcdefgh[<????????>?]<[B]H[/B]>???????[<????>?]<e[B]E[/B]fghijkl[B]LL[/B]mno[B]O[/B]>>>????????[<????>?]<[B]_[/B]>>>??????????[<?????????>?]<uvw[B]W[/B]<<<<[B]O[/B]pqr[B]R[/B]qponml[B]L[/B]kjihgfed[B]D[/B]>>??
Zur Erklärung:
Die Fragezeichen sind Stellen, deren wert ich nicht kenne.
Die kleinen Buchstaben sollen die Schrittweise Aufzählung anzeigen.
Die fetten Großbuchstaben sind Ziffern die ausgegeben, also angezeigt werden.

Was hinzu kommt ist die letzte Ausgabe, die versteh ich ebenfalls nicht, den normalerweise müsste er nach dem D zwei Zellen nach rechts gehen, eins nach oben zählen (also von D auf E) und dann E ausgeben :freak:
 
Zuletzt bearbeitet:
Zu Anfang stehen wir auf Feld 1 des Arbeitsbandes, alle Felder haben den Wert 0.

Code:
>              // gehe auf F2.
+++++++++      // setze F2 auf 9
[              // solange F2 > 0
<++++++++>     // gehe auf F1, erhöhe es um 8, zurück auf F2
-              // erniedrige F2 um 1
]              // Schleifenende - in F1 steht jetzt 9*8 = 72 (ASCII-Code für 'H')
<.             // gehe auf F1 und gib den Wert aus

Damit hast du den ersten Buchstaben. Den Rest darfst du selbst herausfinden :)

Edit: Siehe hier für die Frage, welche Zahlen bei der Ausgabe welche Buchstaben ergeben.
 
Hmm, da hab ich ne falsche Tabelle benutzt^^

Ich hab Die Hier benutzt und dachte Null wäre @ und 1 würde dann gleich mit A anfangen.
Jetzt ergibt das wenigstens einen Sinn^^

Dankeschön :)
 
Bitte sehr :)

Die Tabelle, die du genommen hast, ist übrigens schon ok, du hast nur das ^-Zeichen vor dem @, A, ... übersehen. ^A ist nicht der Buchstabe A, sondern ein Steuerzeichen in Caret-Notation. Die richtigen Buchstaben findest du in der dritten und vierten Spalte der Tabelle.
 
Jetzt hab ich doch noch ein kleines Problem entdeckt.
Und zwar beim Leerzeichen.
nach dem o kommen zwei freie Felder, danach wird zu dem o (111) nochmal 32 dazugezählt, was 143 ausmacht.
Fängt dann die Tabelle nach 127 wieder von vorne an?
 
Hab das jetzt nicht selbst nachgeprüft, aber 32 ist genau der Code für das Leerzeichen. Bist du sicher, daß die auf die 111 draufgezählt werden und nicht auf ein Feld mit 0? Dann nämlich wär's klar.
 
Wenn die Doppel Spitzklammern >> den Zähler zurück auf Null setzen, würde es passen.
Dann hab ich aber das Problem das man bei dem "o" in World 4 Felder zurück geht und dann in dem freien Feld vor dem Leerzeichen landen würde^^

Und am Schluss ist es auch etwas seltsam. Nach meiner Theorie wird nach dem "d" mit >> wieder genullt, es wird um 1 erhöht und landet dann auf "SOH"
 
Nullsetzen gibt es in Brainfuck nicht - ">>" steht schon für "zwei Felder nach rechts".
 
Schaun wir noch mal, Buchstabe für Buchstabe:

Code:
>+++++++++[<++++++++>-]<.
Ist ein H, wie wie schon wissen. Auf F1 steht jetzt 72, überall sonst 0.

Code:
>+++++++[<++++>-]<+
Erhöhe F1 um 7*4+1 = 29. Ausgabe also ASCII(72+29) = 'e'.

Code:
+++++++..+++.
'llo', klar.

Code:
>>>
Wir bewegen uns von F1 nach F4.

Code:
++++++++[<++++>-]<.
Jetzt wird in F3 die Zahl 32 (Leerzeichen) erzeugt und ausgegeben. In F3 steht bisher eine 0 - die 111 war ja in F1.

Code:
>>>
Gehe direkt nach F6. Ziehe keine 2^10 € ein... oder so.

Code:
++++++++++[<+++++++++>-]<---.
Das nächste Zeichen entsteht in F5 und ist 10*9-3 = 'W'.

Code:
<<<<.
Zurück nach F1, wo ja noch 111 ('o') drinsteht, was wir auch sofort ausgeben.

Code:
+++.------.--------.
'rld'

Code:
>>+.
Wir gehen nach F3, wo 32 (Leerzeichen) drinsteht, machen 33 ('!') daraus, schreiben das auf den Schirm und sind fertig.

Ich hoffe, damit sind alle Klarheiten beseitigt ;)
 
OK, jetzt weiss ich wo mein Denkfehler war.
Ich dachte nach der Ausgabe springt man automatisch ein Feld weiter und übernimmt die letzte Ausgabe der Zahl :)

Vielen Dank für die Hilfe NullPointer :)
 
Gern geschehen :)
 
Zurück
Oben