CUSIP: Difference between revisions
Content added Content deleted
m (re-arranged list of codes to show code first, info second; added whitespace, spelled out abbreviations.) |
(Add Common Lisp implementation) |
||
Line 241: | Line 241: | ||
USER></pre> |
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}}== |
=={{header|FreeBASIC}}== |
||
<lang freebasic>' version 04-04-2017 |
<lang freebasic>' version 04-04-2017 |