Входные данные: вам будет передана строка, содержащая одно английское слово. Все буквы будут строчными, и в строке не будет не алфавитных символов.
Вывод: вы вернете целое число от 1 до 7, представляющее, сколько слогов вы думаете в слове.
Оценка: Ваша программа будет работать со всеми словами, найденными в этом хранилище . Если вы получаете N
правильные слова, и ваша программа имеет M
большие байты, значит, ваш результат равен N-(M*10)
. Наибольший счет выигрывает.
Чтобы сгенерировать количество слогов, я использовал это в качестве списка слов и это для подсчета слогов.
code-challenge
word
Натан Меррилл
источник
источник
resume
к примеру ...Ответы:
Ruby, 8618 правильных (91,1%), 53 байта, 8618 - 10 * 53 = 8088 баллов
Это анонимная функция Ruby, которая использует регулярные выражения для подсчета слогов.
Функция добавляет слог для каждого экземпляра:
e
гласных, а затем нуля болееe
сe
которая не является частью трейлингаed
илиely
, за исключением трейлингаted
илиded
sle
Анализ
Основная идея состоит в том, чтобы считать серии гласных, но это само по себе не очень точно (
[aeiouy]+
получается 74% правильных). Основной причиной этого является молчаниеe
, которое изменяет предыдущий гласный звук, но не произносится само по себе. Например, словоslate
имеет два гласных, но только один слог.Чтобы справиться с этим, мы вынимаем
e
из первой части регулярное выражение и рассматриваем его отдельно. Обнаружение тихихe
s сложно, но я обнаружил два случая, когда они происходят часто:ed
(если это неted
или,ded
какsettled
илиsaddled
),evy
(напримерlovely
)Эти случаи специально исключены во что бы то ни стало
e.
.Причина для
.
ine(?!d$|ly).
заключается в том, чтобы потреблять следующий символ, если есть двойной гласный (например,ea
илиee
), и так, чтобыe
в конце слова не учитывались. Однако замыкающаяle
это обычно произносится, так что добавляется обратно.Наконец, гласные звуки считаются одним слогом. Хотя это может не всегда иметь место (например
curious
), часто трудно определить, существует ли несколько слогов. Возьмитеia
изcelestial
иspatial
, как пример.Тестовая программа
Я действительно не знаю Руби, поэтому я не уверен, насколько хорошо он может быть в гольф. Мне удалось собрать воедино тестовую программу, посоветовавшись с большим количеством SO:
источник
e
», дает 6638 (7158 правильно)Python3, 7935 - 10 * 71 = 7225
Мой быстрый и грязный ответ: посчитайте серии последовательных гласных, но сначала удалите все финальные буквы.
После удаления
x
символов «e» это заменяет гласные, а все остальные символы - пробелом. Результат объединяется обратно в строку, а затем разбивается на пробелы. Удобно, пробелы в начале и в конце игнорируются (например," x xx ".split()
дает["x","xx"]
). Следовательно, длина результирующего списка - это число групп гласных.Исходный 83-байтовый ответ, приведенный ниже, был более точным, потому что он удалял только один символ e в конце. Таким образом, у более нового возникают проблемы с такими словами, как
bee
; но сокращенный код перевешивает этот эффект.Тестовая программа:
Очевидно, это было слишком грязно и недостаточно быстро, чтобы превзойти ответ Ruby на Sp3000. ; ^)
источник
->s{s.scan(/([aiouy]|e(?!$))+/).size}
оценка 7583. 84% довольно внушительно для чего-то такого простого.Perl, 8145 - 3 * 30 = 7845
Использование списков до недавних коммитов.
источник
Python, 5370-10 * 19 = 5180
Эта программа просто предполагает, что более длинные слова означают больше слогов.
Программа тестирования, которую я использую:
источник
len(x)/6
вместо этого (5377-190 = 5187).readlines()
включает новую строку в результате. Таким образом, ваш на самом деле(len(x)+1)/7+1
. Вы должны использоватьread().split('\n')
вместо этого. Хотя я получил 5352 за эту формулу.