On 4/27/07, Ruby Quiz <james / grayproductions.net> wrote: > > This week's Ruby Quiz is to write a program that accepts a credit card number as > a command-line argument. The program should print the card's type (or Unknown) > as well a Valid/Invalid indication of whether or not the card passes the Luhn > algorithm. > > Here is my solution. ###### # Check Starting numbers and length def card_ok(str,info) check = "UNKNOWN" info.each do |t| pref = t[0] leng = t[1] name = t[2] pref.each do |x| if x == str.slice(0...x.length) leng.each do |y| if y.to_i == str.length check = name.dup end end end end end return check end # Check Luhn algorithm def luhn(str) luhn_hash = Hash.new("INVALID") if str.length != 0 luhn_hash[0] = "VALID" arr = str.split(//).reverse arr2 = [] arr3 = [] (0...arr.length).each do |u| arr2 << arr[u] if u %2 == 0 arr2 << (arr[u].to_i * 2).to_s if u %2 != 0 end arr2.each do |r| arr3 << r.split(//).inject(0) {|sum,i| sum + i.to_i} end val = arr3.inject(0) {|sum,i| sum + i} % 10 end return luhn_hash[val] end # Card information test = [] test << [["31","34"],["15"],"AMEX"] test << [["6011"],["16"],"DISCOVER"] test << [("51".."55").to_a,["16"],"MASTERCARD"] test << [["4"],["13","16"],"VISA"] #test << [("3528".."3589").to_a,["16"],"JCB"] #test << [[("3000".."3029").to_a + ("3040".."3059").to_a + #("3815".."3889").to_a + ["36","389"]].flatten!,["14"],"DINERS"] # Main str = ARGV.join arr = [] arr << card_ok(str,test) arr << luhn(str) puts arr ###### Harry -- http://www.kakueki.com/ruby/list.html A Look into Japanese Ruby List in English