]> www.fi.muni.cz Git - aoc.git/blob - 2015/30.pl
Day 25: examining the input
[aoc.git] / 2015 / 30.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4 use strict;
5
6 my %prop;
7 while (<>) {
8         my ($name) = /\A(\w+):/;
9         my @vals = /(-?\d+)/g;
10         $prop{$name} = \@vals;
11 }
12
13 my $max;
14
15 sub addprop {
16         my ($amounts, $rem, $rest) = @_;
17
18         if (!@$rest) {
19                 my $cal = 0;
20                 for my $p (keys %prop) {
21                         $cal += $prop{$p}->[-1] * $amounts->{$p};
22                 }
23                 return if $cal != 500;
24                 my $mul = 1;
25                 for my $t (0 ..3) {
26                         my $sum = 0;
27                         for my $p (keys %prop) {
28                                 $sum += $prop{$p}->[$t] * $amounts->{$p};
29                         }
30                         $sum = 0 if $sum < 0;
31                         $mul *= $sum;
32                 }
33                 $max = $mul if !$max || $mul > $max;    
34         } else {
35                 for my $i (0 .. $#$rest) {
36                         my @nr = @$rest;
37                         my ($ing) = splice @nr, $i, 1;
38                         my $min = @nr ? 0 : $rem;
39                         for my $a ($min .. $rem) {
40                                 my %na = %$amounts;
41                                 $na{$ing} = $a;
42                                 addprop(\%na, $rem-$a, \@nr);
43                         }
44                 }
45         }
46 }
47
48 addprop({}, 100, [ keys %prop ]);
49
50 say $max;