Каковы возможные перестановки из 8 цифр

Мне нужно знать, каковы возможные перестановки из 8 цифр, следуя правилам моего кода Python:

import itertools
import time
import string

numbers = set(range(10))
letters = set(string.ascii_letters)
mylist=[]
start=time.time()

comb = ([x for x in itertools.combinations([0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'], 8)
       if set(x) & letters and set(x) & numbers])

f=open("data.txt","w")
f.write("%s" % comb)
f.close()

end=time.time()
diff=end-start

print ("Se obtuvieron {} combinaciones.".format(len(comb)))
print ("En un tiempo total de:",diff,"segundos")

2 ответа

Решение

Их много. Чтобы было ясно:

  • Комбинации 123 для 2 цифр - 12, 13, 23.
  • Перестановки 123 для 2 цифр 12, 13, 21, 23, 31, 32.

Комбинации - это меньшее число, потому что порядок не имеет значения. Ваш код выглядит так, как будто вам требуется хотя бы одна цифра или буква в вашей 8-значной комбинации, поэтому вам нужна сумма:

  • Комбинации из 1 разряда комбинаций из 7 букв.
  • Комбинации из 2 цифр умножить на комбинации из 6 букв.
    так далее...
  • Комбинации из 7 цифр умножить на комбинации из 1 буквы.

Перестановки должны состоять из 62 букв / цифр, взятых по 8, за вычетом перестановок из 52 букв, взятых по 8, за вычетом перестановок из 10 цифр, взятых по 8 за раз.

from math import factorial as f

def P(n,k):
    return f(n)//f(n-k)

def C(n,k):
    return f(n)//f(n-k)//f(k)

letters = 52
numbers = 10
length = 8
combinations = sum(C(numbers,i) * C(letters,length-i) for i in range(1,length))
print('Combinations: {:20,}'.format(combinations))

permutations = P(letters+numbers,length) - P(letters,length) - P(numbers,length)
print('Permutations: {:20,}'.format(permutations))

Выход:

Combinations:        2,628,560,350
Permutations:  105,983,553,312,000

Попытка сгенерировать все эти комбинации или перестановки в списке в памяти, как это делает ваш код, не является хорошей идеей.

Для протокола, я не думаю, что вы задаете правильный вопрос. Вы говорите, перестановка, но ваш код использует комбинации, это разные вещи.

Я не дам вам полный ответ, потому что это займет целую вечность, чтобы вычислить это. Чтобы оценить, насколько велико это число. Перестановка 8 чисел от 0 до 9: 1.814.400

Начиная с: (0, 1, 2, 3, 4, 5, 6, 7), заканчивая (9, 8, 7, 6, 5, 4, 3, 2)

Вы можете продемонстрировать, сколько перестановок из 8 содержится во всех буквах ASCII с числами от 0 до 9, используя это:

mylist = range(10)
mylist.extend(ascii_letters)
i = 0
for n in permutations(mylist,8):
    i += 1

Но это займет ОЧЕНЬ ДОЛГО, чтобы показать, насколько велико это число:

Я запустил его в течение нескольких минут, и это было более 1,500,000,000.( 1,5 миллиарда)

Кроме того, ваш код не имеет особого смысла. Почему вам нужно рассчитать такое большое число? Зачем вам нужно записать его в файл (это, вероятно, займет вечно / не хватит памяти и / или пространства). Попробуйте разработать то, что вы хотите.

Другие вопросы по тегам