CUSIP: Difference between revisions

953 bytes added ,  7 years ago
Add Common Lisp implementation
m (re-arranged list of codes to show code first, info second; added whitespace, spelled out abbreviations.)
(Add Common Lisp implementation)
Line 241:
 
USER></pre>
 
=={{header|Common Lisp}}==
<lang lisp>(defun char->value (c)
(cond ((digit-char-p c 36))
((char= c #\*) 36)
((char= c #\@) 37)
((char= c #\#) 38)
(t (error "Invalid character: ~A" c))))
 
(defun cusip-p (cusip)
(and (= 9 (length cusip))
(loop for i from 1 to 8
for c across cusip
for v = (char->value c)
when (evenp i)
do (setf v (* 2 v))
sum (multiple-value-bind (quot rem) (floor v 10)
(+ quot rem))
into sum
finally (return (eql (digit-char-p (char cusip 8))
(mod (- 10 (mod sum 10)) 10))))))
 
(defun main ()
(dolist (cusip '("037833100" "17275R102" "38259P508" "594918104" "68389X106" "68389X105"))
(format t "~A: ~A~%" cusip (cusip-p cusip))))</lang>
{{out}}
<pre>037833100: T
17275R102: T
38259P508: T
594918104: T
68389X106: NIL
68389X105: T</pre>
 
=={{header|FreeBASIC}}==
<lang freebasic>' version 04-04-2017
68

edits