Решение для перебора без itertools в Python - PullRequest
0 голосов
/ 03 июня 2019

Я новичок в Python.Я пытаюсь вычислить 3 ** 16 (¹[0-f], ²[0-f], ³[0-f]), но он не работает должным образом.Это мой код:

inp = str(input('value len 0-3 digit:'))
hexa = ('0123456789abcdef');
#len(hexa) = 16 digit
#pass = '36f'
pass = inp
for x in range(0, 3 ** len(hexa)):
#range = 0..(3 ^ 16)
    if(hexa[x] == pass):
        found = hexa[x]
#if result valid
        print("pos: %d, pass: %s" % (x, found))
#print position

Я получил сообщение об ошибке "index out of bound".Мне нужен вывод, как это:

000 #first
001
002
...
...
36f #found then break
...
...
fff #last

Как мне это исправить?

1 Ответ

1 голос
/ 03 июня 2019

Я считаю, что ваша IndexError: string index out of range ошибка проистекает из этой логики:

for x in range(0, 3 ** len(hexa)):

Что, вероятно, должно быть:

for x in range(len(hexa) ** len(inp)):

Гораздо меньшее число.Это никогда не сработает при вводе более одной цифры:

if(hexa[x] == pass):

Вам необходимо переосмыслить это.Используя собственную функцию hex() в Python, я получил приблизительное представление о том, что, по-моему, вы пытаетесь сделать:

hexadecimal = input('hex value of 1-3 digits: ').lower()

hex_digits = '0123456789abcdef'

for x in range(len(hex_digits) ** len(hexadecimal)):
    if hex(x) == "0x" + hexadecimal:
        print("pos: %d, pass: %s" % (x, hexadecimal))
        break

OUTPUT

> python3 test.py
hex value of 1-3 digits: 36f
pos: 879, pass: 36f
>

Если это не то, что вы пытаетесь сделать, объясните, пожалуйста, в своем вопросе.

Другие вопросы, которые следует учитывать: не используйте pass в качестве имени переменной, это ключевое слово Python;input() возвращает str, вам не нужно звонить str на него;избегайте точек с запятой (;) в Python.

...