Task1
We find the common characters between all words:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Show;
use List::Util qw(min);
use List::MoreUtils qw(frequency);
sub common_characters{
my @f = map{{frequency split ''}} @{$_[0]};
map{my $l = $_;
($l) x min map{$_->{$l} // 0} @f
} 'a'..'z'
}
print show common_characters(["bella","label","roller"]);
print show common_characters(["cool","lock","cook"]);
print show common_characters(["hello","world","pole"]);
print show common_characters(["abc","def","ghi"]);
print show common_characters(["aab","aac","aaa"]);
Task2
We find the winner by only keeping track of the moves, instead of simulating the whole grid:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Show;
use List::Util qw(any);
sub find_winner{
my ($m) = @_;
my @cnt = (0) x 8;
for(my $k = $#$m; $k >= 0; $k -= 2){
my ($i,$j) = ($m->[$k][0],$m->[$k][1]);
$cnt[$i]++;
$cnt[$j+3]++;
$cnt[6]++ if $i == $j;
$cnt[7]++ if $i + $j == 2;
if(any{$_ == 3} ($cnt[$i],$cnt[$j+3],$cnt[6],$cnt[7])) {
return $k % 2 == 0 ? 'A' : 'B'
}
}
@$m == 9 ? 'Draw' : 'Pending'
}
printf "%s\n",find_winner([[0,0],[2,0],[1,1],[2,1],[2,2]]);
printf "%s\n",find_winner([[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]]);
printf "%s\n",find_winner([[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],
[0,1],[0,2],[2,2]]);
printf "%s\n",find_winner([[0,0],[1,1]]);
printf "%s\n",find_winner([[1,1],[0,0],[2,2],[0,1],[1,0],[0,2]]);