휴대폰 키보드 입력


17

휴대폰 키보드 입력

이 질문 은 잠시 후에 요청되었지만 사양이 좋지 않아 종료되었습니다. 더 나은 사양으로 다시 작성하고 있습니다. 이 질문 은 관련이 있지만 반대 방향으로 진행됩니다.

T9가 등장하기 전에 문자 메시지에 문자를 입력하려면 원하는 문자를 얻기 위해 숫자 키 중 하나를 여러 번 눌러야했습니다. 참고로 다음은 표준 매핑입니다.

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

*백 스페이스, 0공백 ( ' ') 또는 숫자 0이며 #현재 문자를 확인합니다. 간단하게하기 위해 모든 문자는 대문자입니다.

당신은 해당 키에 대한 가능한 문자를 통해 키를 여러 번, 선택한 문자 사이클을 누르면 : 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> A, 등. 이후, 그 주 *하나 개의 옵션이 있습니다, 반복해서 누르면 입력 할 수있는 여러 백 스페이스가 발생합니다. 한 #번에 여러 번 누르는 것은 효과가 없습니다. 후행 #은 불필요합니다.

또한 키를 누른 직후에 다른 키를 누르면 이전 키 누름이 자동으로 확인됩니다. 따라서 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

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

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


1
어떻게 숫자를 생산합니까? 예에서 숫자 '9'가 있지만 사양 ( 2 -> A, 22 -> B..., 2222 -> A....)으로 숫자를 생성 할 수 없습니다.
C. Quilley

1
@ C.Quilley 이제이 다이어그램을 맹목적으로 복사하여 수정했습니다.
Mego


1
@AlexA. 속임수가 아니라 표준 전화 번호 입력이며 T9 사전 조회가 아닙니다.
Mego

답변:


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

파이썬 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 를 작성합니다.이 함수 는 인수로 키 누름 문자열을 취해 휴대 전화가 표시 할 해당 문자열을 반환합니다. 또한 대응하는 문자에 키를 사전 맵핑하는 선택적 두 번째 인수를 사용합니다 (예 : { "0": "0", "1": ".?! 1", ...}) .

먼저 키 누르기 문자열은 반복되는 문자 (예 : [ "8", "#", "99999", "#", ...] )로 그룹화됩니다 . 그런 다음 각 그룹의 첫 번째 문자는 두 번째 인수로 전달 된 사전에 매핑됩니다 . 예를 들어 9WXYZ9에 매핑됩니다 . 마지막으로, 그룹의 길이는 사전 값에서 오프셋으로 사용됩니다.

키 누름이 순환 될 수 있으므로 오프셋은 반복 문자 그룹의 길이에 대해 모듈로를 사용해야합니다. 또한 # 문자는 \ 0에 매핑되며 99 # 999999 와 같지 않으므로 끝에서만 제거됩니다 .

다음은 질문의 각 예제에 대한 함수 출력입니다.

>>> 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

자바 스크립트, 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)

이것은 아마도 조금 작게 만들 수 있지만 결과에 매우 만족합니다. 문자를 하나 이상의 반복 된 그룹으로 분할 한 다음 배열을 단계별로 실행하여 각 문자를 해시의 값에 매핑하고 최종 문자열에 추가합니다. 숫자가 '#'에 이르면 무시합니다. '*'가 있으면 최종 문자열의 끝에서 해당 번호를 제거합니다.


0

파이썬 2, 237 바이트

cr3의 사전을 사용하지만 re는 사용하지 않습니다.

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

파이썬 2, 265 바이트

너무 길어요 IO : stdin, stdout.

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])

세 번째 예제 인 7 ## 222 # 222 ** 7 # 222 # 4 는 스크립트에서 밑이 10 인 '*'인 int ()에 대해 ValueError : invalid literal을 발생시킵니다.
cr3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.