diff options
| author | drbaggy <js5@sanger.ac.uk> | 2021-07-03 18:43:09 +0100 |
|---|---|---|
| committer | drbaggy <js5@sanger.ac.uk> | 2021-07-03 18:43:09 +0100 |
| commit | 7622eb86539a0d6656e4a41421a2c30cb6b91f4f (patch) | |
| tree | 3f789abc44f69f610ffbd4c0ccd22690d5be05ac | |
| parent | 68d9cb2252c468c8cf8a76c0468819025c170230 (diff) | |
| download | perlweeklychallenge-club-7622eb86539a0d6656e4a41421a2c30cb6b91f4f.tar.gz perlweeklychallenge-club-7622eb86539a0d6656e4a41421a2c30cb6b91f4f.tar.bz2 perlweeklychallenge-club-7622eb86539a0d6656e4a41421a2c30cb6b91f4f.zip | |
add some rudimentary error detection...
| -rw-r--r-- | challenge-119/james-smith/cesil/cesil.pl | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/challenge-119/james-smith/cesil/cesil.pl b/challenge-119/james-smith/cesil/cesil.pl index 61c724ca9c..0bbd61888e 100644 --- a/challenge-119/james-smith/cesil/cesil.pl +++ b/challenge-119/james-smith/cesil/cesil.pl @@ -2,33 +2,44 @@ use strict; use warnings; $| = 1; -my( $ptr, @in, %mem, @code, %ptrs, $reg ) = 0; +my( $ptr, $reg, @in, %mem, @code, %ptrs ) = 0; + +my %messages = ( + 'i' => 'No further input', + 'm' => 'Unitialized memory at ', + 'l' => 'Unknown pointer ', +); my %commands = ( 'LINE' ,sub{print "\n"}, 'OUT' ,sub{print $reg}, 'PRINT' ,sub{print $_[0]=~s{^"}{}r=~s{"$}{}r;}, -'IN' ,sub{die 'OUT OF INPUT' unless @in;$reg=shift@in}, +'IN' ,sub{_err('i') unless @in;$reg=shift@in}, 'STORE' ,sub{$mem{$_[0]}=$reg}, -'LOAD' ,sub{$reg=$mem{$_[0]}}, -'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}, -'JINEG' ,sub{$ptr=$ptrs{$_[0]}-1 if $reg<0}, -'JIZERO' ,sub{$ptr=$ptrs{$_[0]}-1 if $reg==0}, -'JUMP' ,sub{$ptr=$ptrs{$_[0]}-1}, +'LOAD' ,sub{_err('m') unless exists$mem{$_[0]};$reg=$mem{$_[0]}}, +'ADD' ,sub{$reg+=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'))}, +'SUBTRACT',sub{$reg-=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'))}, +'MULTIPLY',sub{$reg*=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'))}, +'DIVIDE' ,sub{$reg/=$_[0]=~m{^-?\d+$}?$_[0]:exists$mem{$_[0]}?$mem{$_[0]}:(_err('m'));$reg=int$reg}, +'JINEG' ,sub{_err('l') unless exists $ptrs{$_[0]}; $ptr=$ptrs{$_[0]}-1 if $reg<0}, +'JIZERO' ,sub{_err('l') unless exists $ptrs{$_[0]}; $ptr=$ptrs{$_[0]}-1 if $reg==0}, +'JUMP' ,sub{_err('l') unless exists $ptrs{$_[0]}; $ptr=$ptrs{$_[0]}-1}, 'HALT' ,sub{exit}, ); 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($cmd,$data) = split m{\s+}, s{^\s+}{}r=~s{\s+$}{}r, 2; + die "Unknown command [cmd $cmd - line ",1+@code,"]\n" unless exists $commands{$cmd}; + push @code, [$cmd,$data||'']; } my $MAX_LOOPS = 1e6; ($commands{$code[$ptr][0]}($code[$ptr][1]),$ptr++) while --$MAX_LOOPS && $ptr<@code; - +sub _err { + my $flag = shift; + die sprintf "\n%s%s [cmd %s - line %d]\n", $messages{$flag}, $code[$ptr][1], $code[$ptr][0], 1+$ptr; +} |
