Вам поручено написать программу, в которой слова составляются в виде строки текста, разделяя их дефисом. Это было бы много работы, поэтому вы хотите пропустить некоторые части, в основном потому, что вы не хотите иметь таблицу произношения, необходимую для идеального алгоритма. Вы также хотите сделать его как можно более коротким (и, следовательно, нечитаемым и не поддерживаемым), чтобы отомстить за выполнение этого задания.
У вас есть два варианта:
- Напишите программу, которая берет строку из STDIN и выводит результат в STDOUT.
- Напишите функцию, которая принимает строку как один параметр и возвращает результат.
Технические характеристики
- В этом случае строка означает любую строковую конструкцию на выбранном вами языке (байтовые массивы, символьные массивы, строки ...).
- Гласные
a, e, i, o, u
- В данной строке есть
1 <= n <= 10
слова, каждый из которых имеет длину между1 - 30
символами включительно. На выходе должны быть слова с переносом слов. - Все буквы строчные, а слова всегда разделены пробелами. Таким образом, вход состоит из символов
[a-z ]
- Применяйте правила в порядке важности.
- Когда слово разделено, начните снова с правой половины слова.
Правила для слогов , в порядке важности
Два последовательных одинаковых гласных считаются одним (т. Е. feet
Имеет только один гласный, но beat
и finding
имеют два). Каждый слог имеет ровно один гласный, поэтому для каждого гласного есть один слог.
- Если все слово содержит только четыре буквы, верните его без изменений. (пропустите это для остальной части слова)
- Если слово имеет только одну гласную, верните слово без изменений.
- Если слово имеет два последовательных гласных, разделите их (т. Е.
diaspora
->di-as-po-ra
) - Когда два или более согласных находятся между двумя гласными (одинаковыми или разными), делите после первого согласного (т.е.
sis-ter
), если согласная часть не являетсяck
, и в этом случае делите слово после него. (т.е..nickel
->nick-el
) - Когда
y
между двумя гласными появляется а, делите слово после него (например,paying
->pay-ing
). - Когда один согласный находится между двумя гласными (одинаковыми или разными), разделите их перед согласными (т. Е.
dra-gon
) - Верните слово без изменений, если деление невозможно.
Я выбрал эти правила, потому что они могут быть применены рекурсивно без проблем и не требуют таблиц произношения. Таким образом, они не являются точными, и, например, правило № 5 часто не является правильным. В общем случае, хотя, это так.
пример
In: hello world
Out: hel-lo world
In: have a nice day
Out: have a nice day
In: pour some nickel and xenon there
Out: pour some nick-el and xe-non the-re
x-e-non
? Ссылка на правило № 4?lua
Ответы:
Рубин, 144 байта
Если мы идем к недостижимому, как насчет одного гигантского регулярного выражения?
какой-то вывод:
источник
Луа, 292
Lua, возможно, был не лучшим языком для этого, но это работает. Это в значительной степени течет как заданный вопрос. Правила в основном в порядке с некоторыми оптимизациями: # 2 пропущен (он не нужен, если в начале нет одного гласного слова с "ck"), а правила ck и y пройдены до остальной части # 4 и № 6, которые объединены. Поскольку некоторые гласные в слове должны быть записаны дважды (после одного дефиса и перед другим), этот поиск выполняется дважды.
Ungolfed
Проверьте это здесь: http://ideone.com/g57TzA
источник
Bash + coreultils, 173 байта
Я думаю, что у меня есть все последние изменения правил:
Обратите внимание, что последний символ последней строки - это
(пробел).
Я думаю, что это в достаточной степени удовлетворяет "нечитаемым и не поддерживаемым" ;-)
Принимает участие от STDIN.
В основном прямая замена регулярных выражений. Первая строка
sed
выражения соответствует по правилам 1 и 2, а затем просто переходит к:x
метке в конце выражения.Символы
tr
s в начале и в конце конвейера разделяют слова на новые, поэтому с ними легчеsed
иметь дело. Я надеялся сделать и всеsed
ответить, но этот способ проще и проще.Пример:
источник