]> www.fi.muni.cz Git - aoc.git/blob - 2015/14.pl
Day 25: examining the input
[aoc.git] / 2015 / 14.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4 use strict;
5 use feature 'bitwise';
6
7 $/ = undef;
8 $_ = <> . "\n";
9 s/^.*? -> b\n/3176 -> b\n/m;
10
11 while (1) {
12         my ($wire, $val);
13         if (s/^(\d+) -> (\w+)\n//m) {
14                 ($wire, $val) = ($2, $1);
15         } elsif (s/^NOT (\d+) -> (\w+)\n//m) {
16                 ($wire, $val) = ($2, $1 ^ 0xFFFF);
17         } elsif (s/^(\d+) AND (\d+) -> (\w+)\n//m) {
18                 ($wire, $val) = ($3, $1 & $2);
19         } elsif (s/^(\d+) OR (\d+) -> (\w+)\n//m) {
20                 ($wire, $val) = ($3, $1 | $2);
21         } elsif (s/^(\d+) RSHIFT (\d+) -> (\w+)\n//m) {
22                 ($wire, $val) = ($3, $1 >> $2);
23         } elsif (s/^(\d+) LSHIFT (\d+) -> (\w+)\n//m) {
24                 ($wire, $val) = ($3, ($1 << $2) & 0xFFFF);
25         }
26         last if !$wire;
27         if ($wire eq 'a') {
28                 say "a=$val";
29                 last;
30         }
31         # say "$wire => $val";
32         last if $val !~ /\A\d+\z/;
33         $val &= 0xFFFF;
34         s/\b$wire\b/$val/g;
35         # say "$_\n\n";
36 }