App-wordlist-wordle
view release on metacpan or search on metacpan
lib/App/wordlist/wordle.pm view on Meta::CPAN
## no critic: InputOutput::ProhibitInteractiveTest
package App::wordlist::wordle;
use 5.010001;
use strict;
use warnings;
use Log::ger;
use App::wordlist ();
use Perinci::Sub::Util qw(gen_modified_sub);
our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2025-03-07'; # DATE
our $DIST = 'App-wordlist-wordle'; # DIST
our $VERSION = '0.295'; # VERSION
our %SPEC;
gen_modified_sub(
base_name => 'App::wordlist::wordlist',
output_name => 'wordlist_wordle',
modify_args => {
wordlists => sub {
$_[0]{default} = ['EN::Wordle'];
},
len => sub {
$_[0]{default} = 5;
},
},
remove_args => [
'action',
'lcpan',
'chars_unordered',
'chars_ordered',
],
modify_meta => sub {
$_[0]{summary} = 'Help solve Wordle';
delete $_[0]{'x.doc.faq'};
$_[0]{description} = <<'MARKDOWN';
This is a wrapper to <prog:wordlist> designed to be a convenient helper to solve
Wordle puzzle. By default it greps from the `EN::Wordle` wordlist. It accepts
a series of guesses in a format like the following:
A^R^isE^
Pound
might
blA^ck
PR^ivY^
where lowercase means wrong guess, uppercase means correct letter and position,
while (uppercase) letter followed by a caret (`^`) means the letter exists in
another position. It will convert these guesses to regex patterns and the
`--chars-unordered` option and pass it to `wordlist`.
MARKDOWN
$_[0]{examples} = [
{
argv => ['cR^eEk'],
summary => 'One guess',
test => 0,
'x.doc.show_result' => 0,
},
{
argv => ['A^R^isE^', 'Pound', 'might', 'blA^ck', 'PR^ivY^'],
summary => 'Five guesses',
test => 0,
'x.doc.show_result' => 0,
},
];
},
output_code => sub {
my %args = @_;
$args{arg} //= [];
my $chars_unordered = '';
my $possible_letters = join '', "a".."z";
my @new_arg;
for my $arg (@{ $args{arg} }) {
my @chars = split //, $arg;
my $re = '';
my %letter_exists;
while (@chars) {
my $char = shift @chars;
return [400, "Invalid letter '$char' in guess '$arg'"] unless $char =~ /[A-Za-z]/;
my $caret = @chars && $chars[0] eq '^' ? shift(@chars) : '';
my $uc = $char eq uc $char;
$char = lc $char;
if ($caret) { # letter is in another position
my $letters = $possible_letters;
$letters =~ s/$char//;
$re .= "[$letters]";
$letter_exists{$char}++;
$chars_unordered .= $char unless index($chars_unordered, $char) >= 0;
} elsif ($uc) { # correct guess
$re .= $char;
$letter_exists{$char}++;
$chars_unordered .= $char unless index($chars_unordered, $char) >= 0;
} else { # wrong guess
my $letters = $possible_letters;
$letters =~ s/$char//;
$possible_letters =~ s/$char// unless $letter_exists{$char};
$re .= "[$letters]";
}
}
$re = "/\\A$re\\z/";
push @new_arg, $re;
}
$args{arg} = \@new_arg;
$args{chars_unordered} = $chars_unordered if length $chars_unordered;
log_trace "Arguments passed to wordlist(): %s", \%args;
App::wordlist::wordlist(%args);
},
);
1;
# ABSTRACT: A wordlist wrapper to help solve Wordle
__END__
=pod
=encoding UTF-8
=head1 NAME
App::wordlist::wordle - A wordlist wrapper to help solve Wordle
=head1 VERSION
This document describes version 0.295 of App::wordlist::wordle (from Perl distribution App-wordlist-wordle), released on 2025-03-07.
=head1 FUNCTIONS
=head2 wordlist_wordle
Usage:
wordlist_wordle(%args) -> [$status_code, $reason, $payload, \%result_meta]
Help solve Wordle.
Examples:
=over
=item * One guess:
wordlist_wordle(arg => ["cR^eEk"]);
=item * Five guesses:
wordlist_wordle(arg => ["A^R^isE^", "Pound", "might", "blA^ck", "PR^ivY^"]);
=back
This is a wrapper to L<wordlist> designed to be a convenient helper to solve
Wordle puzzle. By default it greps from the C<EN::Wordle> wordlist. It accepts
a series of guesses in a format like the following:
A^R^isE^
Pound
might
blA^ck
PR^ivY^
where lowercase means wrong guess, uppercase means correct letter and position,
while (uppercase) letter followed by a caret (C<^>) means the letter exists in
another position. It will convert these guesses to regex patterns and the
C<--chars-unordered> option and pass it to C<wordlist>.
This function is not exported.
Arguments ('*' denotes required arguments):
=over 4
=item * B<arg> => I<array[str]>
(No description)
=item * B<color> => I<str> (default: "auto")
When to highlight search stringE<sol>matching pattern with color.
=item * B<detail> => I<bool>
Display more information when listing modulesE<sol>result.
When listing installed modules (C<-l>), this means also returning a wordlist's
language.
When returning grep result, this means also returning wordlist name.
=item * B<exclude_dynamic_wordlists> => I<bool>
(No description)
=item * B<exclude_wordlist_pattern> => I<re_from_str>
(No description)
=item * B<exclude_wordlists> => I<array[str]>
Exclude wordlist modules.
=item * B<ignore_case> => I<bool> (default: 1)
(No description)
=item * B<langs> => I<array[str]>
Only include wordlists of certain language(s).
By convention, language code is the first subnamespace of a wordlist module,
e.g. WordList::EN::* for English, WordList::FR::* for French, and so on.
Wordlist modules which do not follow this convention (e.g. WordList::Password::*
or WordList::PersonName::*) are not included.
=item * B<len> => I<int> (default: 5)
(No description)
=item * B<max_len> => I<int>
(No description)
=item * B<min_len> => I<int>
( run in 0.831 second using v1.01-cache-2.11-cpan-364913b4093 )