2015-06-12 3 views
0
import time 
password=input("What's your password?") 
ans = "" 
password=password.lower() 
alpha = "abcdefghijklmnopqrstuvwxyz" 
n = 0 
a=0 
starttime=time.time() 
while ans !=password: 
    print(a) 
    for i in range(len(password)): 
      letter=alpha[n] 
      ans+=letter 
      if ans[a] != password[a]: 
       print(ans) 
       ans = ans.replace(ans[a],"") 
       n+=1 
       break 
      else: 
       a+=1 
       print(ans) 
       n=0 
       break 
print("Password Found!") 
endtime=time.time() 
time=endtime-starttime 
print("It took " + str(time) + " seconds!") 

Это мой код, извините, если я не отправляю его правильно (первый раз здесь). Но давайте отвлечемся, кажется я получаю сообщение об ошибке индекса строки из диапазонаString Index Out Of Range (Python) Я тоже сделал границы

Traceback (most recent call last): 
    File "C:\Users\admin\Documents\Letter word cracker.py", line 15, in <module> 
    if ans[a] != password[a]: 
IndexError: string index out of range 

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

+2

Что вы пытаетесь достичь с помощью этого? ... –

+0

для моей оценки, мне сказали, чтобы сделать программу, чтобы взломать пароль.Я создал версию номера, однако письмо одно сложнее. Я использовал random.randint, который работает, но слишком много времени, поэтому я здесь просил вас, ребята. –

+0

У вас есть несколько переменных и конструкций, которые либо смутно названы, либо никогда не использовались. Я предлагаю вам выполнить свой код вручную и выяснить, что происходит где. – TigerhawkT3

ответ

0

Хорошо, я не знаю, почему вы пытаетесь это сделать, то, что вы пытаетесь сделать, то ошибка здесь из-за этой линии

ans = ans.replace(ans[a],"") ---> X 

, что заменить будет сделать, это заменить все вхождения определенного символа из массива, в то время как вам нужно только удалить последнее.

Например: -

Если ANS = «НАА», Заменим теперь заменит как «а» в то время как на основе вашей логике вы только хотите, чтобы удалить последний элемент. потому что вы уже подобрали до «na» и теперь в процессе согласования третьего элемента.

Вы, наверное, могли бы сделать: -

ans = ans[:-1] 

Но опять же, это очень очень плохой способ сделать это, потому что строки являются неизменными, так что вы в основном создания и уничтожения струн каждой итерации.

Один совет, который я бы дал, это использовать список символов вместо строки, это не даст значительного повышения времени исполнения для вашей программы, по какой-либо причине вы используете это.

EDIT: - Также цикл for не нужен, поскольку он всегда прерывается после первой итерации. благодаря @TigerHawk


import time 
password=input("What's your password?") 
ans = [] 
password=password.lower() 
alpha = "abcdefghijklmnopqrstuvwxyz" 
n = 0 
a=0 
starttime=time.time() 
while "".join(ans) !=password: 
    letter=alpha[n] 
    ans.append(letter) 
    if ans[a] != password[a]: 
     ans.pop() 
     n+=1 
    else: 
     a+=1 
     n=0 
print("Password Found!") 
endtime=time.time() 
time=endtime-starttime 
+0

Цикл 'for i in ...' не нужен, так как он всегда« ломается »после первой итерации. – TigerhawkT3

+0

@ TigerhawkT3 спасибо за подсказку, также есть лучший способ вместо использования списка здесь? –

+0

Большое вам спасибо! Это была лучшая помощь! Хотя все elses тоже помогли. Я думаю, я все еще могу расти как программист. –

0

Это немного лучше и более сжатая версия. Из того, что я понимаю, вы хотите перебрать строку символов, чтобы сравнить ее с паролем.

import time 
password=input("What's your password?") 

password=password.lower() 
alpha = "abcdefghijklmnopqrstuvwxyz" 

starttime=time.time() 
for letter in range(len(password)): 
    for index in range(len(alpha)): 
     if alpha[index] == password[letter]: 
      print "Letter",letter,"Found." 
      next 
print "Password Found!" 
endtime=time.time() 
time=endtime-starttime 
print "It took",time,"seconds!" 
+0

Почему у вас есть 'next' в самом заявлении? – TigerhawkT3

0

Есть несколько вопросов, в предыдущем посте, но IndexError происходит потому, что вы сравниваете каждый элемент каждого списка, и когда один список заканчивается, он вызывает исключение IndexError. Оберните эту часть кода в if(), который проверяет, осталось ли еще несколько элементов.

Это будет не исправить всю программу, и на самом деле вам, скорее всего, понадобится лучший способ сделать это сравнение ... Я просто объясняю, почему происходит событие IndexError.

if (ans[a] and password[a]): 
    if ans[a] != password[a]: 
     print(ans) 
     ans = ans.replace(ans[a],"") 
     n+=1 
     break 
+0

, где проблема не является проблемой ... существует логическая проблема здесь ... использования замены ... –

0

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

from time import time 
import string 

#this will only work for a-z no whitespace, caps, numbers, etc. 
pwd = raw_input("What is your password? ") 
pwd = pwd.lower() 
#create list of password for easier iterability 
password = list(pwd) 
#alphabet will have a-z lowercase 
alphabet = list(string.ascii_lowercase) 
#empty list to start 
guess = [] 
#start timer 
start = time() 

#outer loop through password 
for char in password: 
    #inner loop through alphabet 
    for letter in alphabet: 
     if letter == char: 
      guess.append(letter) 
      break 

#print correct guess as string 
end = time() 
print "It took " + str(end - start) + " seconds to solve this password." 

#verify correctness 
print "".join(guess) 
print pwd