solutions5/bf.scala
changeset 336 25d9c3b2bc99
parent 329 8a34b2ebc8cc
child 337 c0d9e6548b08
equal deleted inserted replaced
335:7e00d2b13b04 336:25d9c3b2bc99
    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