作者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://www.ptt.cc/bbs/Python/M.1418417097.A.A33.html
※ 編輯: xatier (140.113.249.144), 12/13/2014 04:48:58
推 yauhh: 但你知道嗎,functional language中所謂的行數少,不是以 12/13 08:19
→ yauhh: 行數為根據,而是以計算的次數為根據。而且你可以寫成一行 12/13 08:20
→ yauhh: 但是終究因為這一行太長,必須折行。 12/13 08:20
→ xatier: 折行的話沒差阿,只是用同個 lambda 寫起來就會覺得比用 12/13 08:58
→ xatier: 多個 function 拼起來漂亮 XD 12/13 08:58
→ xatier: s/同個 lambda/多個 lambda/ 12/13 08:58