1 // Part 2 about an Interpreter for the Brainf*** language |
|
2 //======================================================== |
|
3 |
|
4 object CW8b { |
|
5 |
|
6 type Mem = Map[Int, Int] |
|
7 |
|
8 // (2a) Complete the functions for safely reading |
|
9 // and writing brainf*** memory. Safely read should |
|
10 // Return the value stored in the Map for a given memory |
|
11 // pointer, if it exists; otherwise it Returns 0. The |
|
12 // writing function generates a new Map with the |
|
13 // same data, except at the given memory pointer the |
|
14 // value v is stored. |
|
15 |
|
16 |
|
17 //def sread(mem: Mem, mp: Int) : Int = ... |
|
18 |
|
19 //def write(mem: Mem, mp: Int, v: Int) : Mem = ... |
|
20 |
|
21 |
|
22 // (2b) Implement the two jumping instructions in the |
|
23 // brainf*** language. In jumpRight, given a program and |
|
24 // a program counter move the counter to the right |
|
25 // until the command after the *matching* ]-command. Similarly, |
|
26 // jumpLeft implements the move to the left to just after |
|
27 // the *matching* [-command. The levels are used to find the |
|
28 // *matching* bracket. |
|
29 |
|
30 //def jumpRight(prog: String, pc: Int, level: Int) : Int = ... |
|
31 |
|
32 //def jumpLeft(prog: String, pc: Int, level: Int) : Int = ... |
|
33 |
|
34 |
|
35 |
|
36 // (2c) Complete the run function that interprets (runs) a brainf*** |
|
37 // program: the arguments are a program, a program counter, |
|
38 // a memory counter and a brainf*** memory. It Returns the |
|
39 // memory at the stage when the execution of the brainf*** program |
|
40 // finishes. The interpretation finishes once the program counter |
|
41 // pc is pointing to something outside the program string. |
|
42 // If the pc points to a character inside the program, the pc, |
|
43 // memory pointer and memory need to be updated according to |
|
44 // rules of the brainf*** language. Then, recursively, the run |
|
45 // function continues with the command at the new program |
|
46 // counter. |
|
47 // |
|
48 // Implement the start function that calls run with the program |
|
49 // counter and memory counter set to 0. |
|
50 |
|
51 //def run(prog: String, pc: Int, mp: Int, mem: Mem) : Mem = ... |
|
52 |
|
53 //def start(prog: String, mem: Mem) = ... |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 // some sample bf programs collected from the Internet |
|
61 //================================================== |
|
62 |
|
63 |
|
64 /* |
|
65 // first some contrived (small) programs |
|
66 |
|
67 // clears the 0-cell |
|
68 start("[-]", Map(0 -> 100)) |
|
69 |
|
70 // copies content of the 0-cell to 1-cell |
|
71 start("[->+<]", Map(0 -> 10)) |
|
72 |
|
73 // copies content of the 0-cell to 2-cell and 4-cell |
|
74 start("[>>+>>+<<<<-]", Map(0 -> 42)) |
|
75 |
|
76 start("+++[>+++++<-]", Map(0 -> 10)) |
|
77 |
|
78 |
|
79 // prints out numbers 0 to 9 |
|
80 start("""+++++[->++++++++++<]>--<+++[->>++++++++++<<]>>++<<----------[+>.>.<+<]""", Map()) |
|
81 |
|
82 |
|
83 // some more "useful" programs |
|
84 |
|
85 // hello world program 1 |
|
86 start("""++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++ |
|
87 ..+++.>>.<-.<.+++.------.--------.>>+.>++.""", Map()) |
|
88 |
|
89 // hello world program 2 |
|
90 start("""++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>+ |
|
91 +.<<+++++++++++++++.>.+++.------.--------.>+.>.""", Map()) |
|
92 |
|
93 |
|
94 // draws the Sierpinski triangle |
|
95 start("""++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[-<<<[ |
|
96 ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< |
|
97 ]>.>+[>>]>+]""", Map()) |
|
98 |
|
99 //Fibonacci numbers below 100 |
|
100 start("""+++++++++++ |
|
101 >+>>>>++++++++++++++++++++++++++++++++++++++++++++ |
|
102 >++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+> |
|
103 +<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[- |
|
104 <-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<< |
|
105 -]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]] |
|
106 >[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++ |
|
107 +++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++ |
|
108 ++++++++++++++++++++++++++++++++++++++++++++.[-]<< |
|
109 <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<< |
|
110 [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]""", Map()) |
|
111 |
|
112 |
|
113 //outputs the square numbers up to 10000 |
|
114 start("""++++[>+++++<-]>[<+++++>-]+<+[ |
|
115 >[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+ |
|
116 >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<] |
|
117 <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]""", Map()) |
|
118 |
|
119 |
|
120 //Collatz numbers (need to be typed in) |
|
121 start(""">,[[----------[ |
|
122 >>>[>>>>]+[[-]+<[->>>>++>>>>+[>>>>]++[->+<<<<<]]<<<] |
|
123 ++++++[>------<-]>--[>>[->>>>]+>+[<<<<]>-],<]>]>>>++>+>>[ |
|
124 <<[>>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<<]]<[>+<-]>] |
|
125 >[>[>>>>]+[[-]<[+[->>>>]>+<]>[<+>[<<<<]]+<<<<]>>>[->>>>]+>+[<<<<]] |
|
126 >[[>+>>[<<<<+>>>>-]>]<<<<[-]>[-<<<<]]>>>>>>> |
|
127 ]>>+[[-]++++++>>>>]<<<<[[<++++++++>-]<.[-]<[-]<[-]<]<,]""", Map()) |
|
128 |
|
129 |
|
130 // infinite Collatz (never stops) |
|
131 start(""">>+>+<[[->>[>>]>>>[>>]+[<<]<<<[<<]>[>[>>]>>+>[>>]<+<[<<]<<<[< |
|
132 <]>-]>[>>]>>[<<<<[<<]>+>[>>]>>-]<<<<[<<]+>>]<<[+++++[>+++++++ |
|
133 +<-]>.<++++++[>--------<-]+<<]>>[>>]+[>>>>[<<+>+>-]<-[>+<-]+< |
|
134 [<<->>-[<<+>>[-]]]>>>[<<<+<<+>>>>>-]<<<[>>>+<<<-]<<[[-]>+>>-> |
|
135 [<+<[<<+>>-]<[>+<-]<[>+<-]>>>>-]<[>+<-]+<[->[>>]<<[->[<+++>-[ |
|
136 <+++>-[<+++>-[<[-]++>>[-]+>+<<-[<+++>-[<+++>-[<[-]+>>>+<<-[<+ |
|
137 ++>-[<+++>-]]]]]]]]]<[>+<-]+<<]>>>+<[->[<+>-[<+>-[<+>-[<+>-[< |
|
138 +>-[<+>-[<+>-[<+>-[<+>-[<[-]>>[-]+>+<<-[<+>-]]]]]]]]]]]<[>+<- |
|
139 ]+>>]<<[<<]>]<[->>[->+>]<[-[<+>-[<->>+<-[<+>-[<->>+<-[<+>-[<- |
|
140 >>+<-[<+>-[<->>+<-[<+>-[<->>+<-[<+>-[<->>+<-[<+>-[<->>+<-[<+> |
|
141 -[<->>+<-[<+>-[<->>+<-[<+>-]]]]]]]]]]]]]]]]]]]>[<+>-]<+<[<+++ |
|
142 +++++++>-]<]>>[<+>->>]<<[>+>+<<-]>[<+>-]+>[<->[-]]<[-<<-]<<[< |
|
143 <]]++++++[>+++++++<-]>++.------------.[-]>[>>]<<[+++++[>+++++ |
|
144 +++<-]>.<++++++[>--------<-]+<<]+<]>[<+>-]<]>>>[>>]<<[>[-]<-< |
|
145 <]++++++++++.[-]<<<[<<]>>>+<[->[<+>-[<+>-[<+>-[<+>-[<+>-[<+>- |
|
146 [<+>-[<+>-[<+>-[<[-]>>[-]+>+<<-]]]]]]]]]]<[>+<-]+>>]<<[<<]>>]""", Map()) |
|
147 |
|
148 |
|
149 */ |
|
150 |
|
151 } |
|