Esta pregunta solicita una funcionalidad de coincidencia de diccionario T9 que es un problema muy interesante. Pero T9 tiene otra forma de escribir y es escribir caracteres por caracteres. NO necesitaría un diccionario para implementar este teclado.
Aquí está el mapa de teclas de un teclado T9 si lo olvidó:
+-------+-------+-------+
| 1 | 2 | 3 |
| .?! | ABC | DEF |
+-------+-------+-------+
| 4 | 5 | 6 |
| GHI | JKL | MNO |
+-------+-------+-------+
| 7 | 8 | 9 |
| PQRS | TUV | WXYZ |
+-------+-------+-------+
| * | 0 | # |
| ← | SPACE | → |
+-------+-------+-------+
Cómo funciona T9
Para escribir un carácter con T9, debe presionar la tecla numérica que representa los n
tiempos de ese carácter . n
es el orden de ese personaje escrito en esa tecla. Los números son el último carácter que puede escribir para cada tecla. Por ejemplo, para escribir B
presiono 2
dos veces, o para escribir 5
presiono 5
cuatro veces. Para terminar de escribir este personaje, presiono #
. *
es simplemente retroceso. En nuestra versión de teclado no hay mayúsculas.
Ejemplos de entrada y salida:
8#99999#055#33#999#22#666#2#777#3# → T9 KEYBOARD
Explicación:
8
seleccionaT
y#
pasa al siguiente personaje99999
selecciona el último carácter de la9
clave que es9
y#
pasa al siguiente personaje0
inserta un espacio33
selecciona el segundo carácter de la3
clave que esK
y se#
mueve al siguiente carácter- Y así...
Reglas
Su función o programa debe aceptar una cadena que represente las pulsaciones de teclas T9. La salida es el texto resultante de esas pulsaciones de teclas, como se describe anteriormente.
Este es un código básico de golf, por lo que el ganador es el más corto en bytes, y se aplican reglas / lagunas estándar.
T9 KEYBOARD
es completamente incorrecto. Eso se leeT9 JEYBARD
#
si los botones consecutivos son diferentes de todos modos. Dicho esto: sin ese bono, ¿qué pasaría si#
se omite?Respuestas:
CJam,
10994 bytes ( 2º bono)Una solución muy ingenua y larga.
Este es un programa completo, aunque una función tendrá la misma duración.
La entrada entra en STDIN
Ejemplo:
Salida:
Pruébalo en línea aquí
fuente
JavaScript ES6,
220-10 = 210178 bytesComo parte del CMC de Helka , superé mi primer desafío.
Resultados de muestra:
Explicación
Esto implementa el reemplazo recursivo, reemplazando todos los caracteres seguidos por
*
hasta que no queden*
s.Esto coincide con todas las ejecuciones de dígitos consecutivos, o
*
s.Esto crea el diccionario deseado, obtiene la parte codificada de la cadena grande y luego le agrega el dígito deseado.
Esto obtiene el carácter,
a
la longitud del módulo .Esto prepara la cadena para el procesamiento y eliminación de
*
s.fuente
t("2#2");
da enB
lugar deAA
. Intenta combinar cualquiera en#
lugar de eliminarlos.Pitón,167157151 bytes(no admite '*')
Nada especial. Uso regex para convertir la entrada en una lista, luego hago un bucle de las entradas. Utilizo el primer carácter y la longitud de cada entrada para buscarlo en una lista de búsqueda:
Después de jugar al golf se ve así:
Sin bonificaciones (todavía). No sé cómo implementaría el primer bono en regex. El segundo bono agregaría muchos bytes ya que los elementos de búsqueda no son del mismo tamaño. Realmente no entiendo el tercer bono.
fuente
Perl 5: 106 (código 104 + 2 banderas)
Modificado para manejar eliminaciones.
Uso:
Perl 5: 88 (código 86 + 2 banderas)Versión anterior sin eliminación de estrellas.
fuente
AWK 211 bytes (con las bonificaciones)
Este es un programa completo que lee la entrada de stdin. Sería más eficiente no volver a dividir el teclado para cada línea, pero alargaría el guión.
Además, si la tecla "0" fuera algo más que 0, el script sería 4 bytes más corto, pero eso es parte del juego: o)
fuente
C (245 bytes)
Salida
Explicación
El recuento de bytes no incluye la cadena de entrada dada en el primero
#define
.Utilizo una matriz bidimensional como la tabla de búsqueda de qué personaje imprimir. El programa lee en caracteres delimitados por
'#'
.Para cada grupo, el número de entrada determina el índice de matriz de primera dimensión, y el número de repeticiones del número de entrada determina el índice de matriz de segunda dimensión. Los
'*'
mueve hacia atrás el índice de la matriz de la cadena de salida a fin de sobrescribir la letra anterior.Entonces la cadena de entrada
44#
(1 repetición de'4'
) se traduce a la tabla de búsquedaK[4][1]
, que es el carácterH
.Versión sin golf
fuente
Ruby
254,248, 229 bytesGolfizado:
Sin golf:
Todas estas especificaciones deberían tener éxito:
La
0 0
respuesta se parece un poco a una solución hacky. Lo investigaré cuando tenga tiempo.fuente
PHP, 183-10 = 173 bytes
Todas las versiones toman datos del argumento de la línea de comando; llamar con
php -r '<code>' <string>
.Nota : Todas las versiones lanzan una advertencia si la entrada comienza con
*
.Anteponga
$o=[];
al código para eliminar esa falla.210-10 - ?? = ??? bytes
181 bytes, sin bonificación
Descompostura
Las versiones "sin etiquetas hash" dividen la cadena en (racha de números iguales) y (asterisco) y olvidan todo lo demás. La versión sin bonificación toma (racha de números seguidos de
#
) y (asterisco).Luego recorra las coincidencias: si se encuentra un '*', elimine el último elemento de la matriz de resultados.
La diferencia entre las versiones está en la
else
parte:-1
.fuente
JavaScript, 147 bytes
La respuesta de Conor se arregló con la expresión regular de mi respuesta de PHP y bajó el nivel.
Descompostura
versión giratoria, 158 bytes
agregado
s=
para recordar la cadena y%s.length
rotar.fuente