use 5.20.0; use experimental qw/ smartmatch signatures postderef /; use List::AllUtils qw/ sum /; use List::UtilsBy qw/ nsort_by /; my %prog; while(<>) { my( $name, $weight, @deps ) = map { split ', ' } /(\S+).*?(\d+)(?:.*?-> (.*))?/; $prog{$name} = [ $weight, \@deps ]; } balance('qibuqqg'); sub balance($prog) { my %child = map { $_ => balance($_) } $prog{$prog}[1]->@*; my %w; while ( my( $n, $w ) = each %child ) { push @{ $w{$w} }, $n; } if( 1 < keys %w ) { my( $bad, $good ) = nsort_by { scalar $w{$_}->@* } keys %w; die $w{$bad}[0], " needs to be ", $prog{$w{$bad}[0]}[0] - $bad + $good; } return $prog{$prog}[0] + sum values %child; }