aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-001/paulo-custodio/test.pl2
-rw-r--r--challenge-120/paulo-custodio/bfpp.pl183
2 files changed, 184 insertions, 1 deletions
diff --git a/challenge-001/paulo-custodio/test.pl b/challenge-001/paulo-custodio/test.pl
index 8aff1d8161..4e2418c4ae 100644
--- a/challenge-001/paulo-custodio/test.pl
+++ b/challenge-001/paulo-custodio/test.pl
@@ -144,7 +144,7 @@ sub build {
return "bc -lq $prog";
}
if (/^brainfuck$/) {
- run("perl -S bfpp.pl <$prog_wo_ext.bfpp >$prog_wo_ext.bf");
+ run("perl bfpp.pl <$prog_wo_ext.bfpp >$prog_wo_ext.bf");
return "brainfuck $prog_wo_ext.bf";
}
if (/^c$/) {
diff --git a/challenge-120/paulo-custodio/bfpp.pl b/challenge-120/paulo-custodio/bfpp.pl
new file mode 100644
index 0000000000..b3b43a3fde
--- /dev/null
+++ b/challenge-120/paulo-custodio/bfpp.pl
@@ -0,0 +1,183 @@
+#!/usr/bin/env perl
+
+# Macro preprocessor for brainfuck
+
+use Modern::Perl;
+
+my %macros = (
+ INPUT => <<END,
+
+Get ASCII number convert to integer and store in current cell
+
+ ==== ==== ====
+ cont digi num
+ ==== ==== ====
+
+ +
+ [
+ - cont=0
+ >,
+ ======SUB10======
+ ----------
+
+ [ not 10
+ <+> cont=1
+ =====SUB38======
+ ----------
+ ----------
+ ----------
+ --------
+ >
+ =====MUL10=======
+ [>+>+<<-]>>[<<+>>-]< dup
+
+ >>>+++++++++
+ [
+ <<<
+ [>+>+<<-]>>[<<+>>-]< dup
+ [<<+>>-]
+ >>-
+ ]
+ <<<[-]<
+ ======RMOVE1======
+ <
+ [>+<-]
+ ]
+ <
+ ]
+ >>[<<+>>-]<<
+END
+
+ OUTPUT => <<END,
+
+Output number in current cell
+
+ [>+<-]>
+
+ [
+ ======DUP======
+ [>+>+<<-]>>[<<+>>-]<
+
+
+ ======MOD10====
+ >+++++++++<
+ [
+ >>>+<< bool= 1
+ [>+>[-]<<-] bool= ten==0
+ >[<+>-] ten = tmp
+ >[<<++++++++++>>-] if ten=0 ten=10
+ <<- dec ten
+ <- dec num
+ ]
+ +++++++++ num=9
+ >[<->-]< dec num by ten
+
+ =======RROT======
+ [>+<-]
+ < [>+<-]
+ < [>+<-]
+ >>>[<<<+>>>-]
+ <
+
+ =======DIV10========
+ >+++++++++<
+ [
+ >>>+<< bool= 1
+ [>+>[-]<<-] bool= ten==0
+ >[<+>-] ten = tmp
+ >[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
+ <<- dec ten
+ <- dec num
+ ]
+ >>>>[<<<<+>>>>-]<<<< copy div to num
+ >[-]< clear ten
+
+ =======INC1=========
+ <+>
+ ]
+
+ <
+ [
+ =======MOVER=========
+ [>+<-]
+
+ =======ADD48========
+ +++++++[<+++++++>-]<->
+
+ =======PUTC=======
+ <.[-]>
+
+ ======MOVEL2========
+ >[<<+>>-]<
+
+ <-
+ ]
+
+ >++++[<++++++++>-]<.[-]
+END
+
+ DUP1R => "[>+>+<<-]>>[<<+>>-]<<", # duplicate a cell right
+ DUP2R => "[>>+>+<<<-]>>>[<<<+>>>-]<<<", # duplicate a cell 2 right
+ DUP3R => "[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<<", # duplicate a cell 3 right
+ DUP4R => "[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<<<", # duplicate a cell 4 right
+
+ MOVE1L => "<[-]>[-<+>]", # move a cell left
+ MOVE2L => "<<[-]>>[-<<+>>]", # move a cell 2 right
+ MOVE3L => "<<<[-]>>>[-<<<+>>>]", # move a cell 3 right
+ MOVE4L => "<<<<[-]>>>>[-<<<<+>>>>]", # move a cell 4 right
+
+ PLUS => <<END,
+
+ == add x=x(plus)y ( *x y temp0 )
+ >>[-]
+ <[<+>>+<-]
+ >[<+>-]
+ [-]<[-]<
+ == ( *x(plus)y )
+
+END
+
+ DIVMOD => <<END,
+
+ == divmod ( *n d )
+ [->[->+>>]>[<<+>>[-<+>]>+>>]<<<<<]>[>>>]>[[-<+>]>+>>]<<<<<
+ == ( 0 (divisor minus mod) mod div )
+ >>>[-<<<+>>>]<<< move div to first cell
+ >[-]>[-<+>]<< move mod to second cell
+ == ( *div mod )
+
+END
+
+ MULT => <<END,
+
+ == mult x=x*y ( *x y temp0 temp1 )
+ >>[-] temp0=0
+ >[-] temp1=0
+ <<<[>>>+<<<-]
+ >>>[<<[<+>>+<-]>[<+>-]
+ >-]
+ [-]<[-]<[-]<
+ == ( *x*y )
+
+END
+
+);
+
+sub expand_macro {
+ my($name) = @_;
+ my $text = $macros{$name} // '';
+ $text =~ s/[^-+<>\[\],.#]//g;
+ return $text;
+}
+
+my $out = '';
+while (<>) {
+ s/\@(\w+)/ expand_macro($1) /ge;
+ s/[^-+<>\[\],.#]//g;
+ $out .= $_;
+}
+
+while ($out ne '') {
+ say substr($out, 0, 64);
+ substr($out, 0, 64) = '';
+}