2010-03-24 20 views
8

में विकर्ण तत्व प्राप्त करने में मैं अपने 2 डी रूबी सरणी के साथ कुछ समस्याएं आ रहा था और जब मैं सरणी स्लाइसिंग करता हूं तो मेरा एलओ बहुत कम हो जाता है। तो उदाहरण के लिए,रुबी को 2 डी ऐरे

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 {कुछ जादू सामान?} कर

+1

आप शायद इस पता है, लेकिन 'डालता सरणी [1..2] [1]' बराबर है 'सरणी डालता है [2]', नहीं 'सरणी डालता है [1..2] .map {| arr | आगमन [1]} '। मुझे यकीन नहीं है कि सरणी के सरणी का उपयोग करके चीजों को करने का सही तरीका है, लेकिन मैं कुछ भी बेहतर बनाने में सक्षम नहीं हूं। –

+0

यह मेरा इरादा था। लेकिन आपका जवाब अभी भी बहुत उपयोगी है। धन्यवाद :) –

उत्तर

13
puts (0..2).collect { |i| array[i][i] } 
+0

! समाधान इतना स्पष्ट है! ठीक है, हालांकि मैं 2 की जगह array.size का उपयोग करूंगा, क्योंकि सरणी की लंबाई भिन्न हो सकती है। –

+0

बहुत बढ़िया :) अच्छा जवाब ... {कुछ जादू सामान?} रूबी – RubyDubee

+0

में स्पष्ट है वास्तव में मुझे array.size के बजाय 2 की आवश्यकता है क्योंकि यह कोई विकर्ण/आंशिक विकर्ण टुकड़ा हो सकता है :) –

4

बेहतर एक एक लाइनर कि मैट्रिक्स पुस्तकालय का इस्तेमाल हो सकता है:

require 'matrix' 
Matrix.rows(array).each(:diagonal).to_a 
2

रूबी टुकड़ा Get all the diagonals in a matrix/list of lists in 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) 
संबंधित मुद्दे