2014-07-28 06:29:05 +02:00
|
|
|
#!/usr/bin/env perl
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
use Text::Levenshtein qw(fastdistance);
|
|
|
|
|
|
|
|
my $CJEOPARDY_DATA = 'cjeopardy.dat';
|
2014-07-29 19:30:12 +02:00
|
|
|
my $CJEOPARDY_HINT = 'cjeopardy.hint';
|
2014-07-28 06:29:05 +02:00
|
|
|
|
2014-08-04 00:20:54 +02:00
|
|
|
my $hint_only_mode = 0;
|
|
|
|
|
2014-07-28 06:29:05 +02:00
|
|
|
my $channel = shift @ARGV;
|
|
|
|
my $text = join(' ', @ARGV);
|
|
|
|
|
|
|
|
sub encode { my $str = shift; $str =~ s/\\(.)/{sprintf "\\%03d", ord($1)}/ge; return $str; }
|
|
|
|
sub decode { my $str = shift; $str =~ s/\\(\d{3})/{"\\" . chr($1)}/ge; return $str }
|
|
|
|
|
|
|
|
if ($channel !~ /^#/) {
|
|
|
|
print "Sorry, C Jeopardy must be played in a channel.\n";
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
2014-08-04 02:35:41 +02:00
|
|
|
$text =~ s/^\s*is\s+//i;
|
|
|
|
$text =~ s/^\s*are\s+//i;
|
2014-08-04 00:20:54 +02:00
|
|
|
$text =~ s/^(a|an)\s+//i;
|
2014-07-29 19:30:12 +02:00
|
|
|
$text =~ s/\s*\?*$//;
|
|
|
|
$text =~ s/^\s+//;
|
|
|
|
$text =~ s/\s+$//;
|
2014-08-04 00:20:54 +02:00
|
|
|
my $lctext = lc $text;
|
2014-07-29 19:30:12 +02:00
|
|
|
|
2014-08-04 00:20:54 +02:00
|
|
|
if (not length $lctext) {
|
2014-07-29 19:30:12 +02:00
|
|
|
print "What?\n";
|
|
|
|
exit;
|
|
|
|
}
|
2014-07-28 06:29:05 +02:00
|
|
|
|
|
|
|
my @data;
|
|
|
|
open my $fh, "<", "$CJEOPARDY_DATA-$channel" or print "There is no open C Jeopardy question. Use `cjeopardy` to get a question.\n" and exit;
|
|
|
|
@data = <$fh>;
|
|
|
|
close $fh;
|
|
|
|
|
2014-07-29 21:00:06 +02:00
|
|
|
my @valid_answers = map { decode $_ } split /\|/, encode $data[1];
|
2014-07-28 06:29:05 +02:00
|
|
|
|
|
|
|
foreach my $answer (@valid_answers) {
|
|
|
|
chomp $answer;
|
|
|
|
$answer =~ s/\\\|/|/g;
|
|
|
|
|
2014-08-04 00:20:54 +02:00
|
|
|
my $supplemental_text;
|
|
|
|
if ($answer =~ s/\s*{(.*)}\s*$//) {
|
|
|
|
$supplemental_text = $1;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $distance = fastdistance($lctext, lc $answer);
|
|
|
|
my $length = (length($lctext) > length($answer)) ? length $lctext : length $answer;
|
2014-07-28 06:29:05 +02:00
|
|
|
|
2014-07-29 19:30:12 +02:00
|
|
|
if ($distance / $length < 0.15) {
|
2014-07-28 06:29:05 +02:00
|
|
|
if ($distance == 0) {
|
2014-08-04 00:20:54 +02:00
|
|
|
print "'$answer' is correct!";
|
|
|
|
} else {
|
|
|
|
print "'$text' is close enough to '$answer'. You are correct!"
|
|
|
|
}
|
|
|
|
|
|
|
|
if (defined $supplemental_text) {
|
|
|
|
print " $supplemental_text\n";
|
2014-07-28 06:29:05 +02:00
|
|
|
} else {
|
2014-08-04 00:20:54 +02:00
|
|
|
print "\n";
|
2014-07-28 06:29:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
unlink "$CJEOPARDY_DATA-$channel";
|
2014-07-29 19:30:12 +02:00
|
|
|
unlink "$CJEOPARDY_HINT-$channel";
|
2014-07-28 06:29:05 +02:00
|
|
|
|
|
|
|
if ($channel eq '#cjeopardy') {
|
|
|
|
my $question = `./cjeopardy.pl $channel`;
|
2014-08-04 00:20:54 +02:00
|
|
|
|
|
|
|
if ($hint_only_mode) {
|
|
|
|
my $hint = `./cjeopardy_hint.pl $channel`;
|
|
|
|
$hint =~ s/^Hint: //;
|
|
|
|
print "Next hint: $hint\n";
|
|
|
|
} else {
|
|
|
|
print "Next question: $question\n";
|
|
|
|
}
|
2014-07-28 06:29:05 +02:00
|
|
|
}
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
print "Sorry, '$text' is incorrect.\n";
|