RosettaCodeData/Task/CUSIP/Arturo/cusip.arturo
2026-02-01 16:33:20 -08:00

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"]
]