I was just looking at the about.com Perl site, and it has this article about finding if a number is a valid Luhn number, which, apparently, tells you it's a valid credit card number.

  1. double the value of every other digit, counting backward from the second-last
  2. add all the digits of the resulting numbers together (not the numbers, but the digits of the numbers, so if you've got 16, you add it as one plus six)
  3. add the leftover numbers together
  4. add them to the sum of the other lot of numbers

If what you've got is divisible by ten, it's a valid credit card number.

Their solution is at http://perl.about.com/library/weekly/aa080600h.htm, and of course it's quite long, because it's a teaching exercise.

I got thinking about it and how to do it more compactly, in the spirit of "Regular Expressions -- is there anything they can't do?" and tried to make it as short as I could.

Here's an attempt, but I'd love to see you make it shorter:

$n = '4564123800603607'; # this is not my credit card number ($o = reverse($n)) =~ s/.(.)/($1*2)/ge; # every other number in it, times 2 # (reversed because then it will work # for numbers of different lengths, as # some cards are 13, not 16). ($e = reverse($n)) =~ s/(.)./$1/ge; # the other numbers, not times 2 $o =~ s/(.)/$x+=$1/ge; $e =~ s/(.)/$y+=$1/ge; # add the digits printf("%sValid.",(($x+$y)%10 == 0?'':'Not ')); # print the result

In reply to Luhn Number Golf by Cody Pendant

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.