Список превращен в хеш для сравнения сгенерированного пин-кода? - PullRequest
0 голосов
/ 11 сентября 2018

Я создаю игру, в которой вы взламываете код.Я хочу, чтобы это был любой код от 0000 до 9999. Я сделал этот скрипт.

from random import *
from time import sleep
pin = [randint(0,9),randint(0,9),randint(0,9),randint(0,9)]
print(pin)
usrinp = int(input(''))
if int(usrinp) == pin:
  print('cracked')

Беда в том, что когда я ввожу этот код, он не работает, так как ничего не получается.Есть ли способ объединить эти 4 числа в хеш или как его там называют?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

У вас есть список целых чисел, и вы сравниваете его с одним целым числом. Это не работает по двум причинам:

  • отдельные целые числа никогда не равны списку, независимо от содержимого
  • int() не сохраняет начальные 0 символы; int('0999') возвращает 999, int('0000') возвращает 0.

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

Ваш секретный пин-код может быть сгенерирован путем выбора строковых цифр:

digits = '0123456789'  # or use from string import digits

pin = ''.join([random.choice(digits) for _ in range(4)])  # 4 random digits, one string

, затем протестируйте значение input() для этого вывода:

usrinp = input('')
if usrinp == pin:
    # ...

Примечание: вы могли бы выбрать также одно случайное целое число с random.randint(0, 9999), но тогда вам было бы сложнее сказать игроку, получили ли они некоторые из цифры правильные. Вместо этого, сгенерировав строку, можно, например, подсчитать, сколько цифр у них было правильно:

if usrinp == pin:
    print('Cracked!')
else:
    correct_count = 0
    for pindigit, userdigit in zip(pin, usrinp):
        if pindigit == userdigit:
            correct_count += 1
    print('Sorry, not the right pin, but you guessed",
          correct_count, 'digits correctly!')

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

Другой альтернативой является преобразование пользовательского ввода в отдельные целые числа (поэтому сохраните исходный сгенерированный список целых чисел):

userinp = [int(digit) for digit in input('')]

, но если вы не планируете использовать цифры в арифметике (суммирование, умножение и т. Д.), В этом подходе нет реального преимущества перед использованием строк. Оба списка и строки представляют собой последовательности, но генерации строк избавляет вас от необходимости обрабатывать пользователей, которые упорно ввести 'Your mamma is a <censored>' каждый раз, когда они играют свою игру и нарушают int() преобразования. : -)

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

0 голосов
/ 11 сентября 2018

Это потому, что вы сравниваете целочисленное значение со списком.

import random
from time import sleep
pin = 1000*randint(0, 9) + 100*randint(0, 9) + 10*randint(0, 9) + randint(0, 9)
print(pin)
usrinp = int(input(''))
if usrinp == pin:
  print('cracked')

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

0 голосов
/ 11 сентября 2018

Чтобы получить четыре цифры int, используйте это:

pin = randint(0, 9999)

Таким образом, полученный код будет:

from random import *
from time import sleep
pin = randint(0, 9999)
print('%04d'%pin)  # print with leading zeros
usrinp = int(input(''))
if usrinp == pin:
  print('cracked')
...