¿Palabra o casi palabra?

8

Escriba un programa o función que le dé una cadena (o el equivalente de su idioma), determine si la cadena es una palabra o no, y genere un valor verdadero o falso.

(Esto no es un duplicado de ¿Es esto incluso una palabra? Las palabras incorrectas se generan de una manera muy diferente que creo que hace de este un desafío completamente diferente)

Todas las palabras estarán en minúsculas, entre 5 y 10 caracteres, y no tendrán apóstrofes.

Las palabras correctas son un subconjunto seleccionado al azar de la lista de palabras en inglés SCOWL (tamaño 50).

Las palabras incorrectas se generan a través de dos métodos: intercambio y sustitución.

Las palabras "intercambiables" se generan usando un shuffle modificado de Fisher-Yates en las letras de palabras (reales) seleccionadas al azar. En lugar de intercambiar las letras cada vez, una letra puede o no intercambiarse (la probabilidad varía, por lo que algunas palabras serán más realistas que otras). Si la nueva palabra coincide con una palabra existente, el resultado se descarta y genera otra palabra.

Las palabras de "sustitución" se generan utilizando un método similar, pero en lugar de intercambiar la letra con otra letra, cada letra tiene la posibilidad de ser reemplazada por otra letra aleatoria.

Cada método se utiliza para generar el 50% de las palabras falsas.

Puntuación

Su función debe ser inferior a 150 bytes . La puntuación se determina de la siguiente manera:

percentage of answers correct + ((150 - length of program) / 10) 

Reglas

Como se trata de una gran cantidad de casos de prueba (cada lista de palabras tiene 1000 palabras), un programa de prueba automatizado está bien. El probador automatizado no cuenta para la duración del programa; sin embargo, debe publicarse para que otros puedan probarlo.

  • No hay escapatorias.
  • Sin ortografía / diccionario integrado incorporado.

Recursos

Lista de palabras: http://pastebin.com/Leb6rUvt

Lista de no palabras (actualizado) : http://pastebin.com/rEyWdV7S

Otros recursos (lista de palabras SCOWL y el código utilizado para generar las palabras al azar): https://www.dropbox.com/sh/46k13ekm0zvm19z/AAAFL25Z8ogLvXWTDmRwVdiGa?dl=0

Daniel M.
fuente
2
Sé que tener una lista de palabras disponible derrotaría el punto del desafío, pero ¿cómo se supone que un programa debe saber que la sémola (404 en la lista sin palabras) no es una palabra, considerando que realmente es una?
Geobits
2
No me malinterpretes; No me gusta la arena en absoluto. Por qué alguien los comería está más allá de mí. Pero incluso yo no iría tan lejos como para rechazar la palabra en sí: P
Geobits
Advertencia justa: no he ido más allá de eso en la lista, por lo que es posible que haya otros.
Geobits
Unos más palabras que no son palabras, algunos ligeramente oscurecen: quais, paves, colic, supermax. (Nota al supermax
margen
Lo extraño es que incluso ejecutar la lista a través de la lista más grande de SCOWL no captó ninguno de esos, aunque definitivamente son palabras. Generé otras 1000 palabras (están en el enlace de otros recursos), y si una no palabra es realmente una palabra, será reemplazada por la palabra en la lista alternativa que está en el mismo número de línea. Mientras tanto, actualicé lo de pastebin para usar las palabras alternativas para la palabra no palabras.
Daniel M.

Respuestas:

8

PHP, 64,9 (50%, 1 byte)

Bueno, no estoy realmente seguro de si esta es una respuesta aceptable, pero aquí va:

1

Corre así:

echo '1' | php -- word

Obviamente, para una lista igualmente grande de palabras correctas e incorrectas, esto da como resultado un 50% de falsos positivos y un 0% de falsos negativos, por lo que el 50% es correcto. Sin embargo, como el programa es de 1 byte, obtienes la bonificación de longitud máxima posible (a pesar de las respuestas de longitud cero).

aross
fuente
Curiosamente, esto es bastante competitivo debido al balance de puntuación. +1
Addison Crump
6

CJam, 78,6 (78,5%, 149 bytes)

l2b0"(1»\]ÁûKëá*ßð%äp`Ï_5ÚY÷:Ä$î ëQXV)­JKÆ¿-(ivHì?{'à\ßÐiCæz°P0ãª/îÏèÄ)WCÅH±Ø^2Ô¥?
î'jJ#OAõ~×cA$[8,ô#~¬#7>"255b2b+=

Coincide 696 palabras reales y no coincide con 874 no palabras, dando 1570/2000 = 0.785. Probado en el intérprete en línea en Chrome: no estoy seguro de si el enlace permanente funcionará en Firefox. En caso de que no sea así, la cadena, que contiene elementos no imprimibles, se puede obtener mediante

[24 40 5 49 25 187 92 93 193 251 158 131 75 235 131 225 42 129 223 240 14 37 228 112 96 207 95 53 218 89 247 58 3 196 3 36 1 238 143 32 235 139 81 15 88 86 41 20 173 74 75 198 191 45 40 105 118 72 236 63 123 39 224 15 15 92 223 208 16 147 105 140 67 16 230 122 176 80 26 48 133 227 148 144 170 47 238 207 232 136 24 196 41 87 132 67 197 72 177 216 94 24 50 212 165 63 10 238 39 106 74 35 79 65 245 126 215 136 6 99 65 36 91 56 44 143 155 150 244 35 126 172 35 55 62]:c

El programa simplemente codifica la entrada y realiza una búsqueda basada en 1077 cubos posibles. Intenté regex golfing esto, pero las no palabras estaban demasiado cerca de las palabras reales para que fuera útil.

Pruébalo en línea! El | Conjunto de pruebas (pegue la lista de palabras completa para contar el número de coincidencias)

Sp3000
fuente
1
"Traté de regex golfing esto, pero las no palabras estaban demasiado cerca de las palabras reales" -mucho objetivo
Daniel M.
3

Mathematica, 69.35 (69.35%, 150 bytes)

StringContainsQ[" "|##&@@"seaeiislaanreuaooesrtnlneimdiuuosnlrlggtwtwnsdjexexavsvnuvtxsgokcmairlzlzeyatgpnlfiyhtcdxrvmuqtqtmsfohnk"~StringPartition~2]

Explicación

La función verificará si la palabra contiene ciertos pares de letras que rara vez ocurren en palabras reales. Si es así, la función volverá True, lo que indica que la palabra probablemente no sea una palabra real. Por ejemplo, el par "ii"aparece 21 veces en la lista de no palabras, mientras que no aparece en la lista de palabras.

Tasa correcta

Words:      85.4%  
Not words:  53.3%
njpipeorgan
fuente
0

CSharp, 69.85 (57.45%, 26 bytes)

"hoeiaunrt".Contains(s[1])

Compruebo si la segunda letra de la palabra está en la lista de las segundas letras más populares en inglés ( de este sitio ).

Prueba automatizada:

static void Main(string[] args)
{
string[] good = System.IO.File.ReadAllLines( @"PATH_GOOD.txt");
string[] bad = System.IO.File.ReadAllLines(@"PATH_BAD.txt");

int counter_good = 0;
int counter_bad = 0;

foreach (string s in good)
{
    if ("hoeiaunrt".Contains(s[1])) counter_good++;
}

foreach (string s in bad)
{
    if (!("hoeiaunrt".Contains(s[1]))) counter_bad++;
}

Console.WriteLine(counter_good);
Console.WriteLine(counter_bad);

Console.ReadLine();
}

Resultado:

828
321

Cálculo:

(828+321)/20 + 124/10 = 57.45 + 12.4 = 69.85
ivaan
fuente
0

ES6, 76 (67.4%, 64 bytes)

Una respuesta más seria esta vez. Este es un algoritmo bastante simple. Devuelve un valor verdadero cuando el segundo carácter de una palabra es uno de aeinoru. No produce una proporción de éxito significativamente mejor que solo 1, pero aún es muy corto.

w=>/^[^qxy][aehil-prux]/.test(w)>/[^aeiouy]{3}|[fiopq]$/.test(w)

Prueba aquí.

  • +2.7 agregando una expresión regular para encontrar palabras con 3 o más consonantes consecutivas y gobernarlas como "no palabra"
  • +0.1 reemplazando &!con>
  • +1.95 al excluir los primeros caracteres más infrecuentes qxy, agregando segundos caracteres más válidos (comunes) para compensar los falsos negativos, eliminando la coma redundante en expresiones regulares
  • +0.05 al excluir palabras que terminan con los caracteres finales poco probables fiopq
aross
fuente