ISBN13 check digit: Difference between revisions

From Rosetta Code
Content added Content deleted
(new page for ISBN-13 check digit test; included langur language example)
 
No edit summary
Line 1: Line 1:
{{task}}
The task is to validate the check digit of an ISBN-13 code. Use some good and bad codes of your choosing for testing. See https://isbn-information.com/the-13-digit-isbn.html for details on the method of validation.

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

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

<br><br>


=={{header|langur}}==
=={{header|langur}}==

Revision as of 16:48, 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.

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, ": ", .pass
   writeln if(.pass == .tests[.key]: ""; " (ISBN-13 CHECK DIGIT TEST FAILED)")

}</lang>

Output:
978-1734314502: true
978-1734314509: false
978-1788399081: true
978-1788399083: false