]> www.fi.muni.cz Git - aoc.git/blobdiff - 2017/35.pl
The rest of Year 2017
[aoc.git] / 2017 / 35.pl
diff --git a/2017/35.pl b/2017/35.pl
new file mode 100755 (executable)
index 0000000..d1a75fc
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+use v5.30;
+use strict;
+
+my @code = map { chomp; [ split /\s+/ ] } <>;
+my %regs;
+my $pc = 0;
+my $freq;
+while ($pc < @code) {
+       my ($ins, $a1, $a2) = @{ $code[$pc] };
+       my $v1 = $a1 =~ /[a-z]/ ? $regs{$a1} : $a1
+               if defined $a1;
+       my $v2 = $a2 =~ /[a-z]/ ? $regs{$a2} : $a2
+               if defined $a2;
+       if ($ins eq 'snd') {
+               $freq = $v1;
+       } elsif ($ins eq 'set') {
+               $regs{$a1} = $v2;
+       } elsif ($ins eq 'add') {
+               $regs{$a1} += $v2;
+       } elsif ($ins eq 'mul') {
+               $regs{$a1} *= $v2;
+       } elsif ($ins eq 'mod') {
+               $regs{$a1} %= $v2;
+       } elsif ($ins eq 'rcv') {
+               if ($v1) {
+                       $regs{$a1} = $freq;
+                       say $freq;
+                       exit 0;
+               }
+       } elsif ($ins eq 'jgz') {
+               $pc += $v2-1 if $v1 > 0;
+       } else {
+               die "unknown insn $ins";
+       }
+       $pc++;
+}
+       
+