2012-10-16 16 views

答えて

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( '')。map(&:to_i)'はどうなるのですか? –

5

divmodメソッドは、迅速なベンチマークは、これが使用するよりも速いことが示された時点で1

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

またmapの代わりにArray.newを使用することができます。

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 
関連する問題