]> www.fi.muni.cz Git - aoc.git/blob - 2016/45.pl
Day 25: examining the input
[aoc.git] / 2016 / 45.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use v5.30;
5
6 my @code = map { chomp; [ split /\s+/ ] } <>;
7
8 my $ip = 0;
9
10 my %tgl = (
11         cpy => 'jnz',
12         inc => 'dec',
13         dec => 'inc',
14         jnz => 'cpy',
15         tgl => 'inc',
16 );
17
18 my %regs = (a => 12);
19 while ($ip < @code) {
20         say join(' ', $ip, @{ $code[$ip] }, map { "$_=$regs{$_}" } sort keys %regs);
21         my @ins = @{ $code[$ip] };
22         if ($ins[0] eq 'cpy') {
23                 my $val = $ins[1];
24                 my $reg = $ins[2];
25                 $val = $regs{$val} if $val =~ /[a-z]/;
26                 $regs{$reg} = $val;
27         } elsif ($ins[0] eq 'inc') {
28                 $regs{$ins[1]}++;
29         } elsif ($ins[0] eq 'dec') {
30                 $regs{$ins[1]}--;
31         } elsif ($ins[0] eq 'jnz') {
32                 my ($reg, $val) = @ins[1..2];
33                 $reg = $regs{$reg} if $reg =~ /[a-z]/;
34                 $val = $regs{$val} if $val =~ /[a-z]/;
35                 if ($reg) {
36                         $ip += $val - 1;
37                 }
38         } elsif ($ins[0] eq 'tgl') {
39                 my $off = $ins[1];
40                 $off = $regs{$off} if $off =~ /[a-z]/;
41                 my $other = $code[$ip + $off];
42                 $other->[0] = $tgl{$other->[0]};
43         } else {
44                 say "Unknown instrution: $_";
45         }
46         $ip++;
47 }
48
49 say $ip;
50 say $regs{a};
51