App-Greple-wordle
view release on metacpan or search on metacpan
lib/App/Greple/wordle/game.pm view on Meta::CPAN
package App::Greple::wordle::game;
use v5.14;
use warnings;
use Data::Dumper;
use List::Util qw(any uniq);
use List::MoreUtils qw(pairwise);
use Getopt::EX::Colormap qw(colorize);
use Mo qw(is required default); {
has answer => is => 'ro', required => 1 ;
has attempts => [], lazy => 0 ;
has map => {} ;
}
no Mo;
sub try {
my $obj = shift;
push @{$obj->attempts}, @_;
$obj->update(@_);
$obj->solved;
}
sub attempt {
my $obj = shift;
int @{$obj->attempts};
}
sub solved {
my $obj = shift;
any { lc eq lc $obj->answer } @{$obj->attempts};
}
sub update {
my $obj = shift;
my $answer = $obj->answer;
my %a = map { $_ => 1 } my @a = $answer =~ /./g;
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->{$_}//'_'}, $_), $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;
( run in 1.993 second using v1.01-cache-2.11-cpan-f0ff5d10edf )