[QUIZ#3] BrainScript

Quiz #3
BrainScript

Regeln
Die Regeln und der Ablauf der Quizrunde können in der entsprechenden Ankündigung eingesehen werden. Bitte lest sie euch aufmerksam durch, da sie alle wichtigen Informationen enthält. Lösungsansätze können und dürfen auch schon vorab untereinander ausgetauscht und diskutiert werden, allerdings nicht öffentlich im Forum. Verwendet stattdessen bitte private Nachrichten oder schaut im Chat vorbei.

Abgabe
Die Abgabe erfolgt wie immer im Abgabeforum. Abgabefrist ist Sonntag, der 5. Oktober 2008 um ca. 21 Uhr.

Das Problem
Der Suchmaschinenbetreiber Hupf werkelt weiter an seinem revolutionären Browser. Als spezielles Feature soll neben JavaScript auch die Skriptsprache BrainScript angeboten werden. Als inzwischen erfahrener Prototyp-Programmierer ist es nun deine Aufgabe, einen Interpreter für BrainScript zu schreiben.

Die Syntax und Semantik von BrainScript wurde 1:1 von Brainfuck übernommen. Die "virtuelle Maschine", die der Interpreter simuliert, besteht also aus einer Anzahl linear angeordeter Speicherzellen, die jeweils genau ein (vorzeichenloses) Byte speichern können. Zusätzlich besitzt die Maschine einen Zeiger, der auf die momentan aktive Speicherzelle zeigt. Anfangs zeigt dieser auf die niedrigste (erste) Speicherzelle. Die Zellen selbst sind ursprünglich alle mit dem Wert 0 vorbelegt. BrainScript unterstützt lediglich acht verschiedene Befehle, die durch jeweils ein einzelnes Zeichen repräsentiert werden:
  • + - inkrementiert den Wert der aktiven Zelle
  • - - dekrementiert den Wert der aktiven Zelle
  • > - inkrementiert den Zeiger (die nachfolgende Zelle wird aktiv)
  • < - dekrementiert den Zeiger (die vorhergehende Zelle wird aktiv)
  • . - gibt den Wert der aktuellen Zelle aus (als ASCII-Zeichen)
  • , - liest ein Zeichen ein und speichert den ASCII-Wert in der aktiven Zelle (0 falls das Ende der Eingabe erreicht wurde)
  • [ - springt vor zum dazugehörigen ], falls der Wert der aktiven Zelle 0 ist (ansonsten tue nichts)
  • ] - springt zurück zum dazugehörigen [
Die letzten beiden Sprungbefehle können dabei beliebig tief "geschachtelt" werden. Alle anderen Zeichen im Programmtext werden vom Interpreter ignoriert (können also z.B. zur Kommentierung verwendet werden).

Die Anzahl der Speicherzellen soll (klassischerweise) 30.000 betragen. Die Werte in den Zellen sollen das übliche Überlaufverhalten aufzeigen (inkrementieren von 255 ergibt 0, dekrementieren von 0 ergibt 255). Was bei einem Über-/Unterlauf des Zeigers passiert, bleibt euch überlassen.

Erweiterung
Erweitert den Interpreter dahingehend, dass die Zellenanzahl nicht mehr fix ist. Erlaubt die Angabe der Anzahl durch den Benutzer (z.B. über einen Kommandozeilenparameter) und/oder die Möglichkeit eines "unendlich" großen Speichers.

Beispiele
Programm:
Code:
,[.,]
Eingabe:
Code:
BrainScript
Ausgabe:
Code:
BrainScript


Programm:
Code:
,[>,]<[.<]
Eingabe:
Code:
BrainScript
Ausgabe:
Code:
tpircSniarB


Programm:
Code:
[ This program prints Sierpinski triangle on 80-column display. ]
                                >    
                               + +    
                              +   +    
                             [ < + +    
                            +       +    
                           + +     + +    
                          >   -   ]   >    
                         + + + + + + + +    
                        [               >    
                       + +             + +    
                      <   -           ]   >    
                     > + + >         > > + >    
                    >       >       +       <    
                   < <     < <     < <     < <    
                  <   [   -   [   -   >   +   <    
                 ] > [ - < + > > > . < < ] > > >    
                [                               [    
               - >                             + +    
              +   +                           +   +    
             + + [ >                         + + + +    
            <       -                       ]       >    
           . <     < [                     - >     + <    
          ]   +   >   [                   -   >   +   +    
         + + + + + + + +                 < < + > ] > . [    
        -               ]               >               ]    
       ] +             < <             < [             - [    
      -   >           +   <           ]   +           >   [    
     - < + >         > > - [         - > + <         ] + + >    
    [       -       <       -       >       ]       <       <    
   < ]     < <     < <     ] +     + +     + +     + +     + +    
  +   .   +   +   +   .   [   -   ]   <   ]   +   +   +   +   +    
 * * * * * M a d e * B y : * N Y Y R I K K I * 2 0 0 2 * * * * *
Eingabe: irrelevant
Ausgabe:
Code:
                                *    
                               * *    
                              *   *    
                             * * * *    
                            *       *    
                           * *     * *    
                          *   *   *   *    
                         * * * * * * * *    
                        *               *    
                       * *             * *    
                      *   *           *   *    
                     * * * *         * * * *    
                    *       *       *       *    
                   * *     * *     * *     * *    
                  *   *   *   *   *   *   *   *    
                 * * * * * * * * * * * * * * * *    
                *                               *    
               * *                             * *    
              *   *                           *   *    
             * * * *                         * * * *    
            *       *                       *       *    
           * *     * *                     * *     * *    
          *   *   *   *                   *   *   *   *    
         * * * * * * * *                 * * * * * * * *    
        *               *               *               *    
       * *             * *             * *             * *    
      *   *           *   *           *   *           *   *    
     * * * *         * * * *         * * * *         * * * *    
    *       *       *       *       *       *       *       *    
   * *     * *     * *     * *     * *     * *     * *     * *    
  *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *    
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


Weitere Beispiele lassen sich leicht mit der Suchmaschine deines Vertrauens aufspüren.
 
Zuletzt bearbeitet:
Ich hab damals schon Brainfuck nicht verstanden :rolleyes:
Aber ma schaun vielleicht krieg ich ja irgendwas hin.

Das größte Problem ist aber eigentlich, so wirklich versteh ich die Zeiger nicht.
 
Für mich kommt es so vor als wenn
+ und > inkrement
- und < dekrement
stehen

Und unter dem Begriff Zelle muss ich immer zu erst an eine Zelle aus einer Tabelle denken.

Ich hoffe mal mir fehlt jetzt hier nicht allgemein Basiswissen denn bisher kam ich eigentlich immer klar :suspekt:

Edit:
Es ist spät vielleicht kapier ichs morgen besser aber ich denke das hier
http://de.wikipedia.org/wiki/Turingmaschine#Informelle_Beschreibung
erklärt ungefähr wie das mit den Zellen gemeint ist.
 
Zuletzt bearbeitet:
theoretisch scheint alles zu funktionieren ich hab blos ein Problem.
Ich bekomme irgendwie die verdammte Abbruchbedingung für den Block nicht hin.

Im Prinzip dachte ich mir sowas:
C#:
while (band[position] != 0)
Nur das funktioniert so halt nicht.

Kann mich irgendwer auf den richtigen Weg stupsen.
 
Zuletzt bearbeitet von einem Moderator:
Meine Lösung ist fertig und eingesand, ich hab ausgeschlfen... jit-compiling rulz... nun kann ich endlich weiter lernen...
Ich mag das Quiz, es gibt enem immer Ideen, wenn man sonnst nicht wieß, was man machen soll...
 
Zurück