Begin forwarded message: > From: "Colin A. Bartlett" <colin / kineticweb.com> > Date: May 2, 2007 3:47:53 AM CDT > To: <submission / rubyquiz.com> > Subject: Please Forward: Ruby Quiz Submission > > # (C) Copyright 2007, Kinetic Web Solutions, LLC. > # Licensed under the MIT license. > # www.opensource.org/licenses/mit-license.php > > # Transliterate out anything that's not a digit > card_number = ARGV[0].tr("^[0-9]","") > > def valid?(card_number) > # Setup a couple of variables to use > @sum, @digits = 0, "" > # Split the number into individual digits, > # then reverse them and pass each and it's index > # to the block > card_number.split("").reverse.each_with_index do |n,i| > if i % 2 == 0 > # If its sequence in the array is even, > # append the digit to the string > @digits << n > else > # Otherwise, double it first and then > # append it to the string > @digits << (n.to_i * 2).to_s > end > end > # Sum up all the individual digits > @digits.split("").each {|n| @sum = @sum + n.to_i} > # Determine if it's divisible evenly by 10 > if @sum % 10 == 0 > return true > else > return false > end > end > > def which_card?(card_number) > # Not too much going on here, just a bunch > # of regexp to see which card format it matches. > # Source for these patterns was Wikipedia > case card_number > when /^(35[0-9]{14}|(1800|2131)[0-9]{11})$/ > "JCB" > when /^(5020|5038|6759)[0-9]{12}$/ > "Maestro" > when /^(6334|6767)([0-9]{12}|[0-9]{14}|[0-9]{15})$/ > "Solo" > when > /^((4903|4905|4911|4936|6333|6759)([0-9]{12}|[0-9]{14}|[0-9]{15})| > (564182|63 > 3110)([0-9]{10}|[0-9]{12}|[0-9]{13}))$/ > "Switch" > when /^((4917|4913)[0-9]{12}|417500[0-9]{10})$/ > "Visa Electron" > when /^(34|37)[0-9]{13}$/ > "AMEX" > when /^6011[0-9]{12}$/ > "Discover" > when /^5[1-5][0-9]{14}$/ > "MasterCard" > when /^4([0-9]{12}|[0-9]{15})$/ > "Visa" > when /^36[0-9]{12}$/ > "Diners Club (International)" > when /^55[0-9]{12}$/ > "Diners Club (North America)" > when /^30[0-5]{11}$/ > "Diners Club (Carte Blanche)" > else > "Unknown" > end > end > > # Spit out the results > puts "Card Number: #{card_number}" > puts "Valid? #{valid?(card_number)}" > puts "Card Type: #{which_card?(card_number)}" >