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


let char2value c =
  assert (not (String.contains "AEIOU" c));
  match c with
  | '0'..'9' -> int_of_char c - int_of_char '0'
  | 'A'..'Z' -> int_of_char c - int_of_char 'A' + 10
  | _ -> assert false
 
let sedolweight = [1;3;1;7;3;9]
 
let explode s =
  s |> String.to_seq |> List.of_seq
 
let checksum sedol =
  let tmp = List.fold_left2 (fun sum ch weight -> sum + char2value ch * weight)
              0 (explode sedol) sedolweight in
  string_of_int ((10 - (tmp mod 10)) mod 10) ;;
 
List.iter (fun sedol -> print_endline (sedol ^ checksum sedol))
  [ "710889";
    "B0YBKJ";
    "406566";
    "B0YBLH";
    "228276";
    "B0YBKL";
    "557910";
    "B0YBKR";
    "585284";
    "B0YBKT" ]