我很好奇我是否正确打高尔夫。我为自己提出了一个挑战,那就是如何在Python中将小型哈希程序编写为单个语句。我首先开始:
from itertools import permutations
from string import ascii_lowercase
from random import sample
def test():
chars = sample(ascii_lowercase, 9)
sums = list(map(h, permutations(chars)))
if len(set(sums)) == len(sums):
print("unique results for permutations of given string")
else:
print("duplicate entries present in test results")
def h(s):
r = 0
for i in range(len(s)):
r += ord(s[i]) << (i * len(s))
return r
test()
然后,我使函数递归:
def h(s, i=0):
if i < len(s) - 1: return h(s, i+1) + ord(s[i]) << (i * len(s))
else: return ord(s[i]) << (i * len(s))
我尝试用lambda缩短它来重复代码(这没有用):
def h(s, i=0, f=lambda s,i: ord(s[i]) << (i * len(s))):
if i < len(s) - 1: return h(s, i+1) + f(s,i)
else: return f(s,i)
最后,我得到了一个lambda:
h=lambda s,i=0:h(s,i+1)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s))
我希望该程序成为一个声明,所以首先我想到了:
def test():
chars = sample(ascii_lowercase, 9)
sums = list(map((lambda s,i=0,f=lambda s,i,f:f(s,i+1,f)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s)):f(s,i,f)), permutations(chars)))
if len(set(sums)) == len(sums):
print("unique results for permutations of given string")
else:
print("duplicate entries present in test results")
最后我得到了:
print((lambda x=list(map((lambda s,i=0,f=lambda s,i,f:f(s,i+1,f)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s)):f(s,i,f)), permutations(sample(ascii_lowercase, 9)))): "unique results for permutations of given string" if len(set(x)) == len(x) else "duplicate entries present in test results")())
这是如何解决代码高尔夫问题的吗?我从来没有真正做过这样的事情,所以现在我只想知道我是否做对了。
修订:该程序可以为您完成所有工作;因此,我将在此引用该函数:作为输入,该程序接受给定字符串的所有排列;这里的字符串是从中随机选取的9个字符ascii_lowercase
。输出是人类可读的字符串,用于定义给定字符串的每个排列结果是否与另一个字符串的另一个结果重复。如果所有排列均无重复,则程序指示成功。九个字符被选为最大的字符长度,可以在我的盒子上反复计算。
修改II正如好学的读者所指出的,所描述的预期目的不是通过随附的代码获得的。测试用例显然是不够的。
print"x"
而不是print("x")
list()
?