Есть связанный вопрос здесь .Я пытаюсь выполнить этот проект Эйлера на HackerRank.Для этого требуется, чтобы вы могли получить n th перестановку строки "abcdefghijklm".Есть 13!Перестановки.
Я попробовал простое решение, где я использовал for num, stry in zip(range(1, math.factorial(13)), itertools.permutations("abcdefghijklm"):
.Это работает, но время ожидания истекло.
Что было бы действительно хорошо, так это сохранить каждое значение в dict
, как я иду, и сделать что-то вроде этого:
import itertools
import math
strt = "abcdefghijklm"
dic = {}
perms_gen = itertools.permutations(strt)
idxs_gen = range(1, math.factorial(13))
curr_idx = 0
test_list = [1, 2, 5, 10]
def get_elems(n):
for num, stry in zip(idxs_gen, perms_gen):
print(num) # debug
str_stry = "".join(stry)
dic[num] = str_stry
if num == n:
return str_stry
for x in test_list:
if curr_idx < x:
print(get_elems(x))
else:
print(dic[x])
Этоне работаетВместо этого я получаю этот вывод:
1
abcdefghijklm
1
2
abcdefghijlkm
1
2
3
4
5
abcdefghikjml
1
2
3
4
5
6
7
8
9
10
abcdefghilmkj
Когда я писал этот вопрос, я, очевидно, нашел ответ ... продолжение следует.