我在这里遇到了分裂数组并将其添加的问题

时间:2014-03-02 18:15:19

标签: ruby

我试图找到数组是否有2位数字,如果我找到一个我想要添加两位数并使其单一。然后添加数组中的所有数字以得出一个总和。到目前为止,这是我的代码。而且我也是一个菜鸟和学习

    class Imei 
    attr_accessor :Imei, :split_total1, :split_total2



    def initialize(imei)
        @imei = imei.to_i
        @split_total1 = []
        @split_total2 = []
    end

    def check_two_digit(num)
        if num.to_s.length == 2
            num = num.to_s.split(//).partition.with_index{|_,i| i.odd?}
            num.each do |a, b|
                a.to_i + b.to_i
            end
        else
            num.to_i
        end
    end



    def check_imei
        if @imei.to_s.length == 15
            split1, split2 = @imei.to_s.split(//).partition.with_index{|_, i| i.odd?}
            split1.each do |a|
                @split_total1 << check_two_digit(a.to_i * 2)
            end
            split2.pop
            split2.each do |a|
                @split_total2 << a.to_i
            end

        else
            puts "IMEI NUMBER INVALID"
        end
    end


end



imei = Imei.new(123456789102222)

imei.check_imei

puts imei.split_total1.inspect
puts imei.split_total2.inspect

3 个答案:

答案 0 :(得分:0)

在下面找到我在ruby中写的Luhn Algorithm

def luhn_10_valid? imei
  digits = imei.reverse.chars.map(&:to_i)
  digits.each_with_index.inject(0) do |sum, (digit, i)|
    digit *= 2 if i.odd?
    digit -= 9 if digit > 9
    sum += digit
  end  % 10 == 0
end

答案 1 :(得分:0)

对于Luhn算法,我非常喜欢divmod方法,这简化了事情

array.reverse.each_slice(2).map { |x, y|
  y ||= 0
  [x, (y * 2).divmod(10)]
}.flatten.inject(:+) % 10 == 0 

答案 2 :(得分:0)

如果a只包含非负整数,这是一种类似Ruby的计​​算总和的方法:

a.reduce(0) {|t,i| t + (((10..99).cover? i) ? i.divmod(10).reduce(:+) : i )} 

说明:

如果i => 46(10..99).cover?(46) => true46.divmod(10) => [4,6][4,6].reduce(:+) => 10。回想一下reduce又名inject[4,6]reduce(:+)与(但从技术上讲,不等同于')的结果相同:

[4,6].reduce { |u,j| u+j }

第一个reduce需要零初始值,如

   a[46].reduce {|t,i| t+(((10..99).cover? i) ? i.divmod(10).reduce(:+):i)} 
      #=> 46

这是不正确的。

如果a包含整数的字符串表示和/或整数可能是负数,请告诉我,我会相应地更改我的答案。