#122 Credit Card Validator (solution)

It’s a hack job, nothing terribly pretty or well abstracted, but it
certainly hits the 80% mark.


num = ARGV.join

def luhn(number)
double = true
luhn = 0
number.scan(/./) do |digit|
n = digit.to_i * (double ? 2 : 1)
luhn += n % 10 + n / 10
double = !double
end
(luhn % 10) == 0
end

def type(number)
case number
when /^34|37[0-9]{13}/ then “AMEX”
when /^6011[0-9]{12}/ then “Discover”
when /^5[1-5][0-9]{14}/ then “MasterCard”
when /^4([0-9]{12}|[0-9]{15})/ then “Visa”
else “Unknown”
end
end

puts “Type: %s” % type(num)
puts “Valid: %s” % (luhn(num) ? :true : :false)