2012-10-16 14 views

Odpowiedz

7

Nie trzeba wziąć okrągłą podróż przez sznurek gruntów dla tego typu rzeczy:

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

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

Zakłada się, że n jest oczywiście dodatnie, poślizgnięcie n = n.abs w th e mix może zająć się tym w razie potrzeby. Jeśli potrzebujesz na pokrycie wartości non-dodatnie, a następnie:

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

Wydaje się dość zawiłe. –

+2

@RyanBigg: Tylko jeśli zapomniałeś matematyki w szkole średniej. –

13

Może nie jest to najbardziej eleganckie rozwiązanie:

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

wyjściowa:

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

'.map (&: to_i)', aby uzyskać nieco bardziej elegancki? – oldergod

+0

Miło, dzięki za sugestię. – nneonneo

+0

Co dzieje się z '-23.to_s.split (''). Map (&: to_i)'? –

5

Sposób divmod mogą być używane do pobierania cyfry po jednym na raz

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

Szybkie odniesienia pokazał, że jest to szybsze niż przy użyciu Zaloguj się, aby znaleźć liczbę cyfr przed czasem, która sama była szybsza niż metody oparte na ciągach.

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

można przekonwertować na ciąg i użyć metody chars:

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

wyjściowa:

[7, 4, 2, 3, 9] 

jest trochę bardziej elegancki niż rozszczepienia.

1

Można również użyć Array.new zamiast 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 
Powiązane problemy