입력 : 영어 단어 하나가 포함 된 문자열이 전달됩니다. 모든 문자는 소문자이며 문자열에 알파벳이 아닌 문자가 없습니다.
출력 : 단어에 몇 개의 음절이 있다고 생각하는지 나타내는 1에서 7까지의 정수를 반환합니다.
스코어링 : 이 저장소 에있는 모든 단어에 대해 프로그램이 실행됩니다 . 당신이 얻을 경우 N
단어를 수정하고 프로그램이 M
큰 바이트, 당신의 점수입니다 N-(M*10)
. 가장 큰 점수가 이깁니다.
답변
루비, 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}"
답변
Python3, 7935-10 * 71 = 7225
나의 빠른 대답 : 연속 모음의 런 수를 세지 만 마지막 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 답변을 이길만큼 빠르지 않았습니다. ; ^)
답변
펄, 8145-3 * 30 = 7845
최근 커밋 이전의 목록을 사용합니다.
#!perl -lp
$_=s/(?!e[ds]?$)[aeiouy]+//g
답변
파이썬, 5370-10 * 19 = 5180
이 프로그램은 단순히 단어가 길수록 음절이 더 많다고 가정합니다.
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