携帯電話のキーボード入力


17

携帯電話のキーボード入力

この質問はしばらく前に尋ねられましたが、仕様が悪いため終了しました。だから、私はそれをより良い仕様でやり直しています。この質問は関連していますが、反対の方向に進みます。

T9が登場する前に、テキストメッセージに文字を入力するには、数字キーの1つを何度か押して、目的の文字を取得する必要がありました。参考のために、標準のマッピングを次に示します。

+-------+-------+-------+
|   1   |   2   |   3   |
|  .?!1 |  ABC2 |  DEF3 |
+-------+-------+-------+
|   4   |   5   |   6   |
|  GHI4 |  JKL5 |  MNO6 |
+-------+-------+-------+
|   7   |   8   |   9   |
| PQRS7 |  TUV8 | WXYZ9 |
+-------+-------+-------+
|   *   |   0   |   #   |
|   ←   |SPACE 0|   →   |
+-------+-------+-------+

*バックスペース、0スペース(' ')または数字0#、現在の文字を確認します。簡単にするために、すべての文字は大文字です。

あなたは、そのキーのための可能な文字によってキーを複数回、選択した文字のサイクルを押すと:2 -> A22 -> B222 -> C2222 -> 222222 -> A、など。*オプションが1つしかないため、繰り返し押すと複数のバックスペースが入力されることに注意してください。#連続して複数回押しても効果はありません。末尾#は不要です。

さらに、キーを押した直後に別のキーを押すと、前のキー押下が自動的に確認されます。したがって、223機能的にはと同じです22#3

あなたの課題は、一連のキー押下を携帯電話が表示する対応する文字列に変換することです。

8#99999#055#33#999#22#666#2#777#3#1 -> T9 KEYBOARD
4433555#55566609666666677755533*3111 -> HELLO WORLD!
7##222#222**7#222#4 -> PPCG
00#0#00 -> 0 0

ルール

  • これはなので、最短の正しいソリューション(バイト単位)が勝ちます
  • 勝利の答えは一週間で選ばれます
  • 標準的な抜け穴は禁止されています
  • あなたの答えは、完全なプログラム、名前付き関数、または匿名関数の形式であり、標準的な方法のいずれかで入力を取得し、出力を生成します

リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からリーダーボードを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、スニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
どのように数字を生成しますか?例では番号「9」がありますが、仕様(2 -> A22 -> B...、2222 -> A....)で番号を生成することはできません。
C.クイリー

1
@ C.Quilleyそれは私が盲目的にその図をコピーすることで得られるもので、現在修正されています。
メゴ


1
@AlexA。だまされていない、それはT9辞書検索ではなく、標準の電話テンキー入力です。
メゴ

回答:


3

K5、112バイト

{(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)[.*x]20!#1_x}'(){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}

これは本当に混乱ですが、ゴルフをするのにかなりのスペースがあると思います。

最初に、キーマップのルックアップテーブルを作成する必要があります。2、4、5文字がマッピングされたキーがあるため、すべてのエントリを20にパディングすると、後でこのテーブルに周期的にインデックスを付けるプロセスが簡単になります。

  (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
(" 0 0 0 0 0 0 0 0 0 0"
 ".?!1.?!1.?!1.?!1.?!1"
 "ABC2ABC2ABC2ABC2ABC2"
 "DEF3DEF3DEF3DEF3DEF3"
 "GHI4GHI4GHI4GHI4GHI4"
 "JKL5JKL5JKL5JKL5JKL5"
 "MNO6MNO6MNO6MNO6MNO6"
 "PQRS7PQRS7PQRS7PQRS7"
 "TUV8TUV8TUV8TUV8TUV8"
 "WXYZ9WXYZ9WXYZ9WXYZ9")

次に、入力を実行に分割します。

 {(&~0=':x)_x}"8#99999#055#33#999"
(,"8"
 ,"#"
 "99999"
 ,"#"
 ,"0"
 "55"
 ,"#"
 "33"
 ,"#"
 "999")

*に遭遇するたびに#実行をドロップし、後続の実行を削除します

  (){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}"8#99999#055#33#999"
(,"8"
 "99999"
 ,"0"
 "55"
 "33"
 "999")

そして、各実行の長さと最初の要素に基づいて、そのルックアップテーブルに単純にインデックスを作成する準備ができました。

すべて一緒に:

  {(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)[.*x]20!#1_x}'(){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}"4433555#55566609666666677755533*3111"
"HELLO WORLD!"

編集:

5バイト節約:

0 3 6 9 12 15 19 22
((3*!6),19 22)

あなたは短縮することができます(20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
kirbyfan64sos

ええ、私は実際に数分前にそれを見つけました。
JohnE

3

Python 2、230 206バイト

import re
f=lambda a,b=dict(zip("0123456789*#"," 0~.?!1~ABC2~DEF3~GHI4~JKL5~MNO6~PQRS7~TUV8~WXYZ9~\b~".split("~"))):"".join([j and b[j][(len(i)-1)%len(b[j])]or b[i]for i,j in re.findall(r"((\d)\2*|.)",a)])

これは、引数としてキー押下の文字列を受け取り、携帯電話が表示する対応する文字列を返す関数fを作成します。また、キーを対応する文字にマッピングする辞書としてオプションの2番目の引数を使用することもあります(例:{"0": "0"、 "1": "。?!1"、...})

最初に、キー入力の文字列は、繰り返し文字によってグループ化されます(例:["8"、 "#"、 "99999"、 "#"、...])。次に、各グループの最初の文字が、2番目の引数として渡される辞書にマップされます。たとえば、9WXYZ9にマップされます。最後に、グループの長さがディクショナリからの値のオフセットとして使用されます。

キーを押すと循環する可能性があるため、オフセットは繰り返し文字のグループの長さにモジュロを使用する必要があることに注意してください。また、99#999999と同じではないため、文字は\ 0にマップされ、最後でのみ削除されることに注意してください。

以下は、質問の各例の関数の出力です。

>>> print f("8#99999#055#33#999#22#666#2#777#3#1")
T9 KEYBOARD.
>>> print f("4433555#55566609666666677755533*3111")
HELLO WORLD!
>>> print f("7##222#222**7#222#4")
PPCG
>>> print f("00#0#00")
0 0

3

JavaScriptの、214の 184 168 162バイト

x=>(x.match(/(.)\1*/g,f='').map(a=>f=(l=a.length,v=' 0#.?!1#ABC2#DEF3#GHI4#JKL5#MNO6#PQRS7#TUV8#WXYZ9'.split`#`[a[0]])?f+v[--l%v.length]:a<'*'?f:f.slice(0,-l)),f)

これはおそらく少し小さくすることができますが、結果にはかなり満足しています。文字を1つ以上の繰り返しグループに分割し、配列をステップスルーして、各文字をハッシュ内の値にマッピングし、最終文字列に追加します。任意の数の「#」に遭遇した場合、それは無視されます。「*」に遭遇すると、最終文字列の末尾からその数を削除します。


0

Python 2、237バイト

cr3の辞書を使用しますが、再作成はしません。

def f(i):
 d=dict(zip("0123456789"," 0|.?!1|ABC2|DEF3|GHI4|JKL5|MNO6|PQRS7|TUV8|WXYZ9".split("|")))
 s,x,j='',i[0],0
 for c in i[1:]+'#':
  if c==x:j+=1
  else:
   if x>'/':s+=d[x][j%len(d[x])]
   j=0
  if c=='*':s=s[:-1]
  x=c
 return s

-1

Python 2、265バイト

長すぎます。IO:標準入力、標準出力。

a=reduce(lambda q,w:q+" "+[w,""][w=="#"]if q[-1]!=w else q+w,raw_input()).split()
while "*" in a:del a[a.index("*")-1:a.index("*")+1]
print"".join([(lambda a:a[len(q)%len(a)-1])(" 0:.?!1:ABC2:DEF3:GHI4:JKL5:MNO6:PQRS7:TUV8:WXYZ9".split(":")[int(q[0])])for q in a])

3番目の例、7 ## 222#222 ** 7#222#4により、スクリプトはValueErrorを発生させます:int()の基数10: '*'の無効なリテラル。
cr3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.