3
0
mirror of https://github.com/pragma-/pbot.git synced 2025-10-14 15:07:22 +02:00

Plugin/Worlde: track nonword and invalid guesses

This commit is contained in:
Pragmatic Software 2025-07-08 22:41:19 -07:00
parent fa36d8c480
commit 4525cb95d1
No known key found for this signature in database
GPG Key ID: CC916B6E3C84ECCE
2 changed files with 47 additions and 17 deletions

View File

@ -158,7 +158,7 @@ sub wordle($self, $context) {
return NO_WORDLE; return NO_WORDLE;
} }
my $result = "Current wordlist: $self->{$channel}->{wordlist} ($self->{$channel}->{length}); guesses: $self->{$channel}->{guess_count}"; my $result = "Current wordlist: $self->{$channel}->{wordlist} ($self->{$channel}->{length}); guesses: $self->{$channel}->{guess_count}; nonwords: $self->{$channel}->{nonword_count}; invalids: $self->{$channel}->{invalid_count}";
if ($self->{$channel}->{correct}) { if ($self->{$channel}->{correct}) {
my $solved_on = concise ago (time - $self->{$channel}->{solved_on}); my $solved_on = concise ago (time - $self->{$channel}->{solved_on});
@ -439,6 +439,8 @@ sub make_wordle($self, $channel, $length, $word = undef, $wordlist = DEFAULT_LIS
$self->{$channel}->{correct} = 0; $self->{$channel}->{correct} = 0;
$self->{$channel}->{givenup} = 0; $self->{$channel}->{givenup} = 0;
$self->{$channel}->{guess_count} = 0; $self->{$channel}->{guess_count} = 0;
$self->{$channel}->{nonword_count} = 0;
$self->{$channel}->{invalid_count} = 0;
$self->{$channel}->{letters} = {}; $self->{$channel}->{letters} = {};
foreach my $letter ('A'..'Z') { foreach my $letter ('A'..'Z') {
@ -493,6 +495,7 @@ sub guess_wordle($self, $channel, $guess) {
if (length $guess != $self->{$channel}->{wordle}->@*) { if (length $guess != $self->{$channel}->{wordle}->@*) {
my $guess_length = length $guess; my $guess_length = length $guess;
my $wordle_length = $self->{$channel}->{wordle}->@*; my $wordle_length = $self->{$channel}->{wordle}->@*;
$self->{$channel}->{invalid_count}++;
return "Guess length ($guess_length) unequal to Wordle length ($wordle_length). Try again."; return "Guess length ($guess_length) unequal to Wordle length ($wordle_length). Try again.";
} }
@ -505,11 +508,13 @@ sub guess_wordle($self, $channel, $guess) {
for (my $i = 0; $i < @guess; $i++) { for (my $i = 0; $i < @guess; $i++) {
if ($self->{$channel}->{letters}->{$guess[$i]} == LETTER_INVALID) { if ($self->{$channel}->{letters}->{$guess[$i]} == LETTER_INVALID) {
$self->{$channel}->{invalid_count}++;
return "Hard mode is enabled. $guess[$i] is not in the Wordle. Try again."; return "Hard mode is enabled. $guess[$i] is not in the Wordle. Try again.";
} }
if ($greens[$i]) { if ($greens[$i]) {
if ($guess[$i] ne $greens[$i]) { if ($guess[$i] ne $greens[$i]) {
$self->{$channel}->{invalid_count}++;
return "Hard mode is enabled. Position " . ($i + 1) . " must be $greens[$i]. Try again."; return "Hard mode is enabled. Position " . ($i + 1) . " must be $greens[$i]. Try again.";
} }
$greens{$greens[$i]}++; $greens{$greens[$i]}++;
@ -517,6 +522,7 @@ sub guess_wordle($self, $channel, $guess) {
foreach my $orange ($self->{$channel}->{oranges}->@*) { foreach my $orange ($self->{$channel}->{oranges}->@*) {
if ($guess[$i] eq $orange->[$i]) { if ($guess[$i] eq $orange->[$i]) {
$self->{$channel}->{invalid_count}++;
return "Hard mode is enabled. Position " . ($i + 1) . " can't be $guess[$i]. Try again."; return "Hard mode is enabled. Position " . ($i + 1) . " can't be $guess[$i]. Try again.";
} }
} }
@ -532,6 +538,7 @@ sub guess_wordle($self, $channel, $guess) {
my $count = 0; my $count = 0;
$_ eq $o && $count++ foreach @guess; $_ eq $o && $count++ foreach @guess;
if ($count < $oranges{$o} + $greens{$o}) { if ($count < $oranges{$o} + $greens{$o}) {
$self->{$channel}->{invalid_count}++;
return "Hard mode is enabled. There must be " . ($oranges{$o} + $greens{$o}) . " $o. Try again."; return "Hard mode is enabled. There must be " . ($oranges{$o} + $greens{$o}) . " $o. Try again.";
} }
} }
@ -540,6 +547,7 @@ sub guess_wordle($self, $channel, $guess) {
foreach my $white ($self->{$channel}->{whites}->@*) { foreach my $white ($self->{$channel}->{whites}->@*) {
for (my $i = 0; $i < @guess; $i++) { for (my $i = 0; $i < @guess; $i++) {
if ($guess[$i] eq $white->[$i]) { if ($guess[$i] eq $white->[$i]) {
$self->{$channel}->{invalid_count}++;
return "Hard mode is enabled. Position " . ($i + 1) . " can't be $guess[$i]. Try again."; return "Hard mode is enabled. Position " . ($i + 1) . " can't be $guess[$i]. Try again.";
} }
@ -558,12 +566,14 @@ sub guess_wordle($self, $channel, $guess) {
foreach my $c (keys %count) { foreach my $c (keys %count) {
if ($self->{$channel}->{letter_max}->{$c} && $count{$c} > $self->{$channel}->{letter_max}->{$c}) { if ($self->{$channel}->{letter_max}->{$c} && $count{$c} > $self->{$channel}->{letter_max}->{$c}) {
$self->{$channel}->{invalid_count}++;
return "Hard mode is enabled. There can't be more than $self->{$channel}->{letter_max}->{$c} $c. Try again."; return "Hard mode is enabled. There can't be more than $self->{$channel}->{letter_max}->{$c} $c. Try again.";
} }
} }
} }
if (not exists $self->{$channel}->{guesslist}->{$guess}) { if (not exists $self->{$channel}->{guesslist}->{$guess}) {
$self->{$channel}->{nonword_count}++;
return "I don't know that word. Try again."; return "I don't know that word. Try again.";
} }
@ -633,8 +643,28 @@ sub guess_wordle($self, $channel, $guess) {
if ($correct == length $guess) { if ($correct == length $guess) {
$self->{$channel}->{correct} = 1; $self->{$channel}->{correct} = 1;
my $guesses = $self->{$channel}->{guess_count}; my $guesses = $self->{$channel}->{guess_count};
return $self->show_wordle($channel) . " Correct in $guesses guess" . ($guesses != 1 ? 'es! ' : '! '); $guesses = " Correct in $guesses guess" . ($guesses != 1 ? 'es! ' : '! ');
my $nonwords = $self->{$channel}->{nonword_count};
my $invalids = $self->{$channel}->{invalid_count};
if ($nonwords || $invalids) {
$guesses .= '(';
if ($nonwords) {
$guesses .= "$nonwords nonword";
$guesses .= '; ' if $invalids;
}
if ($invalids) {
$guesses .= "$invalids invalid";
}
$guesses .= ') ';
}
return $self->show_wordle($channel) . $guesses;
} else { } else {
return $self->show_wordle($channel, 1); return $self->show_wordle($channel, 1);
} }

View File

@ -25,8 +25,8 @@ use PBot::Imports;
# These are set by the /misc/update_version script # These are set by the /misc/update_version script
use constant { use constant {
BUILD_NAME => "PBot", BUILD_NAME => "PBot",
BUILD_REVISION => 4869, BUILD_REVISION => 4871,
BUILD_DATE => "2025-07-02", BUILD_DATE => "2025-07-08",
}; };
sub initialize {} sub initialize {}