我现在的一个程序中有一个荒谬的代码段:
str(len(str(len(var_text)**255)))
有没有简单的方法来缩短它? “坦率地说,这是荒谬的。”
将数字> 500位数转换为科学计数法的选项也会有所帮助 (这就是我想要做的)
完整代码:
print("Useless code rating:" , str(len(var_text)**255)[1] + "e" + str(len(str(len(var_text)**255))))
答案 0 :(得分:6)
TL; DR :y = 2.408 * len(var_text)
让我们假设您的密钥是一个包含256个字符的字符串(0-255)。然后就像16位数字保持65536个数字(2 ** 16)一样,相等长度的字符串的排列将是
n_perms = 256**len(passkey)
如果你想要n_perms中的(十进制)数字,请考虑对数:
>>> from math import log10
>>> log10(1000)
3.0
>>> log10(9999)
3.9999565683801923
>>>
所以我们有length = floor(log10(n_perms)) + 1
。在python中,无论如何int
向下舍入,所以我想说你想要
n_perms = 256**len(var_text)
length = int(log10(n_perms)) + 1
我认为“缩短”难看的代码并不总是最好的方式 - 你希望它能清楚你正在做什么。
编辑:进一步考虑后,我意识到选择base-10来查找排列长度实际上是任意的 - 所以为什么不选择base-256!
length = log256(256**len(var_text)
length = len(var_text) # the log and exp cancel!
您实际上只是在不同的基础上找到密钥的长度......
编辑2 :退后一步,我将尝试数学!
if x = len(var_text), we want y such that
y = log10(256**x)
10**y = 256**x
10**y = (10**log10(256))**x
10**y = (10**(log10(256)x))
y = log10(256) * x
那么,简而言之:
length = log10(256) * len(var_text) # or about (2.408 * x)
答案 1 :(得分:0)
这看起来像是在字符串长度的第255次幂中生成数字位数的字符串版本。是对的吗?我很好奇这是用来做什么的。
你可以用不同的方式计算数字,但它并不短,我不确定它更漂亮:
str(int(math.ceil(math.log10(len(var_text))*255)))
或:
"%d" % math.ceil(math.log10(len(v))*255)
答案 2 :(得分:0)
您是否尝试确定与var_text
长度相同的可能字符串数?如果是这样,你的基数和指数就会反转。您想使用255**len(var_text)
代替len(var_text)**255
。
但是,我不得不问......这些密码有多长,你用它们做什么?
而且,为什么不使用密码的长度作为其长度的指标?
答案 3 :(得分:0)
首先,如果您的主要问题是操纵巨大的浮点表达式,请使用bigfloat package:
>>> import bigfloat
>>> bigfloat.BigFloat('1e1000')
BigFloat.exact('1.0000000000000001e+1000', precision=53)
至于您问题中的详细信息:len(str(num))
大约等于log(num, 10) + 1
。这并没有明显缩短,但它肯定是一种在代码中表达它的更好方式(为了任何不知道这一点的人的利益)。然后,您可以使用日志法来简化它:
len(str(x**y))
= log(x**y, 10) + 1
= y * log(x, 10) + 1
所以也许你会发现:
"%i" % (log(len(var_text),10)*255 + 1)
......更好?它并没有明显缩短,但输入和输出之间的数学关系更清晰。