2011-11-10 7 views
1

Dans Ruby, étant donné un tableau de tableaux représentant une grille de nombres 2D, comment extrairiez-vous un tableau sub-2D spécifique?Extrait sous-tableau 2D (sans utiliser Matrix)

a = [[0, 3, 1, 5, 5], 
    [4, 6, 8, 3, 5], 
    [7, 1, 4, 0, 8], 
    [0, 8, 8, 7, 4], 
    [7, 2, 4, 5, 4]] 

require 'pp' 
pp sub_array(a,1..4,2..4) 
#=> [[8, 3, 5], 
#=> [4, 0, 8], 
#=> [8, 7, 4], 
#=> [4, 5, 4]] 

Ceci est « facile » à faire en utilisant la bibliothèque Matrix:

m = Matrix[*a] 
p m.minor(1..4,2..4).to_a 
#=> [[8, 3, 5], [4, 0, 8], [8, 7, 4], [4, 5, 4]] 

Cependant, je suis certain qu'il ya une façon élégante de le faire sans utiliser la matrice, peut-être impliquant zip ou transposer:

J'inclus les mots «bidimensionnels» ici pour les résultats de recherche.

Répondre

8
def sub_array(xs, rows, columns) 
    xs[rows].map { |row| row[columns] } 
end 

sub_array(a, 1..4, 2..4) 
#=> [[8, 3, 5], [4, 0, 8], [8, 7, 4], [4, 5, 4]] 
+1

Silly moi. Ou même 'xs [rows] .map {| row | rangée [colonnes]} ' – Phrogz

+1

Lovely! J'ai oublié 'values_at'. –

+0

a changé 'values_at' à' [] ',' Array # [] 'est plus intelligent que je pensais :-) – tokland

Questions connexes