如何将每个循环应用于每个项目?

时间:2017-11-21 18:16:00

标签: ruby

我正在研究一个名为Image Blur的问题。我需要让我的代码从2D数组中获取项目(1或0),并且每1个,将相邻的0更改为1。到目前为止,我的代码对它遇到的第一个问题做得很好,但由于某种原因它不会循环其他代码。

class Image
  def initialize(image)
    @values = image
  end

  def find_ones
    ones = []
    @values.each_with_index do |row, row_index|
      row.each_with_index do |pixel, column_index|
        if pixel == 1
          coord = [row_index, column_index]
          ones << coord
        end
        puts "#{pixel} #{row_index} #{column_index}" if pixel == 1
      end
    end
    ones
  end

  def transform
    ones = find_ones
    ri = ones[0][0]
    ci = ones[0][1]
    ones.each do 
      @values[ri + 1][ci] = 1 if (ri + 1) <= 3
      @values[ri - 1][ci] = 1 if (ri - 1) >= 0
      @values[ri][ci + 1] = 1 if (ci + 1) <= 3
      @values[ri][ci - 1] = 1 if (ci - 1) >= 0
    end
  end


 def output_image
    @values.each do |row|
      puts row.join
    end
  end
end


image = Image.new([
  [0, 0, 0, 1],
  [0, 0, 0, 0],
  [0, 0, 0, 0],
  [0, 1, 0, 0]
])

image.transform
image.output_image

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的ones.each do通过ones但忽略了它们,因为您的区块没有参数。您基本上只需使用ones来确定运行块的频率

ri = ones[0][0]
ci = ones[0][1]
ones.each do 

应该是

ones.each do |ri, ci|

我很惊讶你find_ones正确(你做了类似的事情),但在transform做了一些奇怪的事情(设置rici就像那样)。