Ruby优雅的方式添加一个数字的所有偶数或奇数索引数字?

时间:2014-10-06 08:59:15

标签: ruby

是否有一种方法不需要.each可以优雅地添加所有奇数/偶数索引数字。

eg. 872653627

Odd: 7 + 6 + 3 + 2 = 18
Even: 8 + 2 + 5 + 6 + 7 = 28

8 个答案:

答案 0 :(得分:6)

number.to_s.chars.map(&:to_i).             # turn string into individual numbers
  partition.with_index { |_, i| i.odd? }.  # separate the numbers into 2 arrays
  map { |a| a.reduce(:+) }                 # sum each array
#=> [18, 28]

答案 1 :(得分:3)

num=872653627

num.to_s.split("").
    select.each_with_index { |str, i| i.odd? }.
    map(&:to_i).reduce(:+)

i.even?类似。

答案 2 :(得分:2)

number = 872653627

result = number.to_s.chars.map(&:to_i).group_by.with_index {|_, i| i.odd? }.map {|k,v| [k,v.inject(0, :+)]}.to_h

odd = result[true]
even = result[false]

答案 3 :(得分:1)

num=872653627
odd = even = 0
num.to_s.split("").
  each_with_index { |data, index| index.odd? ? odd += data.to_i : even += data.to_i }

odd #=> 18 
even #=> 28 

答案 4 :(得分:1)

x, odd, even, alt = 872653627, 0, 0, false
until x.zero?
  x, r = x.divmod(10)
  alt ? odd += r : even += r
  alt ^= true
end

odd #=> 18
even #=> 28

答案 5 :(得分:1)

这是一个很好的问题!

无论如何,解决方案非常简单。

string = "872653627"

对于偶数索引数字

string.chars.select.with_index{|e,i|i.even?}.map(&:to_i).reduce(:+)

对于奇数索引数字

string.chars.select.with_index{|e,i|i.odd?}.map(&:to_i).reduce(:+)

希望这有帮助。

答案 6 :(得分:1)

如果允许each_slice的方法,将数字转换为数组然后切片将是简洁的。

num = 872653627.to_s.split(//).map{|x| x.to_i}.reverse
even= num.each_slice(2).inject(0){|total , obj| total + obj[0]}
odd = num.each_slice(2).inject(0){|total , obj| total + obj[1]}

我对这里奇数/偶数索引数字的定义感到困惑,请随意更改obj [0],obj [1]和.reverse以适应奇数/偶数索引数字的各种定义。

答案 7 :(得分:0)

怎么样:

num = '872653627'
[/.(\d)/,/(\d).?/].map{|re| num.scan(re)}.map{|x| x.flatten.map(&:to_i).reduce(:+)}
#=> [18, 28]