#!/usr/bin/perl use strict; # https://rosettacode.org/wiki/Vogel%27s_approximation_method use warnings; use List::AllUtils qw( max_by nsort_by min ); my $data = <[1] } nsort_by { my $x = $_->[0]; $data =~ /(?:$x\w|\w$x)=(\d+)/ && $1 } @penalty)->[0]; my @lowest = nsort_by { /\d+/ && $& } grep { my ($t, $c) = /(.)(.)=/; $data =~ /\b$c=\d/ and $data =~ /\b$t=\d/ } $data =~ /$rc\w=\d+|\w$rc=\d+/g; my ($t, $c) = $lowest[0] =~ /(.)(.)/; my $allocate = min $data =~ /\b[$t$c]=(\d+)/g; $table =~ s/$t$c/ sprintf "%2d", $allocate/e; $cost += $data =~ /$t$c=(\d+)/ && $1 * $allocate; $data =~ s/\b$_=\K\d+/ $& - $allocate || '' /e for $t, $c; } print "cost $cost\n\n", $table =~ s/[A-Z]{2}/--/gr;