2016-12-25 83 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零次或多次的內容」。