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


/* Compute SEDOLs; includes check for invalid characters. */
sedol: procedure options (main); /* 3 March 2012 */
   declare alphabet character (36) static initial
      ('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
   declare weight (6) fixed static initial (1, 3, 1, 7, 3, 9);
   declare s character (6);
   declare (i, v, k) fixed;
 
   do while ('1'b);
      get edit (s) (a(6));
      put skip edit (s) (a);
      /* Check for invalid characters: */
      if verify(s, '0123456789BCDFGHJKLMNPQRSTVWXYZ') > 0 then stop;
      v = 0;
      do i = 1 to 6;
         k = index(alphabet, substr(s, i, 1)) - 1;
         v = v + weight(i) * k;
      end;
      k = mod(v, 10);
      v = mod(10 - k, 10);
      put edit (s, v) (x(2), a, f(1)); put edit ('  ') (a);
   end;
end sedol;