Bill Allombert on Fri, 31 Jan 2025 18:59:22 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: program to verify ISBN numbers (10 digit or 13 digit)


On Fri, Jan 31, 2025 at 02:08:24AM +0100, Karim Belabas wrote:
> Here's a further shortened version.
 
verify_isbn(N)=
{ my(M, n, z);
  M = Map([10, [[10,9,8,7,6,5,4,3,2,1]~, 11];
           13, [[1,3,1,3,1,3,1,3,1,3,1,3,1]~, 10]]);
  n = if (type(N)=="t_STR", apply(eval, select(c -> c != "-", Vec(N))),
          type(N)=="t_INT", digits(N));
  if (!mapisdefined(M, #n, &z) || (n * z[1]) % z[2], print("Invalid! ", N)
                                                   , print("Valid ISBN: ", N));
}

2 comments: 
- for the '13' case, this just check this is an EAN13. To be an ISBN
it needs to start by 978 or 979.

- for the '10' case, the last digit can be the letter X to denote 10,
since the checksum is mod 11.

Game: why do we get this:
? verify_isbn("0-0000-0001-X");
Valid ISBN: 0-0000-0001-X

Cheers,
Bill, small-scale book publisher.