Python良民证算法rev 2

以前发过一个良民证算法

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

  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