सरणी के लिए लंबी निश्चित संख्या को चालू करना क्या 74239 जैसे फिक्सम को [7,4,2,3,9] जैसे फिक्सनम को चालू करने के लिए रूबी में कोई विधि है?रूबी
Q
रूबी
5
A
उत्तर
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
13
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.new
map
के बजाय का उपयोग कर सकते हैं:
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
1
रूबी 2.4 में, पूर्णांकों एक digits method होगा।
संबंधित मुद्दे
काफी दृढ़ लगता है। –
@RyanBigg: केवल तभी जब आप अपना हाईस्कूल गणित भूल गए हैं। –