Dada una cadena como entrada, determine si es un sustantivo o no.
Se te puntuará en las 1000 palabras más comunes en inglés, según la cantidad que etiquetes correctamente como sustantivo o no.
Ganará el programa o función que clasifique correctamente la mayoría de esas palabras en 50 bytes o menos.
Sustantivos
Un sustantivo es una palabra que representa una cosa, típicamente. Se vuelve más complejo, pero esa es la idea básica.
En los casos en que una palabra puede ser un sustantivo o alguna otra parte del discurso, la clasifiqué como un sustantivo, incluso si es un uso poco frecuente. O, de hecho, dejo que este sitio lo haga por mí.
Las palabras en las que se le calificará son estas 1000 palabras comunes , que son de Wikipedia simple , con "dos" y "una vez" agregados. De esos, estos son los 586 sustantivos , y estos son los 414 no sustantivos . Puedes encontrar las tres listas aquí . Tenga en cuenta que todas estas entradas están en minúsculas. Estas listas son finales; no intente discutir la gramática.
Su programa se considerará correcto si genera un resultado verdadero en una entrada que es un sustantivo, y un resultado falso en una entrada que no es un sustantivo.
Sutilezas:
Los programas deben tener una salida determinista. Si quieres usar la aleatoriedad, siembra. Los programas no pueden usar listas de nombres integradas u otras funciones integradas de parte del discurso.
Ejemplos:
a: noun
act: noun
active: noun
about: non-noun
above: non-noun
across: non-noun
Indique cuál es la tasa de éxito de su programa en su respuesta. El programa o función de como máximo 50 bytes con la mayor tasa de éxito gana. En caso de empate, el conteo de bytes más bajo determinará un ganador. ¡Buena suerte!
[bcdf-mp-tvwy]
es equivalente a la clase[^aenouxz]
. Un cambio ahorraría 4 bytes, que podrían capitalizarse.[^aenouz]
porque no tenemos ninguna palabra que comience con ax
.Gelatina , 48 bytes, puntaje 731
Esta es mi primera respuesta en Jelly y tuve muchos problemas para armar esto. Ah bueno ... eso fue divertido. :-)
1 byte guardado gracias a @JonathanAllan
Pruébalo en línea!
Desglose y suites de prueba
¿Cómo?
Primero calculamos un hash de la cadena de entrada por:
Esto nos deja con un índice en [0 ... 255] y así divide todas las palabras en 256 grupos.
Para cada grupo de palabras, precalculamos un indicador binario que es
1
si el grupo contiene más sustantivos que no sustantivos, y de lo0
contrario. Esto conduce a un número N de 256 bits que vamos a utilizar como tabla de búsqueda. Lo almacenamos como una cadena codificada en base 250.A continuación se muestra la representación binaria de N .
Que se puede almacenar como
“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’
en gelatina.De ahí el código:
fuente
O‘ḅ⁹%⁽€Oæ»4“Ạ$ⱮẊḲḲLÑMṆụ⁻ẉṂ`ŻvḤæɠ5ṭȯƁU*×TdƲḥ`’æ»Ḃ
(también tenga en cuenta que puede usar el pie de página en TIO, iría conÇ€¬S,L
yǀS,L
para sus dos suites de prueba.JavaScript (ES6), 50 bytes, puntuación 693
Simplemente buscando los posibles patrones que los no sustantivos tienen y los sustantivos no.
Los no sustantivos contienen más a menudo:
Retazo:
Mostrar fragmento de código
fuente
/h|n/
(o haciendo/^.[hn]/.test(s)
), y otra cambiandos[2]>''
a cualquiera!!s[2]
o2 in s
.a.p
redundante ya que ya lo tienes[aouz]
?[aouz]
solo coincide cuando al principio de la cadena. Por alguna razón, las pruebas ena.p
cualquier parte de la cadena mejoran la puntuación.Gelatina , 50 bytes , puntaje 763
Usando un hash ahora (al igual que la respuesta de Arnauld's Jelly )
¡Pruébelo en línea!
250/414 para no sustantivos
513/586 para sustantivos
total = 250 + 513 = 763.
¿Cómo?
Crea una tabla con 308 entradas, ya sea 1 (que identifica un sustantivo) o 0 (que identifica un sustantivo) e indexa en ella utilizando una clave proporcionada por una función hash que utiliza el producto de los ordinales de la palabra de entrada:
Anterior:
5047 bytes , puntuación 684Un enlace monádico que toma una palabra y devuelve una lista de un carácter (verdad) si la palabra se identifica como un sustantivo, o una lista vacía o cero (ambos falsey) si no lo es.
Pruébalo en línea! (el pie de página realiza un if if en el resultado para imprimir
Noun
oNon-Noun
)... o ver el programa de puntuación (cuenta los índices de verdad en las dos listas y luego calcula la puntuación).
Desglose de la puntuación: 462/586 sustantivos identificados correctamente (124 incorrectos), 222/414 no sustantivos identificados correctamente (192 incorrectos) - total correcto = 684/1000.
¿Cómo?
Supongo que no es un sustantivo si ...
'be', 'th', 'le', 'he', 'm ', 'ev', 'et', 's ', 'fl', 'ax', 'en', 'fo', 'am', 'az'
(nota:'m '
y's '
solo están aquí para facilitar la compresión, pero nunca aparecen de todos modos)aenouyz
(aunque esto se implementa inversa y con letras mayúsculas en exceso)... ya que las palabras tienen todas longitud entre 1 y 11 del -299 º índice es equivalente para usar la longitud para mapear el índice:
{7:2; 8:5; 9:7; 11:9; else 1}
13 bytes, puntuación: 638
Una primera fiesta rápida (extendida arriba)
fuente
0,-2
no significapair zero with -2
que signifiqueliteral [0, -2]
0,-2
es un nilad, no está separado(0)(,)(-2)
... por supuesto, es el mismo efecto en este caso, pero no siempre. Aprendí eso de la manera difícil ... y cualquiera que sea el caso, preferiría explicar lo que realmente sucede en lugar de algo con el mismo efecto o algo.j
"?pair
ojoin
son obviamente maneras equivocadas a la frase, ya que0,-2,-6
, por ejemplo, no significapair 0 with -2 and then pair that with -6 = [[0, -2], -6]
sino que más bien mediosliteral [0, -2, -6]
. Lo entiendo, el,
átomo y el...,...(,...(...))
literal son confusos ... pero aún así0,-2,-6
no es lo mismo0,-2;-6
ya que el primero es 1 enlace y el último es 3 enlaces.Julia 34bytes, 609
f(w)=hash(w)&0x0800000000004808>0
Quería ahorrar en caracteres usando el hash incorporado. Siento que debe haber una manera de hacerlo mejor. Julia simplemente no es lo suficientemente amigable con las operaciones de bit bitging que quiero usar para mejorar esto, creo.
Encontrar máscaras de bits adecuadas para que el hash las separe es un juego interesante.
fuente
Python 2 , 50 bytes, precisión: 596
Pruébalo en línea!
Simplemente verifica la primera letra, la longitud y si "st" está en la palabra Code asume que la palabra se define como x (Editar: Gracias a issacg por arreglar el código del fragmento a la función)
fuente
Haskell, 36 bytes,
626631fuente
length x>2&&(x!!0`notElem`"aenou"||x!!1`elem`"acqrsty")
Implementación de puerta lógica de 2 niveles, no 50 bytes, puntaje 1000
Simplemente conecte la representación binaria de la palabra dada a las 88 entradas
El circuito devuelve 1 si la palabra es un sustantivo y devuelve 0 si no
Esta implementación necesita
Algunas medidas
Circuito de resolución completa.pdf aquí
Circuito de resolución completa.png aquí
fuente
Python 3, 50 bytes, puntaje 602
Python no es el lenguaje más detallado, pero 50 bytes es difícil.
fuente