Debe escribir un programa o función que tome una cadena de 4 caracteres como entrada y genere un valor que indique si la cadena es una palabra en inglés o no. Se le permite cometer errores en el 15% de los casos de prueba proporcionados.
Detalles de entrada:
La entrada es una cadena de 4 caracteres que contiene solo las letras minúsculas en inglés (az).
Detalles de salida:
Si la entrada es una palabra en inglés, debe generar un booleano true
o un entero 1
.
Si la entrada no es una palabra en inglés, debe generar un booleano false
o un entero 0
.
Listas de palabras
lista de palabras en inglés de 4 letras (2236 palabras)
lista de cadenas de 4 letras sin palabras (2236 cadenas)
La lista sin palabras contiene secuencias de letras generadas de manera uniforme y aleatoria con las palabras reales eliminadas de ellas.
Pruebas
Su programa o función no debe cometer más del 15% de errores en las listas de palabras dadas juntas. Eso significa que puede dar una salida incorrecta para 670 de las 4472 entradas proporcionadas.
También debe publicar el programa o la función de prueba para que otros puedan verificar su respuesta. La duración de su programa de pruebas no cuenta en su puntaje de envíos.
Las lagunas estándar no están permitidas.
Su programa no debe usar ninguna fuente externa, por ejemplo, acceder a la web o leer archivos.
Este es el código de golf, por lo que gana el programa o la función más corta.
fuente
Respuestas:
Ruby, 29 bytes
Espero haber entendido bien, es la primera vez que programo en Ruby. Realmente hice todas mis pruebas en Python, pero
import re
fue demasiado largo para mí.Esta es una función anónima que toma una cadena y emite en
true/false
consecuencia. Utiliza una expresión regular que busca una de las siguientes dos cosas:jqxz
Si alguno de estos está presente, clasificamos la entrada como no una palabra.
La función coincide con 2030 palabras (fallando incorrectamente en 206) y falla en 1782 sin palabras (incorrectamente 454), para un total de 660 clasificaciones erróneas. Probado en ideone .
Gracias a @ MartinBüttner por la ayuda de Ruby. Martin también señala que un programa completo toma la misma cantidad de bytes:
También gracias a user20150203 por simplificar la expresión regular.
Rubí,
15861488134912881203 bytesPara un bono, aquí hay una función con una expresión regular mucho más larga:
Quería mostrar que la expresión regular aún puede vencer a la compresión, por lo que esta clasifica cada caso correctamente . La expresión regular en sí es un poco como la descomposición exponencial: los primeros bits coinciden con muchas no palabras, luego cada bit coincide con menos y menos hasta que me di por vencido y concatenaba el resto (aproximadamente 200) al final. Algunos de los que quedaron parecían sorprendentemente palabras reales (como
chia
cuál es una palabra).Lancé el regex a mi limpiador de golf regex que escribí para otro desafío: jugó unos 300 bytes antes de tener que intentar barajar las cosas manualmente. Sin embargo, todavía queda bastante por jugar.
fuente
->s{!s[/[^aeiou]{3}|[jqxz]/]}
tiene solo 29 bytes y coincide con 2030 palabras (fallando incorrectamente en 206) y falla en 1782 no -palabras (que coinciden incorrectamente 454), para un total de 660 clasificaciones erróneas ".v
. Gracias usuario20150203!Groovy,
7774Escribí el programa de prueba en Java, que puedes encontrar en este Gist en Github. Aquí está la salida de mi programa de prueba:
(Falló 629 casos de prueba)
PD: Creo que esto va a terminar con un problema de expresiones regulares de golf muy pronto ...
Si la respuesta de Sp3000 (la función) se va a convertir a Groovy, terminará con el mismo número de caracteres. Como función nombrada:
o función sin nombre:
fuente
Javascript, 1626 bytes:
Quería buscar una solución que para cada personaje tenga una idea de cuál podría ser el siguiente. No es tan breve, pero no tiene expresiones regulares y un resultado bastante bueno (palabras: 101 errores, no palabras, 228 errores)
Aquí hay una implementación funcional http://fiddle.jshell.net/jc73sjyn/
En resumen: el Objeto g contiene los caracteres de la a a la z (como teclas), y para cada uno de ellos, hay un conjunto de caracteres (también como teclas) que representan cada uno un carácter que puede aparecer después, junto con su porcentaje de probabilidad . Donde no existe ningún objeto, no hay probabilidad.
Las 3 puntuaciones (4 letras -> 3 evaluaciones) se multiplican, y una palabra con una puntuación de 60 o más se considera una palabra real.
Ejemplo: para la palabra 'hacer frente' hay tres búsquedas:
g [c] [o] = 20
g [o] [p] = 5
g [p] [e] = 20
puntaje = 20 * 5 * 20 = 2000, que es más de 60, por lo que uno es válido.
(Soy bastante nuevo con javascript, por lo que podría haber formas de acortarlo que no conozco).
EDICIÓN TARDÍA:
Completamente irrelevante por ahora, pero evalué mi camino hacia una g más correcta:
Nuevos resultados:
palabras: 53 errores, no palabras: 159 errores
http://fiddle.jshell.net/jc73sjyn/2/
fuente
for
ciclo.w=>
porfunction(w)
y funcionará para todos los navegadores.Python 2, 5254 bytes
Esta solución separa las buenas palabras en dos mitades. La búsqueda primero verifica los primeros 2 caracteres para encontrar la cadena correcta, luego busca los segundos 2 caracteres en esa cadena. No muy compacto, pero rápido de escribir. Este método coincide con cada palabra sin errores.
fuente
C # WPF, 110
139Más corta
Vieja respuesta
fuente
var
y no introducir variables a menos que sea necesario.Palabra VBA, 25 bytes
Función de ventana inmediata anónima de VBE que toma la entrada como la selección actual y emite si es una palabra como booleana a la ventana inmediata de VBE.
Función de prueba
La siguiente función se usó para probar la función anterior contra los casos de prueba. La función falló el 9.07 por ciento de los casos (396 de las palabras reales y 10 de las palabras falsas)
fuente
Mathematica, 33 bytes
¡Oye, alguien tuvo que hacerlo!
Autoexplicativo.
fuente
Javascript ES6, 32 bytes:
Usando la expresión regular de la respuesta @ Sp3000 :
Esto crea una función anónima. Para usarlo, simplemente envuélvelo
()
.Ejemplo:
Esto tiene exactamente la misma tasa de falla que @ Sp3000, y regresa
true
o enfalse
consecuencia.Todos los créditos se deben a @ Sp3000 por dejarme usar su expresión regular.
fuente
F = function(s) { return /[^aeiou]{3}|[jqxz]/.test(s) }
.