Мені потрібно знати, які можливі перестановки 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 для відповіді № 1Їх багато.
- Комбінації з 123 для 2 цифр складають 12, 13, 23.
- Пермутації 123 для 2 цифр складають 12, 13, 21, 23, 31, 32.
Комбінації є меншою кількістю, тому що замовлення не має значення. Ваш код виглядає так, як вам потрібен принаймні один номер або букву у 8-значній комбінації, тому вам потрібна сума:
- Комбінації по 1 розряду по 7 літер.
- Комбінації по 2 цифри по 6 комбінацій букв.
тощо ... - Комбінації по 7 цифр по 1 комбінації.
Пермутації повинні бути 62 літери / цифри, прийняті за один раз, за вирахуванням всіх літерних перестановок з 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
Спроба генерувати всі ці комбінації або перестановки в списку в пам'яті, як це робиться вашим кодом, не є гарною ідеєю.
1 для відповіді № 2
Для відома, я не думаю, що ви ставите правильне питання.
Я не дам вам повної відповіді, тому що для обчислення цього потрібно вічно. Поставити її в перспективі, наскільки велике це число. Перестановка з 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 мільярдів).
Крім того, ваш код не має особливого сенсу. Чому потрібно розраховувати таке велике число? Чому вам потрібно записати його у файл (це, напевно, займе вічно / закінчиться пам'ять і / або пробіл). Спробуйте розробити те, що ви хочете.