]> www.fi.muni.cz Git - aoc2020.git/blob - 16.pl
Task 9 Perl Golf-style
[aoc2020.git] / 16.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my @code = map { [ split /\s+/ ] } <>;
6
7 for my $i (0 .. $#code) {
8         if ($code[$i]->[0] eq 'nop') {
9                 local $code[$i]->[0] = 'jmp';
10                 interp(\@code);
11         } elsif ($code[$i]->[0] eq 'jmp') {
12                 local $code[$i]->[0] = 'nop';
13                 interp(\@code);
14         }
15 }
16                 
17 sub interp {
18         my ($code) = @_;
19         my $acc = 0;
20         my $pc = 0;
21         my %seen;
22
23         while (!$seen{$pc} && $pc != @$code) {
24                 $seen{$pc} = 1;
25                 my ($ins, $arg) = @{ $code->[$pc] };
26                 # print "pc=$pc, acc=$acc, $ins $arg\n";
27                 if ($ins eq 'nop') {
28                         $pc++;
29                 } elsif ($ins eq 'acc') {
30                         $acc += $arg; $pc++;
31                 } elsif ($ins eq 'jmp') {
32                         $pc += $arg;
33                 }
34         }
35         if ($pc == @$code) {
36                 print "terminating with acc=$acc.\n";
37                 exit 0;
38         }
39         # print "\n";
40 }