]> www.fi.muni.cz Git - aoc.git/blobdiff - 2016/45.pl
The rest of Year 2016
[aoc.git] / 2016 / 45.pl
diff --git a/2016/45.pl b/2016/45.pl
new file mode 100755 (executable)
index 0000000..2924ac1
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w
+
+use strict;
+use v5.30;
+
+my @code = map { chomp; [ split /\s+/ ] } <>;
+
+my $ip = 0;
+
+my %tgl = (
+       cpy => 'jnz',
+       inc => 'dec',
+       dec => 'inc',
+       jnz => 'cpy',
+       tgl => 'inc',
+);
+
+my %regs = (a => 12);
+while ($ip < @code) {
+       say join(' ', $ip, @{ $code[$ip] }, map { "$_=$regs{$_}" } sort keys %regs);
+       my @ins = @{ $code[$ip] };
+       if ($ins[0] eq 'cpy') {
+               my $val = $ins[1];
+               my $reg = $ins[2];
+               $val = $regs{$val} if $val =~ /[a-z]/;
+               $regs{$reg} = $val;
+       } elsif ($ins[0] eq 'inc') {
+               $regs{$ins[1]}++;
+       } elsif ($ins[0] eq 'dec') {
+               $regs{$ins[1]}--;
+       } elsif ($ins[0] eq 'jnz') {
+               my ($reg, $val) = @ins[1..2];
+               $reg = $regs{$reg} if $reg =~ /[a-z]/;
+               $val = $regs{$val} if $val =~ /[a-z]/;
+               if ($reg) {
+                       $ip += $val - 1;
+               }
+       } elsif ($ins[0] eq 'tgl') {
+               my $off = $ins[1];
+               $off = $regs{$off} if $off =~ /[a-z]/;
+               my $other = $code[$ip + $off];
+               $other->[0] = $tgl{$other->[0]};
+       } else {
+               say "Unknown instrution: $_";
+       }
+       $ip++;
+}
+
+say $ip;
+say $regs{a};
+