最小化代码行
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
没必要强求一线。你一无所获,你失去了可读性。
我有几行代码可以为凯撒密码制作一个旋转字符串,为了好玩,我试图将它们压缩成一个。显然这是毫无意义的,因为它完全不可读,但我很好奇。尽管如此,我还是不太清楚该怎么做。这是我到目前为止尝试过的
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
没必要强求一线。你一无所获,你失去了可读性。