индекс списка вне диапазона в взломщике паролей?

#python #arrays #list #indexoutofrangeexception

#питон #массивы #Список #исключение indexoutofrangeexception

Вопрос:

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

 password = input()
chars = "abcdefghijklmnopqrstuvwxyz1234567890"
guess = ""
chars = list(chars)
chararray = []
for l in password:
    chararray.append(0)
while guess != password:
    guess = ""
    for element in chararray:
        guess = guess   chars[element]
    chararray[len(chararray) - 1]  = 1
    i = 0
    while i < len(chararray) - 1:
        if i   1 > len(chars):
            chars[i   1] = 0
            chars[i]  = 1
        i  = 1
    print(guess)
 

часть index out of range находится в той части, которая гласит
guess = guess chars[element]

Комментарии:

1. Вы увеличиваетесь chararray[-1] навсегда. Он быстро приобретет значение , превышающее len(chars) , так что chars[chararray[-1]] > len(chars) .

2. так как же мне это исправить?

3. Я не совсем понимаю, что вы имеете в виду

4. @ProfMonkey07 Код в вашем вопросе выглядит как неудачная попытка преобразовать программу, написанную на C, в Python. Откуда вы его скопировали?

5. это весь оригинальный код Python, я вроде как новичок в программировании

Ответ №1:

Я все исправил

 chars = "abcdefghijklmnopqrstuvwxyz1234567890"
guess = ""
chars = list(chars)
chararray = []
for l in password:
    chararray.append(0)
while guess != password:
    guess = ""
    for element in chararray:
        print(element)
        guess = guess   chars[element]
    chararray[len(chararray) - 1]  = 1
    i = 0
    while i < len(chararray) - 1:
        if chararray[i   1] >= len(chars) - 1:
            chararray[i   1] = 0
            chararray[i]  = 1
        i  = 1
    print(guess)```
 

Ответ №2:

Вы увеличиваете только последний элемент chararray в каждом цикле, получая доступ к элементам chars[] , который фиксирован на 36 элементах. Для тестового ввода hello ваша программа будет работать следующим образом:

 loop 1:
chararray = [0,0,0,0,0]
loop 2:
chararray = [0,0,0,0,1]
loop 3:
chararray = [0,0,0,0,2]
 

Если ваша программа угадает неправильно 36 раз, она увеличит последний элемент chars также в 36 раз, так что с 37-й попытки так и будет chararray = [0, 0, ..., 36] , и поскольку внутренний цикл выполняется для всех элементов chararray, он в конечном итоге попытается выполнить guess = guess chars[36] , что завершится неудачей, потому что в chars всего 36 элементов.