今天的挑战是实现类似t9的功能。
您将实现一个只有2个参数的函数。
您将收到一个字符串形式的电话号码,以及一个带有单词列表的文本文件的内容(不要使用特定的换行符样式)。
您可以使用链接https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt来测试功能,或使用/usr/share/dict/words
(检查的文本文件的单词列表[关闭]更多信息)。
您可以假设您将始终收到至少两个数字。
给定数字,您将从单词列表中读取并返回以映射到这些单词的字母开头的单词。这意味着输入只能是2到9之间的数字。
如果收到无效的输入,则可以执行任何操作。
如果没有找到匹配的,你可以返回一个空列表,null
/ nil
或0
。
请记住,手机密钥已映射到它们的等效字符:
- 0和1无效
- 2个匹配项[abc]
- 3个符合的[def]
- 4场比赛[吉]
- 5个匹配项[jkl]
- 6场比赛[mno]
- 7个匹配项[pqrs]
- 8个匹配项
- 和9场比赛[wxyz]
例子:
f('52726')
//returns ["Japan","japan","Japanee","Japanese","Japanesque"...,"larbowlines"]
f('552')
//returns ["Kjeldahl","kjeldahlization","kjeldahlize"...,"Lleu","Llew"]
f('1234')
//makes demons fly out your nose or divide by 0
f('9999')
//returns ["Zyzzogeton"]
f('999999')
//returns [] or null/nil or 0
运行功能后,您可以按所需的任何方式打印它。
规则:
- 标准漏洞无效
- 您必须返回某些内容,即使它是
null
/ 如果您不返回任何内容,nil
Javascript也将返回undefined
,因此此规则。 - 您不能使用或重新实现其他人的答案,也不能复制我的实现。
- 对于Javascript,您可以假定浏览器已经打开,并且auto元素的
innerText
/textContent
将作为第二个参数传递 - 对于已编译的语言,不能将特殊参数传递给编译器
- 您可以通过编译器参数接收文件名
- 变量,宏,全局变量,常量,非标准类以及在函数内部传递其他值的所有排序将被视为无效。
- 在Javascript中,没有关键字的变量
var
会使您的代码无效 - 您的函数将被命名
f
- 您只能并且在函数上只有2个参数
- 尝试将代码保持在500秒以下。
- 您不必担心空格
- 您只能使用ASCII可打印字符。
例外是仅使用不可打印字符的语言(APL和空白是两个示例)。
得分:
- 赢得的最低字节数
- 您的答案中包含无效的ASCII可打印字符,将被视为使用UTF-32进行编码的答案。编码
异常会导致您的答案被字符计数。 - 只有函数体很重要,不要在函数体之外做其他任何事情
- 如果您根据邻域或最常见的单词建立预测系统,则可获得-30%的奖金
- 如果您只返回与第一个数字相对应的每个字母的前5个匹配项,则可获得-20%的奖金(例如:245将返回5个以'a'开头的单词,5个以'b'开头的单词和5个以'c'开头的单词)。
这是使用Javascript的实现示例:
function f(phone, words)
{
var keypad=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
var regex='';
for(var i=0,l=phone.length;i<l;i++)
{
regex+='['+keypad[phone[i]]+']';
}
var regexp=new RegExp('\\s('+regex+'[a-z]*)\\s','gi');
return words.match(regexp);
}
要运行它,请打开列表链接并运行,例如:
f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]
此示例已经过测试,并且可以在Windows 7 Home Edition 64位的Opera 12.17 64位下运行。