Task1
We keep on alternating between digits and letters:
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw(min);
sub balance_string{
my @chars = split '',$_[0];
my @ds = grep{/\d/} @chars;
my @ls = grep{/\D/} @chars;
my ($m,$n) = (scalar @ds,scalar @ls);
return '' if abs($m-$n) > 1;
my $res;
foreach my $i(0..min($m,$n)-1){
if($m > $n) {
$res .= $ds[$i] . $ls[$i]
} else {
$res .= $ds[$i] . $ls[$i]
}
}
$res .= $ds[$m-1] if($m > $n);
$res .= $ls[$n-1] if($m < $n);
$res
}
printf "%s\n",balance_string('a0b1c2');
printf "%s\n",balance_string('abc12');
printf "%s\n",balance_string('0a2b1c3');
printf "%s\n",balance_string('1a23');
printf "%s\n",balance_string('ab123')
Task2
We find the max score by prefix sum:
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw(max);
sub max_score{
my $res = 0;
foreach my $i(1..(length $_[0])-1) {
my $temp = 0;
foreach my $j(0..$i-1) {
$temp++ if (substr $_[0],$j,1) eq '0'
}
foreach my $j($i..(length $_[0])-1) {
$temp++ if (substr $_[0],$j,1) eq '1'
}
$res = max $res,$temp;
}
$res
}
printf "%d\n",max_score('0011');
printf "%d\n",max_score('0000');
printf "%d\n",max_score('1111');
printf "%d\n",max_score('0101');
printf "%d\n",max_score('011101')