2016-12-25 50 views
2

这是我的代码在红宝石的字压缩。 对于任何给定的单词(例如abbbcca),压缩的单词/输出应采用格式“letter + repeat”(例如,输出:a1b3c2a1)。弦乐压缩器(红宝石)

在这里,我很接近完成,但我的结果不在预期格式。它正在计算整个string.chars.each中的字母,因此得到的结果为a2b3c2a2

任何帮助?

def string_compressor(string) 
    new_string = [] 
    puts string.squeeze 

    string.squeeze.chars.each { |s| 
    count = 0 

    string.chars.each { |w| 
     if [s] == [w] 
     count += 1 
     end 
    } 

    new_string << "#{s}#{count}" 
    puts "#{new_string}" 
    } 

    if new_string.length > string.length 
    return string 
    elsif new_string.length < string.length 
    return new_string 
    else "Equal" 
    end 
end 

string_compressor("abbbcca") 
+1

[连续字母频率]的可能重复(http://stackoverflow.com/questions/27713412/consecutive-letter-frequency) – akuhn

回答

2
'abbbcca'.chars.chunk{|c| c}.map{|c, a| [c, a.size]}.flatten.join 

a similar question改编。

类似:

'abbbcca'.chars.chunk{|c| c}.map{|c, a| "#{c}#{a.size}"}.join 

chunk documentation

+0

'.each_char.chunk(&:本身).flat_map {| l,arr | [l,arr.size]}。join' - short ways – Ilya

+0

'abbbcca'.split('')。chunk {| i | i} .to_a.map {| k,v | [k,v.size]}。join –

0

正如你所说,你的代码计数字符串中的每一个字母,而不仅仅是一个分组旁边彼此。

下面是修改后的版本:

def display_count(count) 
    if count == 1 
    "" 
    else 
    count.to_s 
    end 
end 

def string_compressor(string) 
    new_string = '' 
    last_char = nil 
    count = 0 

    string.chars.each do |char| 
    if char == last_char 
     count += 1 
    else 
     new_string << "#{last_char}#{display_count(count)}" if last_char 
     last_char = char 
     count = 1 
    end 
    end 

    new_string << "#{last_char}#{display_count(count)}" if last_char 

    new_string 
end 

p string_compressor('abbbcca') #=> "ab3c2a" 
p string_compressor('aaaabbb') #=> "a4b3" 
p string_compressor('aabb') #=> "a2b2" 
p string_compressor('abc')  #=> "abc" 

注意与display_count从字符串除去1 S,new_string不能长于string。将Equal作为所谓的压缩字符串返回也可能不是一个好主意。

要解串:

def string_decompressor(string) 
    string.gsub(/([a-z])(\d+)/i){$1*$2.to_i} 
end 

p string_decompressor("a5b11") #=> "aaaaabbbbbbbbbbb" 
p string_decompressor("ab3c2a") #=> "abbbcca" 
1

您可以使用正则表达式为。

'abbbcca'.gsub(/(.)\1*/) { |m| "%s%d" % [m[0], m.size] } 
    #=> "a1b3c2a1" 

正则表达式读,“匹配任何字符,捕捉它在组1。然后匹配捕获组1零次或多次的内容”。