]> www.fi.muni.cz Git - aoc.git/blob - 2022/42.pl
Day 25: examining the input
[aoc.git] / 2022 / 42.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         return undef if !defined $expr{$var};
22         my ($arg1, $op, $arg2) = @{ $expr{$var} };
23         my $val1 = walk($arg1);
24         my $val2 = walk($arg2);
25         return undef if !defined $val1 || !defined $val2;
26         if ($op eq '+') {
27                 return $val{$var} = $val1 + $val2;
28         } elsif ($op eq '-') {
29                 return $val{$var} = $val1 - $val2;
30         } elsif ($op eq '*') {
31                 return $val{$var} = $val1 * $val2;
32         } elsif ($op eq '/') {
33                 return $val{$var} = $val1 / $val2;
34         }
35 }
36
37
38 delete $val{humn};
39 delete $expr{humn};
40 walk('root');
41 my $val = $val{$expr{root}[2]};
42 my $var = $expr{root}[0];
43
44 while ($var ne 'humn') {
45         say "$var = $val, expr = @{ $expr{$var} }";
46         my ($arg1, $op, $arg2) = @{ $expr{$var} };
47         $arg1 = $val{$arg1} if defined $val{$arg1};
48         $arg2 = $val{$arg2} if defined $val{$arg2};
49         if ($arg2 =~ /\d/) {
50                 $var = $arg1;
51                 if ($op eq '/') {
52                         $val = $val * $arg2;
53                 } elsif ($op eq '*') {
54                         $val = $val / $arg2;
55                 } elsif ($op eq '+') {
56                         $val = $val - $arg2;
57                 } elsif ($op eq '-') {
58                         $val = $val + $arg2;
59                 }
60         } elsif ($arg1 =~ /\d/) {
61                 $var = $arg2;
62                 if ($op eq '/') {
63                         $val = $arg1 / $val;
64                 } elsif ($op eq '*') {
65                         $val = $val / $arg1;
66                 } elsif ($op eq '+') {
67                         $val = $val - $arg1;
68                 } elsif ($op eq '-') {
69                         $val = $arg1 - $val;
70                 }
71         } else {
72                 last;
73         }
74         say "var $var = $val";
75         $val{$var} = $val;
76 }
77
78 say $val{humn};