procedure main() every write(sedol("710889"|"B0YBKJ"|"406566"|"B0YBLH"|"228276"| "B0YBKL"|"557910"|"B0YBKR"|"585284"|"B0YBKT"|"B00030")) end procedure sedol(x) #: return the completed sedol with check digit static w,c initial { every (i := -1, c := table())[!(&digits||&ucase)] := i +:= 1 # map chars every c[!"AEIOU"] := &null # delete vowels w := [1,3,1,7,3,9] # weights } if *(x := map(x,&lcase,&ucase)) = *w then { # match lengths every (t :=0, i := 1 to *x) do t +:= \c[x[i]]*w[i] | fail # accumulate weighted chars return x || (10 - (t%10)) % 10 # complete } end