使用 Ruby 搜索矩阵

Searching through a matrix with Ruby

我有一个这样的矩阵:

0 1 0 0 1 0
1 0 1 0 1 0
0 1 0 1 0 0
0 0 1 0 1 1
1 1 0 1 0 0
0 0 0 1 0 0

如何在 Ruby 中定义一个矩阵,然后在其中进行搜索?

我想编写一个程序来搜索所有行和 returns 总和为“1”的行。

在Ruby中定义矩阵的快速方法:

Array.new 6, Array.new(6, 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, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]
     ]

上面的代码初始化了一个包含 6 个项目的数组,并将它们的值默认为第二个参数,这是另一个包含 6 个项目的数组,默认值为 0。

在其他命令式语言中,您将使用嵌套循环:

matrix = []
for x in [0,1,2,3,4,5]
  for y in [0,1,2,3,4,5]
    matrix[x] ||= [] # create the row as an empty array
    matrix[x] << y # push the y value to it
  end
end
# matrix is now:
# => [ 
       [0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5],
       [0, 1, 2, 3, 4, 5]
     ]

搜索矩阵并找到总和最大的行:

greatest_sum_row_index = 0
greatest_sum = 0

matrix.each_with_index do |row, i|
  # row.inject(:+) is a shortcut to adding each int in the array and returning the sum
  sum = row.inject(:+)
  if sum > greatest_sum
    greatest_sum = sum
    greatest_sum_row_index = i
  end
end

# highest_row is now the index of the greatest sum row
matrix[greatest_sum_row_index] # returns the row with the greatest sum

如果数组很大并且需要考虑内存需求,您可以这样做:

def rows_with_most_ones(arr)
  arr.each_with_index.with_object([-1, nil]) do |(row,i),best|
    tot = row.count(1)
    case tot<=>best.first
    when 1 then best.replace([tot, [i]])
    when 0 then best.last << i
    end
  end
end

arr = [[0, 1, 0, 0, 1, 0], 
       [1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 0],
       [0, 0, 1, 0, 1, 1],
       [1, 1, 0, 1, 0, 0],
       [0, 0, 0, 1, 0, 0]]

rows_with_most_ones(arr)
  #=> [3, [1, 3, 4]]