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


string 0;               \use zero-terminated strings
 
func CheckDigit(Str);   \Return the check digit for a SEDOL 
char Str;
int  Sum, I, C, V;
[Sum:= 0;
for I:= 0 to 6-1 do
    [C:= Str(I);
    case of
      C>=^0 & C<=^9: V:= C-^0;
      C>=^A & C<=^Z: V:= C-^A+10
    other V:= -1;
    case I of
      1, 4: V:= V*3;
      3: V:= V*7;
      5: V:= V*9
      other     [];
      Sum:= Sum+V;
      ];
return rem( (10 - rem(Sum/10)) / 10 ) + ^0;
];
 
int Sedol, N;
[Sedol:= ["710889",
          "B0YBKJ",
          "406566",
          "B0YBLH",
          "228276",
          "B0YBKL",
          "557910",
          "B0YBKR",
          "585284",
          "B0YBKT",
          "B00030"];
for N:= 0 to 11-1 do
        [Text(0, Sedol(N));
        ChOut(0, CheckDigit(Sedol(N)));
        CrLf(0);
        ];
]