sedols.sf 615 B

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/SEDOLs
  4. #
  5. func sedol(s) {
  6. die 'No vowels allowed' if (s ~~ /[AEIOU]/)
  7. die 'Invalid format' if (s !~ /^[0-9B-DF-HJ-NP-TV-Z]{6}$/)
  8. const base36 = [[(^10)..., ('A'..'Z')...], ^36].zip.flat.to_h
  9. const weights = [1, 3, 1, 7, 3, 9]
  10. var vs = [base36{ s.chars... }]
  11. var checksum = (vs ~Z* weights -> sum)
  12. var check_digit = ((10 - checksum%10) % 10)
  13. return (s + check_digit)
  14. }
  15. %w(
  16. 710889
  17. B0YBKJ
  18. 406566
  19. B0YBLH
  20. 228276
  21. B0YBKL
  22. 557910
  23. B0YBKR
  24. 585284
  25. B0YBKT
  26. B00030
  27. ).each { |s|
  28. say sedol(s)
  29. }