97 //case ',' => (pc + 1, mp, write(mem, mp, scala.io.StdIn.readByte())) |
97 //case ',' => (pc + 1, mp, write(mem, mp, scala.io.StdIn.readByte())) |
98 case '[' => |
98 case '[' => |
99 if (sread(mem, mp) == 0) (jumpRight(prog, pc + 1, 0), mp, mem) else (pc + 1, mp, mem) |
99 if (sread(mem, mp) == 0) (jumpRight(prog, pc + 1, 0), mp, mem) else (pc + 1, mp, mem) |
100 case ']' => |
100 case ']' => |
101 if (sread(mem, mp) != 0) (jumpLeft(prog, pc - 1, 0), mp, mem) else (pc + 1, mp, mem) |
101 if (sread(mem, mp) != 0) (jumpLeft(prog, pc - 1, 0), mp, mem) else (pc + 1, mp, mem) |
|
102 |
|
103 // new commands |
|
104 case '@' => (pc + 1, mp, write(mem, sread(mem, mp), sread(mem, mp - 1))) |
|
105 case '*' => (pc + 1, mp, write(mem, mp, sread(mem, mp) * sread(mem, mp -1))) |
|
106 case '#' => { println(s"$mp: ${sread(mem, mp)}"); (pc + 1, mp, mem) } |
|
107 |
|
108 |
102 case _ => (pc + 1, mp, mem) |
109 case _ => (pc + 1, mp, mem) |
103 } |
110 } |
104 compute(prog, new_pc, new_mp, new_mem) |
111 compute(prog, new_pc, new_mp, new_mem) |
105 } |
112 } |
106 else mem |
113 else mem |
119 // first some contrived (small) programs |
126 // first some contrived (small) programs |
120 |
127 |
121 // clears the 0-cell |
128 // clears the 0-cell |
122 //run("[-]", Map(0 -> 100)) // Map will be 0 -> 0 |
129 //run("[-]", Map(0 -> 100)) // Map will be 0 -> 0 |
123 |
130 |
124 // copies content of the 0-cell to 1-cell |
131 // moves content of the 0-cell to 1-cell |
125 //run("[->+<]", Map(0 -> 10)) // Map will be 0 -> 0, 1 -> 10 |
132 //run("[->+<]", Map(0 -> 10)) // Map will be 0 -> 0, 1 -> 10 |
126 |
133 |
127 |
134 |
128 // copies content of the 0-cell to 2-cell and 4-cell |
135 // copies content of the 0-cell to 2-cell and 4-cell |
129 //run("[>>+>>+<<<<-]", Map(0 -> 42)) |
136 //run("[>>+>>+<<<<-]", Map(0 -> 42)) |
247 time_needed(1, run(b1)) |
254 time_needed(1, run(b1)) |
248 */ |
255 */ |
249 |
256 |
250 } |
257 } |
251 |
258 |
|
259 def time_needed[T](n: Int, code: => T) = { |
|
260 val start = System.nanoTime() |
|
261 for (i <- 0 until n) code |
|
262 val end = System.nanoTime() |
|
263 (end - start)/(n * 1.0e9) |
|
264 } |
|
265 |
|
266 import CW10a._ |
|
267 |
|
268 // draws the Sierpinski triangle |
|
269 run("""++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[-<<<[ |
|
270 ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< |
|
271 ]>.>+[>>]>+]""") |
|
272 |
|
273 |
|
274 println(run("""++++++++++>+***""")) |
|
275 |
|
276 println(run("""+++>+!+!+!+!+!""")) |
|
277 |
|
278 |
|
279 println(time_needed(2, run(load_bff("a.bf")))) |
|
280 |