38 lines
942 B
Plaintext
38 lines
942 B
Plaintext
var isCusip = Fn.new { |s|
|
|
if (s.count != 9) return false
|
|
var sum = 0
|
|
for (i in 0..7) {
|
|
var c = s[i].bytes[0]
|
|
var v
|
|
if (c >= 48 && c <= 57) { // '0' to '9'
|
|
v = c - 48
|
|
} else if (c >= 65 && c <= 90) { // 'A' to 'Z'
|
|
v = c - 55
|
|
} else if (s[i] == "*") {
|
|
v = 36
|
|
} else if (s[i] == "@") {
|
|
v = 37
|
|
} else if (s[i] == "#") {
|
|
v = 38
|
|
} else {
|
|
return false
|
|
}
|
|
if (i%2 == 1) v = v * 2 // check if odd as using 0-based indexing
|
|
sum = sum + (v/10).floor + v%10
|
|
}
|
|
return s[8].bytes[0] - 48 == (10 - (sum%10)) % 10
|
|
}
|
|
|
|
var candidates = [
|
|
"037833100",
|
|
"17275R102",
|
|
"38259P508",
|
|
"594918104",
|
|
"68389X106",
|
|
"68389X105"
|
|
]
|
|
for (candidate in candidates) {
|
|
var b = (isCusip.call(candidate)) ? "correct" : "incorrect"
|
|
System.print("%(candidate) -> %(b)")
|
|
}
|