Python: Случайное угадывание пароля из 4 цифр, не могу решить 1 проблему

#python #passwords

Вопрос:

Я новичок в Python. У меня есть программа, которая позволяет вам угадать случайный 4-значный пароль. Например, если пароль 5530 , если я угадаю один 5 внутри (например 5111 ), он говорит, что я правильно угадал 2 числа. Если пароль есть 5535 , он говорит, что я правильно угадал 3 числа.

Но на самом деле он интерпретировал сингл 5 в моем ответе как правильный для других 5 s. Я хочу, чтобы в нем говорилось только , что я правильно угадал одно число, если есть, и два или три 5 s, два правильных, если я набрал два 5 s для 5530 , три правильных, если я набрал три 5 s для 5535 .

 import random

no1 = random.randint(0, 9)
no2 = random.randint(0, 9)
no3 = random.randint(0, 9)
no4 = random.randint(0, 9)

password = str(no1)   str(no2)   str(no3)   str(no4)
count = 0

if no1 % 2 == 0:
    count  = 1

if no2 % 2 == 0:
    count  = 1

if no3 % 2 == 0:
    count  = 1

if no4 % 2 == 0:
    count  = 1

print(password)
print(f"Hint: The password consists of {count} even number(s)")

guess = input("Guess the 4 numbers: ")
present = 0

if str(no1) in guess:
    present  = 1

if str(no2) in guess:
    present  = 1

if str(no3) in guess:
    present  = 1

if str(no4) in guess:
    present  = 1

if present == 4:

    if guess == password:
        print("Congrats! You have guessed the password correctly.")

    else:
        print("All the numbers are present but not in the correct sequence.")
        print(f"You did not make it! The password is {password}.")

else:
    print(f"{present} number(s) of your guess are present in the password.")
    print(f"You did not make it! The password is {password}.")
 

P.S. Я ожидаю, что мой приведенный ниже код может быть сокращен range и все такое, но я не уверен в этом, так что может ли кто-нибудь помочь мне с этим?

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

1. количество = len([число для числа в str(пароль) , если int(число) % 2 == 0]) присутствует=len([число для числа в str(пароль), если str(число) в str(угадайте)])

Ответ №1:

Вы должны сравнить каждое число из пароля с каждым числом из догадки. Для этого вам нужно получить доступ к guess с помощью индекса. Вот так:

 if str(no1) in guess[0]:

    present  = 1
 

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

1. Спасибо, но если я использую код из ответов, я не смогу получить вывод о том, что мой пароль не в правильной последовательности. Например, если пароль 5530, и я использую ответы, предоставленные вами, ребята, и угадываю 1155, я получаю 0 чисел моего предположения, присутствующих в пароле, но я хочу, чтобы в нем было указано 2 числа моего предположения, присутствующих в пароле.

2. Ну, вы могли бы создать новую переменную с именем, например, tick. Сделайте его равным нулю и используйте его, чтобы проверить, совпадают ли пароль и догадка. С другой стороны, используйте present так, как вы использовали его изначально, и в конце сделайте заявления if/else, в которых вы проверяете правильность пароля, проверяя «галочку», и проверяете наличие, проверяя «присутствует».

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

4. Хотя это немного сбивает с толку, я попробую, спасибо

Ответ №2:

Измените это:

 if str(no1) in guess:
    present  = 1
if str(no2) in guess:
    present  = 1
if str(no3) in guess:
    present  = 1
if str(no4) in guess:
    present  = 1
 

Для:

 present  = guess[0] == str(no1)
present  = guess[1] == str(no2)
present  = guess[2] == str(no3)
present  = guess[3] == str(no4)
 

Другой способ:

 rand_nums = [no1, no2, no3, no4]
for i in range(4)
    if (int(guess[i]) == rand_nums[i]):
        present  = 1
 

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

1. Спасибо за ответы, это лучше, чем мой нынешний, но я хочу, чтобы он работал, даже если это неправильный порядок, возможно ли это? Если я использую код из ответов, я не смогу получить вывод о том, что мой пароль не в правильной последовательности. Например, если пароль 5530, и я использую ответы, предоставленные вами, ребята, и угадываю 1155, я получаю 0 чисел моего предположения, присутствующих в пароле, но я хочу, чтобы в нем было указано 2 числа моего предположения, присутствующих в пароле.