51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
func isCusip(s string) bool {
|
|
if len(s) != 9 { return false }
|
|
sum := 0
|
|
for i := 0; i < 8; i++ {
|
|
c := s[i]
|
|
var v int
|
|
switch {
|
|
case c >= '0' && c <= '9':
|
|
v = int(c) - 48
|
|
case c >= 'A' && c <= 'Z':
|
|
v = int(c) - 55
|
|
case c == '*':
|
|
v = 36
|
|
case c == '@':
|
|
v = 37
|
|
case c == '#':
|
|
v = 38
|
|
default:
|
|
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
|
|
}
|
|
|
|
func main() {
|
|
candidates := []string {
|
|
"037833100",
|
|
"17275R102",
|
|
"38259P508",
|
|
"594918104",
|
|
"68389X106",
|
|
"68389X105",
|
|
}
|
|
|
|
for _, candidate := range candidates {
|
|
var b string
|
|
if isCusip(candidate) {
|
|
b = "correct"
|
|
} else {
|
|
b = "incorrect"
|
|
}
|
|
fmt.Printf("%s -> %s\n", candidate, b)
|
|
}
|
|
}
|