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


ord0: to :integer `0`
ord7: to :integer `7`
c2v: function [c][
    ordC: to :integer c
    if? c < `A` -> return ordC - ord0
    else -> return ordC - ord7
]
 
weight: [1 3 1 7 3 9]
 
checksum: function [sedol][
    val: new 0
    loop .with:'i sedol 'ch ->
        'val + weight\[i] * c2v ch
    return to :char ord0 + (10 - val % 10) % 10
]
 
sedols: [
    "710889" "B0YBKJ" "406566" "B0YBLH"
    "228276" "B0YBKL" "557910" "B0YBKR"
    "585284" "B0YBKT" "B00030"
]
 
loop sedols 'sed ->
    print [sed "->" sed ++ checksum sed]