Skip to content

Instantly share code, notes, and snippets.

@durrellchamorro
Last active December 5, 2015 01:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save durrellchamorro/5720714832ba734c77b9 to your computer and use it in GitHub Desktop.
Save durrellchamorro/5720714832ba734c77b9 to your computer and use it in GitHub Desktop.
Luhn Algorithm
class Luhn
attr_reader :numbers
def initialize(numbers)
@numbers = numbers.to_s.chars.map(&:to_i)
end
def self.create(numbers)
create_valid_number(new(numbers))
end
def addends
new_numbers = []
numbers.reverse.each_with_index do |number, index|
if index.odd?
new_numbers << double_then_subtract_9_if_over_ten(number)
else
new_numbers << number
end
end
new_numbers.reverse
end
def checksum
addends.inject(:+)
end
def valid?
checksum % 10 == 0
end
private
def double_then_subtract_9_if_over_ten(number)
doubled_number = number * 2
doubled_number -= 9 if doubled_number >= 10
doubled_number
end
def self.create_valid_number(instance)
number = 1
until instance.valid?
instance.numbers << return_0_if_equal_to_10(number)
remove_last_number_from_invalid instance
number += 1
end
instance.numbers.join.to_i
end
def self.return_0_if_equal_to_10(number)
return 0 if number == 10
number
end
def self.remove_last_number_from_invalid(instance)
instance.valid? || instance.numbers.pop
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment