2012-10-16 4 views
5

सरणी के लिए लंबी निश्चित संख्या को चालू करना क्या 74239 जैसे फिक्सम को [7,4,2,3,9] जैसे फिक्सनम को चालू करने के लिए रूबी में कोई विधि है?रूबी

उत्तर

7

आप बात की इस तरह के लिए स्ट्रिंग-भूमि के माध्यम से एक राउंड ट्रिप लेने की जरूरत नहीं है:

def digits(n) 
    Math.log10(n).floor.downto(0).map { |i| (n/10**i) % 10 } 
end 

ary = digits(74239) 
# [7, 4, 2, 3, 9] 

यह मानता है कि n निश्चित रूप से सकारात्मक है, n = n.abs को वें में फिसल रहा है यदि आवश्यक हो तो ई मिश्रण उस पर ध्यान रख सकता है। आप गैर सकारात्मक मूल्यों को कवर करने के लिए, तो जरूरत है:

def digits(n) 
    return [0] if(n == 0) 
    if(n < 0) 
     neg = true 
     n = n.abs 
    end 
    a = Math.log10(n).floor.downto(0).map { |i| (n/10**i) % 10 } 
    a[0] *= -1 if(neg) 
    a 
end 
+7

काफी दृढ़ लगता है। –

+2

@RyanBigg: केवल तभी जब आप अपना हाईस्कूल गणित भूल गए हैं। –

13

शायद नहीं सबसे सुरुचिपूर्ण समाधान:

74239.to_s.split('').map(&:to_i) 

आउटपुट:

[7, 4, 9, 3, 4] 
+0

'.map (&: to_i) 'इसे थोड़ा अधिक सुरुचिपूर्ण बनाने के लिए? – oldergod

+0

अच्छा, सुझाव के लिए धन्यवाद। – nneonneo

+0

'-23.to_s.split ('') के साथ क्या होता है। नक्शा (&: to_i)'? –

5

divmod विधि एक समय

def digits n 
    n= n.abs 
    [].tap do |result| 
    while n > 0 
     n,digit = n.divmod 10 
     result.unshift digit 
    end 
    end 
end 

एक त्वरित बेंचमार्क इस से पता चला है का उपयोग कर से अधिक तेजी से होने के लिए कम अंक एक को निकालने के लिए इस्तेमाल किया जा सकता समय से पहले अंकों की संख्या को खोजने के लिए लॉग इन करें, जो स्ट्रिंग आधारित विधियों से स्वयं तेज़ था।

bmbm(5) do |x| 
    x.report('string') {10000.times {digits_s(rand(1000000000))}} 
    x.report('divmod') {10000.times {digits_divmod(rand(1000000000))}} 
    x.report('log') {10000.times {digits(rand(1000000000))}} 
end 

#=> 
      user  system  total  real 
string 0.120000 0.000000 0.120000 ( 0.126119) 
divmod 0.030000 0.000000 0.030000 ( 0.023148) 
log  0.040000 0.000000 0.040000 ( 0.045285) 
4

आप स्ट्रिंग में बदल जाएंगे और वर्ण विधि का उपयोग कर सकते हैं:

74239.to_s.chars.map(&:to_i) 

आउटपुट:

[7, 4, 2, 3, 9] 

इसका थोड़ा और बंटवारे से सुरुचिपूर्ण।

1

तुम भी Array.newmap के बजाय का उपयोग कर सकते हैं:

n = 74239 

s = Math.log10(n).to_i + 1 # Gets the size of n 

Array.new(s) { d = n % 10; n = n/10; d }.reverse