@ruhroe大约一小时前发布了以下问题。当它被取消时,我正要发布一个答案。这很不幸,因为我认为它很有趣。如果OP看到这一点,我会把它重新放回去,并让其他人有机会发布解决方案。
原始问题(我编辑过):
问题是在字符串中的某些空格上拆分字符串,这取决于部分取决于用户给出的数字的标准。如果该数字为5,则每个子字符串将包含:
例如,如果字符串是:
"abcdefg fg hijkl mno pqrs tuv wx yz"
结果将是:
["abcdefg", "fg", "hijkl", "mno", "pqrs", "tuv", "wx yz"]
"abcdefg"
位于一个单独的行上,因为它至少包含五个字符。"fg"
位于一个单独的行上,因为"fg"
包含5个或几个字符,当与后面的单词结合使用时,它们之间有空格,结果字符串"fg hijkl"
包含更多超过5个字符。"hijkl"
位于单独的一行,因为它符合两个条件。我该怎么做?
答案 0 :(得分:3)
我相信这样做:
str = "abcdefg fg hijkl e mn pqrs tuv wx yz"
str.scan(/\b(?:\w{5,}|\w[\w\s]{0,3}\w|\w)\b/)
#=> ["abcdefg", "fg", "hijkl", "e mn", "pqrs", "tuv", "wx yz"]
答案 1 :(得分:1)
当您遍历集合中的单词时(将原始字符串拆分为单词应该是微不足道的),似乎有三种可能的情况:
这样的事情应该有效(注意 - 我还没有在你的解决方案之外进行过这样的测试。你绝对想要这样做):
words.each do |word|
if line.blank?
# this is a new line, so start it with the current word
line << word
elsif word_can_fit_line?(line, word, length)
# the word fits, so append it to the current line
line << " #{word}"
else
# the word doesn't fit, so keep this line and start a new one with
# the current word
lines << line
line = word
end
end
# add the last line and we're done
lines << line
lines
请注意word_can_fit_line?
的实现应该是微不足道的 - 您只想查看当前行长度加上空格加上字长是否小于或等于您想要的行长度。