我能知道您的电话号码吗?
作者:Eric Hodges
在“我能知道您的电话号码吗?”比赛中,参赛者会获得一个电话号码,然后使用标准电话拨号盘上的字母,构造一个单词,其中字母对应于电话号码中的数字。
活动场景
您可能知道,电话号码可能很难记住;这就是为什么许多公司和组织使用助记符(例如首字母缩略词和 jingle)来使他们的电话号码更容易记住。
那是什么?我们可以举一个助记符的例子吗?当然可以。例如,假设脚本专家组的电话号码是 727-4787。这很难记住;因此,脚本专家组可能会告诉人们拨打 SCRIPTS。单词 SCRIPTS(其中单词中的字母对应于电话号码中的数字)是一个助记符:它使您更容易记住某些内容。
问得好:您如何从 727-4787 这样的电话号码中获得 SCRIPTS?好吧,在标准电话拨号盘上,除了数字值之外,数字 2 到 9 还被分配了字母值
| 数字 | 字母值 |
|---|---|
| 2 | A B C |
| 3 | D E F |
| 4 | G H I |
| 5 | J K L |
| 6 | M N O |
| 7 | P R S |
| 8 | T U V |
| 9 | W X Y |
正是这些对应的字母值使我们能够从电话号码 727-4787 中得出单词 SCRIPTS
| 7 | S |
| 2 | C |
| 7 | R |
| 4 | I |
| 7 | P |
| 8 | T |
| 7 | S |
这很酷;SCRIPTS 比 727-4787 更容易记住。另一方面,尝试找出可以从给定电话号码中组成哪个单词(如果有的话)有点挑战性。真正酷的是可以将电话号码转换为单词的脚本。
现在,试着猜猜你需要为高级组的事件 1 做些什么。
猜对了。您在事件 1 中的任务是:给定一个七位数的电话号码(例如,732-3464),创建一个与这些数字相对应的七个字母的单词。请记住,您只能使用与每个数字对应的三个字母值。例如,您为 732-3464 创建的单词必须以字母 P、R 或 S 开头。为什么?因为电话号码以数字 7 开头,并且在标准电话拨号盘上,这三个字母是唯一与数字 7 关联的字母。如果您想知道,732-3464 的一个可能解决方案是单词 READING
| 7 | 3 | 2 | 3 | 4 | 6 | 4 |
|---|---|---|---|---|---|---|
| R | E | A | D | I | N | G |
要获得此事件的积分,您必须想出一个七个字母的单词;七个字母的任何其他用途(例如,一个四个字母的单词加上一个三个字母的单词)将不被接受。此外,该词必须出现在文件 WordList.txt 中,这是一个官方单词列表,作为脚本游戏竞争对手包的一部分包含在内。最重要的是,请记住:1) 尽管给定的电话号码可能有多个解决方案,但您的脚本应该只显示一个解决方案;2) 脚本应该只显示正确的解决方案。请不要显示所有可能的解决方案;例如,不要这样做
PDBEGMH READING SFCFHOI
如果您这样做,我们将不得不取消您的参赛资格。相反,只显示一个正确的解决方案,如下所示
READING
您的脚本必须提示用户输入电话号码(通过命令行或使用输入框)。测试脚本时,输入电话号码时不带连字符;因此,数字 732-3464 实际上将像这样输入到程序中
7323464
换句话说,您不需要编写代码来删除电话号码中的连字符;电话号码中永远不会出现连字符。哦,当您的脚本从 WordList.txt 文件读取数据时(相信我们:您的脚本需要这样做),请确保此文件位于 C:\Scripts 文件夹中。如果文件位于任何其他文件夹中,则在我们测试您的脚本时,它很可能会失败。
use v6;
sub MAIN(Bool :$verbose = False) {
my $input-file = $*SPEC.catdir($*PROGRAM-NAME.IO.dirname, "wordlist.txt");
my %dict = (($input-file.IO.lines.grep: {.chars == 7}) X 1).flat;
my %digits = (
2 => (<a b c>),
3 => (<d e f>),
4 => (<g h i>),
5 => (<j k l>),
6 => (<m n o>),
7 => (<p r s>),
8 => (<t u v>),
9 => (<w x y>),
);
my $phone_number = 7323464;
my @test_words;
for $phone_number.comb {
say $_, "->", %digits{$_}.join('-') if $verbose;
if (@test_words.elems) {
my @values = %digits{$_}.values;
@test_words = @test_words X~ '' X~ @values;
}
else {
@test_words = %digits{$_}.values;
}
}
say "Comparing {@test_words.elems} words against a dictionary of {%dict.elems} entries"
if $verbose;
for @test_words -> $word {
$word.uc.say if defined %dict{$word};
}
}
Perl 6 示例