]> www.fi.muni.cz Git - aoc.git/blob - 2019/27.pl
Day 25: examining the input
[aoc.git] / 2019 / 27.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4 use Data::Dumper;
5 use List::Util qw(any);
6
7 my %rules;
8 while (<>) {
9         chomp;
10         my ($srcs, $dstcount, $dst) = /(.*) => (\d+) (\w+)/;
11         my %srcs = reverse $srcs =~ /(\d+) (\w+)/g;
12         $rules{$dst} = {
13                 count => $dstcount,
14                 srcs  => \%srcs,
15         };
16 }
17
18 my (%want, %have);
19 $want{FUEL} = 1;
20
21 use List::Util qw(first);
22
23 my $expanded;
24 while (my $w = first { $_ ne 'ORE' && $want{$_} } keys %want) {
25         $expanded = 1;
26         my $r = $rules{$w};
27         my $rcount = int (($want{$w}+$r->{count}-1)/$r->{count});
28         say "want $want{$w} of $w, rule has $r->{count}, need $rcount rules";
29         if ($rcount * $r->{count} > $want{$w}) {
30                 $have{$w} = $rcount * $r->{count} - $want{$w};
31         }
32         delete $want{$w};
33         for my $src (keys %{ $r->{srcs} }) {
34                 my $need = $r->{srcs}->{$src} * $rcount;
35                 if ($have{$src}) {
36                         if ($need >= $have{$src}) {
37                                 $need -= $have{$src};
38                                 delete $have{$src};
39                         } else {
40                                 $have{$src} -= $need;
41                                 next;
42                         }
43                 }
44                 $want{$src} += $need;
45         }
46         say "want: ", join(', ', map { "$want{$_} of $_" } keys %want);
47         say "have: ", join(', ', map { "$have{$_} of $_" } keys %have);
48         say "";
49 }
50
51 say $want{ORE};