CoderByte提出了以下挑战:“使用Ruby语言,让函数WordCount(str)获取传递的str字符串参数,并返回字符串包含的单词数量(即”Never eat shredded wheat“将返回4 )。单词将用单个空格分隔。“
我解决了它,但有一个更简单的解决方案(不使用正则表达式或.length以外的方法)?我在for循环内部的for循环中有一个条件内部条件。我还在第一个for循环的内部和外部将当前变量设置为false。
这些糟糕的行为吗?有更好的解决方案吗?
def WordCount(string)
alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
counter = 0
current = false
for i in 0...string.length
prev = current
current = false
for j in 0...alphabet.length
if string[i] == alphabet[j]
current = true
if prev == false
counter += 1
end
end
end
end
return counter
end
WordCount(STDIN.gets)
答案 0 :(得分:6)
它 涉及正则表达式,但它是正确的解决方案:
"Hi there 334".scan(/[[:alpha:]]+/).count # => 2
答案 1 :(得分:3)
嗯,
s = "Never eat shredded wheat"
puts s.split.count
# => 4
如果您不想计算下划线和数字:
s = "Never eat shredded wheat 1 _ ?"
puts s.split.reject { |w| w =~ /(\W|_|\d)/ }.count
# => 4
更高级的正则表达式:
s = "Never __ 111 ?? eat shredded wheat. _Word?"
p s.split.reject { |w| w !~ /([a-zA-Z]+(_[a-zA-Z]+)*)/ }
# => ["Never", "eat", "shredded", "wheat.", "_Word?"]
答案 2 :(得分:1)
我在Ruby中查找字数的最优雅的解决方案是:
words = 'This is a word'
p words.scan(/\S+/).size #=> 4
为了方便起见,猴子补丁字符串:
class String
def number_of_words
self.scan(/\S+/).size
end
end
p 'Hi there, how are you?'.number_of_words #=> 5
我在你的代码中看到的主要问题是你正在编码,但是你没有使用Ruby(样式)进行编码。你很少会看到人们在这里使用/,例。如果您知道如何编写惯用的Ruby,那么在其他语言中需要10行的代码在这里只需要1行。
答案 3 :(得分:1)
标点符号显然是个问题。除了在其他地方提到的撇号之外,老学者用某些词组连字符,例如复合形容词,破折号用于引用条款,省略号(例如,符号“......”或多个句号)表示继续或改变思想,斜杠提供选择等。解决这个问题的一种方法(不使用regrex)将首先使用String#tr(或String#gsub)将这些标点字符转换为空格(如果您想要“删除”,请删除'
t“被视为一个词”:
def word_count str
str.tr("'-/–…\.", ' ').split.size
end
word_count "It was the best of times, it was the worst of times"
#=> 12
word_count "I don't think his/her answer is best."
#=> 9
word_count "Mozart is a much-beloved composer." # with hyphen
#=> 6
word_count "I pay the bills–she has all the fun." # with dash
#=> 9
word_count "I wish you would…oh, forget it." # with ellipse
#=> 7
word_count "I wish you would––oh, forget it." # with dashes
#=> 7
word_count ""
#=> 0
在Mac上,输入短划线作为选项,连字符;一个椭圆,选项,分号(或“分号”,两者都被接受:-))。
现在我们只需弄清楚如何将带连字符的单词(“最先进的”)作为单个单词计算。实际上,我刚刚触及了这个复杂主题的表面。对不起,如果我被带走了。又是什么问题?
答案 4 :(得分:0)
string = '' => Your string will be stored in this variable
word_count = string.split(' ').count
这应该解决它。