aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2021-07-03 14:09:17 +0100
committerdrbaggy <js5@sanger.ac.uk>2021-07-03 14:09:17 +0100
commit489a98656b5502f2bc3551e452142d91a6e12a44 (patch)
treebb212153ff5dfa3715d261d9eeace161b07550d8
parentc5ea6e773fd285ee2db652a6f0e59998ac4c8543 (diff)
downloadperlweeklychallenge-club-489a98656b5502f2bc3551e452142d91a6e12a44.tar.gz
perlweeklychallenge-club-489a98656b5502f2bc3551e452142d91a6e12a44.tar.bz2
perlweeklychallenge-club-489a98656b5502f2bc3551e452142d91a6e12a44.zip
reordered
-rw-r--r--challenge-119/james-smith/cesil/cesil.pl40
1 files changed, 19 insertions, 21 deletions
diff --git a/challenge-119/james-smith/cesil/cesil.pl b/challenge-119/james-smith/cesil/cesil.pl
index bc1f9613aa..8a969cd4f4 100644
--- a/challenge-119/james-smith/cesil/cesil.pl
+++ b/challenge-119/james-smith/cesil/cesil.pl
@@ -3,30 +3,28 @@ use strict;
$| = 1;
my( $ptr, @in, %mem, @code, %ptrs, $reg ) = 0;
+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},
+'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},
+'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 ];
+ 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;
+($commands{$code[$ptr][0]}($code[$ptr][1]),$ptr++) for 1..1e6;