]> www.fi.muni.cz Git - aoc.git/blob - 2017/35.pl
The rest of Year 2017
[aoc.git] / 2017 / 35.pl
1 #!/usr/bin/perl
2
3 use v5.30;
4 use strict;
5
6 my @code = map { chomp; [ split /\s+/ ] } <>;
7 my %regs;
8 my $pc = 0;
9 my $freq;
10 while ($pc < @code) {
11         my ($ins, $a1, $a2) = @{ $code[$pc] };
12         my $v1 = $a1 =~ /[a-z]/ ? $regs{$a1} : $a1
13                 if defined $a1;
14         my $v2 = $a2 =~ /[a-z]/ ? $regs{$a2} : $a2
15                 if defined $a2;
16         if ($ins eq 'snd') {
17                 $freq = $v1;
18         } elsif ($ins eq 'set') {
19                 $regs{$a1} = $v2;
20         } elsif ($ins eq 'add') {
21                 $regs{$a1} += $v2;
22         } elsif ($ins eq 'mul') {
23                 $regs{$a1} *= $v2;
24         } elsif ($ins eq 'mod') {
25                 $regs{$a1} %= $v2;
26         } elsif ($ins eq 'rcv') {
27                 if ($v1) {
28                         $regs{$a1} = $freq;
29                         say $freq;
30                         exit 0;
31                 }
32         } elsif ($ins eq 'jgz') {
33                 $pc += $v2-1 if $v1 > 0;
34         } else {
35                 die "unknown insn $ins";
36         }
37         $pc++;
38 }
39         
40