Twoim zadaniem jest napisanie programu, który sylabuje słowa w ciągu tekstu, oddzielając je myślnikiem. To byłoby dużo pracy, więc chcesz pominąć niektóre części, głównie dlatego, że nie chcesz mieć tabeli wymowy wymaganej dla idealnego algorytmu. Chcesz również, aby był on tak krótki (a przez to nieczytelny i niemożliwy do utrzymania), jak to możliwe, jako zemsta za otrzymanie tego zadania.
Masz dwie możliwości:
- Napisz program, który pobiera ciąg ze STDIN i przekazuje wynik do STDOUT.
- Napisz funkcję, która bierze ciąg jako pojedynczy parametr i zwraca wynik.
Specyfikacja
- W tym przypadku łańcuch oznacza dowolną konstrukcję podobną do łańcucha w wybranym języku (tablice bajtów, tablice znaków, łańcuchy ...).
- Samogłoski są
a, e, i, o, u
- Podany ciąg ma
1 <= n <= 10
słowa, przy czym każdy ma długość między1 - 30
znakami, włącznie. Twoje dane wyjściowe powinny być wyrazami dzielonymi. - Wszystkie litery są pisane małymi literami, a słowa zawsze są oddzielane spacjami. Zatem dane wejściowe składają się ze znaków
[a-z ]
- Zastosuj reguły według ważności.
- Kiedy słowo jest podzielone, zacznij od prawej połowy słowa.
Reguły sylabizacji , w kolejności ich ważności
Dwa kolejne same samogłoski liczyć jako jeden (tj. feet
Posiada tylko jedną samogłoskę, ale beat
i finding
mają dwa). Każda sylaba ma dokładnie jedną samogłoskę, dlatego dla każdej samogłoski jest jedna sylaba.
- Jeśli całe słowo ma tylko cztery litery, zwróć je bez zmian. (pomiń to do końca słowa)
- Jeśli słowo ma tylko jedną samogłoskę, zwróć słowo bez zmian.
- Jeśli słowo ma dwie kolejne samogłoski, podziel je między sobą (tj.
diaspora
->di-as-po-ra
) - Kiedy dwie lub więcej spółgłosek występuje między dwiema samogłoskami (ta sama lub inna), podziel po pierwszej spółgłosce (tj.
sis-ter
), Chyba że część spółgłoski jestck
, w takim przypadku podziel słowo po niej. (tj.nickel
->nick-el
) - Kiedy a
y
występuje między dwiema samogłoskami, podziel słowo po nim (np.paying
->pay-ing
). - Gdy jedna spółgłoska występuje między dwiema samogłoskami (ta sama lub inna), podziel się przed spółgłoską (tj.
dra-gon
) - Zwróć słowo bez zmian, jeśli nie można wykonać podziału.
Wybrałem te reguły, ponieważ można je stosować rekurencyjnie bez problemów i nie wymagają tabel wymowy. Dlatego nie są one dokładne i na przykład reguła nr 5 często nie jest poprawna. Jednak w ogólnym przypadku tak jest.
Przykład
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
? Odniesienie do reguły nr 4?lua
Odpowiedzi:
Rubin, 144 bajty
Jeśli dążymy do niemożliwego do utrzymania, co powiesz o pojedynczym wyrażeniu regularnym?
niektóre dane wyjściowe:
źródło
Lua, 292
Lua może nie był najlepszym językiem do zrobienia tego, ale działa. Prawie płynie jak zadane pytanie. Reguły są głównie w porządku z pewnymi optymalizacjami: # 2 jest pomijane (nie jest potrzebne, chyba że na początku jest jedno samogłoskowe słowo z "ck"), a reguły ck i y są przestrzegane przed resztą # 4 i # 6, które są połączone. Ponieważ niektóre samogłoski w tym słowie muszą zostać przechwycone dwukrotnie (po jednym łączniku i przed drugim), wyszukiwanie jest wykonywane dwukrotnie.
Nie golfił
Przetestuj tutaj: http://ideone.com/g57TzA
źródło
Bash + coreultils, 173 bajty
Myślę, że mam wszystkie najnowsze zmiany zasad:
Zauważ, że ostatnim znakiem ostatniego wiersza jest
(spacja).
Myślę, że to wystarczająco spełnia „nieczytelne i nie do utrzymania” ;-)
Pobiera dane wejściowe ze STDIN.
Głównie proste podstawienie wyrażenia regularnego. Pierwszy wiersz
sed
wyrażenia pasuje do reguł 1 i 2, a następnie po prostu przeskakuje do:x
etykiety na końcu wyrażenia.Litery „
tr
s” na początku i na końcu potoku powodują, że słowa są oddzielone znakiem nowej linii, dzięki czemu łatwiejsed
sobie z nimi poradzić. Miałem nadzieję, że to zrobię i wszyscysed
odpowiedzą, ale ten sposób jest prostszy i łatwiejszy.Przykład:
źródło