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 |