]> www.fi.muni.cz Git - aoc.git/blob - 2017/14.pl
Day 25: examining the input
[aoc.git] / 2017 / 14.pl
1 #!/usr/bin/perl
2
3 use v5.30;
4 use strict;
5
6 my %all;
7 my %above;
8 my %top;
9
10 while (<>) {
11         my ($name, $num, $rest) = /^(\w+) \((\d+)\)(.*)/;
12         $all{$name} = $num;
13         next if !length $rest;
14         for my $t ($rest =~ /(\w+)/g) {
15                 push @{ $above{$name} }, $t;
16                 $top{$t} = 1;
17         }
18 }
19
20 my $start = 'uownj';
21
22 sub walk {
23         my ($node) = @_;
24         my %sizes;
25         return $all{$node}
26                 if !exists $above{$node};
27
28         my $sum;
29         my %nodes;
30         for my $ab (@{ $above{$node} }) {
31                 my $s = walk($ab);
32                 $sum += $s;
33                 $sizes{$s}++;
34                 $nodes{$s} = $ab;
35         }
36         my @sizes = sort { $sizes{$a} <=> $sizes{$b} } keys %sizes;
37         if (@sizes == 1) {
38                 return $sum + $all{$node};
39         } else {
40                 say $all{$nodes{$sizes[0]}} + $sizes[1]-$sizes[0];
41                 exit 0;
42         }
43 }
44
45 walk('uownj');
46
47
48