I was looking for the checksum validation of credit card numbers and came across the Luhn Algorithm. I had emacs open and on a whim decided I'll try and implement it using elisp. I'm no lisp programmer but, have in the past managed to write some basic elisp in .emacs so, I guessed it would take me about .5hr at most.
I guessed wrong. It took me a lot longer to wrap my head around even some of the simple elisp constructs like let and lambda took quite a while and it took a lot longer than I anticipated. Here, I present to you the fruit of my labors :)
I guessed wrong. It took me a lot longer to wrap my head around even some of the simple elisp constructs like let and lambda took quite a while and it took a lot longer than I anticipated. Here, I present to you the fruit of my labors :)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defun luhn-sum (list n) | |
(if (null list) | |
0 | |
(+ (let ((x (car list))) | |
(if (= 1 (mod n 2)) | |
(let ((y (* 2 x))) | |
(if (> y 9) | |
(+ 1 (mod y 10)) | |
y)) | |
x)) | |
(luhn-sum (cdr list) (+ 1 n))) | |
) | |
) | |
(defun card-no-str-to-num (card-no) | |
(mapcar (lambda (x) (string-to-number x 10)) (cdr (reverse (cdr (split-string card-no ""))))) | |
) | |
(defun luhn-check (card-no) | |
(eq 0 (mod (luhn-sum (card-no-str-to-num card-no) 0) 10)) | |
) | |
(luhn-check "49927398716") |
No comments:
Post a Comment