27 lines
688 B
Text
27 lines
688 B
Text
validCUSIP?: function [cusip][
|
|
s: 0
|
|
alpha: 'A'..'Z'
|
|
|
|
loop.with:'i chop cusip 'c [
|
|
v: 0
|
|
|
|
when.has: c [
|
|
[|numeric?] -> v: to :integer to :string c
|
|
[|in? alpha] -> v: (index alpha c) + 1 + 9
|
|
[= '*'] -> v: 36
|
|
[= '@'] -> v: 37
|
|
[= '#'] -> v: 38
|
|
]
|
|
|
|
if odd? i -> v: 2 * v
|
|
|
|
s: s + (v / 10) + (v % 10)
|
|
]
|
|
check: (10 - (s % 10)) % 10
|
|
|
|
return check = to :integer to :string last cusip
|
|
]
|
|
|
|
loop ["037833100" "17275R102" "38259P508" "594918104" "68389X106" "68389X105"] 'cusip [
|
|
print [cusip "=>" (validCUSIP? cusip)? -> "VALID" -> "INVALID"]
|
|
]
|