From: Chase Southard Date: 2007-05-03T03:37:31+09:00 Subject: Re: [QUIZ] Checking Credit Cards (#122) ------=_Part_6828_3990668.1178131049479 Content-Type: multipart/alternative; boundary="----=_Part_6829_29407486.1178131049479" ------=_Part_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 = ARGV.shift end puts "You entered: #{cardnumber}" @card_array = cardnumber.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 = Array.new while array_size > 1 untouched_elements_index.push(array_size - 1) array_size -= 2 end untouched_elements = Array.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 = Array.new while array_size > 1 every_other_element.push(array_size - 2) array_size -= 2 end #debug #puts "Every other element: #{every_other_element}" #multiply each element by 2 touched_array = Array.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 = Array.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 = Array.new split_touched_array.each { |e| split_touched_array_integers.push(e.to_i) } #debug #split_touched_array_total = 0 #split_touched_array_integers.each { |e| split_touched_array_total += e } #puts "split total = #{split_touched_array_total}" #concatentate the two arrays all_digit_array = untouched_elements + split_touched_array_integers #find the total value of the touched and untouched digits from the card number array_total_value = 0 all_digit_array.each { |x| array_total_value += x } #debug #puts "array total value = #{array_total_value}" #final determination of validity by Luhn algorithm @numerical_validation = false if array_total_value % 10 == 0 @numerical_validation = true 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 = CardValidator.new my_card.get_card_number my_card.validate_card_prefix my_card.validate_luhn ------=_Part_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.

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 = ARGV.shift
    end
    puts "You entered: #{cardnumber}"
    @card_array = cardnumber.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 = Array.new
    while array_size > 1
      untouched_elements_index.push(array_size - 1)
      array_size -= 2
    end
   
    untouched_elements = Array.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 = Array.new
    while array_size > 1
      every_other_element.push(array_size - 2)
      array_size -= 2
    end
   
    #debug
    #puts "Every other element: #{every_other_element}"
   
    #multiply each element by 2
    touched_array = Array.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 = Array.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 = Array.new
    split_touched_array.each { |e| split_touched_array_integers.push(e.to_i) }
       
    #debug
    #split_touched_array_total = 0
    #split_touched_array_integers.each { |e| split_touched_array_total += e }
    #puts "split total = #{split_touched_array_total}"
   
   
    #concatentate the two arrays
    all_digit_array = untouched_elements + split_touched_array_integers
   
    #find the total value of the touched and untouched digits from the card number
    array_total_value = 0
    all_digit_array.each { |x| array_total_value += x }

    #debug
    #puts "array total value = #{array_total_value}"
   
   
    #final determination of validity by Luhn algorithm
    @numerical_validation = false
     
    if array_total_value % 10 == 0
      @numerical_validation = true
      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 = CardValidator.new
my_card.get_card_number
my_card.validate_card_prefix
my_card.validate_luhn
------=_Part_6829_29407486.1178131049479-- ------=_Part_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 ------=_Part_6828_3990668.1178131049479--