App-Greple-wordle
view release on metacpan or search on metacpan
lib/App/Greple/wordle/game.pm view on Meta::CPAN
my $keys = $obj->map;
for my $try (@_) {
my @b = $try =~ /./g;
pairwise { $keys->{$a} = 'G' if $a eq $b } @a, @b;
$keys->{$_} ||= $a{$_} ? 'Y' : 'K' for @b;
}
$obj;
}
######################################################################
# keymap
######################################################################
my %map_color = (
G => '555/#6aaa64',
Y => '555/#c9b458',
K => '#787c7e/#787c7e',
K => 'L17/#787c7e',
_ => '555/#787c7e',
);
sub keycolor {
my($kmap, $cmap, $s) = @_;
join '', map colorize($cmap->{$kmap->{$_}//'_'}, uc $_), $s =~ /./g;
}
sub keymap {
my $obj = shift;
my $keys = keycolor $obj->map, \%map_color, join('', 'a'..'z');
$keys;
}
######################################################################
# result
######################################################################
my %square = (
G => "\N{U+1F7E9}", # LARGE GREEN SQUARE
Y => "\N{U+1F7E8}", # LARGE YELLOW SQUARE
K => "\N{U+2B1C}", # WHITE LARGE SQUARE
);
sub result {
my $obj = shift;
my @result = _result(map lc, $obj->answer, @{$obj->attempts});
my $result = join "\n", map s/([GYK])/$square{$1}/ger, @result;
$result;
}
sub _result {
my $answer = shift;
my %a = map { $_ => 1 } my @a = $answer =~ /./g;
map {
my @b = /./g;
join '', pairwise {
$a eq $b ? 'G' : $a{$b} ? 'Y' : 'K'
} @a, @b;
} @_;
}
my %guess_color = (
G => '555/#6aaa64',
Y => '555/#c9b458',
K => '555/#787c7e',
);
sub guess_color {
my $obj = shift;
my @result = _result(map lc, $obj->answer, @_);
map {
my @c = shift(@result) =~ /./g;
my @w = /./g;
join '', pairwise { colorize($guess_color{$a}, uc $b) } @c, @w;
} @_;
}
######################################################################
# hint
######################################################################
my %hint_color = (
G => 'G',
Y => 'Y',
K => 'U',
_ => '',
);
sub hint_color {
my $obj = shift;
map keycolor($obj->map, \%hint_color, $_), @_;
}
sub hint {
my $obj = shift;
my $pattern = _hint(map lc, $obj->answer, @{$obj->attempts});
}
sub _hint {
my $answer = shift;
my %a = map { $_ => 1 } my @a = $answer =~ /./g;
my(@yes, @no);
my $seen = '';
map {
my @b = /./g;
for my $i (0 .. $#b) {
if ($a{$b[$i]}) {
$seen .= $b[$i];
} else {
$seen .= "-$b[$i]";
}
if ($a[$i] eq $b[$i]) {
$yes[$i] = $a[$i];
} else {
$no[$i] .= $b[$i];
}
}
} @_;
my $match = join '', pairwise {
$b = join '', uniq $b =~ /./g if $b;
$a ? $a : "[^$b]";
} @yes, @no;
my $in = join '', map { "(?=.*$_)" } uniq $seen =~ /(?<!-)\w/g;
my $ex = join '', uniq $seen =~ /(?<=-)\w/g;
$ex = "(?!.*[$ex])" if $ex ne '';
'^' . $in . $ex . $match;
}
1;
( run in 1.942 second using v1.01-cache-2.11-cpan-5e09290becf )