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


procedure main()
every write(sedol("710889"|"B0YBKJ"|"406566"|"B0YBLH"|"228276"|
           "B0YBKL"|"557910"|"B0YBKR"|"585284"|"B0YBKT"|"B00030"))
end
 
procedure sedol(x)   #: return the completed sedol with check digit
static w,c
initial {
   every (i := -1, c := table())[!(&digits||&ucase)] := i +:= 1 # map chars
   every c[!"AEIOU"] := &null                 # delete vowels
   w := [1,3,1,7,3,9]                         # weights
   }
 
if *(x := map(x,&lcase,&ucase)) = *w then {   # match lengths
   every (t :=0, i := 1 to *x) do
      t +:= \c[x[i]]*w[i] | fail              # accumulate weighted chars
   return x  || (10 - (t%10))  % 10           # complete
   }
end