CWYAlpha

Just another WordPress.com site

Thought this was cool: Python良民证算法rev 2

leave a comment »


以前发过一个良民证算法

现在发现了一个碉堡的新办法:

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普通版描述在这里,前六位的来自官方 县及县以上行政区划代码

from est's blog: http://blog.est.im/post/31769215479

Written by cwyalpha

九月 18, 2012 在 10:38 上午

发表在 Uncategorized

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: