#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 числа моего предположения, присутствующих в пароле.