------ art_6828_3990668.1178131049479
Content-Type: multipart/alternative;
boundary --- art_6829_29407486.1178131049479"
------ art_6829_29407486.1178131049479
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
This is my first time submitting a solution to the quiz. I'll attach my .rb
file and copy / paste my solution below. It's ugly, but it works.
Thanks,
Chase Southard
#!/usr/bin/env ruby
#
# Created by Chase Southard on 2007-05-01.
class CardValidator
def get_card_number
if $*[0] nil
puts "I need a card number. Please enter one now:"
cardnumber stdin.gets.strip!
else
cardnumber RGV.shift
end
puts "You entered: #{cardnumber}"
@card_array ardnumber.split(//).collect
#remove spaces
@card_array.compact!
end
def validate_card_prefix
#case statement to grab the first few digits
case @card_array.first.to_i
when 3
prefix card_array.slice(0, 2).join.to_i
#debug
#puts prefix
#puts prefix.class
if prefix 34 || 37
if @card_array.length 15
card_type AMEX"
puts "The card type entered was: #{card_type}"
else
"You might have bogus card."
end
else
"You might have a bogus card."
end
when 6
prefix card_array.slice(0,4).join.to_i
#debug
#puts prefix
#puts prefix.class
#puts "card length: #{@card_array.length}"
if prefix 6011 && @card_array.length 16
card_type Discover"
puts "The card type entered was: #{card_type}"
else
"You might have a bogus card."
end
when 4
if @card_array.length 13 || 16
card_type Visa"
puts "The card type entered was: #{card_type}"
else
"You might have a bogus card."
end
when 5
prefix card_array.slice(0, 2).join.to_i
#puts prefix
#puts prefix.class
if prefix 51 || 52 || 53 || 54
if @card_array.length 16
card_type MasterCard"
puts "The card type entered was: #{card_type}"
else
"You might have a bogus card."
end
end
end
end
def validate_luhn
array_size card_array.length
#starting at the LAST digit and working backwards gathering digits to
get the untouched elements of the card number
untouched_elements_index rray.new
while array_size > 1
untouched_elements_index.push(array_size - 1)
array_size -
end
untouched_elements rray.new
untouched_elements_index.each { |e|
untouched_elements.push(@card_array[e].to_i) }
#reset array size for the next part
array_size card_array.length
#Starting at the NEXT TO LAST digit and working backwards gathering
digits to get the touched elements of the card number
every_other_element rray.new
while array_size > 1
every_other_element.push(array_size - 2)
array_size -
end
#debug
#puts "Every other element: #{every_other_element}"
#multiply each element by 2
touched_array rray.new
every_other_element.each { |element|
touched_array.push(@card_array[element].to_i*2) }
#debug
#puts "Touched array: #{touched_array}"
#split each into digits
split_touched_array rray.new
touched_array.each { |e| split_touched_array.push(e.to_s.split(//)) }
split_touched_array.flatten!
#debug
#puts "Split touched array:"
#puts split_touched_array
#return digits to integer form
split_touched_array_integers rray.new
split_touched_array.each { |e| split_touched_array_integers.push(e.to_i)
}
#debug
#split_touched_array_total
#split_touched_array_integers.each { |e| split_touched_array_total +
}
#puts "split total {split_touched_array_total}"
#concatentate the two arrays
all_digit_array ntouched_elements + split_touched_array_integers
#find the total value of the touched and untouched digits from the card
number
array_total_value
all_digit_array.each { |x| array_total_value + }
#debug
#puts "array total value {array_total_value}"
#final determination of validity by Luhn algorithm
@numerical_validation alse
if array_total_value % 10 0
@numerical_validation rue
puts "This card number, #{@card_array}, is valid [by Luhn algorithm]"
else
puts "This card number, #{@card_array}, is in-valid [by Luhn
algorithm]"
end
end
end
my_card ardValidator.new
my_card.get_card_number
my_card.validate_card_prefix
my_card.validate_luhn
------ art_6829_29407486.1178131049479
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
This is my first time submitting a solution to the quiz. I'll attach my .rb file and copy / paste my solution below. It's ugly, but it works. <br><br>Thanks,<br><br>Chase Southard<br><br>#!/usr/bin/env ruby<br>#<br>
# Created by Chase Southard on 2007-05-01.<br><br><br>class CardValidator<br> <br> def get_card_number<br> if $*[0] nil<br> puts "I need a card number. Please enter one now:"<br> cardnumber stdin.gets.strip!
<br> else<br> cardnumber RGV.shift<br> end<br> puts "You entered: #{cardnumber}"<br> @card_array ardnumber.split(//).collect<br> #remove spaces<br> @card_array.compact!<br> end<br>
<br> def validate_card_prefix<br> #case statement to grab the first few digits<br> case @card_array.first.to_i<br> when 3<br> prefix card_array.slice(0, 2).join.to_i<br> #debug<br> #puts prefix
<br> #puts prefix.class<br> if prefix 34 || 37<br> if @card_array.length 15<br> card_type quot;AMEX"<br> puts "The card type entered was: #{card_type}"<br> else
<br> "You might have bogus card."<br> end<br> else<br> "You might have a bogus card."<br> end<br> when 6<br> prefix card_array.slice(0,4).join.to_i<br> #debug
<br> #puts prefix<br> #puts prefix.class<br> #puts "card length: #{@card_array.length}"<br> if prefix 6011 && @card_array.length 16<br> card_type quot;Discover"
<br> puts "The card type entered was: #{card_type}"<br> else<br> "You might have a bogus card."<br> end<br> when 4<br> if @card_array.length 13 || 16<br> card_type quot;Visa"
<br> puts "The card type entered was: #{card_type}"<br> else<br> "You might have a bogus card."<br> end<br> when 5<br> prefix card_array.slice(0, 2).join.to_i<br> #puts prefix
<br> #puts prefix.class<br> if prefix 51 || 52 || 53 || 54<br> if @card_array.length 16<br> card_type quot;MasterCard"<br> puts "The card type entered was: #{card_type}"
<br> else<br> "You might have a bogus card."<br> end<br> end<br> end<br> end<br> <br> def validate_luhn<br> array_size card_array.length<br> <br> #starting at the LAST digit and working backwards gathering digits to get the untouched elements of the card number
<br> <br> untouched_elements_index rray.new<br> while array_size > 1<br> untouched_elements_index.push(array_size - 1)<br> array_size - <br> end<br> <br> untouched_elements rray.new<br>
untouched_elements_index.each { |e| untouched_elements.push(@card_array[e].to_i) }<br> <br> <br> #reset array size for the next part<br> array_size card_array.length<br> <br> #Starting at the NEXT TO LAST digit and working backwards gathering digits to get the touched elements of the card number
<br> every_other_element rray.new<br> while array_size > 1<br> every_other_element.push(array_size - 2)<br> array_size - <br> end<br> <br> #debug<br> #puts "Every other element: #{every_other_element}"
<br> <br> #multiply each element by 2<br> touched_array rray.new<br> every_other_element.each { |element| touched_array.push(@card_array[element].to_i*2) }<br> <br> #debug<br> #puts "Touched array: #{touched_array}"
<br> <br> #split each into digits<br> split_touched_array rray.new<br> touched_array.each { |e| split_touched_array.push(e.to_s.split(//)) }<br> split_touched_array.flatten!<br> <br> #debug<br> #puts "Split touched array:"
<br> #puts split_touched_array<br> <br> #return digits to integer form<br> split_touched_array_integers rray.new<br> split_touched_array.each { |e| split_touched_array_integers.push(e.to_i) }<br>
<br> #debug<br> #split_touched_array_total <br> #split_touched_array_integers.each { |e| split_touched_array_total + }<br> #puts "split total {split_touched_array_total}"<br> <br> <br>
#concatentate the two arrays<br> all_digit_array ntouched_elements + split_touched_array_integers<br> <br> #find the total value of the touched and untouched digits from the card number<br> array_total_value
<br> all_digit_array.each { |x| array_total_value + }<br><br> #debug<br> #puts "array total value {array_total_value}"<br> <br> <br> #final determination of validity by Luhn algorithm<br>
@numerical_validation alse<br> <br> if array_total_value % 10 0<br> @numerical_validation rue<br> puts "This card number, #{@card_array}, is valid [by Luhn algorithm]"<br> else<br>
puts "This card number, #{@card_array}, is in-valid [by Luhn algorithm]"<br> end<br> <br> <br> end<br> <br> <br>end<br><br><br>my_card ardValidator.new<br>my_card.get_card_number<br>my_card.validate_card_prefix
<br>my_card.validate_luhn<br>
------ art_6829_29407486.1178131049479--
------ art_6828_3990668.1178131049479
Content-Type: application/octet-stream; name=Quiz122_CardValidator.rb
Content-Transfer-Encoding: base64
X-Attachment-Id: f_f184q4qt
Content-Disposition: attachment; filename="Quiz122_CardValidator.rb"
IyEvdXNyL2Jpbi9lbnYgcnVieQojCiMgIENyZWF0ZWQgYnkgQ2hhc2UgU291dGhhcmQgb24gMjAw
Ny0wNS0wMS4KCgpjbGFzcyBDYXJkVmFsaWRhdG9yCiAgCiAgZGVmIGdldF9jYXJkX251bWJlcgog
ICAgaWYgJCpbMF0gPT0gbmlsCiAgICAgIHB1dHMgIkkgbmVlZCBhIGNhcmQgbnVtYmVyLiBQbGVh
c2UgZW50ZXIgb25lIG5vdzoiCiAgICAgIGNhcmRudW1iZXIgPSAkc3RkaW4uZ2V0cy5zdHJpcCEK
ICAgIGVsc2UKICAgICAgY2FyZG51bWJlciA9IEFSR1Yuc2hpZnQKICAgIGVuZAogICAgcHV0cyAi
WW91IGVudGVyZWQ6ICN7Y2FyZG51bWJlcn0iCiAgICBAY2FyZF9hcnJheSA9IGNhcmRudW1iZXIu
c3BsaXQoLy8pLmNvbGxlY3QKICAgICNyZW1vdmUgc3BhY2VzCiAgICBAY2FyZF9hcnJheS5jb21w
YWN0IQogIGVuZAogIAogIGRlZiB2YWxpZGF0ZV9jYXJkX3ByZWZpeAogICAgI2Nhc2Ugc3RhdGVt
ZW50IHRvIGdyYWIgdGhlIGZpcnN0IGZldyBkaWdpdHMKICAgIGNhc2UgQGNhcmRfYXJyYXkuZmly
c3QudG9faQogICAgd2hlbiAzCiAgICAgIHByZWZpeCA9IEBjYXJkX2FycmF5LnNsaWNlKDAsIDIp
LmpvaW4udG9faQogICAgICAjZGVidWcKICAgICAgI3B1dHMgcHJlZml4CiAgICAgICNwdXRzIHBy
ZWZpeC5jbGFzcwogICAgICBpZiBwcmVmaXggPT0gMzQgfHwgMzcKICAgICAgICBpZiBAY2FyZF9h
cnJheS5sZW5ndGggPT0gMTUKICAgICAgICAgIGNhcmRfdHlwZSA9ICJBTUVYIgogICAgICAgICAg
cHV0cyAiVGhlIGNhcmQgdHlwZSBlbnRlcmVkIHdhczogI3tjYXJkX3R5cGV9IgogICAgICAgIGVs
c2UKICAgICAgICAgICJZb3UgbWlnaHQgaGF2ZSBib2d1cyBjYXJkLiIKICAgICAgICBlbmQKICAg
ICAgZWxzZQogICAgICAgICJZb3UgbWlnaHQgaGF2ZSBhIGJvZ3VzIGNhcmQuIgogICAgICBlbmQK
ICAgIHdoZW4gNgogICAgICBwcmVmaXggPSBAY2FyZF9hcnJheS5zbGljZSgwLDQpLmpvaW4udG9f
aQogICAgICAjZGVidWcKICAgICAgI3B1dHMgcHJlZml4CiAgICAgICNwdXRzIHByZWZpeC5jbGFz
cwogICAgICAjcHV0cyAiY2FyZCBsZW5ndGg6ICN7QGNhcmRfYXJyYXkubGVuZ3RofSIKICAgICAg
aWYgcHJlZml4ID09IDYwMTEgJiYgQGNhcmRfYXJyYXkubGVuZ3RoID09IDE2CiAgICAgICAgICBj
YXJkX3R5cGUgPSAiRGlzY292ZXIiCiAgICAgICAgICBwdXRzICJUaGUgY2FyZCB0eXBlIGVudGVy
ZWQgd2FzOiAje2NhcmRfdHlwZX0iCiAgICAgIGVsc2UKICAgICAgICAiWW91IG1pZ2h0IGhhdmUg
YSBib2d1cyBjYXJkLiIKICAgICAgZW5kCiAgICB3aGVuIDQKICAgICAgaWYgQGNhcmRfYXJyYXku
bGVuZ3RoID09IDEzIHx8IDE2CiAgICAgICAgY2FyZF90eXBlID0gIlZpc2EiCiAgICAgICAgcHV0
cyAiVGhlIGNhcmQgdHlwZSBlbnRlcmVkIHdhczogI3tjYXJkX3R5cGV9IgogICAgICBlbHNlCiAg
ICAgICAgIllvdSBtaWdodCBoYXZlIGEgYm9ndXMgY2FyZC4iCiAgICAgIGVuZAogICAgd2hlbiA1
CiAgICAgIHByZWZpeCA9IEBjYXJkX2FycmF5LnNsaWNlKDAsIDIpLmpvaW4udG9faQogICAgICAj
cHV0cyBwcmVmaXgKICAgICAgI3B1dHMgcHJlZml4LmNsYXNzCiAgICAgIGlmIHByZWZpeCA9PSA1
MSB8fCA1MiB8fCA1MyB8fCA1NAogICAgICAgIGlmIEBjYXJkX2FycmF5Lmxlbmd0aCA9PSAxNgog
ICAgICAgICAgY2FyZF90eXBlID0gIk1hc3RlckNhcmQiCiAgICAgICAgICBwdXRzICJUaGUgY2Fy
ZCB0eXBlIGVudGVyZWQgd2FzOiAje2NhcmRfdHlwZX0iCiAgICAgICAgZWxzZQogICAgICAgICAg
IllvdSBtaWdodCBoYXZlIGEgYm9ndXMgY2FyZC4iCiAgICAgICAgZW5kCiAgICAgIGVuZAogICAg
ZW5kCiAgZW5kCiAgCiAgZGVmIHZhbGlkYXRlX2x1aG4KICAgIGFycmF5X3NpemUgPSBAY2FyZF9h
cnJheS5sZW5ndGgKICAgIAogICAgI3N0YXJ0aW5nIGF0IHRoZSBMQVNUIGRpZ2l0IGFuZCB3b3Jr
aW5nIGJhY2t3YXJkcyBnYXRoZXJpbmcgZGlnaXRzIHRvIGdldCB0aGUgdW50b3VjaGVkIGVsZW1l
bnRzIG9mIHRoZSBjYXJkIG51bWJlcgogICAgCiAgICB1bnRvdWNoZWRfZWxlbWVudHNfaW5kZXgg
PSBBcnJheS5uZXcKICAgIHdoaWxlIGFycmF5X3NpemUgPiAxCiAgICAgIHVudG91Y2hlZF9lbGVt
ZW50c19pbmRleC5wdXNoKGFycmF5X3NpemUgLSAxKQogICAgICBhcnJheV9zaXplIC09IDIKICAg
IGVuZAogICAgCiAgICB1bnRvdWNoZWRfZWxlbWVudHMgPSBBcnJheS5uZXcKICAgIHVudG91Y2hl
ZF9lbGVtZW50c19pbmRleC5lYWNoIHsgfGV8IHVudG91Y2hlZF9lbGVtZW50cy5wdXNoKEBjYXJk
X2FycmF5W2VdLnRvX2kpIH0KICAgIAogICAgCiAgICAjcmVzZXQgYXJyYXkgc2l6ZSBmb3IgdGhl
IG5leHQgcGFydAogICAgYXJyYXlfc2l6ZSA9IEBjYXJkX2FycmF5Lmxlbmd0aAogICAgCiAgICAj
U3RhcnRpbmcgYXQgdGhlIE5FWFQgVE8gTEFTVCBkaWdpdCBhbmQgd29ya2luZyBiYWNrd2FyZHMg
Z2F0aGVyaW5nIGRpZ2l0cyB0byBnZXQgdGhlIHRvdWNoZWQgZWxlbWVudHMgb2YgdGhlIGNhcmQg
bnVtYmVyCiAgICBldmVyeV9vdGhlcl9lbGVtZW50ID0gQXJyYXkubmV3CiAgICB3aGlsZSBhcnJh
eV9zaXplID4gMQogICAgICBldmVyeV9vdGhlcl9lbGVtZW50LnB1c2goYXJyYXlfc2l6ZSAtIDIp
CiAgICAgIGFycmF5X3NpemUgLT0gMgogICAgZW5kCiAgICAKICAgICNkZWJ1ZwogICAgI3B1dHMg
IkV2ZXJ5IG90aGVyIGVsZW1lbnQ6ICN7ZXZlcnlfb3RoZXJfZWxlbWVudH0iCiAgICAKICAgICNt
dWx0aXBseSBlYWNoIGVsZW1lbnQgYnkgMgogICAgdG91Y2hlZF9hcnJheSA9IEFycmF5Lm5ldwog
ICAgZXZlcnlfb3RoZXJfZWxlbWVudC5lYWNoIHsgfGVsZW1lbnR8IHRvdWNoZWRfYXJyYXkucHVz
aChAY2FyZF9hcnJheVtlbGVtZW50XS50b19pKjIpIH0KICAgIAogICAgI2RlYnVnCiAgICAjcHV0
cyAiVG91Y2hlZCBhcnJheTogI3t0b3VjaGVkX2FycmF5fSIKICAgIAogICAgI3NwbGl0IGVhY2gg
aW50byBkaWdpdHMKICAgIHNwbGl0X3RvdWNoZWRfYXJyYXkgPSBBcnJheS5uZXcKICAgIHRvdWNo
ZWRfYXJyYXkuZWFjaCB7IHxlfCBzcGxpdF90b3VjaGVkX2FycmF5LnB1c2goZS50b19zLnNwbGl0
KC8vKSkgfQogICAgc3BsaXRfdG91Y2hlZF9hcnJheS5mbGF0dGVuIQogICAgCiAgICAjZGVidWcK
ICAgICNwdXRzICJTcGxpdCB0b3VjaGVkIGFycmF5OiIKICAgICNwdXRzIHNwbGl0X3RvdWNoZWRf
YXJyYXkKICAgIAogICAgI3JldHVybiBkaWdpdHMgdG8gaW50ZWdlciBmb3JtCiAgICBzcGxpdF90
b3VjaGVkX2FycmF5X2ludGVnZXJzID0gQXJyYXkubmV3CiAgICBzcGxpdF90b3VjaGVkX2FycmF5
LmVhY2ggeyB8ZXwgc3BsaXRfdG91Y2hlZF9hcnJheV9pbnRlZ2Vycy5wdXNoKGUudG9faSkgfQog
ICAgICAgIAogICAgI2RlYnVnCiAgICAjc3BsaXRfdG91Y2hlZF9hcnJheV90b3RhbCA9IDAKICAg
ICNzcGxpdF90b3VjaGVkX2FycmF5X2ludGVnZXJzLmVhY2ggeyB8ZXwgc3BsaXRfdG91Y2hlZF9h
cnJheV90b3RhbCArPSBlIH0KICAgICNwdXRzICJzcGxpdCB0b3RhbCA9ICN7c3BsaXRfdG91Y2hl
ZF9hcnJheV90b3RhbH0iCiAgICAKICAgIAogICAgI2NvbmNhdGVudGF0ZSB0aGUgdHdvIGFycmF5
cwogICAgYWxsX2RpZ2l0X2FycmF5ID0gdW50b3VjaGVkX2VsZW1lbnRzICsgc3BsaXRfdG91Y2hl
ZF9hcnJheV9pbnRlZ2VycwogICAgCiAgICAjZmluZCB0aGUgdG90YWwgdmFsdWUgb2YgdGhlIHRv
dWNoZWQgYW5kIHVudG91Y2hlZCBkaWdpdHMgZnJvbSB0aGUgY2FyZCBudW1iZXIKICAgIGFycmF5
X3RvdGFsX3ZhbHVlID0gMAogICAgYWxsX2RpZ2l0X2FycmF5LmVhY2ggeyB8eHwgYXJyYXlfdG90
YWxfdmFsdWUgKz0geCB9CgogICAgI2RlYnVnCiAgICAjcHV0cyAiYXJyYXkgdG90YWwgdmFsdWUg
PSAje2FycmF5X3RvdGFsX3ZhbHVlfSIKICAgIAogICAgCiAgICAjZmluYWwgZGV0ZXJtaW5hdGlv
biBvZiB2YWxpZGl0eSBieSBMdWhuIGFsZ29yaXRobQogICAgQG51bWVyaWNhbF92YWxpZGF0aW9u
ID0gZmFsc2UKICAgICAgCiAgICBpZiBhcnJheV90b3RhbF92YWx1ZSAlIDEwID09IDAKICAgICAg
QG51bWVyaWNhbF92YWxpZGF0aW9uID0gdHJ1ZQogICAgICBwdXRzICJUaGlzIGNhcmQgbnVtYmVy
LCAje0BjYXJkX2FycmF5fSwgaXMgdmFsaWQgW2J5IEx1aG4gYWxnb3JpdGhtXSIKICAgIGVsc2UK
ICAgICAgcHV0cyAiVGhpcyBjYXJkIG51bWJlciwgI3tAY2FyZF9hcnJheX0sIGlzIGluLXZhbGlk
IFtieSBMdWhuIGFsZ29yaXRobV0iCiAgICBlbmQKICAgIAogICAKICBlbmQKICAKICAKZW5kCgoK
bXlfY2FyZCA9IENhcmRWYWxpZGF0b3IubmV3Cm15X2NhcmQuZ2V0X2NhcmRfbnVtYmVyCm15X2Nh
cmQudmFsaWRhdGVfY2FyZF9wcmVmaXgKbXlfY2FyZC52YWxpZGF0ZV9sdWhu
------ art_6828_3990668.1178131049479--