diff --git a/bfi-rust/bf.b b/bfi-rust/bf.b index b695ab4..d9cce41 100644 --- a/bfi-rust/bf.b +++ b/bfi-rust/bf.b @@ -1,11 +1,163 @@ -++++++++++[>++++++++++<-]>>++++++++++>->>>>>>>>>>>>>>>>-->+++++++[->++ -++++++++<]>[->+>+>+>+<<<<]+++>>+++>>>++++++++[-<++++<++++<++++>>>]++++ -+[-<++++<++++>>]>>-->++++++[->+++++++++++<]>[->+>+>+>+<<<<]+++++>>+>++ -++++>++++++>++++++++[-<++++<++++<++++>>>]++++++[-<+++<+++<+++>>>]>>--> ----+[-<+]-<[+[->+]-<<->>>+>[-]++[-->++]-->+++[---++[--<++]---->>-<+>[+ -+++[----<++++]--[>]++[-->++]--<]>++[--+[-<+]->>[-]+++++[---->++++]-->[ -->+<]>>[.>]++[-->++]]-->+++]---+[-<+]->>-[+>>>+[-<+]->>>++++++++++<<[- ->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]> -+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->+++ -+++++<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]+[-<+]->>]+[-]<<<.>>>+[ --<+]-<<] \ No newline at end of file +* factor an arbitrarily large positive integer +* +* Copyright (C) 1999 by Brian Raiter +* under the GNU General Public License +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>- +* +* read in the number +* +<<<<<<<<<+ +[-[>>>>>>>>>>][-]<<<<<<<<<<[[->>>>>>>>>>+<<<<<<<<<<]<<<<<<<<<<] + >>>>>>>>>>,----------] +>>>>>>>>>>[------------------------------------->>>>>>>>>->] +<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]- +* +* display the number and initialize the loop variable to two +* +[>++++++++++++++++++++++++++++++++++++++++++++++++. + ------------------------------------------------<<<<<<<<<<<] +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. +--------------------------.[-] +>>>>>>>>>>>>++<<<<+ +* +* the main loop +* +[ [-]>> + * + * make copies of the number and the loop variable + * + [>>>>[-]>[-]>[-]>[-] + >[-]>[-] + <<<<<<<[->>>+>+<<<<]>>>>>>>>] + <<<<<<<<<<[>>>>>>[-<<<<+>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>> + [>[->>>+>>+<<<<<]>>>>>>>>>] + <<<<<<<<<<[>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>> + * + * divide the number by the loop variable + * + [>>>[-]>>>[-]>[-]>>>] initialize + <<<<<<<<<<[<<<<<<<<<<] + >>>>>>>>>[-]>>>>>>>+<<<<<<<<[+]+ + [ ->> double divisor until above dividend + [>>>>>>[->++<]>>>>]<<<<<<<<<< + [>>>>>>>>[-]>[-] + <<<<[->>>++<<<]<<<<<<<<<<<<<<<]>>>>>>>>>> + [>>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+< + [->--------->>>>>>>>>+<<<<<<<<<<[->+<]]]]]]]]]]]>>] + <<<<<<<<<<[>>>>>>>>>[-<+<<<+>>>>]<<<<<<<<<<<<<<<<<<<]>>>>>>>>>> + [>>>>>>>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+> + [-<--------->>>>>>>>>>>+<<<<<<<<<<[-<+>]]]]]]]]]]]>>>] + <<<<<<<<<< + [>>>>[->>>+>>+<<<<<]<<<<<<<<<<<<<<] + >>>>>>>>>>[>>>>>>>[-<<<+>>>]>>>]<<<<<<<<<< + [>>>>>>>>[->-<]> + [<<<<<<<<<[<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<] + >>>>>>>>>>>>>>>>>>>] + <<<<<<<<<<<<<<<<<<<] + >>>>>>>>>[+[+[+[+[+[+[+[+[+[+[[-]<+>]]]]]]]]]]]< + ] + >>>>>>>> + [ subtract divisor from dividend + <<<<<< + [>>>>>>>>[-]>[-]<<<<<[->>>+>+<<<<]>>>>>>]<<<<<<<<<< + [>>>>>>>>[-<<<<+>>>>]<<<[->>>+>+<<<<]<<<<<<<<<<<<<<<]>>>>>>>>>> + [>>>>>>>>>[-<<<<+>>>>]>]<<<<<<<<<< + [>>>>>>>>[-<->]<<<<<<<<<<<<<<<<<<]>>>>>>>>>> + [>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+< + [++++++++++[+>-<]>>>>>>>>>>-<<<<<<<<<<]]]]]]]]]]]>>>] + >>>>>>>+ + [ if difference is nonnegative then + [-]<<<<<<<<<<<<<<<<< replace dividend and increment quotient + [>>>>[-]>>>>[-<<<<+>>>>]<<[->>+<<]<<<<<<<<<<<<<<<<]>>>>>>>>>> + [>>>>>>>>[->+<<<+>>]>>]<<<<<<<<<< + [>>>[->>>>>>+<<<<<<]<<<<<<<<<<<<<]>>>>>>>>>> + [>>>>>>>>>[-<<<<<<+>>>>>>[-<<<<<<+>>>>>> + [-<<<<<<+>>>>>>[-<<<<<<+>>>>>> + [-<<<<<<+>>>>>>[-<<<<<<+>>>>>> + [-<<<<<<+>>>>>>[-<<<<<<+>>>>>> + [-<<<<<<+>>>>>>[-<<<<<<--------->>>>>>>>>>>>>>>>+<<<<<<<<<< + [-<<<<<<+>>>>>>]]]]]]]]]]]>] + >>>>>>> + ] halve divisor and loop until zero + <<<<<<<<<<<<<<<<<[<<<<<<<<<<]>>>>>>>>>> + [>>>>>>>>[-]<<[->+<]<[->>>+<<<]>>>>>]<<<<<<<<<< + [+>>>>>>>[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> + [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> + [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> + [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> + [-<<<<<<<+>>>>>>>]]]]]]]]]<<<<<<< + [->>>>>>>+<<<<<<<]-<<<<<<<<<<] + >>>>>>> + [-<<<<<<<<<<<+>>>>>>>>>>>] + >>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<< + [+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> + [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> + [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> + [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> + [-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<< + [->>>>>>>>+<<<<<<<<]-<<<<<<<<<<] + >>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>> + [>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<< + [<<<<<<<<<<]>>>>>>>>>> + >>>>>> + ] + <<<<<< + * + * make copies of the loop variable and the quotient + * + [>>>[->>>>+>+<<<<<]>>>>>>>] + <<<<<<<<<< + [>>>>>>>[-<<<<+>>>>]<<<<<[->>>>>+>>+<<<<<<<]<<<<<<<<<<<<] + >>>>>>>>>>[>>>>>>>[-<<<<<+>>>>>]>>>]<<<<<<<<<< + * + * break out of the loop if the quotient is larger than the loop variable + * + [>>>>>>>>>[-<->]< + [<<<<<<<< + [<<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<] + >>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<] + >>>>>>>>[>-<[+[+[+[+[+[+[+[+[+[[-]>+<]]]]]]]]]]]>+ + [ [-] + * + * partially increment the loop variable + * + <[-]+>>>>+>>>>>>>>[>>>>>>>>>>]<<<<<<<<<< + * + * examine the remainder for nonzero digits + * + [<<<<<<[<<<<[<<<<<<<<<<]>>>>+<<<<<<<<<<]<<<<] + >>>>>>>>>>>>>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<[<<<<<<<<<<] + >>>>- + [ [+] + * + * decrement the loop variable and replace the number with the quotient + * + >>>>>>>>-<<[>[-]>>[-<<+>>]>>>>>>>]<<<<<<<<<< + * + * display the loop variable + * + [+>>[>>>>>>>>+>>]<<-<<<<<<<<<<]- + [>>++++++++++++++++++++++++++++++++++++++++++++++++. + ------------------------------------------------<<<<<<<<<<<<] + ++++++++++++++++++++++++++++++++.[-]>>>> + ] + * + * normalize the loop variable + * + >>>>>> + [>>[->>>>>+<<<<<[->>>>>+<<<<< + [->>>>>+<<<<<[->>>>>+<<<<< + [->>>>>+<<<<<[->>>>>+<<<<< + [->>>>>+<<<<<[->>>>>+<<<<< + [->>>>>+<<<<<[->>>>>--------->>>>>+<<<<<<<<<< + [->>>>>+<<<<<]]]]]]]]]]]>>>>>>>>] + <<<<<<<<<<[>>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<<] + >>>>>>>>> + ]< +]>> +* +* display the number and end +* +[>>>>>>>>>>]<<<<<<<<<<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]- +[>++++++++++++++++++++++++++++++++++++++++++++++++.<<<<<<<<<<<] +++++++++++. \ No newline at end of file diff --git a/bfi-rust/src/main.rs b/bfi-rust/src/main.rs index 18b8fa6..bfe1a5d 100644 --- a/bfi-rust/src/main.rs +++ b/bfi-rust/src/main.rs @@ -18,13 +18,8 @@ fn main() { fn run(path: String) { println!("Path: {}", path); let program = fs::read_to_string(path).unwrap(); - let program = minify(program); - println!("{}", program); - let start = SystemTime::now(); - let out = o1::run(&*program); - println!("{}\nFinished execution in {}ms", out, start.elapsed().unwrap().as_millis()); } @@ -35,7 +30,7 @@ fn run(path: String) { /// most importantly: loop jumps should be immediate /// mod o1 { - use std::io::{stdin, Read}; + use std::io::{stdin, Read, stdout, Write}; const MEM_SIZE: usize = 0xFFFF;