2012-08-04 42 views
1

我只是做了下面的代碼。我在語法和模式中看到很多重複(比如一次又一次使用臨時變量r,並且在不爲零時追加字符串)。我怎樣才能讓這更幹?我在C背景,只是想學習Ruby的方式來抽象和簡化,以獲得優雅的代碼...如何讓這個紅寶石代碼更幹DRY

# Traverse a matrix spirally 

def subm(m) 
    result=[] 
    if m.length>1 
    m[1..-2].each {|a| result << a[1..-2]} 
    end 
    result 
end 

def trav_sp(m) 
    result=[] 
    if not m.empty? 
    result += m[0] if m[0] 

    r=[] 
    m[1..-1].each {|a| r << a[-1]} if m[1..-1] 
    result += r 

    r=[] 
    if m[-1] 
     m[-1].each_with_index{|a,i| (r<< m[-1][-2-i] if m[-1][-2-i])} 
     result += r 
    end 

    r=[] 
    m.each_with_index {|a,i| (r<< m[0][-2-i] if m[0][-2-i])} 
    result += r 

    return result = result + trav_sp(subm(m)) 
    else 
    return result 
    end 

end 

回答

1

可以使用map,而不是反覆將元素添加到一個臨時數組,再加上一些其他的變化:

# Traverse a matrix spirally 

def subm(m) 
    m[1..-2].map {|a| a[1..-2]} 
end 

def trav_sp(m) 
    result = [] 

    if not m.empty? 
     result += m[0] if m[0] 
     result += m[1..-1].map {|a| a[-1]} if m[1..-1] 

     r = [] 
     if m[-1] 
      m[-1].each_with_index{|a,i| (r<< m[-1][-2-i] if m[-1][-2-i])} 
      result += r 
     end 

     r = [] 
     m.each_with_index {|a,i| (r << m[0][-2-i] if m[0][-2-i])} 
     result += r 

     result += trav_sp(subm(m)) 
    end 

    result 
end