我在使用2D ruby数组时遇到了一些问题,当我进行数组切片时,我的LOC减少了很多。例如,
require "test/unit"
class LibraryTest < Test::Unit::TestCase
def test_box
array = [[1,2,3,4],[3,4,5,6], [5,6,7,8], [2,3,4,5]]
puts array[1][2..3] # 5, 6
puts array[1..2][1] # 5, 6, 7, 8
end
end
我想知道是否有办法获得对角切片?让我们说我想从[0,0]开始并想要一个3的对角切片。然后我会得到[0,0],[1,1],[2,2]的元素,我会得到一个类似的数组[1,4,7]例如上面。是否有任何神奇的单行红宝石代码可以实现这一目标? 3次做{某些神奇的东西?}
答案 0 :(得分:13)
puts (0..2).collect { |i| array[i][i] }
答案 1 :(得分:5)
更好的可能是利用Matrix库的单行:
require 'matrix'
Matrix.rows(array).each(:diagonal).to_a
答案 2 :(得分:3)
基于Get all the diagonals in a matrix/list of lists in Python
的Ruby代码段这是为了得到所有的对角线。无论如何,我们的想法是从不同的侧面填充阵列,使对角线在行和列中对齐:
arr = [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [2, 3, 4, 5]]
# pad every row from down all the way up, incrementing the padding.
# so: go through every row, add the corresponding padding it should have.
# then, grab every column, that’s the end result.
padding = arr.size - 1
padded_matrix = []
arr.each do |row|
inverse_padding = arr.size - padding
padded_matrix << ([nil] * inverse_padding) + row + ([nil] * padding)
padding -= 1
end
padded_matrix.transpose.map(&:compact)
答案 3 :(得分:0)
我正在选择@Shai的答案,并建议使其更实用。
首先我们初始化数组:
arr = [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [2, 3, 4, 5]]
然后我们准备用作填充的数组:
padding = [*0..(arr.length - 1)].map { |i| [nil] * i }
=> [[], [nil], [nil, nil], [nil, nil, nil]]
然后,将填充应用于数组。如果您颠倒了第一次使用 填充还是第二个填充取决于您要向下还是向上 对角线。
padded = padding.reverse.zip(arr).zip(padding).map(&:flatten)
=> [[nil, nil, nil, 1, 2, 3, 4], [nil, nil, 3, 4, 5, 6, nil], [nil, 5, 6, 7, 8, nil, nil], [2, 3, 4, 5, nil, nil, nil]]
然后我们按照@Shai的解决方案进行转置:
padded.transpose.map(&:compact)
=> [[2], [5, 3], [3, 6, 4], [1, 4, 7, 5], [2, 5, 8], [3, 6], [4]]