3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-22 11:59:43 +01:00

Plugin/WordMorph: allow hinting from right-hand side

This commit is contained in:
Pragmatic Software 2022-08-31 18:27:31 -07:00
parent bc02854d15
commit 3c28dd046a
2 changed files with 71 additions and 30 deletions

View File

@ -35,7 +35,7 @@ sub unload {
} }
use constant { use constant {
USAGE => 'Usage: wordmorph start [steps to solve [word length]] | custom <word1> <word2> | solve <solution> | show | hint | giveup', USAGE => 'Usage: wordmorph start [steps to solve [word length]] | custom <word1> <word2> | solve <solution> | show | hint [from direction] | giveup',
NO_MORPH_AVAILABLE => "There is no word morph available. Use `wordmorph start [steps to solve [word length]]` to create one.", NO_MORPH_AVAILABLE => "There is no word morph available. Use `wordmorph start [steps to solve [word length]]` to create one.",
DB_UNAVAILABLE => "Word morph database not available.", DB_UNAVAILABLE => "Word morph database not available.",
}; };
@ -59,42 +59,82 @@ sub wordmorph {
return NO_MORPH_AVAILABLE; return NO_MORPH_AVAILABLE;
} }
$self->{$channel}->{hint}++; if (@args > 1) {
return 'Usage: wordmorph hint [from direction]; from direction can be `left` or `right`';
}
if ($self->{$channel}->{hint} > @{$self->{$channel}->{morph}} - 2) { my $direction;
$self->{$channel}->{hint} = @{$self->{$channel}->{morph}} - 2;
if (@args == 0) {
$direction = 1;
} elsif ($args[0] eq 'left' || $args[0] eq 'l') {
$direction = 1;
} elsif ($args[0] eq 'right' || $args[0] eq 'r') {
$direction = -1;
} else {
return "Unknown direction `$args[0]`; usage: wordmorph hint [from direction]; from direction can be `left` or `right`";
}
if ($direction == 1) {
$self->{$channel}->{hintL}++;
if ($self->{$channel}->{hintL} > $#{$self->{$channel}->{morph}}) {
$self->{$channel}->{hintL} = $#{$self->{$channel}->{morph}};
}
} else {
$self->{$channel}->{hintR}--;
if ($self->{$channel}->{hintR} < 0) {
$self->{$channel}->{hintR} = 0;
}
} }
my @hints; my @hints;
for (my $i = 0; $i < $self->{$channel}->{hint}; $i++) { my $size = @{$self->{$channel}->{morph}};
$hints[0] = $self->{$channel}->{morph}->[0];
$hints[$size - 1] = $self->{$channel}->{morph}->[$size - 1];
for (my $i = 1; $i < $self->{$channel}->{hintL}; $i++) {
my $hint = ''; my $hint = '';
if ($i > 0) { my $word1 = $self->{$channel}->{morph}->[$i - 1];
my $word1 = $self->{$channel}->{morph}->[$i - 1]; my $word2 = $self->{$channel}->{morph}->[$i];
my $word2 = $self->{$channel}->{morph}->[$i];
for (0 .. length $word1) { for (0 .. length $word1) {
if (substr($word1, $_, 1) eq substr($word2, $_, 1)) { if (substr($word1, $_, 1) eq substr($word2, $_, 1)) {
$hint .= substr($word1, $_, 1); $hint .= substr($word1, $_, 1);
} else { } else {
$hint .= "?"; $hint .= "?";
}
} }
} else {
$hint = $self->{$channel}->{morph}->[$i];
} }
push @hints, $hint; $hints[$i] = $hint;
} }
my $hint = '_' x length $self->{$channel}->{morph}->[0]; my $blank_hint = '_' x length $self->{$channel}->{morph}->[0];
for (my $i = $self->{$channel}->{hint}; $i < @{$self->{$channel}->{morph}} - 1; $i++) { for (my $i = $self->{$channel}->{hintL}; $i < $self->{$channel}->{hintR} + 1; $i++) {
push @hints, $hint; $hints[$i] = $blank_hint;
} }
push @hints, $self->{$channel}->{morph}->[@{$self->{$channel}->{morph}} -1]; for (my $i = $#{$self->{$channel}->{morph}} - 1; $i > $self->{$channel}->{hintR}; $i--) {
my $hint = '';
my $word1 = $self->{$channel}->{morph}->[$i];
my $word2 = $self->{$channel}->{morph}->[$i + 1];
for (0 .. length $word1) {
if (substr($word1, $_, 1) eq substr($word2, $_, 1)) {
$hint .= substr($word1, $_, 1);
} else {
$hint .= "?";
}
}
$hints[$i] = $hint;
}
return "Hint: " . join(' > ', @hints); return "Hint: " . join(' > ', @hints);
} }
@ -194,10 +234,7 @@ sub wordmorph {
push @solution, $self->{$channel}->{word2}; push @solution, $self->{$channel}->{word2};
} }
my $i = 0; my $last_word = $solution[0];
my $last_word = $solution[$i];
my $word;
return DB_UNAVAILABLE if not $self->{db}; return DB_UNAVAILABLE if not $self->{db};
@ -205,14 +242,17 @@ sub wordmorph {
return "I do not know this word `$last_word`."; return "I do not know this word `$last_word`.";
} }
for ($i = 1; $i < @solution; $i++) { my $length = length $last_word;
my $word;
for (my $i = 1; $i < @solution; $i++) {
$word = $solution[$i]; $word = $solution[$i];
if (not exists $self->{db}->{length $word}->{$word}) { if (not exists $self->{db}->{length $word}->{$word}) {
return "I do not know this word `$word`."; return "I do not know this word `$word`.";
} }
if (distance($word, $last_word) != 1 || length($word) != length($last_word)) { if (distance($word, $last_word) != 1 || length($word) != $length) {
return "Wrong. `$word` does not follow from `$last_word`."; return "Wrong. `$word` does not follow from `$last_word`.";
} }
@ -265,7 +305,8 @@ sub set_up_new_morph {
my ($self, $channel) = @_; my ($self, $channel) = @_;
$self->{$channel}->{word1} = $self->{$channel}->{morph}->[0]; $self->{$channel}->{word1} = $self->{$channel}->{morph}->[0];
$self->{$channel}->{word2} = $self->{$channel}->{morph}->[$#{$self->{$channel}->{morph}}]; $self->{$channel}->{word2} = $self->{$channel}->{morph}->[$#{$self->{$channel}->{morph}}];
$self->{$channel}->{hint} = 1; $self->{$channel}->{hintL} = 1;
$self->{$channel}->{hintR} = $#{$self->{$channel}->{morph}} - 1;
} }
sub make_morph_by_steps { sub make_morph_by_steps {

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 => 4577, BUILD_REVISION => 4578,
BUILD_DATE => "2022-08-26", BUILD_DATE => "2022-08-31",
}; };
sub initialize {} sub initialize {}