字数(红宝石)

时间:2014-11-23 22:33:44

标签: ruby word-count

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)

5 个答案:

答案 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

这应该解决它。