|    443  |    443  | 
|    444 def instrs(prog: String) : String = |    444 def instrs(prog: String) : String = | 
|    445   prog.toList.map(instr).mkString |    445   prog.toList.map(instr).mkString | 
|    446  |    446  | 
|    447  |    447  | 
|         |    448 // the mandelbrot.bf program is so large that | 
|         |    449 // it does not fit into the limitations of what the | 
|         |    450 // JVM imposes on methods. | 
|         |    451 // | 
|         |    452 // below it just about fits by optimising [-] loops | 
|         |    453 // and combining instructions | 
|         |    454  | 
|    448 def splice(cs: List[Char], acc: List[(Char, Int)]) : List[(Char, Int)] = (cs, acc) match { |    455 def splice(cs: List[Char], acc: List[(Char, Int)]) : List[(Char, Int)] = (cs, acc) match { | 
|    449   case (Nil, acc) => acc |    456   case (Nil, acc) => acc | 
|    450   case (c :: cs, Nil) => splice(cs, List((c, 1))) |    457   case (c :: cs, Nil) => splice(cs, List((c, 1))) | 
|    451   case (c :: cs, (d, n) :: acc) =>  |    458   case (c :: cs, (d, n) :: acc) =>  | 
|    452     if (c == d) splice(cs, (c, n + 1) :: acc) |    459     if (c == d) splice(cs, (c, n + 1) :: acc) | 
|    454 } |    461 } | 
|    455  |    462  | 
|    456 def spl(s: String) = splice(s.toList, Nil).reverse |    463 def spl(s: String) = splice(s.toList, Nil).reverse | 
|    457  |    464  | 
|    458 def instr2(c: Char, n: Int) : String = c match { |    465 def instr2(c: Char, n: Int) : String = c match { | 
|    459   case '>' => "ptr := ptr + " + n.toString + ";" |    466   case '>' => s"ptr := ptr + $n;" | 
|    460   case '<' => "ptr := ptr - " + n.toString + ";" |    467   case '<' => s"ptr := ptr - $n;" | 
|    461   case '+' => "field[ptr] := field[ptr] + " + n.toString + ";" |    468   case '0' => s"field[ptr] := 0;" | 
|    462   case '-' => "field[ptr] := field[ptr] - " + n.toString + ";" |    469   case '+' => s"field[ptr] := field[ptr] + $n;" | 
|    463   case '.' => "x := field[ptr]; write x;" //* n |    470   case '-' => s"field[ptr] := field[ptr] - $n;" | 
|    464   //case ',' => "*ptr = getchar();\n" * n |    471   case '.' => s"x := field[ptr]; write x;"  | 
|    465   case '['  => "while (field[ptr] != 0) do {" * n  |    472   case '['  => "while (field[ptr] != 0) do {" * n  | 
|    466   case ']'  => "skip};" * n |    473   case ']'  => "skip};" * n | 
|    467   case _ => "" |    474   case _ => "" | 
|    468 } |    475 } | 
|    469  |    476  | 
|    470 def instrs2(prog: String) : String = |    477 def instrs2(prog: String) : String = | 
|    471   spl(prog).map{ case (c, n) => instr2(c, n) }.mkString |    478   spl(prog.replaceAll("""\[-\]""", "0")).map{ case (c, n) => instr2(c, n) }.mkString | 
|    472  |         | 
|    473  |    479  | 
|    474 def bf_str(prog: String) : String = { |    480 def bf_str(prog: String) : String = { | 
|    475   "\n" ++ |    481   "\n" ++ | 
|    476   //"new field[30000];\n" ++ |         | 
|    477   "ptr := 15000;" ++ |    482   "ptr := 15000;" ++ | 
|    478   instrs(prog) ++ |    483   instrs2(prog) ++ | 
|    479   "skip" |    484   "skip" | 
|    480 } |    485 } | 
|    481  |    486  | 
|    482 def bf_run(prog: String, name: String) = { |    487 def bf_run(prog: String, name: String) = { | 
|    483   println("BF processing start") |    488   println("BF processing start") | 
|    521       <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<< |    526       <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<< | 
|    522       [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]""" |    527       [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]""" | 
|    523  |    528  | 
|    524 bf_run(bf2, "fibs") |    529 bf_run(bf2, "fibs") | 
|    525  |    530  | 
|    526 /* |         | 
|    527  |    531  | 
|    528  |    532  | 
|    529 bf_run("""      A mandelbrot set fractal viewer in brainf*** written by Erik Bosman |    533 bf_run("""      A mandelbrot set fractal viewer in brainf*** written by Erik Bosman | 
|    530 +++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[ |    534 +++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[ | 
|    531 >>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+ |    535 >>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+ | 
|    670 -<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>> |    674 -<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>> | 
|    671 >>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++ |    675 >>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++ | 
|    672 +[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<< |    676 +[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<< | 
|    673 <<<<<]]>>>]""", "mand") |    677 <<<<<]]>>>]""", "mand") | 
|    674  |    678  | 
|    675 */ |    679  |