我能知道您的电话号码吗?

作者: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 文件夹中。如果文件位于任何其他文件夹中,则在我们测试您的脚本时,它很可能会失败。

http://web.archive.org/web/20080321224441/http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/aevent1.mspx

源代码:event001-eric256.pl

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};
    }
}