2012-10-16 20 views

Antwort

7

Sie brauchen nicht eine Rundreise durch strang Land für diese Art der Sache zu nehmen:

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

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

Das geht davon aus, dass n natürlich positiv ist, eine n = n.abs in th gleiten Der Mix kann das bei Bedarf erledigen. Wenn Sie nicht-positive Werte decken, dann:

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

Scheint ziemlich verschlungen. –

+2

@RyanBigg: Nur wenn Sie Ihre High School Mathe vergessen haben. –

13

Vielleicht nicht die eleganteste Lösung:

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

Ausgang:

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

'.map (&: to_i)', um es ein bisschen eleganter zu bekommen? – oldergod

+0

Schön, danke für den Vorschlag. – nneonneo

+0

Was passiert mit '-23.to_s.split (' '). Map (&: to_i) '? –

5

Die divmod Verfahren verwendet werden können, die Ziffern einen nach dem anderen

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

Eine schnelle Benchmark dies schneller sein zeigte zu extrahieren als die Verwendung von log, um die Anzahl der Ziffern im voraus zu finden, die selbst schneller war als die string-basierten Methoden.

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

können Sie in String konvertieren und die Zeichen-Methode verwenden:

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

Ausgang:

[7, 4, 2, 3, 9] 

Es ist ein bisschen eleganter als Splitting.

1

Sie können auch Array.new statt map verwenden:

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 
Verwandte Themen