package part1; use 5.20.0; use warnings; use experimental qw/ signatures postderef switch /; sub parse_code($lines) { return map { [ split ] } split "\n", $lines } sub run_once($index,$accum,$code) { my( $op, $val ) = $code->[$index]->@*; given( $op ) { when( 'nop' ) { $index++ } when( 'acc' ) { $index++; $accum += $val; } when( 'jmp' ) { $index += $val; } } return ( $index, $accum ); } sub solution($lines) { my @code = parse_code($lines); my $index = 0; my $accum = 0; my %seen; until( $seen{$index}++ ) { ($index,$accum) = run_once($index,$accum,\@code); } return $accum; } 1;