0

次のことを行うメソッドを書く必要があります

consecutive_count("aaabbcbbaaa") == [["a", 3], ["b", 2], ["c", 1], ["b", 2], ["a", 3]]

コードを取得しましたが、見栄えが悪く、より良い解決策を見つけようとしています。アドバイスをお願いします。

これが私のコードです:

def consecutive_count(str)

  el = str[0]; count = 0; result = []
  str.split("").each do |l|

    if (el != l)
      result << [el, count]
      count = 1
      el = l
    else
      count +=1
    end

  end
  result << [el, count] if !el.nil?

  return result

end
4

5 に答える 5

3
"aaabbcbbaaa".scan(/(?<s>(?<c>.)\k<c>*)/).map{|s, c| [c, s.length]}
# => [["a", 3], ["b", 2], ["c", 1], ["b", 2], ["a", 3]]

また

"aaabbcbbaaa".scan(/((.)\2*)/).map{|s, c| [c, s.length]}
# => [["a", 3], ["b", 2], ["c", 1], ["b", 2], ["a", 3]]
于 2013-11-07T17:09:05.027 に答える
3

ここに1つの方法があります:

s = "aaabbcbbaaa"
s.chars.chunk{|e| e }.map{|item,ary| [item,ary.size]}
# => [["a", 3], ["b", 2], ["c", 1], ["b", 2], ["a", 3]]
于 2013-11-07T18:12:24.090 に答える
0

正規表現マジックを使用しないソリューションは次のとおりです (ただし、それらは少し短く、おそらく高速です)。

str.each_char.each_with_object([]) do |char, result|
  if (result.last || [])[0] == char
    result.last[1] += 1
  else
    result << [char, 1]
  end
end

あなたの理解度に応じて、意図した意味をよりよく伝えることができ、6か月で物事をデバッグするのに役立つかもしれません:)

于 2013-11-07T17:22:44.927 に答える
-1

あなたが試すことができます:

def consecutive_count(str)
  result = {}
  array = str.split(//).uniq
  array.each.map {|char| result[char] = 0}
  array.each do |char|
    while str.starts_with?(char) do        
      result[char] += 1
      str[0] = ""
   end
  result
end
于 2013-11-07T17:05:43.570 に答える