2015-01-02 5 views
-3

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

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") 
+1

комбинации или перестановки? Один находится в коде, а один - ваш тег, но это не одно и то же. –

+0

@MarkTolonen извините, они на самом деле перестановки и 8 цифр, извините мой английский. – jcrashvzla

ответ

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 

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

+0

Привет, спасибо за ваш ответ, но вы думаете, что мой код не сохраняет следующие перестановки? ABCEFGTH или 12345678 или AAAAAAAA и т. Д. – jcrashvzla

+1

AAAAAAAA не является перестановкой. Если вы разрешаете повторы, это декартово произведение, и их еще больше. –

1

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

Я не дам вам полного ответа, потому что на это потребуется время, чтобы вычислить это. Чтобы выразить это в перспективе, насколько велика эта цифра. Перестановка 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 

Но это займет очень LONG, просто чтобы показать, насколько велика эта цифра:

Я запустил ее на пару минут, и это было o ver 1.500.000.000. (1,5 миллиарда)

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

+0

Я хочу преобразовать md5, но с учетом того, что слишком долго думать, я продолжу программу :(Большое спасибо в любом случае файл. – jcrashvzla

Смежные вопросы