From: Bob Lisbonne Date: 2007-05-02T10:17:47+09:00 Subject: Re: [QUIZ] Checking Credit Cards (#122) My second ever Ruby Quiz. TIA for any suggestions for making it more Ruby-like. /Bob #!/usr/bin/env ruby -w class CreditCard attr_reader :number, :type, :validity def initialize(cardnumber) @number = cardnumber.gsub(/\s/,'') @type = case @number when /^3[47]\d{13}$/ then "AMEX" when /^6011\d{12}$/ then "Discover" when /^5[12345]\d{14}$/ then "Mastercard" when /^4\d{12}$/ then "VISA" when /^4\d{15}$/ then "VISA" else "Unknown" end sum = 0 digits = @number.to_s.split('').reverse.map {|i| i.to_i} digits.each_index {|i| i%2==0 ? sum+=add_digits(digits[i]) : sum +=add_digits(digits[i]*2)} @validity = sum%10 == 0 ? "Valid" : "Invalid" end def add_digits(n) return n.to_s.split('').inject(0) {|sum, i| sum += i.to_i} end end #CreditCard c = CreditCard.new(ARGV.join) puts "#{c.number}: #{c.type}\t#{c.validity}"