루비, 8618 정확한 (91.1 %), 53 바이트, 8618-10 * 53 = 8088 점수
->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}
이것은 정규 표현식을 사용하여 음절을 세는 익명의 루비 함수입니다.
이 함수는 다음의 모든 인스턴스에 음절을 추가합니다.
- 비의 실행
e
이상 0으로 다음 모음, e
의
e
되는 하지 말미의 일부 ed
또는 ely
후단을 제외 ted
또는 ded
S
- 후행
le
분석
기본 아이디어는 모음을 세는 것이지만 그 자체로는 정확하지 않습니다 ( [aeiouy]+
74 % 정확함). 이것의 주된 이유는 조용한e
소리로 인해 이전 모음 사운드를 수정하지 않고 자체적으로 발음하기 때문입니다. 예를 들어, 단어 slate
에는 모음이 두 개 있지만 음절이 하나만 있습니다.
이를 처리하기 위해 e
정규식의 첫 부분을 꺼내어 별도로 처리합니다. 침묵을 감지하는 e
것은 어렵지만 자주 발생하는 두 가지 경우를 발견했습니다.
- 후행의 일부로
ed
( ted
또는 ded
같 settled
거나 같지 않은 경우 saddled
)
- 말미의 일부로서
evy
(예 lovely
)
이러한 경우는 다른 방법으로 제외됩니다 e.
.
.
in 의 이유 e(?!d$|ly).
는 이중 모음 (예 : ea
또는 ee
) 이있는 경우 다음 문자를 사용하기 때문에 e
단어의 끝에서 계산되지 않습니다. 그러나 후행 le
은 일반적으로 발음되므로 다시 추가됩니다.
마지막으로 모음 실행은 한 음절로 계산됩니다. 항상 그런 것은 아니지만 (예 curious
:) 여러 음절이 있는지 확인하기가 어려운 경우가 많습니다. 를 타고 ia
의 celestial
와 spatial
예를 들어,.
테스트 프로그램
나는 루비를 잘 몰라서 골프를 얼마나 잘 할 수 있는지 잘 모르겠습니다. 나는 많은 SO를 상담하여 테스트 프로그램을 함께 긁어 냈습니다.
cases = 0
correct = 0
s = "->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}"
f = eval s
for i in 1 ... 8
filepath = i.to_s + "-syllable-words.txt"
file = File.open(filepath)
while (line = file.gets)
word = line.strip
cases += 1
if f.call(word) == i
correct += 1
end
end
end
p "Correct: #{correct}/#{cases}, Length: #{s.length}, Score: #{correct - s.length*10}"