use 5.20.0; my $script = "\$a = 1;\n"; while(<>) { s/\b[a-h]\b/\$$&/g; s/sub (\S+) (\S+)/$1 -= $2;/; s/set (\S+) (\S+)/$1 = $2;/; s/mul (\S+) (\S+)/$1 *= $2;/; s/jnz (\S+) (\S+)/"goto L" . ($. + $2) . " if $1;"/e; s/^/L${.}: /; $script .= $_; } for ( 1..35 ) { my @c = $script =~ /(L$_[ :])/g; next if @c > 1; $script =~ s/L$_[ :] *//g; } print $script; __END__ my $i = 0; my %reg = ( a => 1); my $last_played; use experimental qw/ signatures /; sub valof($x) { $x =~ /\d/ ? $x : $reg{$x}; } my $vr = qr/(-?\d+|.)/; my $times; use DDP; my $t; while() { last if $i < 0 or $i > $#commands; $_ = $commands[$i++]; # say $_; if( /set (.) $vr/ ) { $reg{$1} = valof($2); } elsif( /sub (.) $vr/ ) { $reg{$1} -= valof($2); } elsif( /mul (.) $vr/ ) { $reg{$1} *= valof($2); } elsif( /jnz (.) $vr/ ) { $i += -1 + valof($2) if valof($1) != 0; } else { die "wut? $_"; } say $i; # say $_; p %reg unless $t++ % 10_000; # my $dummy = ; } say $reg{h};