Turning long fixed number to array Ruby Turning long fixed number to array Ruby ruby ruby

Turning long fixed number to array Ruby


Maybe not the most elegant solution:

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

Output:

[7, 4, 2, 3, 9]


You don't need to take a round trip through string-land for this sort of thing:

def digits(n)  Math.log10(n).floor.downto(0).map { |i| (n / 10**i) % 10 }endary = digits(74239)# [7, 4, 2, 3, 9]

This does assume that n is positive of course, slipping an n = n.abs into the mix can take care of that if needed. If you need to cover non-positive values, then:

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)  aend


The divmod method can be used to extract the digits one at a time

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

A quick benchmark showed this to be faster than using log to find the number of digits ahead of time, which was itself faster than string based methods.

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        realstring   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)