Mecanografía del teclado del teléfono celular


17

Mecanografía del teclado del teléfono celular

Esta pregunta se hizo hace un tiempo, pero se cerró debido a malas especificaciones. Entonces, lo estoy rehaciendo, con mejores especificaciones. Esta pregunta está relacionada, pero va en la dirección opuesta.

Antes de que apareciera T9, para escribir un carácter en un mensaje de texto, tenía que presionar una de las teclas numéricas varias veces para obtener el carácter que deseaba. Como referencia, aquí está el mapeo estándar:

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

*es retroceso, 0es un espacio ( ' ') o el número 0y #confirma el carácter actual. En aras de la simplicidad, todos los caracteres son mayúsculas.

Cuando se pulsa una tecla varias veces, los ciclos de caracteres seleccionados a través de los caracteres posibles para esa tecla: 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> A, y así sucesivamente. Tenga en cuenta que, dado que *solo tiene una opción, al presionarla repetidamente se ingresan múltiples espacios de retroceso. Presionar #varias veces seguidas no tiene ningún efecto. Un seguimiento #es innecesario.

Además, si se presiona una tecla diferente inmediatamente después de presionar una tecla, la pulsación de tecla anterior se confirma automáticamente. Por lo tanto, 223es funcionalmente idéntico a 22#3.

Su desafío es traducir una serie de pulsaciones de teclas en la cadena correspondiente que mostraría un teléfono celular.

Ejemplos

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

Reglas

  • Este es el , por lo que gana la solución correcta más corta (en bytes)
  • La respuesta ganadora se elegirá en una semana.
  • Las lagunas estándar están prohibidas
  • Su respuesta puede ser en forma de un programa completo, una función con nombre o una función anónima, tomando entrada y produciendo salida en uno de los métodos estándar

Tabla de clasificación

El Fragmento de pila al final de esta publicación genera la tabla de clasificación a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

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


1
¿Cómo se producen los números? Tiene el número '9' en un ejemplo, pero su especificación ( 2 -> A, 22 -> B..., 2222 -> A....) no permite que se produzca ningún número.
C. Quilley

1
@ C.Quilley Eso es lo que obtengo por copiar ciegamente ese diagrama, arreglado ahora.
Mego


1
@AlexA. No es un engaño, es una entrada de teclado numérico estándar, no una búsqueda de diccionario T9.
Mego

Respuestas:


3

K5, 112 bytes

{(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}

Este es realmente un desastre, pero creo que hay bastante espacio para jugar golf.

Primero necesitamos construir una tabla de búsqueda para el mapa de teclas. Hay teclas con 2, 4 y 5 caracteres asignados a ellas, por lo que rellenar cada entrada a 20 simplifica el proceso de indexación cíclica de esta tabla más adelante:

  (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")

Luego dividí la entrada en carreras:

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

Suelte cualquier # ejecución y elimine las ejecuciones finales cada vez que encuentre un *:

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

Y luego estoy listo para simplemente indexar en esa tabla de búsqueda en función de la longitud y el primer elemento de cada ejecución.

Todos juntos:

  {(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!"

Editar:

Ahorre 5 bytes:

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

Puedes acortar (20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)a (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10).
kirbyfan64sos

Sí, en realidad lo encontré hace unos minutos.
JohnE

3

Python 2, 230 206 bytes

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

Éste crea una función f que toma una cadena de pulsaciones de teclas como argumento y devuelve la cadena correspondiente que mostrará un teléfono celular. También sucede que toma un segundo argumento opcional como teclas de asignación de diccionario a sus caracteres correspondientes, por ejemplo, {"0": "0", "1": ".?! 1", ...} .

Primero, la cadena de pulsaciones de teclas se agrupa por caracteres repetidos, por ejemplo, ["8", "#", "99999", "#", ...] . Luego, el primer carácter de cada grupo se asigna en el diccionario pasado como segundo argumento, por ejemplo, 9 asigna a WXYZ9 . Finalmente, la longitud del grupo se usa como compensación en el valor del diccionario.

Tenga en cuenta que el desplazamiento debe usar un módulo en la longitud del grupo de caracteres repetidos porque las pulsaciones de teclas pueden alternar. También tenga en cuenta que el carácter # se asigna a \ 0 y solo se elimina al final porque 99 # 99 no es lo mismo que 9999 .

Aquí está el resultado de la función para cada uno de los ejemplos en la pregunta:

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

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)

Esto probablemente se puede hacer un poco más pequeño, pero estoy bastante contento con el resultado. Divide los caracteres en grupos repetidos de uno o más, luego avanza por la matriz, asigna cada carácter a su valor en el hash y lo agrega a la cadena final. Si se encuentra con cualquier número de '#', lo ignora. Si se encuentra con un '*', elimina ese número del final de la cadena final.


0

Python 2, 237 bytes

Usando el diccionario de cr3, pero sin 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

Python 2, 265 bytes

Es muy largo 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])

El tercer ejemplo, 7 ## 222 # 222 ** 7 # 222 # 4 , hará que su script genere un ValueError : literal no válido para int () con base 10: '*'.
cr3
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.