From: doug meyer Date: 2007-05-01T22:38:03+09:00 Subject: Re: [QUIZ] Checking Credit Cards (#122) ------=_Part_356970_20361627.1178026680671 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline The only reason I'm submitting this is because I added a inject_with_index method to Array. I liked Daniel Martin's use of the inject([0,0]), I didn't even think of doing that. class Array def inject_with_index(injected) each_with_index{|obj, index| injected = yield(injected, obj, index) } injected end end class CreditCard @@types = { 'AMEX' => { :start => [34, 37], :length => [15] }, 'Discover' => { :start => [6011], :length => [16] }, 'MasterCard' => { :start => (51..55).to_a, :length => [16] }, 'Vista' => { :start => [4], :length => [13, 16] } } attr :type, true attr :valid, true def initialize(number) @type = (@@types.find do |card_type, card_st| card_st[:start].any?{|st| /^#{st}/ =~ number } and card_st[:length].any?{|le| number.length == le } end || ['Unknown']).first @valid = number.reverse.split('').inject_with_index(0) do |acc,num,ind| acc + ( ind%2 == 0 ? num.to_i : (num.to_i*2).to_s.split('').inject(0){|a,e|a.to_i+e.to_i} ) end % 10 == 0 puts " Type: #{@type}" puts "Valid: #{@valid}" end end ------=_Part_356970_20361627.1178026680671 Content-Type: application/x-ruby; name="credit_card.rb" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="credit_card.rb" X-Attachment-Id: f_f16eo3es IyEvdXNyL2Jpbi9ydWJ5CgpjbGFzcyBBcnJheQogIGRlZiBpbmplY3Rfd2l0aF9pbmRleChpbmpl Y3RlZCkKICAgIGVhY2hfd2l0aF9pbmRleHt8b2JqLCBpbmRleHwgaW5qZWN0ZWQgPSB5aWVsZChp bmplY3RlZCwgb2JqLCBpbmRleCkgfQogICAgaW5qZWN0ZWQKICBlbmQKZW5kCgpjbGFzcyBDcmVk aXRDYXJkCiAgQEB0eXBlcyA9IHsKICAgICAgJ0FNRVgnID0+IHsgOnN0YXJ0ID0+IFszNCwgMzdd LCA6bGVuZ3RoID0+IFsxNV0gfSwKICAgICAgJ0Rpc2NvdmVyJyA9PiB7IDpzdGFydCA9PiBbNjAx MV0sIDpsZW5ndGggPT4gWzE2XSB9LAogICAgICAnTWFzdGVyQ2FyZCcgPT4geyA6c3RhcnQgPT4g KDUxLi41NSkudG9fYSwgOmxlbmd0aCA9PiBbMTZdIH0sCiAgICAgICdWaXN0YScgPT4geyA6c3Rh cnQgPT4gWzRdLCA6bGVuZ3RoID0+IFsxMywgMTZdIH0KICAgIH0KICBhdHRyIDp0eXBlLCB0cnVl CiAgYXR0ciA6dmFsaWQsIHRydWUKICBkZWYgaW5pdGlhbGl6ZShudW1iZXIpCiAgICBAdHlwZSA9 IChAQHR5cGVzLmZpbmQgZG8gfGNhcmRfdHlwZSwgY2FyZF9zdHwKICAgICAgY2FyZF9zdFs6c3Rh cnRdLmFueT97fHN0fCAvXiN7c3R9LyA9fiBudW1iZXIgfSBhbmQgCiAgICAgICAgY2FyZF9zdFs6 bGVuZ3RoXS5hbnk/e3xsZXwgbnVtYmVyLmxlbmd0aCA9PSBsZSB9CiAgICBlbmQgfHwgWydVbmtu b3duJ10pLmZpcnN0CiAgICBAdmFsaWQgPSBudW1iZXIucmV2ZXJzZS5zcGxpdCgnJykuaW5qZWN0 X3dpdGhfaW5kZXgoMCkgZG8gfGFjYyxudW0saW5kfAogICAgICAgIGFjYyArICggaW5kJTIgPT0g MCA/IG51bS50b19pIDoKICAgICAgICAgICAgKG51bS50b19pKjIpLnRvX3Muc3BsaXQoJycpLmlu amVjdCgwKXt8YSxlfGEudG9faStlLnRvX2l9ICkKICAgICAgZW5kICUgMTAgPT0gMAogICAgcHV0 cyAiIFR5cGU6ICN7QHR5cGV9IgogICAgcHV0cyAiVmFsaWQ6ICN7QHZhbGlkfSIKICBlbmQKZW5k CgpjYyA9IENyZWRpdENhcmQubmV3KEFSR1Yuam9pbi5zY2FuKC9cZC8pLmpvaW4pCg== ------=_Part_356970_20361627.1178026680671--