作者xatier (陪在你身边 :))
看板Python
标题Re: [问题] 如何能做到字母进位呢?
时间Sat Dec 13 04:44:55 2014
: 想不到怎麽压到一行 XD
你的好做
(lambda s:
lambda sFixed=s.rstrip('z'):
lambda lz=len(s)-len(sFixed):
(sFixed[:-1] + chr(ord(sFixed[-1])+1) if sFixed else 'a') + 'a'*lz)
('a')()()
不过我也在想我的作法一行要怎麽压 XD
不过 baseN 操作没办法偷偷藏在 lambda 里面w 所以只好拿出来 QQ
baseN = lambda n,b=26,d="abcdefghijklmnopqrstuvwxyz":
(not n and d[0]) or (baseN(n // b, b, d).lstrip(d[0]) + d[n % b])
(lambda s : (lambda x=(sum([(26**(len(s)-_-1)*(ord(c)-ord('a'))) for _,c in
enumerate(s)])+1) : lambda bx=baseN(x): 'a'*(len(s)-len(bx))+bx)()())('az')
'ba'
(lambda s : (lambda x=(sum([(26**(len(s)-_-1)*(ord(c)-ord('a'))) for _,c in
enumerate(s)])+1) : lambda bx=baseN(x): 'a'*(len(s)-len(bx))+bx)()())('aa')
'ab'
(lambda s : (lambda x=(sum([(26**(len(s)-_-1)*(ord(c)-ord('a'))) for _,c in
enumerate(s)])+1) : lambda bx=baseN(x): 'a'*(len(s)-len(bx))+bx)()())('at')
'au'
作法基本上就是换 26 进位然後加一
不过最内层考虑到 leading zero 会是 'a' 但还是要补上去
(lambda s :
(lambda x=
(sum([(26**(len(s)-_-1)*(ord(c)-ord('a'))) for _,c in enumerate(s)])+1) :
# 26 进位换算 ( Σ 26 的几次方 * 系数 )
lambda bx=baseN(x): 'a'*(len(s)-len(bx))+bx)()())('at')
# 补个 0 ,如果原本有的话
<del>其实我们在写 Scheme 对吧 </del>
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.249.144
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1418417097.A.A33.html
※ 编辑: xatier (140.113.249.144), 12/13/2014 04:48:58
1F:推 yauhh: 但你知道吗,functional language中所谓的行数少,不是以 12/13 08:19
2F:→ yauhh: 行数为根据,而是以计算的次数为根据。而且你可以写成一行 12/13 08:20
3F:→ yauhh: 但是终究因为这一行太长,必须折行。 12/13 08:20
4F:→ xatier: 折行的话没差阿,只是用同个 lambda 写起来就会觉得比用 12/13 08:58
5F:→ xatier: 多个 function 拼起来漂亮 XD 12/13 08:58
6F:→ xatier: s/同个 lambda/多个 lambda/ 12/13 08:58