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


// version 1.1.0
 
val weights = listOf(1, 3, 1, 7, 3, 9, 1)
 
fun sedol7(sedol6: String): String {
    if (sedol6.length != 6) throw IllegalArgumentException("Length of argument string must be 6")
    var sum = 0
    for (i in 0..5) {
        val c = sedol6[i] 
        val v = when (c) {
            in '0'..'9' -> c.toInt() - 48  
            in 'A'..'Z' -> c.toInt() - 55
            else        -> throw IllegalArgumentException("Argument string contains an invalid character")
        }
        sum += v * weights[i]
    }
    val check = (10 - (sum % 10)) % 10 
    return sedol6 + (check + 48).toChar()
}
 
fun main(args: Array<String>) {
    val sedol6s = listOf("710889", "B0YBKJ", "406566", "B0YBLH", "228276", "B0YBKL",
                         "557910", "B0YBKR", "585284", "B0YBKT", "B00030")
    for (sedol6 in sedol6s) println("$sedol6 -> ${sedol7(sedol6)}")
}