]> www.fi.muni.cz Git - aoc.git/blob - 2016/46.pl
Day 25: examining the input
[aoc.git] / 2016 / 46.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 # my %regs = (a => 479001600, b => 1, c => 2, d => 0);
20 # $code[24][0] = 'dec'; # after b=4
21 # $code[22][0] = 'dec'; # after b=3
22 # $code[20][0] = 'cpy'; # after b=2
23 # $code[18][0] = 'cpy'; # after b=2
24 # $code[16][0] = 'inc'; # after b=1
25 my $debug = 0;
26 # $ip = 17;
27 while ($ip < @code) {
28         say join(' ', $ip, @{ $code[$ip] }, map { "$_=$regs{$_}" } sort keys %regs)
29                 if $debug;
30         $debug = 0;
31         my @ins = @{ $code[$ip] };
32         if ($ins[0] eq 'cpy') {
33                 my $val = $ins[1];
34                 my $reg = $ins[2];
35                 $val = $regs{$val} if $val =~ /[a-z]/;
36                 $regs{$reg} = $val;
37         } elsif ($ins[0] eq 'inc') {
38                 $regs{$ins[1]}++;
39         } elsif ($ins[0] eq 'dec') {
40                 $regs{$ins[1]}--;
41         } elsif ($ins[0] eq 'jnz') {
42                 my ($reg, $val) = @ins[1..2];
43                 if ($val eq '-2' && $ip >= 2 && $code[$ip-1][0] eq 'dec'
44                         && $code[$ip-2][0] eq 'inc'
45                         && $code[$ip-1][1] eq $reg) {
46                         $regs{$code[$ip-2][1]} += $regs{$reg};
47                         $regs{$reg} = 0;
48                 }
49                 $val = $regs{$val} if $val =~ /[a-z]/;
50                 $reg = $regs{$reg} if $reg =~ /[a-z]/;
51                 if ($reg) {
52                         $ip += $val - 1;
53                 }
54         } elsif ($ins[0] eq 'tgl') {
55                 my $off = $ins[1];
56                 $off = $regs{$off} if $off =~ /[a-z]/;
57                 my $other = $code[$ip + $off];
58                 say "toggle ", $ip+$off, " $other->[0] to $tgl{$other->[0]}"
59                         if $other;
60                 $debug = 1;
61                 $other->[0] = $tgl{$other->[0]} if $other;
62         } else {
63                 say "Unknown instrution: $_";
64         }
65         $ip++;
66 }
67
68 say $ip;
69 say $regs{a};
70