将列表制成散列以比较生成的 pin 码?

List made into a hash to compare generated pin code?

我正在制作一款破解密码的游戏。我想要它,所以它可以是从 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 个数字组合成一个散列或任何所谓的散列?

要获得四位整数,请使用:

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')

您有一个整数列表,并将其与单个整数进行比较。这不起作用有两个原因:

  • 无论内容如何,​​单个整数永远不会等于列表
  • int() 不保留前导 0 字符; int('0999') returns 999, int('0000') returns 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() 转换的用户。 :-)

None 其中需要hashing;散列在这里没有用,因为你想测试相等性,而不是试图将大量的潜在值减少到一组有限的选项(比如试图将任意值放入有限大小的 table 中,或者将大量传入连接定向到可以处理这些连接的有限数量的服务器)。

这是因为您正在将整数值与列表进行比较。

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')

如果您的 pin 始终为 4 位数字,而不是前导零的数字,这应该有效。