Re: [问题] 如何能做到字母进位呢?

楼主: xatier (一切重来就好了...)   2014-12-13 04:44:55
: 想不到怎么压到一行 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>
作者: yauhh (小y宝贝)   2014-12-13 08:19:00
但你知道吗,functional language中所谓的行数少,不是以行数为根据,而是以计算的次数为根据。而且你可以写成一行但是终究因为这一行太长,必须折行。
楼主: xatier (一切重来就好了...)   2014-12-13 08:58:00
折行的话没差阿,只是用同个 lambda 写起来就会觉得比用多个 function 拼起来漂亮 XDs/同个 lambda/多个 lambda/

Links booklink

Contact Us: admin [ a t ] ucptt.com