From: James Barnett Date: 2007-04-30T05:45:10+09:00 Subject: Re: Fwd: Please Forward: Ruby Quiz Submission Here's my solution: #!/usr/bin/env ruby def type(card) if card =~ /\A4(\d{12}|\d{15})\Z/ "VISA" elsif card =~ /\A3(4|7)\d{13}\Z/ "AMEX" elsif card =~ /\A5[1-5]\d{14}\Z/ "MasterCard" elsif card =~ /\A6011\d{12}\Z/ "Discover" else "Unknown" end end def luhn_valid?(card) digits = card.unpack("c#{card.length}").map { |c| c.chr.to_i } sum = 0 digits.each_with_index do |n, i| val = if i % 2 == digits.length % 2 2 * n else n end sum += if val >= 10 1 + (val % 10) else val end end sum % 10 == 0 end def valid?(card) card_type = type(card) puts "#{card_type} - #{ (card_type != "Unknown" && luhn_valid? (card)) ? "Valid" : "Invalid" }" end valid?(ARGV[0])