1. #1

    Registriert seit
    19.11.2011
    Beiträge
    496
    Thanked 412 Times in 268 Posts

    Standard Brainfuck-Interpreter

    Hi,

    wieder eine Programmieraufgabe: es soll ein Interpreter für die esoterische Programmiersprache Brainfuck programmiert werden.

    Spoiler:Meine Lösung (Java)

    Code:
    import java.io.IOException;
    import java.io.Reader;
    
    import java.util.Scanner;
    
    public final class BrainfuckInterpreter {
    	private final String  input;
    	private       int     inputPtr;
    	private final short[] data;
    	private       short   dataPtr;
    	
    	public BrainfuckInterpreter(final Reader source) throws IOException {
    		input    = getInputAsString(source);
    		data     = new short[Short.MAX_VALUE];
    		inputPtr = dataPtr = 0;
    	}
    	
    	public void interpret() {
    		for (; inputPtr < input.length(); ++inputPtr) {
    			switch (input.charAt(inputPtr)) {
    			case '>': ++dataPtr; break;
    			case '<': --dataPtr; break;
    			case '+': ++data[dataPtr]; break;
    			case '-': --data[dataPtr]; break;
    			case '.': System.out.print((char) data[dataPtr]); break;
    			case ',': data[dataPtr] = new Scanner(System.in).nextByte(); break;
    			case '[': if (data[dataPtr] == 0) handleLoop('['); break;
    			case ']': handleLoop(']'); --inputPtr; break;
    			default: break;
    			}
    		}
    	}
    	
    	private void handleLoop(final char sign) {
    		int brackets = 1;
    		while (brackets > 0) {
    			switch (input.charAt(sign == '[' ? ++inputPtr : --inputPtr)) {
    			case '[': brackets += sign == '[' ?  1 : -1; break;
    			case ']': brackets += sign == '[' ? -1 :  1; break;
    			}
    		}
    	}
    	
    	private String getInputAsString(final Reader source) throws IOException {
    		final StringBuilder output = new StringBuilder();
    		int current = source.read();
    		while (current != -1) {
    			output.append((char) current);
    			current = source.read();
    		}
    		return output.toString();
    	}
    }
    Benutzung:
    Code:
    public final class BrainfuckInterpreterTest {
    	public static void main(String[] args) throws FileNotFoundException, IOException {
    		final BrainfuckInterpreter bfinterpreter =
    				new BrainfuckInterpreter(new FileReader("/home/tobi/test.bf"));
    		bfinterpreter.interpret();
    	}
    }


    Brainfuck-Codes zum Füttern des Interpreters:

    Spoiler:Hello World

    Code:
     ++++++++++
     [
      >+++++++>++++++++++>+++>+<<<<-
     ]                       Schleife zur Vorbereitung der Textausgabe
     >++.                    Ausgabe von 'H'
     >+.                     Ausgabe von 'e'
     +++++++.                'l'
     .                       'l'
     +++.                    'o'
     >++.                    Leerzeichen
     <<+++++++++++++++.      'W'
     >.                      'o'
     +++.                    'r'
     ------.                 'l'
     --------.               'd'
     >+.                     '!'
     >.                      Zeilenvorschub
     +++.                    Wagenrücklauf
    Ausgabe:
    Code:
    Hello World


    Spoiler:99 Bottles of Beer

    Code:
    # 99 bottles of beer in Brainf*ck
    # Copyright (C) 2008 Raphael Bois
    # 1671 brainf*ck instructions.
    # Published under GPL v2
    
    Initialization
    ++    Counter for loop (a)
    >+    unused
    >++   Counter for loop (b)
    >     Flag for 'no more'
    >+    Flag for not 'no more'
    >>>   (5) to (7) : temporary values
    ++++++++++[->+>+>++++++++++<<<]>>>    10 10 100 in (8) (9) (10)
    >++++++++++   10 in (11)
    [-
       >+++++           50  in (12)
       >++++++++++      100 in (13)
       >+++++++++++     110 in (14)
       >++++++++        80  in (15)
       >++++++++        80  in (16)
       >+++             30  in (17)
       >++++            40  in (18)
       >+               10  in (19)
       <<<<<<<<]
    +
    >-- +             48  '0'   plus 1 in (12)
    >++ +             102 'f'   plus 1 in (13)
    >+++++ +          115 's'   plus 1 in (14)
    >-- +             78  'N'   plus 1 in (15)
    >++++ +           84  'T'   plus 1 in (16)
    >++ +             32  ' '   plus 1 in (17)
    >++++ +           44  comma plus 1 in (18)
    > +               10  LF    plus 1 in (19)
    
    stuff for writing parts of the song
    >+   select stuff
    >+   select stuff
    >+   write song part 3
    >++  write song part 1
    >+   write song part 2
    >+   Flag for 'end of song'
    >++  Flag for not 'end of song'
    
    All bytes are at val plus 1
    Go back to (7) with final initialization step (remove 1 to all bytes)
    [-<]
    
    <<<<<<< at (0)
    [ loop (a)
    -
    
    >> at (2)
    [ loop (b)
    
      >>>>>>>> at (10)
      [ start loop
    
        <<<<<<< at (3)
        [->[-]
          print '(N|n)o more'
          >>>>>>>>>>>.  '(N|n)'
          <----.        'o'
          >>>.          ' '
          <<<--.        'm'
          ++.           'o'
          +++.+         'r'
          <-.+          'e'
          <<+<<<<<<<<
        ]+> at (4)
        [-<[-]>>>>> at (9)
          prints number (using (9) and (10))
          [>>>+<<<<+<+<+>>>-]<<<[->>>+<<<]> at (6)
          [>>>>>>+<<<<<<-]>>>>>[[-]>.<]<<<<[>>>>>-<<<<<-]>> at (9)
          [<<+<+<+>>>>-]<<<<[->>>>+<<<<]> at (6)
          [>>>>>>+<<<<<<-]>>>>>>.<<<<<[>>>>>-<<<<<-] at (7)
    
          memorize in (11) if (10) not 1
          >>>[-<<<+<+>>>>]<<<<[->>>>+<<<<]>-[[-]>>>>+<<<<]<<< at (4)
        ]+
    
        >>>>>>>> at (12)
        print ' bottle(s) of beer'
        >>>>>.      ' '
        <<<<----.    'b'
        >----.       'o'
        +++++..-     'tt'
        <++++++++++. 'l'
        -------.     'e'
        <<[[-]>>>.<<<]>> 's' if (11)==1 ie if (10)!=1
        >>>>.        ' '
        <<<----.     'o'
        <+.          'f'
        >>>>.        ' '
        <<<<----.    'b'
        +++..+       'ee'
        >+++.+       'r'
    
        [>] at (20)
    
        +>+>[->+<<-<-
             print ' on the wall' DOT LF LF
             <<<.            ' '
             <<<----.        'o'
             -.              'n'
             >>>.            ' '
             <<<++++++.      't'
             <++.            'h'
             ---.            'e'
             >>>>.           ' '
             <<<+++.         'w'
             <----.          'a'
             +++++++++++..   'll'
             ------>----     reset to 'f' and 's'
             >---------- ---------- ---------- -- sets (15) to 'N'
    
             >>>++.--  DOT
             >..       LF LF
        >>>] at (22)
    
        >>>[->[-]<<<<<<<[<]<[-]>>[>]>>>>>]+ if end of song reset bottles counter
        >[-<[-] at (25)
          <<<< at (21)
          [->>[->+<<<<-
               print ' on the wall' COMMA ' '
               <<<.            ' '
               <<<----.        'o'
               -.              'n'
               >>>.            ' '
               <<<++++++.      't'
               <++.            'h'
               ---.            'e'
               >>>>.           ' '
               <<<+++.         'w'
               <----.          'a'
               +++++++++++..   'll'
    
               ------>----     reset (13) and (14) to 'f' and 's'
               >++++++++++ ++++++++++ ++++++++++ ++ sets (15) to 'n'
    
               >>>.            comma
               <.              ' '
          >>>>>>]<<]< at (20)
    
          [->>>>[-<<+< at (21)
                 <<<++.--       DOT
                 >.             LF
    
                 [<]<<<<<<<< at (3)
                 [->[-]<]+>  at (4)
                 [-<[-]>
                   >>>>>>>>>>>>.  'T'
                   <<<-----.      'a'
                   ++++++++++.    'k'
                   ------.        'e'
                   >>>>.          ' '
                   <<<----.       'o'
                   -.             'n'
                   <.             'e'
                   >>>>.          ' '
                   <<<<-.         'd'
                   >+.            'o'
                   ++++++++.      'w'
                   ---------.     'n'
                   >>>.           ' '
                   <<<<---.       'a'
                   >.             'n'
                   <+++.          'd'
                   >>>>.          ' '
                   <<<++.         'p'
                   <---.          'a'
                   >+++..         'ss'
                   >>>.           ' '
                   <<<<++++++++.  'i'
                   >+.            't'
                   >>>.           ' '
                   <<<<--------.  'a'
                   >--.           'r'
                   ---.           'o'
                   ++++++.        'u'
                   -------.       'n'
                   <+++.          'd'
                   ++>+++++       reset (13) and (14) to 'f' and 's'
                   >>>>.          comma
                   <.             ' '
    
                   [<]<<<<<<< at (4)
                 ]+
    
                >>>>>> at (10)
                decrements values
                -<<<+>>[<<[-]<+<+>>>>-]<<<<[>-<[-]]>[->>>+<<<]>[->->+++++++++<<]>>> at (10)
    
             >>[>]>>>>] at (24)
          <<<<] at (20)
    
        >>>>>>]+ at (26)
    
        <<<<<<<[<]< at (10)
      ]
      +<+
      <<<<<<+< at (2)
      -
    ]
    
    print 'Go to the store and buy some more' comma ' '
    
      >>>>>>>>>>[>]>>>>> at (25)
      [->[-]<]+> at (26)
      [-<[-]
        <<<<<<<<< at (16)
        -------------.   'G'
        <<----.          'o'
        >>>.             ' '
        <<<+++++.        't'
        -----.           'o'
        >>>.             ' '
        <<<+++++.        't'
        <++.             'h'
        ---.             'e'
        >>>>.            ' '
        <<<-.            's'
        +.               't'
        -----.           'o'
        +++.             'r'
        <.               'e'
        >>>>.            ' '
        <<<<----.        'a'
        >----.           'n'
        <+++.            'd'
        >>>>.            ' '
        <<<<--.          'b'
        >+++++++.        'u'
        ++++.            'y'
        >>>.             ' '
        <<<------.       's'
        ----.            'o'
        --.              'm'
        <+++.            'e'
        >>>>.            ' '
        <<<.             'm'
        ++.              'o'
        +++.+            'r'
        <.+              'e'
        >>>>>.           coma
        <.               ' '
        >>>>>>>>>
      ]+
    
      Initialize last loop to print final '99 bottles of beer on the wall' DOT
      <[-]+<[-]<[-]<[-]+<<< at (19)
      [<]<[-]<[-]<[-]<[-] at (7)
      ++++++++++[->+>+>++++++++++<<<]>->->-
      <<<<<<[-]+<[-]<+<< at (0)
    ]
    Ausgabe:
    Code:
    99 bottles of beer on the wall, 99 bottles of beer.
    Take one down and pass it around, 98 bottles of beer on the wall.
    
    98 bottles of beer on the wall, 98 bottles of beer.
    Take one down and pass it around, 97 bottles of beer on the wall.
    
    97 bottles of beer on the wall, 97 bottles of beer.
    Take one down and pass it around, 96 bottles of beer on the wall.
    
    96 bottles of beer on the wall, 96 bottles of beer.
    Take one down and pass it around, 95 bottles of beer on the wall.
    
    95 bottles of beer on the wall, 95 bottles of beer.
    Take one down and pass it around, 94 bottles of beer on the wall.
    
    94 bottles of beer on the wall, 94 bottles of beer.
    Take one down and pass it around, 93 bottles of beer on the wall.
    
    93 bottles of beer on the wall, 93 bottles of beer.
    Take one down and pass it around, 92 bottles of beer on the wall.
    
    92 bottles of beer on the wall, 92 bottles of beer.
    Take one down and pass it around, 91 bottles of beer on the wall.
    
    91 bottles of beer on the wall, 91 bottles of beer.
    Take one down and pass it around, 90 bottles of beer on the wall.
    
    90 bottles of beer on the wall, 90 bottles of beer.
    Take one down and pass it around, 89 bottles of beer on the wall.
    
    89 bottles of beer on the wall, 89 bottles of beer.
    Take one down and pass it around, 88 bottles of beer on the wall.
    
    88 bottles of beer on the wall, 88 bottles of beer.
    Take one down and pass it around, 87 bottles of beer on the wall.
    
    87 bottles of beer on the wall, 87 bottles of beer.
    Take one down and pass it around, 86 bottles of beer on the wall.
    
    86 bottles of beer on the wall, 86 bottles of beer.
    Take one down and pass it around, 85 bottles of beer on the wall.
    
    85 bottles of beer on the wall, 85 bottles of beer.
    Take one down and pass it around, 84 bottles of beer on the wall.
    
    84 bottles of beer on the wall, 84 bottles of beer.
    Take one down and pass it around, 83 bottles of beer on the wall.
    
    83 bottles of beer on the wall, 83 bottles of beer.
    Take one down and pass it around, 82 bottles of beer on the wall.
    
    82 bottles of beer on the wall, 82 bottles of beer.
    Take one down and pass it around, 81 bottles of beer on the wall.
    
    81 bottles of beer on the wall, 81 bottles of beer.
    Take one down and pass it around, 80 bottles of beer on the wall.
    
    80 bottles of beer on the wall, 80 bottles of beer.
    Take one down and pass it around, 79 bottles of beer on the wall.
    
    79 bottles of beer on the wall, 79 bottles of beer.
    Take one down and pass it around, 78 bottles of beer on the wall.
    
    78 bottles of beer on the wall, 78 bottles of beer.
    Take one down and pass it around, 77 bottles of beer on the wall.
    
    77 bottles of beer on the wall, 77 bottles of beer.
    Take one down and pass it around, 76 bottles of beer on the wall.
    
    76 bottles of beer on the wall, 76 bottles of beer.
    Take one down and pass it around, 75 bottles of beer on the wall.
    
    75 bottles of beer on the wall, 75 bottles of beer.
    Take one down and pass it around, 74 bottles of beer on the wall.
    
    74 bottles of beer on the wall, 74 bottles of beer.
    Take one down and pass it around, 73 bottles of beer on the wall.
    
    73 bottles of beer on the wall, 73 bottles of beer.
    Take one down and pass it around, 72 bottles of beer on the wall.
    
    72 bottles of beer on the wall, 72 bottles of beer.
    Take one down and pass it around, 71 bottles of beer on the wall.
    
    71 bottles of beer on the wall, 71 bottles of beer.
    Take one down and pass it around, 70 bottles of beer on the wall.
    
    70 bottles of beer on the wall, 70 bottles of beer.
    Take one down and pass it around, 69 bottles of beer on the wall.
    
    69 bottles of beer on the wall, 69 bottles of beer.
    Take one down and pass it around, 68 bottles of beer on the wall.
    
    68 bottles of beer on the wall, 68 bottles of beer.
    Take one down and pass it around, 67 bottles of beer on the wall.
    
    67 bottles of beer on the wall, 67 bottles of beer.
    Take one down and pass it around, 66 bottles of beer on the wall.
    
    66 bottles of beer on the wall, 66 bottles of beer.
    Take one down and pass it around, 65 bottles of beer on the wall.
    
    65 bottles of beer on the wall, 65 bottles of beer.
    Take one down and pass it around, 64 bottles of beer on the wall.
    
    64 bottles of beer on the wall, 64 bottles of beer.
    Take one down and pass it around, 63 bottles of beer on the wall.
    
    63 bottles of beer on the wall, 63 bottles of beer.
    Take one down and pass it around, 62 bottles of beer on the wall.
    
    62 bottles of beer on the wall, 62 bottles of beer.
    Take one down and pass it around, 61 bottles of beer on the wall.
    
    61 bottles of beer on the wall, 61 bottles of beer.
    Take one down and pass it around, 60 bottles of beer on the wall.
    
    60 bottles of beer on the wall, 60 bottles of beer.
    Take one down and pass it around, 59 bottles of beer on the wall.
    
    59 bottles of beer on the wall, 59 bottles of beer.
    Take one down and pass it around, 58 bottles of beer on the wall.
    
    58 bottles of beer on the wall, 58 bottles of beer.
    Take one down and pass it around, 57 bottles of beer on the wall.
    
    57 bottles of beer on the wall, 57 bottles of beer.
    Take one down and pass it around, 56 bottles of beer on the wall.
    
    56 bottles of beer on the wall, 56 bottles of beer.
    Take one down and pass it around, 55 bottles of beer on the wall.
    
    55 bottles of beer on the wall, 55 bottles of beer.
    Take one down and pass it around, 54 bottles of beer on the wall.
    
    54 bottles of beer on the wall, 54 bottles of beer.
    Take one down and pass it around, 53 bottles of beer on the wall.
    
    53 bottles of beer on the wall, 53 bottles of beer.
    Take one down and pass it around, 52 bottles of beer on the wall.
    
    52 bottles of beer on the wall, 52 bottles of beer.
    Take one down and pass it around, 51 bottles of beer on the wall.
    
    51 bottles of beer on the wall, 51 bottles of beer.
    Take one down and pass it around, 50 bottles of beer on the wall.
    
    50 bottles of beer on the wall, 50 bottles of beer.
    Take one down and pass it around, 49 bottles of beer on the wall.
    
    49 bottles of beer on the wall, 49 bottles of beer.
    Take one down and pass it around, 48 bottles of beer on the wall.
    
    48 bottles of beer on the wall, 48 bottles of beer.
    Take one down and pass it around, 47 bottles of beer on the wall.
    
    47 bottles of beer on the wall, 47 bottles of beer.
    Take one down and pass it around, 46 bottles of beer on the wall.
    
    46 bottles of beer on the wall, 46 bottles of beer.
    Take one down and pass it around, 45 bottles of beer on the wall.
    
    45 bottles of beer on the wall, 45 bottles of beer.
    Take one down and pass it around, 44 bottles of beer on the wall.
    
    44 bottles of beer on the wall, 44 bottles of beer.
    Take one down and pass it around, 43 bottles of beer on the wall.
    
    43 bottles of beer on the wall, 43 bottles of beer.
    Take one down and pass it around, 42 bottles of beer on the wall.
    
    42 bottles of beer on the wall, 42 bottles of beer.
    Take one down and pass it around, 41 bottles of beer on the wall.
    
    41 bottles of beer on the wall, 41 bottles of beer.
    Take one down and pass it around, 40 bottles of beer on the wall.
    
    40 bottles of beer on the wall, 40 bottles of beer.
    Take one down and pass it around, 39 bottles of beer on the wall.
    
    39 bottles of beer on the wall, 39 bottles of beer.
    Take one down and pass it around, 38 bottles of beer on the wall.
    
    38 bottles of beer on the wall, 38 bottles of beer.
    Take one down and pass it around, 37 bottles of beer on the wall.
    
    37 bottles of beer on the wall, 37 bottles of beer.
    Take one down and pass it around, 36 bottles of beer on the wall.
    
    36 bottles of beer on the wall, 36 bottles of beer.
    Take one down and pass it around, 35 bottles of beer on the wall.
    
    35 bottles of beer on the wall, 35 bottles of beer.
    Take one down and pass it around, 34 bottles of beer on the wall.
    
    34 bottles of beer on the wall, 34 bottles of beer.
    Take one down and pass it around, 33 bottles of beer on the wall.
    
    33 bottles of beer on the wall, 33 bottles of beer.
    Take one down and pass it around, 32 bottles of beer on the wall.
    
    32 bottles of beer on the wall, 32 bottles of beer.
    Take one down and pass it around, 31 bottles of beer on the wall.
    
    31 bottles of beer on the wall, 31 bottles of beer.
    Take one down and pass it around, 30 bottles of beer on the wall.
    
    30 bottles of beer on the wall, 30 bottles of beer.
    Take one down and pass it around, 29 bottles of beer on the wall.
    
    29 bottles of beer on the wall, 29 bottles of beer.
    Take one down and pass it around, 28 bottles of beer on the wall.
    
    28 bottles of beer on the wall, 28 bottles of beer.
    Take one down and pass it around, 27 bottles of beer on the wall.
    
    27 bottles of beer on the wall, 27 bottles of beer.
    Take one down and pass it around, 26 bottles of beer on the wall.
    
    26 bottles of beer on the wall, 26 bottles of beer.
    Take one down and pass it around, 25 bottles of beer on the wall.
    
    25 bottles of beer on the wall, 25 bottles of beer.
    Take one down and pass it around, 24 bottles of beer on the wall.
    
    24 bottles of beer on the wall, 24 bottles of beer.
    Take one down and pass it around, 23 bottles of beer on the wall.
    
    23 bottles of beer on the wall, 23 bottles of beer.
    Take one down and pass it around, 22 bottles of beer on the wall.
    
    22 bottles of beer on the wall, 22 bottles of beer.
    Take one down and pass it around, 21 bottles of beer on the wall.
    
    21 bottles of beer on the wall, 21 bottles of beer.
    Take one down and pass it around, 20 bottles of beer on the wall.
    
    20 bottles of beer on the wall, 20 bottles of beer.
    Take one down and pass it around, 19 bottles of beer on the wall.
    
    19 bottles of beer on the wall, 19 bottles of beer.
    Take one down and pass it around, 18 bottles of beer on the wall.
    
    18 bottles of beer on the wall, 18 bottles of beer.
    Take one down and pass it around, 17 bottles of beer on the wall.
    
    17 bottles of beer on the wall, 17 bottles of beer.
    Take one down and pass it around, 16 bottles of beer on the wall.
    
    16 bottles of beer on the wall, 16 bottles of beer.
    Take one down and pass it around, 15 bottles of beer on the wall.
    
    15 bottles of beer on the wall, 15 bottles of beer.
    Take one down and pass it around, 14 bottles of beer on the wall.
    
    14 bottles of beer on the wall, 14 bottles of beer.
    Take one down and pass it around, 13 bottles of beer on the wall.
    
    13 bottles of beer on the wall, 13 bottles of beer.
    Take one down and pass it around, 12 bottles of beer on the wall.
    
    12 bottles of beer on the wall, 12 bottles of beer.
    Take one down and pass it around, 11 bottles of beer on the wall.
    
    11 bottles of beer on the wall, 11 bottles of beer.
    Take one down and pass it around, 10 bottles of beer on the wall.
    
    10 bottles of beer on the wall, 10 bottles of beer.
    Take one down and pass it around, 9 bottles of beer on the wall.
    
    9 bottles of beer on the wall, 9 bottles of beer.
    Take one down and pass it around, 8 bottles of beer on the wall.
    
    8 bottles of beer on the wall, 8 bottles of beer.
    Take one down and pass it around, 7 bottles of beer on the wall.
    
    7 bottles of beer on the wall, 7 bottles of beer.
    Take one down and pass it around, 6 bottles of beer on the wall.
    
    6 bottles of beer on the wall, 6 bottles of beer.
    Take one down and pass it around, 5 bottles of beer on the wall.
    
    5 bottles of beer on the wall, 5 bottles of beer.
    Take one down and pass it around, 4 bottles of beer on the wall.
    
    4 bottles of beer on the wall, 4 bottles of beer.
    Take one down and pass it around, 3 bottles of beer on the wall.
    
    3 bottles of beer on the wall, 3 bottles of beer.
    Take one down and pass it around, 2 bottles of beer on the wall.
    
    2 bottles of beer on the wall, 2 bottles of beer.
    Take one down and pass it around, 1 bottle of beer on the wall.
    
    1 bottle of beer on the wall, 1 bottle of beer.
    Take one down and pass it around, no more bottles of beer on the wall.
    
    No more bottles of beer on the wall, no more bottles of beer.
    Go to the store and buy some more, 99 bottles of beer on the wall.

  2. The Following User Says Thank You to Mr. White For This Useful Post:

    ThunderStorm (12.03.2013)

Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.