2次元の配列(すべて0と1)と最大垂直距離nの2つのパラメタをとり、修正された配列を返すスクリプトを書いています。その結果、その次の配列の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
(私の考えは、この手順を元の配列の右と左に2回実装することです)。
"最大垂直距離"を単語で定義する必要があります(質問を編集してください)。この例では十分ではありません。また、どの要素が10になることができますか? –