Ruby 数组中的变异数
我试图写一些东西,让数组中的“1”可以模糊上面、下面和旁边的其他数字。例如,如果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
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
的坐标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]
#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