卡号校验
* * * *
拉格朗日计划
* * * *
卡号校验

Luhn算法是一种常用的数字序列有效性校验的方法。

给定一系列输入数据,每条数据是一串16位数的卡号,每四位由一个空格隔开(比如3566 0020 2036 0505),若号码有效就将其输出。

设输入的卡号是XyXy XyXy XyXy XyXy, 记所有y的数字和是s1,对每一个X,计算$2\cdot X$的各位数字和,再将所有这些数字相加,结果记作s2,若$s1+s2$能被10整除,则卡号有效。

本题难度:



解答

0到9的数字乘以2以后依次是0,2,4,6,8,10,12,14,16,18,对应的数字和是0,2,4,6,8,1,3,5,7,9。

亦即若X不超过5,则数字和的个位就是2X的个位,否则是2X+1的个位。

利用这一点可以简化s2的计算。

最终代码有两行。

代码长度:113字节 vs. 全站第一:84字节。

import sys
for a in sys.argv[1:]:b=[*map(int,a.replace(" ",""))];sum(b+[d+(d>4)for d in b[::2]])%10<1and print(a)