30 lines
570 B
Plaintext
30 lines
570 B
Plaintext
func sedol(s) {
|
|
|
|
die 'No vowels allowed' if (s ~~ /[AEIOU]/);
|
|
die 'Invalid format' if (s !~ /^[0-9B-DF-HJ-NP-TV-Z]{6}$/);
|
|
|
|
const base36 = ((@(0..9) + @('A'..'Z')) ~Z @(0..35) -> flatten.to_h);
|
|
const weights = [1, 3, 1, 7, 3, 9];
|
|
|
|
var vs = [base36{ s.chars... }];
|
|
var checksum = (vs ~Z* weights -> sum);
|
|
var check_digit = ((10 - checksum%10) % 10);
|
|
return (s + check_digit);
|
|
}
|
|
|
|
%w(
|
|
710889
|
|
B0YBKJ
|
|
406566
|
|
B0YBLH
|
|
228276
|
|
B0YBKL
|
|
557910
|
|
B0YBKR
|
|
585284
|
|
B0YBKT
|
|
B00030
|
|
).each { |s|
|
|
say sedol(s);
|
|
}
|