3

私は codewars でトレーニングを始めた初心者ですが、この RLE 問題のどこに間違いがあるのか​​ わかりません。手順は次のとおりです。

あなたの仕事は、そのようなランレングスのエンコーディングを書くことです。与えられた文字列に対して、ペア (または配列) [ (i1, s1), (i2, s2), …, (in, sn) ] のリスト (または配列) を返します。文字 sx を ix 回使用し、それらすべての文字列を連結します。ランレングス エンコーディングは最小限にする必要があります。すべての i について、値 si と si+1 は異なる必要があります。

>rle("hello world!")
# => [[1,'h'],[1,'e'],[2,'l'],[1,'o'],[1,' '],[1,'w'],[1,'o'],[1,'r'],[1,'l'],[1,'d'],[1,'!']]

>rle("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbb")
# => [[34,'a'], [3,'b']]

そして、ここに私のコードがあります:

def rle(str)
  result=[[]]
  str.to_s.split.each do |word| #"Hello World"->["Hello","World!"]-->"Hello", "World!"
    new_word_count=[[]]
    word.each_char do |char| #"H","e","l"...
      new_char=true
      new_word_count.map! do |find|
        if find[1]==char
        find[0]+=1
        new_char=false
        break
        end
      end
      if new_char==true
        new_word_count<<[1,'char']
      end
    end
    result+=new_word_count
  end
  result
end

次のエラーが表示されます。

`block (3 levels) in rle': undefined method `[]' for nil:NilClass (NoMethodError)
from `map!'
from  `block (2 levels) in rle'
from  `each_char'
from  `block in rle'
from  `each'
from  `rle'
from  `
'

ランレングス エンコーディング (RLE) は、非常に単純な形式のデータ圧縮であり、ラン データ (つまり、同じデータ値が多くの連続するデータ要素で発生するシーケンス) が単一のデータ値として格納され、カウントされるのではなく、オリジナルランとして。ウィキペディア

4

2 に答える 2

1
def rle s
  s.each_char.inject([]) do |memo, c| 
     memo.last && c == memo.last.last ? memo.last[0] += 1 : memo << [1, c]
     memo
  end
end

ここで最後の文字 ( memo.last.last) を確認し、現在と同じ場合はカウンターを増やします。それ以外の場合は、新しい配列をリストに追加します。

于 2015-08-21T12:07:11.577 に答える