最小化代码行

Minimizing lines of code

我有几行代码可以为凯撒密码制作一个旋转字符串,为了好玩,我试图将它们压缩成一个。显然这是毫无意义的,因为它完全不可读,但我很好奇。尽管如此,我还是不太清楚该怎么做。这是我到目前为止尝试过的

s = 'abcdefghijklmnopqrstuvwxyz'
rot = raw_input('Enter Rotation or Key: ')
s = s[-int(rot):] + s[:-int(rot)] if rot.isdigit() else rot.lower()+ ''.join([j for i in s for j in rot.lower() if j == i]) # This is the only line I want condensed
print s

这是实际有效的可读版本

s = 'abcdefghijklmnopqrstuvwxyz'
rot = raw_input('Enter Rotation or Key: ')
if rot.isdigit():                        #I only want from here
    s = s[-int(rot):] + s[:-int(rot)]
else:
    for i in rot.lower():
        s = s.replace(i,'')
    s = rot.lower() + s                  #To here condensed into one line
print s

rot 是旋转字母表的量或凯撒密码的 keyed version 的密钥。您应该能够 运行 按原样查看代码并准确查看错误所在

我知道这是糟糕的代码,但我发现这种代码很有趣,因为该语言支持将如此多的 if/else/for/lambda/whatever 链接成一行。

给定这个简单的测试用例

>>> from string import ascii_lowercase as letters
>>> s = 'this is a test with 2 numbers 55!'
>>> rot = 5

下面的一行代码似乎可以解决问题

>>> ''.join(letters[(letters.index(i)+rot)%len(letters)] if i in letters else i for i in s)
'ymnx nx f yjxy bnym 2 szrgjwx 55!'

您可以在 Python 3):

中使用 reduce (it’s functools.reduce 重写 else 情况
if rot.isdigit():
    s = s[-int(rot):] + s[:-int(rot)]
else:
    s = rot.lower() + reduce(lambda x, y: x.replace(y, ''), rot.lower(), s)

然后你可以把它合并成一行:

s = s[-int(rot):] + s[:-int(rot)] if rot.isdigit() else rot.lower() + reduce(lambda x, y: x.replace(y, ''), rot.lower(), s)

但是你说的完全正确:这样写是没有意义的。真是看不懂。


因为你使用的是Python 2,你实际上也可以在这里使用str.translate,从s中删除rot中的字符。这使用该函数的 deletechars 参数:

s = rot.lower() + s.translate(None, rot.lower())

你的单行表达式再短一点:

s = s[-int(rot):] + s[:-int(rot)] if rot.isdigit() else rot.lower() + s.translate(None, rot.lower())

这只是您的代码(178 字节)的快速练习:

rot=raw_input('Enter Rotation or Key: ').lower();s='abcdefghijklmnopqrstuvwxyz';print s[-int(rot):]+s[:-int(rot)]if rot.isdigit()else rot+reduce(lambda s,i:s.replace(i,''),rot,s)

您可以拥有的最简单的一行:s = rotify(s, rot)

s = 'abcdefghijklmnopqrstuvwxyz'
rot = raw_input('Enter Rotation or Key: ')
s = rotify(s, rot)
print s

你只需要一个函数 rotify(),你已经在问题中提供了它(我从 s =return 做了一些修改):

def rotify(s, rot):
    if rot.isdigit():
        return s[-int(rot):] + s[:-int(rot)]
    else:
        for i in rot.lower():
            s = s.replace(i,'')
        return rot.lower() + s

没必要强求一线。你一无所获,你失去了可读性。