Task

For each number list of 6-digit SEDOLs, calculate and append the checksum digit.



That is, given this input:

710889
B0YBKJ
406566
B0YBLH
228276
B0YBKL
557910
B0YBKR
585284
B0YBKT
B00030

Produce this output:

7108899
B0YBKJ7
4065663
B0YBLH2
2282765
B0YBKL9
5579107
B0YBKR5
5852842
B0YBKT7
B000300

Extra credit

Check each input is correctly formed, especially with respect to valid characters allowed in a SEDOL string.



Related tasks

   Luhn test
   ISIN


(defun append-sedol-check-digit (sedol &key (start 0) (end (+ start 6)))
  (assert (<= 0 start end (length sedol)))
  (assert (= (- end start) 6))
  (loop 
       :with checksum = 0
       :for weight :in '(1 3 1 7 3 9)
       :for index :upfrom start
       :do (incf checksum (* weight (digit-char-p (char sedol index) 36)))
       :finally (let* ((posn (- 10 (mod checksum 10)))
		       (head (subseq sedol start end))
		       (tail (digit-char posn)))
		  (return (concatenate 'string head (list tail))))))