这个问题要求提供一个T9字典匹配功能,这是一个非常有趣的问题。但是T9还有另一种打字方法,那就是逐字打字.您不需要字典来实现这个键盘。
这是T9键盘的键映射,如果您忘记了的话:
+-------+-------+-------+
| 1 | 2 | 3 |
| .?! | ABC | DEF |
+-------+-------+-------+
| 4 | 5 | 6 |
| GHI | JKL | MNO |
+-------+-------+-------+
| 7 | 8 | 9 |
| PQRS | TUV | WXYZ |
+-------+-------+-------+
| * | 0 | # |
| ← | SPACE | → |
+-------+-------+-------+若要使用T9键入字符,需要按表示该字符n时间的数字键。n是写在那个键上的字符的顺序。数字是您可以为每个键键入的最后一个字符。例如,要键入B,我按2两次,或者键入5,按四次5。要完成这个字符的键入,我按#键。*只是一个简单的后退空间。在我们的键盘版本中没有大写。
8#99999#055#33#999#22#666#2#777#3# → T9 KEYBOARD解释:
8选择T和#移动到下一个字符99999选择9键的最后一个字符,即9和#移动到下一个字符0插入一个空格33选择3键的第二个字符,即K和#移动到下一个字符。您的函数或程序应该接受一个表示T9键的字符串。输出是这些按键产生的文本,如上文所述。
这是基本的代码高尔夫,所以赢家是最短的字节,并适用标准规则/漏洞。
发布于 2014-12-18 08:12:57
{split(".?!1-ABC2-DEF3-GHI4-JKL5-MNO6-PQRS7-TUV8-WXYZ9- 0",k,"-");split($0"#",a,"");while(1+(b=a[++i])){if(b==p)++c;else{for(g in k)if(p==substr(k[g],l=length(k[g])))printf(substr(k[g],1+((c-1)%l),1));c=1;p=b}}}这是一个完整的程序,从stdin读取输入。不为每一行重新分配键盘将更有效,但它会使脚本更长。
另外,如果" 0“键是0以外的任何东西,脚本将比0短4个字节,但这是游戏的一部分:o)
发布于 2015-10-26 21:20:03
#define M "8#44#33#0#999#*77#88#444#222#55#0#22#777#666#9#66#0#333#666#99#0#5#88#6#7#7777#0#666#888#33#777#0#8#44#33#0#555#2#99#*9999#999#0#3#666#4#111#"
#include<stdio.h>
char K[][4]={" ",".?!","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"},I[]=M;int
i,j,k,r;main(){for(;I[i];++i){if(I[i]=='#')I[j++]=K[k][--r],r=k=0;else
if(I[i]=='*')j?--j:0;else if(!r++)k=I[i]-'0';}I[j]=0;printf("%s\n",I);}THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG!字节计数不包括在第一个#define中给定的输入字符串。
我使用一个二维数组作为查找表来打印什么字符.程序读取由'#'分隔的字符。
对于每个组,输入数决定一维数组索引,输入数的重复次数决定二维数组索引。'*'将输出字符串的数组索引向后移动,以便覆盖前一个字母。
因此,将输入字符串44# ('4'的1次重复)转换为查找表K[4][1],即字符H。
#define INPUT "8#44#33#0#999#*77#88#444#222#55#0#22#777#666#9#66#0#333#666#99#0#5#88#6#7#7777#0#666#888#33#777#0#8#44#33#0#555#2#99#*9999#999#0#3#666#4#"
#include<stdio.h>
static const char keyboard[10][4] = {" ", ".?!", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"};
int main(void)
{
char input[] = INPUT;
char output[256];
int i, j;
int key = 0;
int reps = 0;
for (i = j = 0; input[i] != '\0'; ++i) {
switch (input[i]) {
case '#':
output[j] = keyboard[key][reps - 1];
++j;
reps = key = 0;
break;
case '*':
if (j > 0) --j;
break;
default:
if (reps == 0) {
key = (int)input[i] - '0';
}
++reps;
break;
}
}
output[j] = '\0';
printf("%s\n", output);
return(0);
}发布于 2016-09-15 03:42:14
t=i=>i.match(/(\d)\1*|\*/g).map(w=>(" 0~.?!1~ABC2~DEF3~GHI4~JKL5~MNO6~PQRS7~TUV8~WXYZ9".split`~`[w[0]]||"*")[w.length-1]).join``.replace(/.\*/g,"")t=i=>i
.match(/(\d)\1*|\*/g) // split input to streaks of equal numbers and single `*`
.map(w=> // replace each item with ...
// .. take string depending on the digit
(" 0~.?!1~ABC2~DEF3~GHI4~JKL5~MNO6~PQRS7~TUV8~WXYZ9".split`~`[w[0]]
||"*") // .. ("*" for not a digit)
[w.length-1] // -> the (item length)th character of that string
)
.join`` // join without delimiter
.replace(/.\*/g,"") // and recursively remove every (letter,asterisk) combination添加了s=来记住字符串,%s.length添加了旋转。
t=i=>i.match(/(\d)\1*|\*/g).map(w=>(s=" 0~.?!1~ABC2~DEF3~GHI4~JKL5~MNO6~PQRS7~TUV8~WXYZ9".split`~`[w[0]]||"*")[w.length%s.length-1]).join``.replace(/.\*/g,"")https://codegolf.stackexchange.com/questions/42465
复制相似问题