]> www.fi.muni.cz Git - aoc.git/blobdiff - 2017/14.pl
AoC 2017 begins
[aoc.git] / 2017 / 14.pl
diff --git a/2017/14.pl b/2017/14.pl
new file mode 100755 (executable)
index 0000000..56740ee
--- /dev/null
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+
+use v5.30;
+use strict;
+
+my %all;
+my %above;
+my %top;
+
+while (<>) {
+       my ($name, $num, $rest) = /^(\w+) \((\d+)\)(.*)/;
+       $all{$name} = $num;
+       next if !length $rest;
+       for my $t ($rest =~ /(\w+)/g) {
+               push @{ $above{$name} }, $t;
+               $top{$t} = 1;
+       }
+}
+
+my $start = 'uownj';
+
+sub walk {
+       my ($node) = @_;
+       my %sizes;
+       return $all{$node}
+               if !exists $above{$node};
+
+       my $sum;
+       my %nodes;
+       for my $ab (@{ $above{$node} }) {
+               my $s = walk($ab);
+               $sum += $s;
+               $sizes{$s}++;
+               $nodes{$s} = $ab;
+       }
+       my @sizes = sort { $sizes{$a} <=> $sizes{$b} } keys %sizes;
+       if (@sizes == 1) {
+               return $sum + $all{$node};
+       } else {
+               say $all{$nodes{$sizes[0]}} + $sizes[1]-$sizes[0];
+               exit 0;
+       }
+}
+
+walk('uownj');
+
+
+