输入:将为您传递一个包含单个英语单词的字符串。所有字母均为小写,并且字符串中没有非字母字符。
输出:您将返回一个从1到7的整数,表示您认为单词中有多少个音节。
评分:您的程序将针对此存储库中找到的所有单词运行。如果您输入的N
单词正确,并且程序的大小为M
字节,则分数为N-(M*10)
。最高分获胜。
resume
例如...
输入:将为您传递一个包含单个英语单词的字符串。所有字母均为小写,并且字符串中没有非字母字符。
输出:您将返回一个从1到7的整数,表示您认为单词中有多少个音节。
评分:您的程序将针对此存储库中找到的所有单词运行。如果您输入的N
单词正确,并且程序的大小为M
字节,则分数为N-(M*10)
。最高分获胜。
resume
例如...
Answers:
->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}
这是一个匿名的Ruby函数,它使用正则表达式对音节进行计数。
该函数为以下每个实例添加一个音节:
e
元音,接着更多的零e
小号e
这是不尾部的一部分ed
或ely
与尾随的例外ted
或ded
小号le
基本思想是计算元音的游动次数,但这本身并不十分准确([aeiouy]+
正确率达到74%)。造成这种情况的主要原因是由于无声e
,它可以修改以前的元音,而不会自己发声。例如,该单词slate
有两个元音,但只有一个音节。
为了解决这个问题,我们e
从正则表达式的第一部分中取出并单独对待。检测无声e
s很难,但是我发现两种情况经常发生:
ed
(除非是a ted
或ded
like settled
或saddled
),evy
(例如lovely
)这些情况在其他情况下将被特别排除e.
。
.
in 的原因e(?!d$|ly).
是,如果有一个双元音(例如ea
或ee
),则消耗下一个字符,以便e
不计算单词的末尾。但是尾部le
是通常发音,使加回。
最后,元音运行被算作一个音节。尽管并非总是如此(例如curious
),但通常很难弄清是否有多个音节。取ia
的celestial
和spatial
,作为一个例子。
我不太了解Ruby,因此不确定其打高尔夫球的程度。我确实通过咨询很多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}"
e
”的实现给出了6638(正确的是7158)
我的回答很简单:计算连续元音的运行次数,但不要删除任何最后一个e。
lambda w:len(''.join(" x"[c in"aeiouy"]for c in w.rstrip('e')).split())
剥离e后,将元音替换为,x
并将所有其他字符替换为空格。结果重新连接成字符串,然后在空格上分割。方便地,开头和结尾的空格将被忽略(例如," x xx ".split()
给定["x","xx"]
)。因此,结果列表的长度就是元音组的数量。
以下原始的83字节答案更准确,因为它最后只删除了一个e。因此,较新的单词在单词等问题上存在问题bee
; 但是缩短的代码胜过这种效果。
lambda w:len(''.join(" x"[c in"aeiouy"]for c in(w[:-1]if'e'==w[-1]else w)).split())
测试程序:
syll = lambda w:len(''.join(c if c in"aeiouy"else' 'for c in w.rstrip('e')).split())
overallCorrect = overallTotal = 0
for i in range(1, 7):
with open("%s-syllable-words.txt" % i) as f:
words = f.read().split()
correct = sum(syll(word) == i for word in words)
total = len(words)
print("%s: %s correct out of %s (%.2f%%)" % (i, correct, total, 100*correct/total))
overallCorrect += correct
overallTotal += total
print()
print("%s correct out of %s (%.2f%%)" % (overallCorrect, overallTotal, 100*overallCorrect/overallTotal))
显然,这太脏了,不够快,无法击败Sp3000的Ruby答案。; ^)
->s{s.scan(/([aiouy]|e(?!$))+/).size}
得分7583。84%的简单成绩令人印象深刻。
使用最近提交之前的列表。
#!perl -lp
$_=s/(?!e[ds]?$)[aeiouy]+//g
该程序仅假设更长的单词意味着更多的音节。
lambda x:len(x)/6+1
我使用的测试程序是:
correct = 0
y = lambda x:len(x)/6+1
for i in xrange(1,8):
f = file(str(i)+"-syllable-words.txt")
lines = f.read().split("\n")
f.close()
correct += len([1 for line in lines if y(line)==i])
print correct
len(x)/6
(5377-190 = 5187)。
readlines()
在结果中包括换行符。所以你实际上是(len(x)+1)/7+1
。您应该read().split('\n')
改用。尽管我得到了5352的公式。