ISBN13 check digit: Difference between revisions

(Add Swift)
Line 215:
matching(re/^[0-9]{13}$/, .s) and
for[=0] .d in map(f .c-'0', s2cp .s) { _for += if(.alt=not .alt: .d x 3; .d) } rem 10 == 0
}
 
val .tests = h{
"978-1734314502": true,
"978-1734314509": false,
"978-1788399081": true,
"978-1788399083": false,
}
 
for .key in sort(keys .tests) {
val .pass = .isbn13checkdigit(.key)
write .key, ": ", if(.pass: "good"; "bad")
writeln if(.pass == .tests[.key]: ""; " (ISBN-13 CHECK DIGIT TEST FAILED)")
}</lang>
 
{{works with|langur|0.6.13}}
<lang langur>val .isbn13checkdigit = f(.n) {
val .s = replace .n, RE/[\- ]/
if not matching(re/^[0-9]{13}$/, .s) {
return false
}
# multiply every other number by 3
val .nums = map(
f(.i, .d) if(.i rem 2 == 0: .d x 3; .d),
1..13,
map f .c-'0', s2cp .s,
)
fold(f{+}, .nums) rem 10 == 0
}
 
990

edits