首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个T9键盘

创建一个T9键盘
EN

Code Golf用户
提问于 2014-12-17 23:04:19
回答 3查看 6.9K关注 0票数 12

这个问题要求提供一个T9字典匹配功能,这是一个非常有趣的问题。但是T9还有另一种打字方法,那就是逐字打字.您不需要字典来实现这个键盘。

这是T9键盘的键映射,如果您忘记了的话:

代码语言:javascript
复制
+-------+-------+-------+
|   1   |   2   |   3   |
|  .?!  |  ABC  |  DEF  |
+-------+-------+-------+
|   4   |   5   |   6   |
|  GHI  |  JKL  |  MNO  |
+-------+-------+-------+
|   7   |   8   |   9   |
| PQRS  |  TUV  |  WXYZ |
+-------+-------+-------+
|   *   |   0   |   #   |
|   ←   | SPACE |   →   |
+-------+-------+-------+

T9如何工作

若要使用T9键入字符,需要按表示该字符n时间的数字键。n是写在那个键上的字符的顺序。数字是您可以为每个键键入的最后一个字符。例如,要键入B,我按2两次,或者键入5,按四次5。要完成这个字符的键入,我按#键。*只是一个简单的后退空间。在我们的键盘版本中没有大写。

输入和输出示例:

代码语言:javascript
复制
8#99999#055#33#999#22#666#2#777#3# → T9 KEYBOARD

解释:

  • 8选择T#移动到下一个字符
  • 99999选择9键的最后一个字符,即9#移动到下一个字符
  • 0插入一个空格
  • 33选择3键的第二个字符,即K#移动到下一个字符。
  • 等等..。

规则

您的函数或程序应该接受一个表示T9键的字符串。输出是这些按键产生的文本,如上文所述。

这是基本的代码高尔夫,所以赢家是最短的字节,并适用标准规则/漏洞。

EN

回答 3

Code Golf用户

发布于 2014-12-18 08:12:57

AWK 211个字节(带奖金)

代码语言:javascript
复制
{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)

票数 1
EN

Code Golf用户

发布于 2015-10-26 21:20:03

C (245个字节)

代码语言:javascript
复制
#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);}

输出

代码语言:javascript
复制
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG!

解释

字节计数不包括在第一个#define中给定的输入字符串。

我使用一个二维数组作为查找表来打印什么字符.程序读取由'#'分隔的字符。

对于每个组,输入数决定一维数组索引,输入数的重复次数决定二维数组索引。'*'将输出字符串的数组索引向后移动,以便覆盖前一个字母。

因此,将输入字符串44# ('4'的1次重复)转换为查找表K[4][1],即字符H

Ungolfed版本

代码语言:javascript
复制
#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);
}
票数 1
EN

Code Golf用户

发布于 2016-09-15 03:42:14

JavaScript,147个字节

康纳S回答我的回答的横梁固定下来,打了金牌。

代码语言:javascript
复制
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,"")

击穿

代码语言:javascript
复制
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

旋转版本,158个字节

添加了s=来记住字符串,%s.length添加了旋转。

代码语言:javascript
复制
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,"")
票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/42465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档