【问题标题】:Minimizing lines of code [closed]最小化代码行[关闭]
【发布时间】:2015-08-13 14:26:58
【问题描述】:

我有几行代码用于为凯撒密码制作旋转字符串,只是为了好玩,我试图将它们浓缩成一个。显然这是毫无意义的,因为它完全不可读,但我很好奇。不过,我还是不知道该怎么做。这是我到目前为止尝试过的方法

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 链接到一行中。

【问题讨论】:

  • 你为什么希望它是单行的?你失去了可读性,却一无所获。
  • @MarkusMeskanen 引用 OP:“显然这是毫无意义的,因为它完全不可读,但 我很好奇。”(强调我的)。只是玩玩而已。
  • @poke 我知道他只是好奇,但他的所作所为很愚蠢(无意冒犯,我自己也做过)。看看我的回答,你可以有一个功能,保持可读性,什么都没有。没有必要对编写糟糕的代码感到好奇。
  • 为什么要压缩代码?这看起来是个愚蠢的问题。
  • 我想把它浓缩成一行,因为我一直看到这样的代码,而且我很难阅读它,所以我试图编写糟糕的代码,以便我能理解糟糕的代码。这对我来说也很有趣,该语言支持将这么多 if/else/for/lambda/whatever 链接在一起。

标签: python python-2.7 minimize


【解决方案1】:

您可以使用reduce(在 Python 3 中为 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,将 rot 中的字符从 s 中删除。这使用了该函数的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())

【讨论】:

  • 这和原来的不一样。
  • @skyking 这就是我想要的。我只想压缩 if else 语句,我更新了我的问题以更好地描述它。
  • @skyking 是的,确实如此。或者你有没有为相同的输入产生不同结果的例子?
  • 原文包括提示输入键例如...
  • @skyking 从原文中我很清楚。 “这是我迄今为止尝试过的” 代码显示了它的外观;替换 s 在一行中完成。但是 OP 的代码不起作用(正如后面介绍 “实际工作的版本” 的那一行所表明的那样),所以他询问如何在让它仍然工作的同时正确地做到这一点。我无法帮助你不明白,但我明白了。这也不会使我的答案无效,所以我不知道为什么我的答案被否决了,而这正是 OP 所要求的。
【解决方案2】:

鉴于这个简单的测试用例

>>> 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!'

【讨论】:

  • 这不考虑密钥密码的情况。只有旋转的情况。如果您不了解密钥密码,则问题中有一个链接。这是一个很好的解释
【解决方案3】:

这只是您的代码的快速打高尔夫球(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)

【讨论】:

  • 我不明白你从那个 OP 想打高尔夫球的代码那里得到的想法......
  • @poke “我有几行代码......只是为了好玩,我试图将它们压缩成一个......”。我知道,不完全是“打高尔夫球”,但非常接近。也就是说,我可能应该去睡觉了,所以我可能是错的:)。
  • @Cyphase 你比我想要的更多,但它仍然回答了这个问题,所以 +1
【解决方案4】:

您可以拥有的最简单的单线: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

没有必要强制单行。你一无所获,你失去了可读性。

【讨论】:

  • 在哪里可以找到rotify 函数?
  • @SirParselot 为什么?我发现这比任何其他答案都好得多且可读性强。就像你自己说的:“这是实际有效的可读版本”
  • @skyking “尽量减少行数”?这是什么,单行记事本?
  • 我同意这是一个愚蠢的问题。
  • @SirParselot 那么为什么首先要问这个问题呢?你想要完成的事情是疯狂的。这就像想拥有一间壁挂式笔记本电脑的浴室:为什么不使用可以随时携带到浴室的普通笔记本电脑呢?您正在拼命寻找一种将笔记本电脑安装到坚固墙上的方法,而正确的答案是一开始就不要这样做。不要压缩代码,它现在绝对完美。没有一个雇主希望您使用其他人提供的单线解决方案,而不是您已经拥有的多线解决方案。
猜你喜欢
  • 2011-08-23
  • 2021-12-31
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多