您的任务是编写一个程序,该程序通过用连字符将单词分隔成一串文字。那将是很多工作,所以您想跳过一些部分,主要是因为您不想拥有完美算法所需的发音表。您还希望使它尽可能短(因此难以理解和难以维护),以作为为此任务分配的报仇。
您有两种选择:
- 编写一个程序,该程序从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
) - 当a
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
@JanDvorak“当一个单词被分割时,请从单词的右半部分重新开始。”,然后是规则6。
—
seequ 2014年
我的意思是,规则4不应该只在音节之间分割吗?
—
约翰·德沃夏克
规则1处理四个字母词。少于四个字母的单词呢?例如
—
Digital Trauma 2014年
lua
@DigitalTrauma他们通常会受到起诉,但很少有两个音节。
—
seequ 2014年
x-e-non
吗?规则4的参考?