是否有一种方法不需要.each可以优雅地添加所有奇数/偶数索引数字。
eg. 872653627
Odd: 7 + 6 + 3 + 2 = 18
Even: 8 + 2 + 5 + 6 + 7 = 28
答案 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]