From: Joseph Seaton Date: 2007-04-29T21:20:17+09:00 Subject: Re: [QUIZ] Checking Credit Cards (#122) My solution (the second I've submitted, so please be nice :). Suggestions welcome. ### BCTYPES = { [[34,37],[15]] => "AMEX", [[6011],[16]] => "Discoverer", [(51..57).to_a,16] => "MasterCard", [[4],[13,16]] => "Visa"} def ctype(num) BCTYPES.each { |n,t| n[0].each { |s| return t if num.grep(/^#{s}/).any? && n[1].include?(num.length) } } "Unknown" end def luhncheck(num) e = false num.split(//).reverse.collect { |a| e=!e a.to_i*(e ? 1:2) }.join.split(//).inject(0) {|a,b| a+b.to_i} % 10 == 0 ? "Valid" : "Invalid" end card = ARGV.join.gsub(/ /, '') if card == "" puts "Usage: #{$0} " else puts ctype(card) puts luhncheck(card) end ### Joe