RosettaCodeData/Task/CUSIP/Langur/cusip-2.langur

36 lines
741 B
Text
Raw Permalink Normal View History

2026-02-01 16:33:20 -08:00
val isCusip = fn(s string) {
if len(s) != 9 : return false
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
val basechars = '0'..'9' ~ 'A'..'Z' ~ "*@#"
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
val sum = for[=0] i of 8 {
val c = s[i]
var v = 0
switch[and] c {
2023-07-01 11:58:00 -04:00
case >= '0', <= '9':
2024-07-13 15:19:22 -07:00
v = c-'0'
2023-07-01 11:58:00 -04:00
case >= 'A', <= 'Z':
2024-07-13 15:19:22 -07:00
v = c-55 # c-'A'+10
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
case '*': v = 36
case '@': v = 37
case '#': v = 38
2023-07-01 11:58:00 -04:00
default: return false
}
2024-07-13 15:19:22 -07:00
if i div 2: v *= 2
_for += v \ 10 + v rem 10
2023-07-01 11:58:00 -04:00
}
2024-07-13 15:19:22 -07:00
s[9]-'0' == (10-(sum rem 10)) rem 10
2023-07-01 11:58:00 -04:00
}
2024-07-13 15:19:22 -07:00
val candidates = fw/037833100 17275R102 38259P508 594918104 68389X106 68389X105/
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
for c in candidates {
writeln c, ": ", if(isCusip(c): "good" ; "bad")
2023-07-01 11:58:00 -04:00
}