From: Kai Weingärtner <KaiWeing@gmx.net>
Date: May 5, 2007 7:48:53 AM CDT
To: submission@rubyquiz.com
Subject: Please Forward: Ruby Quiz Submission (please update)Hello,
I first sent you my solution as a tar attachement. This version is plain text and much easier to read
Could you please replace my solution?Thank You!
Kai Weingärtner
The card check implementation:
class CardCheck
attr_reader :number@@types = {
'AMEX' => {:starts_with => [34, 37], :length => [15]},
'Discover' => {:starts_with => [6011], :length => [16]},
'MasterCard' => {:starts_with => (51..55), :length => [16]},
'Visa' => {:starts_with => [4], :length => [13, 16]}
}def initialize(num)
@number = num.to_s
enddef type
@@types.each do |card_name, type_checks|
starts_with = type_checks[:starts_with]
lengths = type_checks[:length]
fits_length = lengths.any? {|length| @number.length == length}
fits_start = starts_with.any? {|start| @number.match('^' + start.to_s)}
return card_name if (fits_length and fits_start)
end
return 'Unknown'
enddef calc_luhn
elements =
@number.reverse.split(//).each_with_index do |digit, index|
if (index.even?)
elements << digit
else
elements << (digit.to_i * 2).to_s.split(//)
end
end
return elements.flatten.sum
enddef is_valid?
return (calc_luhn % 10) == 0
endprivate :calc_luhn
endclass Integer
def even?
(to_i % 2) == 0
end
endmodule Enumerable
def to_i
collect {|x| x.to_i}
enddef sum
to_i.inject {|sum, x| sum + x}
endThe command line interpreter
require 'card_check'
unless ARGV[0]
print <<-USAGE
Checks card vendor and validity
Usage: provide the card number
USAGE
exit
endcard = CardCheck.new(ARGV[0])
puts "Card type: #{card.type}\n"
puts "Number valid? #{card.is_valid?}\n"some tests...
require 'card_check'
require 'test/unit'
class TestCardCheck < Test::Unit::TestCase
def test_validity
assert_equal(true, CardCheck.new("4408041234567893").is_valid?)
assert_equal(false, CardCheck.new("4417123456789112").is_valid?)
enddef test_type
assert_equal('Visa', CardCheck.new("4408041234567893").type)
assert_equal('AMEX', CardCheck.new("340804123456789").type)
assert_equal('Discover', CardCheck.new("6011440804123456").type)
assert_equal('MasterCard', CardCheck.new("5308041234567893").type)
assert_equal('Visa', CardCheck.new("4408041234567").type)
assert_equal('Unknown', CardCheck.new("9408041234567893").type)
end
end
···
Begin forwarded message: