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


data "710889", "B0YBKJ", "406566", "B0YBLH", "228276", "B0YBKL", "557910", "B0YBKR", "585284", "B0YBKT", "B00030", "AB", "B00A03", ""
 
do
    read d$
    if d$ = "" break
    print sedol$(d$)
loop
 
sub sedol$(d$)
    LOCAL a, i, s, weights$(1)
 
    a = len(d$)
    if a < 6 or a > 6 return d$ + ": Error in length"
 
    for i = 1 to 6
        if not instr("BCDFGHJKLMNPQRSTVWXYZ0123456789", mid$(d$, i, 1)) return d$ + ": Error in symbol " + mid$(d$, i, 1)
    next
 
    a = token("1 3 1 7 3 9", weights$())
 
    FOR i = 1 TO 6
      a = ASC(MID$(d$, i, 1)) - 48
      s = s + (a + 3 * (a > 9)) * val(weights$(i))
    NEXT
    return d$ + CHR$(48 + mod(10 - mod(s, 10), 10))
end sub