Я новичок, тренирующийся в 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) — это очень простая форма сжатия данных, при которой ряды данных (то есть последовательности, в которых одно и то же значение данных встречается во многих последовательных элементах данных) сохраняются как одно значение данных и подсчитываются, а не как исходный пробег. Википедия
map!
? Цельюmap
является преобразование каждого элемента массива в другой массив с тем же количеством элементов, которое определяется блоком, переданнымmap
. Иmap!
заменяет каждый элемент исходного массива как таковой напрямую. - person lurker   schedule 21.08.2015map!
. Спасибо за быстрый ответ :) - person Guillermo García Serrano   schedule 21.08.2015break
в середине вашего блокаmap
, что является хорошим признаком того, что вы используете его неправильно. Больше похоже на то, что вы пытаетесь использовать его для перебора элементов массива, чтобы изменить другую переменную, что можно сделать с помощью чего-то вродеeach
. - person lurker   schedule 21.08.2015