defencode_2(n,key=None,unique = False):
fact = [1]
for i in range(1,n+1):fact.append(fact[-1]*i)
defkey_value(x):return key(x) if key else x
defencode_unique(s):
length = len(s)
code = 0for i in range(length):
count=0for j in range(i+1,length):
if key_value(s[i])>key_value(s[i]):count+=1
code += count*fact[length-i-1]
return code
defencode_nonunique(s):
length = len(s)
code,repeat = 0,{}
for x in s:
k = key_value(x)
if k in repeat:repeat[k]+=1else:repeat[k]=1for i in range(length):
repeat[key_value(s[i])]-=1
vis = set()
for j in range(i+1,length):
if key_value(s[i])>key_value(s[j]) and key_value(s[j]) notin vis:
repeat[key_value(s[j])]-=1;repeat[key_value(s[i])]+=1
code += fact[length-i-1]//reduce(lambda x,y:x*y,[w for w in repeat.values() if w>1],1)
repeat[key_value(s[j])]+=1;repeat[key_value(s[i])]-=1
vis.add(key_value(s[j]))
return code
return encode_unique if unique else encode_nonunique
hash = encode_2(10)
print(hash([1,3,2,2,1,1,6,7,8]))