#!/usr/bin/perl #made by Qajin $dbg = 0; # split number $sides = 2; # read lengths undef %muslen; $totallen=0; while (<>) { ($title,$len) = split("\t",$_); $muslen{$title} = &cnvlen($len); $totallen += $muslen{$title}; } # convert HH:MM:SS -> N (sec) sub cnvlen { local($ml) = @_; local($h,$m,$s) = ($ml =~ /(\d{0,2}):?(\d\d):(\d\d)$/); return (($h * 60 + $m) * 60 + $s); } # length as each side @sdlen = ( 0 ) x $sides; $sdlen[0] = $totallen; # titles as each side @contents = ( [ keys(%muslen) ] ); for ($i=1;$i<$sides;$i++) { push(@contents, [ () ] ); } while (true) { if ($dbg == 1) { &total_out(); print "-----\n"; } $maxl = 0; $minl = $totallen; $maxn = -1; $minn = -1; # search longest and shortest (for over 2 sides) for ($i=0; $i<$sides; $i++) { ($maxn,$maxl) = ($i,$sdlen[$i]) if ($maxl < $sdlen[$i]); ($minn,$minl) = ($i,$sdlen[$i]) if ($minl > $sdlen[$i]); } $lgside = $contents[$maxn]; $stside = $contents[$minn]; $diff = $sdlen[$maxn] - $sdlen[$minn]; $l = 0; $n = -1; $m = -1; for ($i=0; $i<@$lgside; $i++) { $tmp = $muslen{$lgside->[$i]}; # search longest within different of 2 sides ($n,$m,$l) = ($i,-1,$tmp) if ($tmp < $diff && $tmp > $l); for ($j=0; $j<@$stside; $j++) { $tmp = $muslen{$lgside->[$i]} - $muslen{$stside->[$j]}; ($n,$m,$l) = ($i,$j,$tmp) if ($tmp < $diff && $tmp > $l); } } last if ($n == -1); # move (or swap) $sdlen[$maxn] -= $l; $sdlen[$minn] += $l; $lm = splice(@$lgside,$n,1); $sm = splice(@$stside,$m,1) if ($m != -1); push(@$stside,$lm); push(@$lgside,$sm) if ($m != -1); } &total_out(); sub total_out { local($c,$f,$i); for ($i=0; $i<$sides; $i++) { $c = $contents[$i]; foreach $f (@$c) { printf "%s %s\n",$f,&cnvrlen($muslen{$f}); } print "--- ",&cnvrlen($sdlen[$i]),"\n\n"; } } # convert N (sec) -> HH:MM:SS sub cnvrlen { local($l) = @_; local($h,$m,$s) = (int($l / 3600), int($l/60) % 60 , $l % 60); if ($h > 0) { return (sprintf "%02d:%02d:%02d",$h,$m,$s); } else { return (sprintf "%02d:%02d",$m,$s); } }