Su desafío hoy es implementar una funcionalidad similar a t9 .
Implementará una función que solo tendrá 2 parámetros.
Recibirá 1 número de teléfono en una cadena y el contenido de un archivo de texto con una lista de palabras (no asuma un estilo específico de nueva línea).
Puede usar el enlace https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt para probar la funcionalidad, o usar /usr/share/dict/words
(consulte un archivo de texto con una lista de palabras [cerrado] para obtener más información) información).
Puede suponer que siempre recibirá al menos 2 números.
Dado el número, leerá de una lista de palabras y devolverá las palabras que comienzan con el mapeo de letras a esas palabras. Esto significa que la entrada debe ser solo números del 2 al 9.
Puede hacer lo que quiera si recibe una entrada no válida.
Si no se encuentra ninguna coincidencia, puede devolver una lista vacía, null
/ nil
o 0
.
Recuerde que las teclas del teléfono celular se asignan a sus caracteres equivalentes:
- 0 y 1 no son válidos
- 2 partidos [abc]
- 3 coincidentes [def]
- 4 partidos [ghi]
- 5 coincidencias [jkl]
- 6 partidos [mno]
- 7 coincidencias [pqrs]
- 8 partidos [tuv]
- y 9 coincidencias [wxyz]
Ejemplos:
f('52726')
//returns ["Japan","japan","Japanee","Japanese","Japanesque"...,"larbowlines"]
f('552')
//returns ["Kjeldahl","kjeldahlization","kjeldahlize"...,"Lleu","Llew"]
f('1234')
//makes demons fly out your nose or divide by 0
f('9999')
//returns ["Zyzzogeton"]
f('999999')
//returns [] or null/nil or 0
Después de ejecutar su función, puede imprimirla de la forma que desee.
Reglas:
- Las lagunas estándar son inválidas
- Debe devolver algo, incluso si es
null
/nil
Javascript devolveráundefined
si no devuelve algo, por lo tanto, esta regla. - No puede usar o volver a implementar las respuestas de otros ni copiar mi implementación.
- Puede suponer, para Javascript, que el navegador ya estará abierto y que el
innerText
/textContent
del elemento automático se pasará como el segundo parámetro - Para lenguajes compilados, no puede pasar argumentos especiales al compilador
- Puede recibir el nombre del archivo sobre los argumentos del compilador
- Las variables, macros, variables globales, constantes, clases no estándar y todo el tipo que pasa otros valores dentro de la función se considerarán inválidas.
- En Javascript, las variables sin la palabra
var
clave invalidan su código - Su función será nombrada
f
- Solo puedes tener 2 argumentos en tu función
- Intenta mantener tu código por debajo de 500 segundos para ejecutarlo.
- No tiene que preocuparse por los espacios en blanco.
- Debe usar solo caracteres imprimibles ASCII .
Las excepciones son idiomas que solo usan caracteres no imprimibles (APL y espacios en blanco son 2 ejemplos).
Puntuación:
- El menor número de bytes gana
- Tener caracteres imprimibles ASCII no válidos en su respuesta contará como la respuesta codificada en UTF-32.
La excepción a la codificación hará que su respuesta se cuente por caracteres . - Solo cuenta el cuerpo de la función, no cuentes nada más que hagas fuera de él
- Bonificación de -30% si realiza un sistema de predicción basado en el vecindario o las palabras más comunes
- Bono de -20% si solo devuelve las primeras 5 coincidencias para cada letra correspondiente al primer número (por ejemplo: 245 devolvería 5 palabras que comienzan con 'a', 5 que comienzan con 'b' y 5 que comienzan con 'c' )
Aquí hay un ejemplo de una implementación, usando Javascript:
function f(phone, words)
{
var keypad=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
var regex='';
for(var i=0,l=phone.length;i<l;i++)
{
regex+='['+keypad[phone[i]]+']';
}
var regexp=new RegExp('\\s('+regex+'[a-z]*)\\s','gi');
return words.match(regexp);
}
Para ejecutarlo, abra el enlace de la lista y ejecute, por ejemplo:
f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]
Este ejemplo fue probado y funciona bajo Opera 12.17 64bits en Windows 7 Home Edition 64bits.
Respuestas:
CJam, 28 bytes
Toma entrada en forma de
"<number>" [<list of words>]
Ejemplo:
Salida:
No voy por ninguna bonificación por ahora.
Pruebe el código en línea aquí, pero para mediciones de tiempo real, ejecútelo en el compilador de Java
Tenga en cuenta que CJam representa listas vacías como
""
Para convertir la lista de palabras sin formato en la lista de CJam, use el siguiente código con la lista de palabras como entrada:
fuente
Java: 395
Esto forma un patrón regex basado en las letras permitidas para cada número, y luego agrega un. * Al final para que coincida con los siguientes caracteres.
Aquí está la versión de golf:
Y aquí está la versión no adaptada para la capacidad de lectura
fuente
f
".([W-Zw-z)]
) debería estar([W-Zw-z])
. Y en Code-golf no tiene que preocuparse por los estilos de programación y las buenas prácticas: su código simplemente debe hacer sus cosas dentro de los parámetros requeridos. Si revisas mi respuesta, verá esta línea:$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
. Este es un horrible 'crimen' en PHP. Básicamente estoy obligando a PHP a convertir constantes no existentes en cadenas. Esto es perfectamente aceptable. También verá que ni siquiera estoy configurando la variable$t
en una matriz antes de usarla como talC # .NET 4.5 235
Esto debería funcionar:
fuente
foreach
. Si espera que ya sea asíIEnumerable
, incluya el código que se usa afueraa
var.a
var. ¡Pero realmente veo mejoras notables! Sigan con el buen trabajo.Python 2 (155 bytes)
También debería funcionar en Python 3 con los reemplazos apropiados (
string
->bytes
,b
prefijo en cadenas, etc.).No estaba seguro de si tener la
maketrans
llamada fuera de la función se considera "justo"; si no, la función es de 134 bytes con ella movida dentro.EDITAR: Se cayó un byte de una estúpida supervisión.
Con preparado
maketrans
, 67 bytes:Con
maketrans
en el cuerpo, 134 bytes:Con
import
ymaketrans
en cuerpo, 155 bytes:Llamada de prueba:
fuente
maketrans
es parte del cuerpo de la función. Deberías moverlo. No sé si es posible, pero puedes intentar usar directamente elimport
. Creo que lo vi en alguna parte ... ¡Pero tu código es realmente bueno!t=(from stirng import maketrans)([...])
. No tengo idea si es posible. Pero tal vez pueda usar lofrom string import as x t=x([...])
que no estoy seguro si también es posible: /__import__('string').maketran
.PHP 5.4+ (
171186-20% = 148.8 bytes):Bueno, esta es una gran respuesta, pero bueno.
Espero que esto atraiga a más personas para responder.
Esta función espera que el crudo contenido que está siendo leído.
Aquí está el código:
Esto funciona verificando que la letra está en la lista de letras permitidas.
Ejemplo: la entrada
36
haría para verificar si1abc
tiene la primera letra de la palabra y si1def
tiene la segunda letra.Anexo
1
para que no verifique si la carta está en la primera posición (que volvería0
y que evaluaríafalse
).if(!strpos(1..$s[$c],$v[$i]))
oif(!strpos($c.$s[$c],$v[$i]))
tendrá el mismo efecto, pero el primero confunde más y me gusta.De lo contrario, eliminará la palabra.
Sin palabras restantes, devuelve una matriz vacía.
Para probar esto en línea, vaya a http://writecodeonline.com/php/ y cree una variable simple con una palabra para línea.
Un ejemplo comprobable:
Esto debería generar:
Para trabajar en versiones anteriores de php, reemplace
$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
por$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
Para el bono del 20%:
Para reducir el código, simplemente agregué
||$t[$v[0]]++>4
, que comprueba cuántas veces se usó la primera letra.En php,
$t
no es necesario definirlo, lo que ayuda a reducir una gran parte de 37,2 bytes.Para ver este efecto, use la siguiente variable como segundo argumento:
fuente