Entrada: se le pasará una cadena que contiene una sola palabra en inglés. Todas las letras estarán en minúsculas y no habrá caracteres no alfabéticos en la cadena.
Salida: devolverá un número entero del 1 al 7 que representa cuántas sílabas cree que hay en la palabra.
Puntuación: su programa se ejecutará contra todas las palabras que se encuentran en este repositorio . Si obtienes N
palabras correctas y tu programa es de M
bytes grandes, entonces tu puntaje es N-(M*10)
. Mayor puntuación gana.
Para generar mi conteo de sílabas, utilicé esto como mi lista de palabras y esto para contar las sílabas.
code-challenge
word
Nathan Merrill
fuente
fuente
resume
por ejemplo ...Respuestas:
Ruby, 8618 correcto (91.1%), 53 bytes, 8618-10 * 53 = 8088 puntaje
Esta es una función de Ruby anónima que utiliza expresiones regulares para contar sílabas.
La función agrega una sílaba para cada instancia de:
e
vocales, seguida de cero de máse
se
que no es parte de un finaled
oely
, con la excepción de finalted
oded
sle
Análisis
La idea básica es contar series de vocales, pero esto por sí solo no es muy preciso (
[aeiouy]+
obtiene un 74% correcto). La razón principal de esto es debido al silencioe
, que modifica el sonido vocal anterior sin ser pronunciado. Por ejemplo, la palabraslate
tiene dos vocales pero solo una sílaba.Para lidiar con esto, sacamos
e
la primera parte de la expresión regular y la tratamos por separado. Detectare
s silencioso es difícil, pero encontré dos casos en los que ocurren con frecuencia:ed
(a menos que sea unted
oded
comosettled
osaddled
),evy
(por ejemplolovely
)Estos casos están específicamente excluidos de lo que de otro modo sería
e.
.La razón de la
.
ene(?!d$|ly).
es consumir la siguiente Char si hay un doble vocal (por ejemplo,ea
oee
), y de modo quee
al final de la palabra no se cuentan. Sin embargo, un trailingle
se pronuncia generalmente, de modo que se añade de nuevo.Finalmente, las corridas vocales se cuentan como una sílaba. Si bien esto puede no ser siempre el caso (p
curious
. Ej. ), A menudo es difícil determinar si hay varias sílabas. Tome elia
decelestial
yspatial
, como ejemplo.Programa de prueba
Realmente no conozco a Ruby, así que no estoy seguro de qué tan bien se puede jugar al golf. Sin embargo, logré reunir un programa de prueba consultando mucho SO:
fuente
e
" da 6638 (7158 correcto)Python3, 7935-10 * 71 = 7225
Mi respuesta rápida y sucia: cuenta las corridas de vocales consecutivas, pero elimina primero cualquier e final.
Después de quitar las e, esto reemplaza las vocales con
x
y todos los demás caracteres con un espacio. El resultado se vuelve a unir en una cadena y luego se divide en espacios en blanco. Convenientemente, el espacio en blanco al principio y al final se ignora (por ejemplo," x xx ".split()
da["x","xx"]
). La longitud de la lista resultante es, por lo tanto, el número de grupos de vocales.La respuesta original de 83 bytes a continuación fue más precisa porque solo eliminó una sola e al final. El más nuevo tiene problemas para palabras como
bee
; pero el código acortado supera ese efecto.Programa de prueba:
Evidentemente, esto era demasiado sucio y no lo suficientemente rápido como para superar la respuesta de Ruby de Sp3000. ; ^)
fuente
->s{s.scan(/([aiouy]|e(?!$))+/).size}
puntajes 7583. 84% es bastante impresionante para algo tan simple.Perl, 8145 - 3 * 30 = 7845
Usando las listas anteriores a los commits recientes.
fuente
Python, 5370-10 * 19 = 5180
Este programa simplemente supone que las palabras más largas significan más sílabas.
El programa de prueba que uso es:
fuente
len(x)/6
(5377-190 = 5187).readlines()
incluye la nueva línea en el resultado. Entonces el tuyo es en realidad(len(x)+1)/7+1
. Deberías usarread().split('\n')
en su lugar. Aunque obtuve 5352 para esa fórmula, sin embargo.