Не правильно вычисляет одинаковые числа

import random

a = 0
b = 0
c = 0
d = 0

cows = 0
bulls = 0

nig = 0

player = 0

a = random.randrange(1, 10)
b = random.randrange(10)
c = random.randrange(10)
d = random.randrange(10)

while b == a:
    b = random.randrange(10)

while c == a or c == b:
    c = random.randrange(10)

while d == a or d == c or d == b:
    d = random.randrange(10)

number_sof_comp = str(a) + str(b) + str(c) + str(d)

player = str(input("Computer guessed a number.What is your guess:"))

list(player)

if a == int(player[0]):
    bulls = bulls + 1

if a == int(player[1]) or int(player[2]) or int(player[3]):
    cows = cows + 1



if b == int(player[1]):
    bulls = bulls + 1

if b == int(player[0]) or int(player[2]) or int(player[3]):
    cows = cows + 1



if c == int(player[2]):
    bulls = bulls + 1

if c == int(player[1]) or int(player[0]) or int(player[3]):
    cows = cows + 1



if d == int(player[3]):
    bulls = bulls + 1

if d == int(player[1]) or int(player[2]) or int(player[0]):
    cows = cows + 1

print("bulls-" + str(bulls))
print("cows-" + str(cows))
print(number_sof_comp)

Эта программа должна выдавать случайное число без повторяющихся цифр, после она должна сравнить это число с числом которое ввел пользователь, если в в первом есть одинаковые числа то программа должна добавить +1 к "cows", если есть одинаковые по местоположению то +1 к "bulls". Проблема в том что "cows" нормально не плюсуется и просто всегда выдает 4.


Ответы (2 шт):

Автор решения: Roman Konoval

Все выражения типа b == int(player[0]) or int(player[2]) or int(player[3]) будут истинным, если пользователь введет строку хотя бы из 4 символов и один из них не '0'. По-этому, каждое такое условие в большинстве случаев добавляет 1 к cows.

Истинны эти выражения потому, что каждое такое выражение трактуется как A or B or C, где A - b == int(player[0]). B - int(player[2]) и C аналогично.

Выражение int(player[2]) равно целому числу, которое получается преобразованием символа в позиции 3 из ввода пользователя к int. Когда же int используется в логическом выражении (т.е. как условие в if), то осуществляется преобразование int к bool, которое возвращает true для любого целого кроме 0:

>>> bool(1)
True
>>> bool(0)
False

Вероятно, вы имели ввиду такое условие b == int(player[0]) or b == int(player[2]) or b == int(player[3]), хотя не совсем понятно зачем проверка player[2] и player[3] в этом условии вообще.

→ Ссылка
Автор решения: S. Nick

Не уверен что правильно вас понял, но попробуйте так:

import random

number_sof_comp = ''
while len(number_sof_comp) != 4:
    number_sof_comp = str(random.randrange(1, 9999))
    number_sof_comp = number_sof_comp if len(set(number_sof_comp))==4 else ''
    
print(number_sof_comp)    

player = input("Computer guessed a number.What is your guess: ssss ")
# list(player)           # ???

cows, bulls = 0, 0
for i in range(4):
    if number_sof_comp[i] == player[i]:
        bulls += 1
    else:
        _p = player[:i] + player[i+1:]
        if number_sof_comp[i] in _p:
            cows += 1        

print(f"bulls = {bulls}")
print(f"cows  = {cows}")
print(number_sof_comp)
→ Ссылка