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


def weights := [1,3,1,7,3,9]
def Digit := ('0'..'9')
def Letter := ('B'..'D'|'F'..'H'|'J'..'N'|'P'..'T'|'V'..'Z')
def sedolCharValue(c) {
  switch (c) {
    match digit :Digit { return digit - '0' }
    match letter :Letter {
      return letter - 'A'
    }
  }
}
 
def checksum(sedol :String) {
  require(sedol.size() == 6)
  var sum := 0
  for i => c in sedol {
    sum += weights[i] * sedolCharValue(c)
  }
  return E.toString((10 - sum %% 10) %% 10)
}
 
def addChecksum(sedol :String) {
  return sedol + checksum(sedol)
}
 
for sedol in "710889
              B0YBKJ
              406566
              B0YBLH
              228276
              B0YBKL
              557910
              B0YBKR
              585284
              B0YBKT".trim().split("\n") {
  println(addChecksum(sedol.trim()))
}