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


fun char2value c =
  if List.exists (fn x => x = c) (explode "AEIOU") then raise Fail "no vowels"
  else if Char.isDigit c then ord c - ord #"0"
  else if Char.isUpper c then ord c - ord #"A" + 10
  else raise Match
 
val sedolweight = [1,3,1,7,3,9]
 
fun checksum sedol = let
  val tmp = ListPair.foldlEq (fn (ch, weight, sum) => sum + char2value ch * weight)
              0 (explode sedol, sedolweight)
in
  Int.toString ((10 - (tmp mod 10)) mod 10)
end
 
app (fn sedol => print (sedol ^ checksum sedol ^ "\n"))
  [ "710889",
    "B0YBKJ",
    "406566",
    "B0YBLH",
    "228276",
    "B0YBKL",
    "557910",
    "B0YBKR",
    "585284",
    "B0YBKT" ];