Ruby Syllable计数器

时间:2017-09-22 07:39:02

标签: ruby

我正在尝试编写一些代码来执行以下操作(使用类):

  1. 放ha句
  2. 计算行并返回true是否有3行,如果没有3行则返回false。
  3. 计算ha句中的音节。
  4. 我能够实现的前两个。但是,我的音节计数器不起作用,我不知道为什么......这是我的代码。

    class SampleHaiku
      attr_accessor :paragraph
      def initialize(paragraph)
        @paragraph = paragraph
      end
      def paragraph
        @paragraph
      end
      def line_counter
        @paragraph.lines.count
        if @paragraph.lines.count == 3
          puts true
        else puts false
        end
      end
      def syllable_counter
        scount = []
        @paragraph.split(' ').each do |letter|
          if letter.to_s.downcase.include?("a")
            scount << letter
          elsif letter.to_s.downcase.include?("e")
          elsif letter.to_s.downcase.include?("i")
            scount << letter
          elsif letter.to_s.downcase.include?("o")
            scount << letter
          elsif letter.to_s.downcase.include?("u")
            scount << letter
          elsif letter.to_s.downcase.include?("y")
            scount << letter
          else scount << " "
          end
        end
        puts scount.to_s
        return scount.join('').split(' ').size
      end
    end
    haiku = SampleHaiku.new("green and speckled legs,
    hop on logs and lily pads
    splash in cool water")
    puts haiku.paragraph
    puts haiku.line_counter
    puts haiku.syllable_counter
    

    得出的是:

    green and speckled legs,
    hop on logs and lily pads
    splash in cool water
    true
    
    ["and", "hop", "on", "logs", "and", "lily", "pads", "splash", "in", "cool", 
    "water"]
    1
    

    --- ---编辑

    我考虑用于音节计数器的内容包括以下内容:

    1. 计算元音。

    2. Diagraphs(两个字母比拼写一个声音:“ai,ay,ee,ea,ie,ei,oo,oe,ey,ay,oy,au)算作一个元音(这是一般规则) ......我确信可能会有一些例外情况。)

    3. 包含双元音的单词计为一个元音。在我的帖子中,我只能根据多个来源计算我知道的元音只有大约75%的元音。

    4. 显然我无法将第二和第三个选项纳入此选项,但根据我在网上看到的不同来源,第一个选项在75%的时间内是正确的。

      另外,当我将ha句文改为

      “haikus很容易

      有时它们没有意义

      冰箱“

      到目前为止建议的代码给出了以下内容......

      def syllable_counter
        scount = []
      @paragraph.split("").each do |letter|
        if letter.to_s.downcase.include?("a")
          scount << letter
        elsif letter.to_s.downcase.include?("e")
          scount << letter
        elsif letter.to_s.downcase.include?("i")
          scount << letter
        elsif letter.to_s.downcase.include?("o")
          scount << letter
        elsif letter.to_s.downcase.include?("u")
          scount << letter
        elsif letter.to_s.downcase.include?("y")
          scount << letter
        else scount << " "
        end
      end
      scount.to_s
      return scount.join('').split(' ').size
      end
      

       haikus are easy
       sometimes they do not make sense
       refrigerator
       22
      

      对战

      def syllable_counter
        @paragraph.scan(/[aiouy]+e*|e(?!d$|ly).|[td]|ed|le$/).size
      end
      

      put

       haikus are easy
       sometimes they do not make sense
       refrigerator
       25
      

1 个答案:

答案 0 :(得分:3)

你正在做的只是用元音检查每个单词(由于某种原因除了e)并将其添加到数组中。

通过@paragraph.split(' ')进行分词而不是字母。如果要分成字母,则必须@paragraph.split("")。但即便如此,那只会计算元音的数量

您可以查看第一个答案here。它有一个非常好的简单解决方案与正则表达式。

你可以这样做 @paragraph.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size

它不完美,但大部分时间都有效。

如果你想要一个完美的解决方案,需要更多的思考和英语语言知识。