]> www.fi.muni.cz Git - aoc.git/blob - 2017/49.pl
Day 25: examining the input
[aoc.git] / 2017 / 49.pl
1 #!/usr/bin/perl
2
3 use v5.30;
4 use strict;
5
6 my %st_move;
7 my %st_write;
8 my %st_next;
9 my $state;
10 my $val;
11 my $start_st;
12 my $sum_steps;
13 while (<>) {
14         if (/Begin in state (\w+)/) {
15                 $start_st = $1;
16         } elsif (/Perform a diagnostic checksum after (\d+) steps/) {
17                 $sum_steps = $1;
18         } elsif (/In state (\w+):/) {
19                 $state = $1;
20         } elsif (/If the current value is (\d):/) {
21                 $val = $1;
22         } elsif (/Write the value (\d)./) {
23                 $st_write{$state,$val} = $1;
24         } elsif (/Move one slot to the (\w+)/) {
25                 $st_move{$state,$val} = $1 eq 'right' ? 1 : -1;
26         } elsif (/Continue with state (\w+)/) {
27                 $st_next{$state,$val} = $1;
28         }
29 }
30
31 my %tape;
32 my $pos = 0;
33 while ($sum_steps--) {
34         my $val = $tape{$pos} ? 1 : 0;
35         $tape{$pos} = $st_write{$start_st,$val};
36         $pos += $st_move{$start_st,$val};
37         $start_st = $st_next{$start_st,$val};
38 }
39
40 use List::Util qw(sum);
41 say sum values %tape;