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


import "/str" for Char
import "/fmt" for Conv
 
var sedol = Fn.new { |s|
    if (!(s is String && s.count == 6)) return false
    var weights = [1, 3, 1, 7, 3, 9]
    var sum = 0
    for (i in 0..5) {
        var c = s[i]
        if (!Char.isUpper(c) && !Char.isDigit(c)) return null
        if ("AEIOU".contains(c)) return null
        sum = sum + Conv.atoi(c, 36) * weights[i]
    }
    var cd = (10 - sum%10) % 10
    return s + "%(cd)"
}
 
var tests = [
    "710889",
    "B0YBKJ",
    "406566",
    "B0YBLH",
    "228276",
    "B0YBKL",
    "557910",
    "B0YBKR",
    "585284",
    "B0YBKT",
    "B00030",
    "I23456"
]
 
for (test in tests) {
    var a
    var ans = (a = sedol.call(test)) ? a : "not valid"
    System.print("%(test) -> %(ans)")
}