Skip to content

Instantly share code, notes, and snippets.

@pdbradley
Created February 13, 2017 23:25
Show Gist options
  • Save pdbradley/a656fb3315e3d9f058de9ca000540adb to your computer and use it in GitHub Desktop.
Save pdbradley/a656fb3315e3d9f058de9ca000540adb to your computer and use it in GitHub Desktop.
Luhn Refactor
module Luhn
def self.is_valid?(number)
result = Luhn.card_number_to_integer_array_from_string(number)
result = Luhn.reverse_to_start_from_right(result)
result = Luhn.double_every_second_digit(result)
result = Luhn.subtract_9_from_values_over_10(result)
sum = Luhn.sum_all_digits_of_array(result)
Luhn.luhn_is_valid?(sum)
end
def self.reverse_to_start_from_right(number_array)
number_array.reverse
end
def self.sum_all_digits_of_array(number_array)
number_array.inject(:+)
end
def self.card_number_to_integer_array_from_string(number_as_string)
number_as_string.to_s.chars.map(&:to_i)
end
def self.double_every_second_digit(number_array)
result = []
number_array.each_with_index do |value, index|
if is_even?(index)
result << value
else
result << value * 2
end
end
result
end
def self.subtract_9_from_values_over_10(number_array)
number_array.map do |number|
if number >= 10
number - 9
else
number
end
end
end
def self.luhn_is_valid?(sum_total)
(sum_total % 10 == 0)
end
def self.is_even?(number)
number % 2 == 0
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment