ISBN13 check digit: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
Line 35: Line 35:
for .key in sort(keys .tests) {
for .key in sort(keys .tests) {
val .pass = .isbn13checkdigit(.key)
val .pass = .isbn13checkdigit(.key)
write .key, ": ", .pass
write .key, ": ", if(.pass: "good"; "bad")
writeln if(.pass == .tests[.key]: ""; " (ISBN-13 CHECK DIGIT TEST FAILED)")
writeln if(.pass == .tests[.key]: ""; " (ISBN-13 CHECK DIGIT TEST FAILED)")
}</lang>
}</lang>


{{out}}
{{out}}
<pre>978-1734314502: true
<pre>978-1734314502: good
978-1734314509: false
978-1734314509: bad
978-1788399081: true
978-1788399081: good
978-1788399083: false</pre>
978-1788399083: bad</pre>

Revision as of 17:11, 4 December 2019

Task
ISBN13 check digit
You are encouraged to solve this task according to the task description, using any language you may know.
Task

Validate the check digit of an ISBN-13 code. Use some good and bad codes of your choosing for testing.

Multiply every other digit by 3. Add the digits together. Take the remainder of division by 10. If it is 0, the ISBN-13 check digit is correct.

See also

See https://isbn-information.com/the-13-digit-isbn.html for details on the method of validation.

langur

<lang langur>val .isbn13checkdigit = f(.n) {

   val .s = replace(.n, "-", "")
   if len(.s) != 13 {
       return false
   }
   # multiply every other number by 3
   val .nums = map(
       f(.i, .d) if(.i rem 2 == 0: .d x 3; .d),
       series(13),
       map f .c-'0', s2cp .s,
   )
   fold(f .x + .y, .nums) 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>

Output:
978-1734314502: good
978-1734314509: bad
978-1788399081: good
978-1788399083: bad