Entrada: você receberá uma string contendo uma única palavra em inglês. Todas as letras serão minúsculas e não haverá caracteres não alfabéticos na sequência.
Saída: Você retornará um número inteiro de 1 a 7, representando quantas sílabas você acha que existem na palavra.
Pontuação: Seu programa será executado com todas as palavras encontradas neste repositório . Se você acertar as N
palavras e seu programa tiver M
bytes grandes, sua pontuação será N-(M*10)
. Maior pontuação ganha.
Para gerar minha contagem de sílabas, usei isso como minha lista de palavras e isso para contar as sílabas.
code-challenge
word
Nathan Merrill
fonte
fonte
resume
por exemplo ...Respostas:
Ruby, 8618 correto (91,1%), 53 bytes, 8618 - 10 * 53 = pontuação do 8088
Esta é uma função Ruby anônima que usa expressões regulares para contar sílabas.
A função adiciona uma sílaba para cada instância de:
e
vogais, seguida por zero de maise
se
que não faz parte de um trailinged
ouely
, com exceção de trailingted
ouded
sle
Análise
A idéia básica é contar as execuções de vogais, mas isso por si só não é muito preciso (
[aeiouy]+
fica 74% correto). A principal razão para isso é o silêncioe
, que modifica o som da vogal anterior sem ser pronunciado. Por exemplo, a palavraslate
tem duas vogais, mas apenas uma sílaba.Para lidar com isso, retiramos
e
a primeira parte do regex e o tratamos separadamente. Detectare
s silenciosos é difícil, mas encontrei dois casos em que ocorrem com frequência:ed
(a menos que seja umated
ouded
semelhantessettled
ousaddled
),evy
(por exemplolovely
)Esses casos são especificamente excluídos do que seria de outra forma
e.
.A razão para a
.
eme(?!d$|ly).
é consumir o próximo carvão animal se existe uma dupla vogal (por exemplo,ea
ouee
), e de modo quee
no fim da palavra não são contados. No entanto, um finalle
é geralmente pronunciado, de modo que é adicionado novamente.Finalmente, as execuções de vogais são contadas como uma sílaba. Embora nem sempre seja esse o caso (por exemplo
curious
), geralmente é difícil descobrir se há várias sílabas. Pegue oia
decelestial
espatial
, como um exemplo.Programa de teste
Eu realmente não conheço Ruby, então não tenho certeza de quão bem ele pode ser jogado no golfe. Consegui reunir um programa de teste consultando muito SO:
fonte
e
" fornece 6638 (7158 correto)Python3, 7935 - 10 * 71 = 7225
Minha resposta rápida e suja: conte execuções de vogais consecutivas, mas remova qualquer e final primeiro.
Depois de retirar os e, isso substitui as vogais por
x
e todos os outros caracteres por um espaço. O resultado é unido novamente em uma sequência e depois dividido em espaço em branco. Convenientemente, os espaços em branco no início e no final são ignorados (por exemplo," x xx ".split()
dá["x","xx"]
). O comprimento da lista resultante é, portanto, o número de grupos de vogais.A resposta original de 83 bytes abaixo foi mais precisa, pois removeu apenas um e no final. O mais novo, portanto, tem problemas para palavras como
bee
; mas o código reduzido supera esse efeito.Programa de teste:
Evidentemente, isso era muito sujo e não era rápido o suficiente para vencer a resposta Ruby do Sp3000. ; ^)
fonte
->s{s.scan(/([aiouy]|e(?!$))+/).size}
pontuação 7583. 84% é bastante impressionante para algo tão simples.Perl, 8145 - 3 * 30 = 7845
Usando as listas anteriores às confirmações recentes.
fonte
Python, 5370-10 * 19 = 5180
Este programa simplesmente assume que palavras mais longas significam mais sílabas.
O programa testador que eu uso é:
fonte
len(x)/6
(5377-190 = 5187).readlines()
inclui a nova linha no resultado. Então o seu é realmente(len(x)+1)/7+1
. Você deve usar em seuread().split('\n')
lugar. Embora eu tenha 5353 para essa fórmula, no entanto.