diff options
| -rw-r--r-- | challenge-119/james-smith/cesil/cesil.pl | 32 | ||||
| -rw-r--r-- | challenge-119/james-smith/cesil/ch-1-extendeded.ces | 62 |
2 files changed, 94 insertions, 0 deletions
diff --git a/challenge-119/james-smith/cesil/cesil.pl b/challenge-119/james-smith/cesil/cesil.pl new file mode 100644 index 0000000000..bc1f9613aa --- /dev/null +++ b/challenge-119/james-smith/cesil/cesil.pl @@ -0,0 +1,32 @@ +use strict; + +$| = 1; +my( $ptr, @in, %mem, @code, %ptrs, $reg ) = 0; + +while(<>) { + (@in = map { 0+$_ } <> ) && last if m{^ {8}%}; + ($ptrs{$1},$_)=(scalar @code,$2) if m{^(\S{1,7})\s+(.*)}; + push @code, [ split m{\s+}, s{^\s+}{}r =~ s{\s+$}{}r, 2 ]; +} + +my %commands = ( + 'LINE' => sub { print "\n"; }, + 'IN' => sub { die "RUN OUT OF INPUT" unless @in; $reg = shift @in; }, + 'OUT' => sub { print $reg }, + 'PRINT' => sub { print $_[0] =~ s{^"}{}r =~ s{"$}{}r; }, + 'STORE' => sub { $mem{$_[0]} = $reg; }, + 'LOAD' => sub { $reg = $mem{$_[0]}; }, + 'HALT' => sub { exit; }, + 'JINEG' => sub { $ptr = $ptrs{$_[0]} - 1 if $reg < 0; }, + 'JIZERO' => sub { $ptr = $ptrs{$_[0]} - 1 if $reg == 0; }, + 'JUMP' => sub { $ptr = $ptrs{$_[0]} - 1; }, + 'ADD' => sub { $reg += ( $_[0]=~m{^-?\d+$} ? $_[0] : $mem{$_[0]} ) }, + 'SUBTRACT' => sub { $reg -= ( $_[0]=~m{^-?\d+$} ? $_[0] : $mem{$_[0]} ) }, + 'MULTIPLY' => sub { $reg *= ( $_[0]=~m{^-?\d+$} ? $_[0] : $mem{$_[0]} ) }, + 'DIVIDE' => sub { $reg /= ( $_[0]=~m{^-?\d+$} ? $_[0] : $mem{$_[0]} ) ; $reg = int $reg; }, +); + +## Execution loop... +(&{ $commands{$code[$ptr][0]} }( $code[$ptr][1] ),$ptr++) foreach 1..1e6; + + diff --git a/challenge-119/james-smith/cesil/ch-1-extendeded.ces b/challenge-119/james-smith/cesil/ch-1-extendeded.ces new file mode 100644 index 0000000000..f011dad073 --- /dev/null +++ b/challenge-119/james-smith/cesil/ch-1-extendeded.ces @@ -0,0 +1,62 @@ + LINE + IN + STORE success + STORE tests +Next IN + JINEG End + OUT + PRINT " => " + STORE a + IN + STORE c + LOAD a + DIVIDE 16 + STORE b + MULTIPLY -16 + ADD a + MULTIPLY 16 + ADD b + OUT + PRINT " : " + SUBTRACT c + JIZERO Ok + PRINT "-- should be " + LOAD c + OUT + PRINT "?" + JUMP Line +Ok PRINT "OK" + LOAD success + ADD 1 + STORE success +Line LINE + LOAD tests + ADD 1 + STORE tests + JUMP Next +End LINE + PRINT "TESTS: " + LOAD success + OUT + PRINT " of " + LOAD tests + OUT + PRINT " passed" + LINE + LINE + HALT + % + 0 + 240 + 15 + 15 + 240 + 0 + 0 + 255 + 255 + 99 + 54 + 99 + 2 + -1 |
