| Karim Belabas on Fri, 31 Jan 2025 02:08:29 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: program to verify ISBN numbers (10 digit or 13 digit) |
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));
}
Cheers,
K.B.
--
Pr. Karim Belabas, U. Bordeaux, Vice-président en charge du Numérique
Institut de Mathématiques de Bordeaux UMR 5251 - (+33) 05 40 00 29 77
http://www.math.u-bordeaux.fr/~kbelabas/
* Loïc Grenié [2025-01-30 23:15]:
> Hi,
>
> On Thu 30 Jan, 2025, at 21:43, American Citizen wrote:
>
>> Hello All:
>>
>> I had to verify some ISBN numbers and didn't know that they actually
>> followed a well ordered scheme for being checked.
>>
>> For anyone who wants it, here's the GP-Pari program to verify the number
>> or string value (removing the dashes)
>>
>> {verify_isbn(N)=
>> my(m10,m13,m,n,sz,z);
>> m10=[10,9,8,7,6,5,4,3,2,1]~;
>> m13=[1,3,1,3,1,3,1,3,1,3,1,3,1]~;
>> if(type(N)=="t_STR",
>> m=Vec(N);
>> sz=matsize(m)[2];
>> n=0;
>> for(i=1,sz,if(m[i]!="-",n=concat(n,eval(m[i]));););
>> sz=matsize(n)[2];
>> n=vector(sz-1,i,n[i+1]);
>> );
>> if(type(N)=="t_INT", n=digits(N););
>> if(default(debug)>0,print("n=",n));
>> if(matsize(n)[2]==13,
>> z=n*m13;
>> if(z%10==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
>> return;
>> );
>> if(matsize(n)[2]==10,
>> z=n*m10;
>> if(z%11==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
>> return;
>> );
>> print("Invalid ISBN: ",N);
>> }
>>
>
> I have slightly streamlined it. It is possible to make it shorter,
> I have not pushed in that direction.
>
> Cheers,
>
> Loïc
>
> verify_isbn(N)=
> {
> my(m10,m13,n,z);
>
> m10=[10,9,8,7,6,5,4,3,2,1]~;
> m13=[1,3,1,3,1,3,1,3,1,3,1,3,1]~;
>
> if(type(N)=="t_STR",
> n=apply(eval,select(c->c!="-",Vec(N)));
> ,
> type(N)=="t_INT",
> n=digits(N);
> );
> if(default(debug)>0,print("n=",n));
> if(#n==13,
> z=n*m13;
> if(z%10==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
> ,
> #n==10,
> z=n*m10;
> if(z%11==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
> ,
> print("Invalid ISBN: ",N);
> );
> }