Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 数组中的变异数_Ruby_Methods_Undefined - Fatal编程技术网

Ruby 数组中的变异数

Ruby 数组中的变异数,ruby,methods,undefined,Ruby,Methods,Undefined,我试图写一些东西,让数组中的“1”可以模糊上面、下面和旁边的其他数字。例如,如果 image = Image.new([ [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0] ]) 产出将是: 0100 1110 0111 0010 所以我写了一些代码如下: class Image def initialize(data) @data = data end def output_image @data.ea

我试图写一些东西,让数组中的“1”可以模糊上面、下面和旁边的其他数字。例如,如果

image = Image.new([
[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0]
])
产出将是:

0100
1110
0111
0010
所以我写了一些代码如下:

class Image
  def initialize(data)
    @data = data
  end

  def output_image
    @data.each do |pixel_row|
      pixel_row.each do |pixel_value|
        print pixel_value
      end

      print "\n"
    end
  end

  def blur
    ###find the location of "1"#######
    @data.each_with_index do |row, row_position|
      row.each_with_index do |pixel, col_position|
        if pixel == 1
          #left
          @data[row_position][col_position-1] = 1 if col_position > 0
          #right
          @data[row_position][col_position+1] = 1 if col_position < @data[row_position].length - 1
          #above
          @data[row_position-1][col_position] = 1 if row_position > 0
          #below
          @data[row_position+1][col_position] = 1 if row_position < @data.length - 1
        end
      end
    end
  end

end

image = Image.new([
                  [0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 1, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 1, 0, 0]
])
image.output_image
image.blur
类图像
def初始化(数据)
@数据=数据
结束
def输出图像
@数据。每个do |像素|行|
像素_行。每个do |像素_值|
打印像素值
结束
打印“\n”
结束
结束
def模糊
###查找“1”的位置#######
@data.each_与_索引do |行,行位置|
行。每个带有索引do的像素,列位置|
如果像素==1
#左
@如果列位置>0,则数据[行位置][列位置-1]=1
#对
@数据[行位置][列位置+1]=1,如果列位置<@data[行位置]。长度-1
#在上面
@如果行位置>0,则数据[行位置-1][列位置]=1
#下面
@如果行位置<@data.length-1,则数据[行位置+1][列位置]=1
结束
结束
结束
结束
结束
image=image.new([
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0]
])
image.output\u图像
图像模糊

目前我的问题是,1s旁边的数字和1s以下的数字都会变成1s

要实现你想要做的事情,你可以做如下的事情

  • 首先找到存在
    1
    的坐标
  • 然后根据问题陈述书的要求,列出和这些坐标相邻的坐标(垂直或水平)。如果给定(x,y)坐标,则其左侧相邻坐标为(x-1,y),右侧相邻坐标为(x,y+1,上方为(x,y-1),下方相邻坐标为(x,y+1)
  • 在确定相邻坐标时,确保你在边界之内-如果我们考虑<代码>图像<代码>是二维数组,那么它的维度是“代码>图像。长度 x<代码>图像。首先,长度 .COD>图像。第一个< /Cord>返回第一个元素<代码>图像< /代码>数组。在下面的样本运行中,<代码>图像< /代码>尺寸
    4 x 4
  • 更新
    图像
    数组,并将值设置为
    1
    ,以确定为与具有值
    1
    的坐标相邻的所有坐标
  • 下面是上述逻辑的代码

    # A helper method to display the image as grid
    def display(ary, msg)
        puts msg if msg
        ary.each do |i| 
            puts i.join(" ")
        end
    end
    
    def blur(image)
        # Co-ordinates of all 1's
        pos = []
        image.each_with_index do |arr, i|
            arr.each_with_index do |ele, j|
               pos << [i, j] if ele == 1
            end
        end
    
        # Adjacent co-ordinages
        adj_pos = pos.flat_map {|i, j| [[i,j+1],[i+1,j],[i-1,j],[i,j-1]] }
                       .reject do |i,j|  # Reject out-of-bounds co-ords
                           i < 0 || 
                           i >= image.length || 
                           j < 0 || 
                           j >= image.first.length 
                        end
    
        # Update to image
        adj_pos.each {|i, j| image[i][j] = 1}
    end
    
    
    image = [
        [0, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 0]
    ]
    
    
    display(image, "Before blur")
    blur(image)
    display(image, "After blur")
    
    对于上面的示例运行:

  • pos
    的值将是
    [[1,1],[2,2]]
    ,这是存在
    1
    的两个坐标
  • adj_pos
    的值将是
    [[1,2],[2,1],[0,1],[1,0],[2,3],[3,2],[1,2],[2,1]
  • if on
    #blur
    的实现方式导致了您的错误:

    #below
    @data[row_position+1][col_position] = 1 if row_position == @data.length - 1
    
    请注意,即使您已经在读取
    数组的最后一行,您的检查
    行位置==@data.length-1
    也将返回true,即:

    [0, 0, 0, 0, 1, 0, 0]
    
    在您的示例中。因此,此行将尝试在不存在的行(最后一行之后的下一行)上设置一个数字
    1
    。有意义吗

    要将此行更改为:

    #below
    @data[row_position+1][col_position] = 1 if row_position == @data.length - 2
    

    将解决此错误。但我认为(我不确定,因为我现在不在终端中)您将发现与此类似的其他错误。

    我更改了“模糊”方法,错误消失了。但模糊不起作用。如果col\u position>0如果col\u position<@data[row\u position].length-1如果row_position>0如果row_position<@data.length-1您是如何调试的?我经常使用的一种方法是在纸和笔上遍历一些测试用例(例如row_position==1,col_position==2),然后阅读每行代码,看看我编写的代码是否符合我的要求我想你会发现一个错误:)我愿意打赌,如果你做
    行位置+1
    列位置+1
    @SergioTulentsev,这是一个越界错误。谢谢你的回答!你说到点子上了。我现在面临这两个问题lines@Julie谢谢你。你的建议很有帮助。我正在逐步解决一些错误并继续努力。这对他来说真的不太好让他在代码中找到错误,是吗?@SergioTulentsev我拿了一个,我想我可以提供一个(相对而言)更干净的解决方案。如果我缺少一些SO指导原则,请告诉我,我不太关注元部分,因此我是这方面的新手。在我看来,Ken更感兴趣的是找出他的代码不起作用的原因,而不是让别人给他完整的解决方案。你的解决方案很好/干净,但我认为Ken要完全理解它还为时过早@SergioTulentsev感谢你理解我的观点。我希望我能更多地理解Wandm Maker的答案。我对ruby on rails还是太新了。“将解决这个bug”-不。它将把它转换成另一个。现在逻辑无法正确工作。非常感谢Ricardo。在我像刚才发布的那样更改代码后,方法错误得到了解决。
    #below
    @data[row_position+1][col_position] = 1 if row_position == @data.length - 2