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


$ include "seed7_05.s7i";
 
const func char: sedolCheckDigit (in string: sedol) is func
  result
    var char: checkDigit is ' ';
  local
    const array integer: weight is [] (1, 3, 1, 7, 3, 9);
    var char: ch is ' ';
    var integer: index is 0;
    var integer: item is 0;
    var integer: sum is 0;
   begin
     for ch key index range sedol do
       case ch of
         when {'0' .. '9'}:
           item := ord(ch) - ord('0');
         when {'A' .. 'Z'} - {'A', 'E', 'I', 'O', 'U'}:
           item := ord(ch) - ord('A') + 10;
         otherwise:
           raise RANGE_ERROR;
       end case;
       sum +:= item * weight[index];
     end for;
     checkDigit := chr(-sum mod 10 + ord('0'));
   end func;
 
const proc: main is func
  local
    var string: sedol is "";
  begin
    for sedol range [] ("710889", "B0YBKJ", "406566", "B0YBLH", "228276", "B0YBKL",
                        "557910", "B0YBKR", "585284", "B0YBKT", "B00030") do
      writeln(sedol <& sedolCheckDigit(sedol));
    end for;
  end func;