]> www.fi.muni.cz Git - aoc.git/blob - 2022/41.pl
Day 21: slightly polished solution
[aoc.git] / 2022 / 41.pl
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use strict;
5
6 my %expr;
7 my %val;
8 while (<>) {
9         chomp;
10         my ($name, $rest) = split /: /;
11         my @ops = split /\s+/, $rest;
12         if (@ops > 1) {
13                 $expr{$name} = \@ops;
14         } else {
15                 $val{$name} = $ops[0];
16         }
17 }
18
19 sub walk($var) {
20         return $val{$var} if defined $val{$var};
21         my ($arg1, $op, $arg2) = @{ $expr{$var} };
22         if ($op eq '+') {
23                 return $val{$var} = walk($arg1) + walk($arg2);
24         } elsif ($op eq '-') {
25                 return $val{$var} = walk($arg1) - walk($arg2);
26         } elsif ($op eq '*') {
27                 return $val{$var} = walk($arg1) * walk($arg2);
28         } elsif ($op eq '/') {
29                 return $val{$var} = walk($arg1) / walk($arg2);
30         }
31 }
32
33 say walk('root');