45 lines
743 B
Perl
45 lines
743 B
Perl
|
package part2;
|
||
|
|
||
|
use 5.20.0;
|
||
|
use warnings;
|
||
|
|
||
|
require './part1.pm';
|
||
|
|
||
|
use experimental qw/
|
||
|
signatures
|
||
|
postderef
|
||
|
switch
|
||
|
/;
|
||
|
|
||
|
sub run_instance(@code) {
|
||
|
|
||
|
my $index = 0;
|
||
|
my $accum = 0;
|
||
|
my %seen;
|
||
|
|
||
|
until( $seen{$index}++ ) {
|
||
|
($index,$accum) = part1::run_once($index,$accum,\@code);
|
||
|
|
||
|
return $accum if $index >= @code;
|
||
|
}
|
||
|
|
||
|
return undef;
|
||
|
}
|
||
|
|
||
|
sub solution($lines) {
|
||
|
my @code = part1::parse_code($lines);
|
||
|
|
||
|
for(0..$#code) {
|
||
|
next if $code[$_][0] eq 'acc';
|
||
|
my @new_code = @code;
|
||
|
$new_code[$_] = [ $code[$_]->@* ];
|
||
|
$new_code[$_][0] = $new_code[$_][0] eq 'nop' ? 'jmp' : 'nop';
|
||
|
|
||
|
my $result = run_instance(@new_code);
|
||
|
|
||
|
return $result if $result;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
1;
|