作者darkgerm (黑骏)
看板Python
标题Re: [闲聊] 身份证产生器
时间Sat Dec 17 21:25:16 2011
※ 引述《zha0 (这个帐号是挂网用)》之铭言:
: 这二天在版上一直问一些基本的问题, 其实是要写身份证产生器(不过是某个程式的一部份)
: 以下分享写的程式码, 如果有人有兴趣, 不知可不可以再帮我把他简化 , 感谢 .
: 以前写 C 有写过不用查表的方式 , 用 if else if 一直在那里判断 A~G, H, I~... 就减多少加多少之类的 :p
: 不过觉得这样也要好几行, 还是用查表好了, 二个 array 去代入 .
: import os, sys
: from random import randint, sample, choice
: def chk():
: id=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
: num=[10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35, 23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33]
: a2n=dict(zip(id, num))
: alpha = choice(id)
: r = [choice((1, 2))]+sample(range(0, 10), 7)
: k = [ v*(8-i) for i,v in enumerate(r) ]
: chk = (a2n[alpha]/10)+(a2n[alpha]%10*9) + sum(k)
: chk = (10 - (chk % 10)) % 10
: return alpha+''.join(map(str, r))+str(chk)
: if __name__ == '__main__':
: for i in range(1,10):
: print chk()
事实上,"对照"这件事是可以事先化简的
("英文部分" + "流水号部分" + "检查码") %10 = 0
("英文部分"%10 + "流水号部分" + "检查码") %10 = 0
这两个意思一样
於是我可以把 10 11 12... 先"十位加个位" %10 (身分证计算法)
然後就能写成字串 "10987654932210898765431320"
这是我的写法:
alpha = choice(
range(
26))
ret = [choice([
1,
2])] + sample(
range(
10),
7)
chk = [ v*(
8-i)
for i,v
in enumerate(ret) ]
chk =
int(
"10987654932210898765431320"[alpha]) +
sum(chk)
chk = (
10-chk%
10) %
10
return
chr(alpha+
ord(
"A")) +
''.join(
map(
str,ret)) +
str(chk)
其实 chk 是可以全部缩成一行的XD 不过那样会变得很丑就是了
(如何在最短行数做到最多的事是我乐趣之一XD)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.24.33