我试图找到数组是否有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
答案 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) => true
,46.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
包含整数的字符串表示和/或整数可能是负数,请告诉我,我会相应地更改我的答案。