52 lines
1 KiB
V
52 lines
1 KiB
V
fn is_cusip(s string) bool {
|
|
if s.len != 9 { return false }
|
|
mut sum := 0
|
|
for i in 0..8 {
|
|
c := s[i]
|
|
mut v :=0
|
|
match true {
|
|
c >= '0'[0] && c <= '9'[0] {
|
|
v = c - 48
|
|
}
|
|
c >= 'A'[0] && c <= 'Z'[0] {
|
|
v = c - 55
|
|
}
|
|
c == '*'[0] {
|
|
v = 36
|
|
}
|
|
c == '@'[0] {
|
|
v = 37
|
|
}
|
|
c == '#'[0] {
|
|
v = 38
|
|
}
|
|
else {
|
|
return false
|
|
}
|
|
}
|
|
if i % 2 == 1 { v *= 2 } // check if odd as using 0-based indexing
|
|
sum += v/10 + v%10
|
|
}
|
|
return int(s[8]) - 48 == (10 - (sum%10)) % 10
|
|
}
|
|
|
|
fn main() {
|
|
candidates := [
|
|
"037833100",
|
|
"17275R102",
|
|
"38259P508",
|
|
"594918104",
|
|
"68389X106",
|
|
"68389X105",
|
|
]
|
|
|
|
for candidate in candidates {
|
|
mut b :=' '
|
|
if is_cusip(candidate) {
|
|
b = "correct"
|
|
} else {
|
|
b = "incorrect"
|
|
}
|
|
println("$candidate -> $b")
|
|
}
|
|
}
|