use 5.20.0; my @commands = <>; my $i = 0; my %reg; my $last_played; use experimental qw/ signatures /; sub valof($x) { my $y = $x =~ /\d/ ? $x : $reg{$x}; die $_ if $y eq 'Inf'; return $y; } my $vr = qr/(-?\d+|.)/; while() { $_ = $commands[$i++]; warn $_ if /\bb\b/; if( /snd (.)/ ) { $last_played = valof($1); } elsif( /set (.) $vr/ ) { $reg{$1} = valof($2); } elsif( /add (.) $vr/ ) { $reg{$1} += valof($2); } elsif( /mul (.) $vr/ ) { $reg{$1} *= valof($2); } elsif( /mul (.) $vr/ ) { $reg{$1} *= valof($2); } elsif( /mod (.) $vr/ ) { $reg{$1} %= valof($2); } elsif( /jgz (.) $vr/ ) { next unless $reg{$1} > 0; $i += -1 + valof($2); } elsif( /rcv (.)/ ) { next unless $reg{$1}; die $last_played; } else { die "wut? $_"; } }