2015-05-08 4 views
12

Ich habe versucht, meinen Dolmetscher in Brainfuck c mit dieser Flasche geformt Code in Brainfuck Prüfung:Umgang mit Schleifen in Brainf * ck

   +>+++++++[>>>+++ 
       +++++<<<<+++++ 
       +++>-]+++++++++>>> 
       +>>++++++++++[>+ 
       +++++++++<-]>[ 
       >>+>+>+>+>+>+> 
       +>>+>+>>+>+>+> 
       +>>+>+>>+>+>+> 
       >+>+>+>+>>>>>+ 
       >+>+>+>>+>+>+> 
       >+>+>+>+>>+>+> 
       +>>+>+>+>+>>+>+> 
       >+>+>+>+>+>+>>>> 
       +>+>>+>+>+>+<<<< 
       <<<<<<<<<<<<<<<< 
       <<<<<<<<<<<<<<<<<< 
       <<<<<<<<<<<<<<<<<< 
       <<<<<<<<<<<<<<<<<< 
       -]<++++[>++++++++< 
       -]>[>+>>>>>>>>+>>> 
       +>>>>>+>>>+>>>>+>> 
       >>>+>+>>+>>>>>+>>>>+ 
       >>>>>+>>>>+>>>>>+>>> 
       +>>>>>>>+>+>+>>>+>>> 
       >>+<<<<<<<<<<<<<<<<< 
       <<<<<<<<<<<<<<<<<<<< 
      <<<<<<<<<<<<<<<<<<<<<< 
      <<<<<<<<<<<<<<<<-]+++++[ 
      >>>++>+++>+++>++>>+++>>++> 
      >>>>>+++>>++>++>>+++>+>>>+++ 
     +>->++>++>++>+++>++>>--->->+>>>+ 
     +>++>>>>++>++++>++>>->++>>>++>->++ 
    +>+++>>+>+++>>>+++>++>+++>++>>>++>>++> 
    ++>>++>++>+++<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    <<<<-]>>-->+>+>+>-->+>>>+>++>>-->+>+>->>+>>> 
    +>->+>>->++>-->-->++>->>>->++>++>+>>+>>+>>>+ 
>->>>++>>>>++>++>>>>>+>>++>->+>++>>>>+++>>>+>> 
->+>->+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[>>>>++ 
++++++++[->[-]+>[-]<<[<<<<<.>>>>.>>>>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>> 
>.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.>>>>.> 
>>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>>>>>>>>>>>>>> 
.>.>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.<<<<<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<.>>>>-.>>>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>>.>..<<<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<-]>[<<<<<->[-]+>[-]<<[<.>>>>.>>>>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>>>.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<.>>>>.>>>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>>>>>> 
>>>>>>>>.>.>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.<<<<<<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<-.>>>>+++++++++.>>>>.>.>.>.>.>.>.>.> 
.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>>.>..<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-]>[<<.>>>>.>>> 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>>>.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<<.>>>>.>>>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>> 
>>>>>>>>>>>>.>.>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.<<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<+++++++++.>>>>.>.>.>.>.>.>.>.>.>.>.> 
.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>>.>..<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<->]<<+>>>>>->]<<]<<<< 
-]>>>>++++++++[->[-]+>[-]<<[<.>>>>.>.>.>.>.>.>.> 
.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>>>.< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.>>>>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>>>>>>>>>>>>>>.>.>>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-.>>>>.>.>.> 
.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.> 
.>>.>..<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-]>[<<.>> 
>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.> 
.>.>.>.>.>.>>>.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<.>>>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>>>>>>>>>> 
>>>>.>.>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<-.>>>>.>.>.>.>.>.>.>>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>>.>..<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<<<->]<<]<.>>>>.>.>.>.>.>.>.>>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>>>.<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<<<<<<.>>>>.>.>.>.>.>.>.>>.>.>.>.>.>. 
>.>.>>>>>>>>>>>>>>.>.>>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>. 
>.>.>.>.>.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.>.>.>.>.>.>. 
>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>>.> 

Und statt ouf outputing die ganzen '99 Flaschen Bier an der Wand‘Lied von 99 zu 1, es hat nur die Verse von 99 bis 96 Flaschen ausgegeben. Stimmt etwas nicht mit den Schleifen im Brainfuck-Code oder im Interpreter?

Hier ist mein c-Code:

#include <stdio.h> 
#include <stdlib.h> 

int loop(char *commands, int indexOfCommand, int mode){ 
    int sum = 0; 
    int movingIndex = indexOfCommand; 
    while(sum > -1){ 
     movingIndex -= mode; 
     if(commands[movingIndex] == ']') 
      sum += mode; 
     else if(commands[movingIndex]=='[') 
      sum -= mode; 
    } 
    return movingIndex; 
} 

int main(){ 
    unsigned char array[30000] = {0}; // all elements are 0 
    unsigned char commands[60000] = {0}; // all elements are 0 
    int counter = 0; 
    int c; 

    int loop(char *commands, int indexOfCommand, int mode); 

    while((c = getchar()) != EOF){ 
     commands[counter] = c; 
     counter++; 
    } 

    int indexOfArray = counter; 
    int indexOfCommands = 0; 
    int numOfCommands = 0; 

    int length = sizeof(commands)/sizeof(commands[0]); // the length of an array 

    while (indexOfCommands < length && numOfCommands < 60000){ 
     switch(commands[indexOfCommands]){ 
      case '+': 
       if(array[indexOfArray]==255){ 
        array[indexOfArray]=0; 
       } else array[indexOfArray]++; 
      break; 
      case '-': 
       if(array[indexOfArray]==0){ 
        array[indexOfArray]=255; 
       }else array[indexOfArray]--; 
      break; 
      case '>': 
       indexOfArray++; 
      break; 
      case '<': 
       indexOfArray--; 
      break; 
      case '.': 
       putchar(array[indexOfArray]); 
      break; 
      case ']': 
       if(array[indexOfArray]!=0) { 
        indexOfCommands=loop(commands,indexOfCommands,1); 
       } 
      break; 
      case '[': 
       if(array[indexOfArray]==0){ 
        indexOfCommands=loop(commands,indexOfCommands,-1); 
       } 
      break; 
      default: 
       // if there is any other character, just ignore it 
       break; 
     } 
     indexOfCommands++; 
     numOfCommands++; 
    } 

    return 0; 
} 
+8

Liebe die Art, wie Sie bro: D –

+5

nur mein Wochenende gemacht – cerkiewny

+0

musste Screenshot dieser, danke @ lol für die lolz –

Antwort

6

Die Bedingung für die vorzeitige Ende der Programmausführung ist hier:

while (indexOfCommands < length && numOfCommands < 60000) { 
            ^^^^^^^^^^^^^^^^^^^^^ 
    // interpret BF opcodes 

    numOfCommands++; 
} 

Sie haben unterschätzt, wie viele Befehle BF einfache Dinge tun muss. (Ich bin nicht sicher, warum diese Bedingung dort ist. Entfernen Sie es und Sie werden alle 99 Verse sehen.)