我能知道您的电话号码吗?
作者: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}; } }