Ruby получает диагональные элементы в 2d Array - PullRequest
8 голосов
/ 24 марта 2010

Я пытался решить некоторые проблемы с моим 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. Times {некоторые магические вещи?}

Ответы [ 3 ]

13 голосов
/ 24 марта 2010
puts (0..2).collect { |i| array[i][i] }
5 голосов
/ 14 августа 2014

Лучше может быть однострочник, использующий библиотеку Matrix:

require 'matrix'
Matrix.rows(array).each(:diagonal).to_a
3 голосов
/ 21 января 2015

Фрагмент Ruby на основе Получить все диагонали в матрице / списке списков в Python

Это чтобы получить все диагонали. В любом случае, идея состоит в том, чтобы заполнить массив с разных сторон, чтобы диагонали совпали по строкам и столбцам:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...