Sha256: f9cdb0a2c81d0ac7025ec5f5cf194d47111650df0dd8334fbd22ada6a7692e6f

Contents?: true

Size: 980 Bytes

Versions: 2

Compression:

Stored size: 980 Bytes

Contents

class LuhnBase
  def initialize number, options = {}
    @mod, @base = 0, 0..100
    @number     = number.to_s.scan(/\d/).join
    @base       = options[:base]  if options.has_key? :base
    @mod        = options[:mod]   if options.has_key? :mod
  end

  def check_digit
    sum / @mod
  end

  def * digits
    digits.times.reduce(self) do |number, digit|
      number += self.class.new(number, :base => @base, :mode => @mod).check_digit
    end
  end

  def + digit
    self.class.new(@number += digit.to_s.scan(/\d/).join, :base => @base, :mode => @mod)
  end

  def to_s
    @number.to_s
  end

  def == other
    self.to_s == other.to_s
  end

  protected
  def bases
    multipliers = ([*@base] * (@number.length/@base.count+1))[0..(@number.length-1)].reverse
  end

  def numbers_list
    @number.chars.map &:to_i
  end

  def sum
    bases.zip(numbers_list).reduce(0) {|total, n| total += before_sum(*n) }
  end

  def before_sum base, number
    base * number
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
brid-0.2.1 lib/brid/algorithms/luhn.rb
brid-0.2.0 lib/brid/algorithms/luhn.rb