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


proc c2v(c: char): int =
  assert c notin "AEIOU"
  if c < 'A': ord(c) - ord('0') else: ord(c) - ord('7')
 
const weight = [1, 3, 1, 7, 3, 9]
 
proc checksum(sedol: string): char =
  var val = 0
  for i, ch in sedol:
    val += c2v(ch) * weight[i]
  result = chr((10 - val mod 10) mod 10 + ord('0'))
 
for sedol in ["710889", "B0YBKJ", "406566", "B0YBLH",
              "228276", "B0YBKL", "557910", "B0YBKR",
              "585284", "B0YBKT", "B00030"]:
  echo sedol, " → ", sedol & checksum(sedol)