# Fwd: Please Forward: Ruby Quiz Submission

**URL:** <https://www.ruby-forum.com/t/fwd-please-forward-ruby-quiz-submission/229092>\
**Category:** Ruby\
**Created:** [April 29, 2007, 5:26pm UTC](https://www.ruby-forum.com/t/fwd-please-forward-ruby-quiz-submission/229092 "2007-04-29T17:26:10Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![bbazzarrakk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/47e85d/32.png) [@bbazzarrakk](https://www.ruby-forum.com/u/bbazzarrakk)\
**Post date:** [April 29, 2007, 5:26pm UTC](https://www.ruby-forum.com/t/fwd-please-forward-ruby-quiz-submission/229092/1 "2007-04-29T17:26:10Z")

</div>

Begin forwarded message:

---

<div class="post-metadata">

**Author:** ![bbazzarrakk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/47e85d/32.png) [@bbazzarrakk](https://www.ruby-forum.com/u/bbazzarrakk)\
**Post date:** [April 29, 2007, 10:46pm UTC](https://www.ruby-forum.com/t/fwd-please-forward-ruby-quiz-submission/229092/2 "2007-04-29T22:46:36Z")

</div>

Here’s my solution:

#!/usr/bin/env ruby

def type(card)  
if card =~ /\A4(\d{12}|\d{15})\Z/  
“VISA”  
elsif card =~ /\A3(4|7)\d{13}\Z/  
“AMEX”  
elsif card =~ /\A5[1-5]\d{14}\Z/  
“MasterCard”  
elsif card =~ /\A6011\d{12}\Z/  
“Discover”  
else  
“Unknown”  
end  
end

def luhn\_valid?(card)  
digits = card.unpack(“c#{card.length}”).map { |c| c.chr.to\_i }  
sum = 0  
digits.each\_with\_index do |n, i|  
val = if i % 2 == digits.length % 2  
2 \* n  
else  
n  
end

```
sum += if val >= 10
  1 + (val % 10)
else
  val
end

```

end  
sum % 10 == 0  
end

def valid?(card)  
card\_type = type(card)  
puts “#{card\_type} - #{ (card\_type != “Unknown” && luhn\_valid?  
(card)) ? “Valid” : “Invalid” }”  
end

valid?(ARGV[0])
