2012-10-19 3 views
5
a = [3, 4, 7, 8, 3] 
b = [5, 3, 6, 8, 3] 

समान लंबाई के सरणी मानते हुए, क्या each या दोनों सरणी के प्रत्येक तत्व से परिणाम प्राप्त करने के लिए कुछ अन्य मूर्खतापूर्ण तरीके का उपयोग करने का कोई तरीका है? काउंटर का उपयोग किए बिना? Array.zip का उपयोग कर के बारे में क्या [15, 12, 42, 64, 9]रूबी में 2 सरणी पर काम करने का एक बेवकूफ तरीका है?

(0..a.count - 1).each do |i| इतना बदसूरत है ...

रूबी 1.9.3

उत्तर

4

प्रदर्शन कारणों से, zip बेहतर हो सकता है, लेकिन transpose समरूपता रखता है और समझने में आसान है।

[a, b].transpose.map{|a, b| a * b} 
# => [15, 12, 42, 64, 9] 

zip और transpose के बीच एक अंतर यह है कि मामले में सरणियों जबकि बाद एक त्रुटि को जन्म देती है एक डिफ़ॉल्ट रूप में एक ही लंबाई, पूर्व आवेषण nil नहीं है। स्थिति के आधार पर, आप एक दूसरे के पक्ष में हो सकते हैं।

6

:

उदाहरण के लिए, प्रत्येक तत्व के उत्पाद प्राप्त करने के लिए

>> a = [3,4,7,8,3] 
=> [3, 4, 7, 8, 3] 
>> b = [5,3,6,8,3] 
=> [5, 3, 6, 8, 3] 
>> c = [] 
=> [] 
>> a.zip(b) do |i, j| c << i * j end 
=> [[3, 5], [4, 3], [7, 6], [8, 8], [3, 3]] 
>> c 
=> [15, 12, 42, 64, 9] 

नोट: मैं बहुत अधिक एक रूबी प्रोग्रामर हूं इसलिए मैं apolo किसी भी मुहावरे के लिए जज जो मैंने पूरी तरह से छेड़छाड़ की है।

+0

इसे लिखने वाला था। जिस तरह से मैं इसे करूँगा :) – Castilho

+0

@Castilho: मेरा पहला विचार था, लानत ... रूबी को कहीं भी 'ज़िप' विधि होनी चाहिए। मैं पाइथन भूमि से आया हूं इसलिए इसे खोजने में कुछ सेकंड लग गए। –

+4

ब्रेसिज़ आमतौर पर एक-लाइनर ('a.zip (b) .each {| i, j | c << i * j}') के साथ उपयोग किया जाता है लेकिन यह बिल्कुल * trampling * नहीं है। और 'विशिष्ट' इस विशिष्ट मामले में अधिक उपयुक्त होगा: 'c = a.zip (b) .map {...}' –

संबंधित मुद्दे

 संबंधित मुद्दे