Python良民证算法rev 2
Posted | archive
以前发过一个良民证算法
现在发现了一个碉堡的新办法:
get_id = lambda s: s + '1X864209753'[int(s, 13) % 11]
来自newsmth的python版:
发信人: Andor (珍惜), 信区: Python
标 题: Re: Python的良民证算法,有没有更简单的写法?
发信站: 水木社区 (Fri Sep 14 15:13:05 2012), 站内
get_id = lambda s: s + '1X864209753'[int(s, 13) % 11]
【 在 zxn0 (est) 的大作中提到: 】
: >>> get_id = lambda s: s+'10X98765432'[reduce(int.__add__, map(lambda
: a,b:int(a)*(ord(b)-64), s[0:17], 'GIJEHDBAFCGIJEHDB' )) % 11]
: >>> get_id('34052419800101001')
: '34052419800101001X'
: 大家看哪里还能精简字符不?
发信人: Fermat (Fermat), 信区: Python
标 题: Re: Python的良民证算法,有没有更简单的写法?
发信站: 水木社区 (Mon Sep 17 01:41:42 2012), 站内
既然 int(s, 13) 这么漂亮的都出来了,又何必把那么好记的 "10X98765432" 弄成一个 magic number 呢
get_id = lambda s: s + '10X98765432'[(int(s, 13)*13) % 11]
或者在有32位整数限制的地方使用类似的
get_id = lambda s: s + '10X98765432'[((int(s, 13)%11)*13)%11]
对于有算法洁癖的,下面的可能会好些
from itertools import chain
get_id = lambda s: s + '10X98765432'[reduce(lambda acc, x:
(acc*13 + int(x)) % 11, chain(s, "0"), 0)]
因为可以把输入字符串当成个无限流,且程序只占用少量固定的空间,也不需要语言对很大的整型有支持。虽然对这个程序没啥意义。
关于良民证,python普通版描述在这里,前六位的来自官方 县及县以上行政区划代码
Comments