Сложи английские слова - вид

11

Вам поручено написать программу, в которой слова составляются в виде строки текста, разделяя их дефисом. Это было бы много работы, поэтому вы хотите пропустить некоторые части, в основном потому, что вы не хотите иметь таблицу произношения, необходимую для идеального алгоритма. Вы также хотите сделать его как можно более коротким (и, следовательно, нечитаемым и не поддерживаемым), чтобы отомстить за выполнение этого задания.

У вас есть два варианта:

  • Напишите программу, которая берет строку из STDIN и выводит результат в STDOUT.
  • Напишите функцию, которая принимает строку как один параметр и возвращает результат.

Технические характеристики

  • В этом случае строка означает любую строковую конструкцию на выбранном вами языке (байтовые массивы, символьные массивы, строки ...).
  • Гласные a, e, i, o, u
  • В данной строке есть 1 <= n <= 10слова, каждый из которых имеет длину между 1 - 30символами включительно. На выходе должны быть слова с переносом слов.
  • Все буквы строчные, а слова всегда разделены пробелами. Таким образом, вход состоит из символов[a-z ]
  • Применяйте правила в порядке важности.
  • Когда слово разделено, начните снова с правой половины слова.

Правила для слогов , в порядке важности

Два последовательных одинаковых гласных считаются одним (т. Е. feetИмеет только один гласный, но beatи findingимеют два). Каждый слог имеет ровно один гласный, поэтому для каждого гласного есть один слог.

  1. Если все слово содержит только четыре буквы, верните его без изменений. (пропустите это для остальной части слова)
  2. Если слово имеет только одну гласную, верните слово без изменений.
  3. Если слово имеет два последовательных гласных, разделите их (т. Е. diaspora-> di-as-po-ra)
  4. Когда два или более согласных находятся между двумя гласными (одинаковыми или разными), делите после первого согласного (т.е. sis-ter), если согласная часть не является ck, и в этом случае делите слово после него. (т.е.. nickel-> nick-el)
  5. Когда yмежду двумя гласными появляется а, делите слово после него (например, paying-> pay-ing).
  6. Когда один согласный находится между двумя гласными (одинаковыми или разными), разделите их перед согласными (т. Е. dra-gon)
  7. Верните слово без изменений, если деление невозможно.

Я выбрал эти правила, потому что они могут быть применены рекурсивно без проблем и не требуют таблиц произношения. Таким образом, они не являются точными, и, например, правило № 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
seequ
источник
Вы уверены x-e-non? Ссылка на правило № 4?
Джон Дворжак
@JanDvorak «Когда слово разделено, начните снова с правой половины слова.», А затем правило № 6.
seequ
Я имею в виду, не должно ли правило № 4 разделяться только на слоги?
Джон Дворжак
1
Правило № 1 касается четырехбуквенных слов. Как насчет слов с менее чем четырьмя буквами? напр.lua
цифровая травма
1
@DigitalTrauma У них нормальное положение, но редко есть два слога.
Seequ

Ответы:

6

Рубин, 144 байта

Если мы идем к недостижимому, как насчет одного гигантского регулярного выражения?

puts gets.split.map {|w| w.scan(/(^.{4}$|[^aeiou]*([aeiou])\2?((?=[^aeiouy]?[aeiou])|ck|[^aeiou]((?=.*[aeiou])|.*$)|$))/).map(&:first)*'-'}*' '

какой-то вывод:

echo "hello world" | ruby syllable.rb
hel-lo world

echo "have a nice day" | ruby syllable.rb
have a nice day

echo "pour some nickel and xenon in there" | ruby syllable.rb
pour some nick-el and xe-non in the-re

echo "diaspora dragon paying sister hemlock happy quicksilver" | ruby syllable.rb
di-as-po-ra dra-gon pay-ing sis-ter hem-lock happy qu-ick-sil-ver
YenTheFirst
источник
8

Луа, 292

Lua, возможно, был не лучшим языком для этого, но это работает. Это в значительной степени течет как заданный вопрос. Правила в основном в порядке с некоторыми оптимизациями: # 2 пропущен (он не нужен, если в начале нет одного гласного слова с "ck"), а правила ck и y пройдены до остальной части # 4 и № 6, которые объединены. Поскольку некоторые гласные в слове должны быть записаны дважды (после одного дефиса и перед другим), этот поиск выполняется дважды.

i=io.read()v="([aeiou])"for s in i:gfind("%l+ ?")do
if s:len()~=4 then
s=s:gsub(v..v,function(x,y)if x==y then return x..y;end;return x.."-"..y;end)s=s:gsub("ck"..v,"ck-%1")s=s:gsub(v.."y"..v,"%1y-%2")for b=1,2 do
s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")end
end
io.write(s)end

Ungolfed

function checkEquals(x,y)
    if x==y then 
        return x..y
    end
    return x.."-"..y
end
i=io.read()
v="([aeiou])"
for s in i:gfind("%l+ ?") do
    if s:len()~=4 then
        s=s:gsub(v..v,checkEquals)
        s=s:gsub("ck"..v,"ck-%1")
        s=s:gsub(v.."y"..v,"%1y-%2")
        for b=1,2 do
            s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")
        end
    end
    io.write(s)
end

Проверьте это здесь: http://ideone.com/g57TzA

нексус
источник
У меня нет рубина, но, похоже, все в порядке.
seequ
4

Bash + coreultils, 173 байта

Я думаю, что у меня есть все последние изменения правил:

v=aeiou
r="[$v])/\1-\2/g"
s=s/\([$v]
e="$s[^$v-])([^$v-]+$r
"
tr \  \\n|sed -r "/^([a-z]{4}|[^$v]*[$v][^$v]*)$/bx
$s)($r
${s}ck)($r
$e$e${s}y)($r
$s)([^$v-]$r
:x"|tr \\n \ 

Обратите внимание, что последний символ последней строки - это (пробел).

Я думаю, что это в достаточной степени удовлетворяет "нечитаемым и не поддерживаемым" ;-)

Принимает участие от STDIN.

В основном прямая замена регулярных выражений. Первая строка sedвыражения соответствует по правилам 1 и 2, а затем просто переходит к :xметке в конце выражения.

Символы trs в начале и в конце конвейера разделяют слова на новые, поэтому с ними легче sedиметь дело. Я надеялся сделать и все sedответить, но этот способ проще и проще.

Пример:

$ ./sylabify.sh <<< "diaspora nickel sister dragon hello world have a nice day pour some nickel and xenon there paying tricks quicksilver"
di-as-po-ra nick-el sis-ter dra-gon hel-lo world have a nice day pour some nick-el and xe-non the-re pay-ing tricks qu-ic-ksil-ver $ 
Цифровая травма
источник
Я продолжаю забывать, что правило № 3 изменилось. Все хорошо.
Seequ