我正在写一个脚本,它需要两个参数,一个二维数组(全0和1)以及最大垂直距离n,并返回一个修改后的数组。使得如果n = 3以下数组红宝石阵列金字塔形修改
[[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,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,0,0],
[0,0,0,0,0,0,0]]
返回
[[0,0,0,1,0,0,0],
[0,0,1,1,1,0,0],
[0,1,1,1,1,1,0],
[1,1,1,1,1,1,1],
[0,1,1,1,1,1,0],
[0,0,1,1,1,0,0],
[0,0,0,1,0,0,0]]
(数组输入可以具有任何尺寸的矩形;任何元件可以是10)。
我的想法是克隆原始数组,将其扫描为1,并将更改映射到克隆中。我想先右侧,然后映射改变原来的1
左边我得到了以下的工作,这改变了阵列的中心柱:
a = [[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,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,0,0],
[0,0,0,0,0,0,0]]
cloned = a.map(&:clone)
n = 3
a.each.with_index do |whole_row, row|
whole_row.each.with_index do |cell, column|
if cell == 1
#center column
row_path = row - n
(n*2+1).times do
unless (cloned[row_path][column]).nil?
cloned[row_path][column] = 1
end
row_path += 1
end
end
end
end
cloned
但是,当我尝试将此过程迭代到右侧时,我得到了undefined method '[]' for nil:NilClass
。我在哪里搞乱这里的逻辑?
a = [[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,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,0,0],
[0,0,0,0,0,0,0]]
cloned = a.map(&:clone)
n = 3
a.each.with_index do |whole_row, row|
whole_row.each.with_index do |cell, column|
if cell == 1
#central column & right side
row_path = row - n
column_path = column
repetition = 2 * n + 1
(n+1).times do
(repetition).times do
unless cloned[row_path][column_path].nil?
cloned[row_path][column_path] = 1
end
row_path += 1
end
repetition -= 2
column_path += 1
row_path += 1
end
end
end
end
cloned
(我的想法是执行此程序两次,在原始数组的右侧,然后左侧)。
您需要在单词中定义“最大垂直距离”(通过编辑您的问题)。这个例子是不够的。另外,你的意思是什么元素可以是10? –