Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59

Коровы и быки. Секретный уровень

19.02.2023, 19:49. Показов 11690. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Правила игры «коровы и быки» следующие: компьютер загадывает четырёхзначное число с неповторяющимися цифрами, а игрок пытается его угадать за минимальное число попыток. Угадывающий называет число, а компьютер специальным образом отвечает, сколько цифр совпало с ответом. Если в названном числе цифра какого-то разряда совпала с цифрой в том же разряде правильного ответа, это называется «быком». Если указанная цифра есть в ответе, но на неверной позиции, это «корова». Компьютер отвечает, сколько «быков» и «коров» в числе угадывающего.

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

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

Рекомендации по реализации: Эту задачу будет проще решить, если у вас будут следующие функции:

Функция, которая по числу возвращает массив цифр в том порядке, в котором они указаны.
Функция, которая принимает два массива цифр: цифры загаданного числа и цифры из попытки отгадать — и считает по ним число быков и коров.
Функция, которая проверяет, подходит ли новое «загаданное» число под историю уже данных ответов. Историю ответов можно хранить как список троек вида: (попытка, число коров, число быков).
В этой задаче, разумеется, не требуется соблюдать какой-либо формат. Все детали реализации остаются на ваше усмотрение, главное, чтобы бот позволял играть в «Коровы и быки» и перезагадывал число в процессе, не обманывая при этом игрока (не загадывая число, противоречащее прошлым попыткам).


Добрый вечер, господа. Вот то ли я дурак, то ли ещё что, но я вообще не понял, как это бот должен перезагадывать число так, чтобы оно не противоречило прошлым попытка. Точнее, я знаю, как это сделать, но я не понимаю самого ТЗ. Вот у нас есть число 6543, мы вводим число 7890. Быков 0, коров 0. Потом мы вводим число 6438. Быков 1, коров 2. А потом мы вводим 6543, и бот загадывает новое число, в котором минимум 1 бык и 2 коровы. Так, что-ли?

Я не прошу писать код за меня, прошу помочь с пониманием ТЗ. Но если кто хочет помочь с написанием, то я приложу код (ну и чтобы ленивым меня не называли) )
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import random as r
 
hist = []
 
 
def random_number():
    d = [i for i in range(10)]
    r.shuffle(d)
    conc = d[:4]
    if conc[0] == 0:
        conc[0] = conc[1]
        conc[1] = 0
    return conc
 
 
def ret_mass(num):
    num = list(str(num))
    return list(map(int, num))
 
 
def get_mass(num):
    mass_zag, mass_try = random_number(), ret_mass(num)
    bull, cow = 0, 0
    for i, j in zip(mass_zag, mass_try):
        if j in mass_zag:
            if j == i:
                bull += 1
            else:
                cow += 1
    return bull, cow
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2023, 19:49
Ответы с готовыми решениями:

Коровы и быки. Секретный уровень
Правила игры «коровы и быки» следующие: компьютер загадывает четырёхзначное число с неповторяющимися цифрами, а игрок пытается его угадать...

Коровы и быки. Секретный уровень
Правила игры «коровы и быки» следующие: компьютер загадывает четырёхзначное число с неповторяющимися цифрами, а игрок пытается его угадать...

Коровы и быки. Секретный уровень
Правила игры «коровы и быки» следующие: компьютер загадывает четырёхзначное число с неповторяющимися цифрами, а игрок пытается его угадать...

22
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
19.02.2023, 21:15
Есть такое понятие как гарантированное число ходов алгоритма. В данном случае некая последовательность чисел, при которой загаданное число будет угадано, вне зависимости от выдаваемых ответов загадывающего (но все ответы должны быть корректными)
Вот ваш бот и должен реализовывать "наихудший" случай.
Мне кажется, что по хорошему это очень сложная задача, но можно реализовать жадный метод. Я назвал его "Жадным Объектно-Приспосабливающимся Алгоритмом".
1. Пусть у нас есть какое-то множество чисел S.
2. Игрок называет некое число.
3. Тогда множество S разбивается на сумму непересекающихся подмножеств S_ij, где i - число быков, j - число коров
4. Выбираем из этих подмножеств подмножество с наибольшей мощностью и делаем вид, что загадано число из этого подмножества.
5. Если мощность этого подмножества равна 1, то игра окончена, иначе делаем S равным этому подмножеству и возвращаемся к шагу 2.
1
7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59
19.02.2023, 21:33  [ТС]
Ага, у нас есть числа от 1000 до 9999, т.к нам нужны только 4-х значные числа, загадали мы число 6785. Ирок называет его. У нас получаетс 4 быка и 0 коров. И тогда нам нужно выбрать число, где будет 3 быка и 1 корова?

Добавлено через 5 минут
Цитата Сообщение от Red white socks Посмотреть сообщение
Тогда множество S разбивается на сумму непересекающихся подмножеств S_ij, где i - число быков, j - число коров
Ну вот пользователь угадал число. И тогда у нас 4 быка и 0 коров. И что теперь? Как подобрать новое число?
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
19.02.2023, 21:38
Dezertir747, во-первых, по условию, как я понял, цифры в загаданном числе не должны повторяться (это не канонические БиК, но таковы правила).
У нас есть Це из 10 по 4 (если можно 0 на первом месте) чисел с различными цифрами. Пусть игрок назвал 6785.
Начинаем перебирать наши числа. Берем 1234 - 0 быков, 0 коров. Кладем его в корзину 00. Берем 6543 - 1 бык, 1 корова. Кладем в корзину 11. И так далее по всем числам.
В результате в какой корзине будет больше чисел, такой ответ и сообщаем.

Добавлено через 2 минуты
Цитата Сообщение от Dezertir747 Посмотреть сообщение
Ну вот пользователь угадал число.
Он не может угадать число, потому что по сути мы с числом не определились. Только когда во множестве не останется ровно одно число.
0
7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59
19.02.2023, 21:39  [ТС]
Цитата Сообщение от Red white socks Посмотреть сообщение
И так далее по всем числам.
В результате в какой корзине будет больше чисел, такой ответ и сообщаем.
Ага, т.е нам нужно завести словарь, в котором будет число, кол-во коров и быков. Как только пользователь угадывает, выбираем самое большое кол-во коров и быков, смотрим, что это за число и делаем его новым "загаданным". Я правильно понял?
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
19.02.2023, 21:46
Цитата Сообщение от Dezertir747 Посмотреть сообщение
т.е нам нужно завести словарь, в котором будет число, кол-во коров и быков. Как только пользователь угадывает, выбираем самое большое кол-во коров и быков, смотрим, что это за число и делаем его новым "загаданным". Я правильно понял?
В целом это похоже на правду, но есть пара деталей, по которым я не могу определить верно вы поняли или нет. Вам лучше перейти к практическим действиям, а там вы точно поймете.
Цитата Сообщение от Red white socks Посмотреть сообщение
Начинаем перебирать наши числа. Берем 1234 - 0 быков, 0 коров. Кладем его в корзину 00. Берем 6543 - 1 бык, 1 корова. Кладем в корзину 11. И так далее по всем числам.
Вот это шаг реализуйте.
0
7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59
19.02.2023, 21:51  [ТС]
Цитата Сообщение от Red white socks Посмотреть сообщение
Он не может угадать число, потому что по сути мы с числом не определились. Только когда во множестве не останется ровно одно число.
Так. Получается, мы сначала ждем, пока пользователь не введет число, потом подбираем под это число "загаданное"?
В какой корзине больше всего будет чисел, из такой корзины выбираем число.

А разве сначала нам не нужно загадать число, а потом уже пользователь должен его отгадывать? А ещё нам надо, чтобы новое загаданное число не противоречило ранее данным ответам
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
19.02.2023, 22:33
Dezertir747, суть хитро выделанного жадного объектно-приспосабливающегося алгоритма, что мы загадываем не число, а множество чисел, удовлетворяющих выданным ответам.

Добавлено через 31 минуту
Я понял в чем проблема. ТЗ требует какой-то честности и число загадывать нужно. Тогда лайт-версия алгоритма, назовем ее "периодически обманывающий пользователя калибровочный алгоритм".
На 1 шаге загадываем какое-то число.
Как и в основном алгоритме - раскладываем числа по корзинам и смотрим сколько чисел попало в корзину с загаданным нами числом и количеством чисел в максимальной корзине. И если отношение превышает некий параметр р, то менять корзину (и загаданное число). Можно менять корзину на максимальную или на одну из нескольких максимальных.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
19.02.2023, 23:05
Red white socks,

Не по теме:

В детстве играли… Тогда для себя вывел 100% выигрышный алгоритм из 7(насколько помню) шагов, который учитывает хитрость противника, загадывающего не четырех-, а трехзначное число, и, в зависимости от вопросов, «отсеивающего» кандидатов на четвертую цифру. Таким образом его противник гарантированно не мог в течение первых 4 ходов определить состав цифр в задуманном числе.
Возможно по ТЗ под перезагадыванием имеется что то похожее



Добавлено через 7 минут
А вообще можно создать множество всех чисел по условию ТЗ. Рандомно определять первые два ответа из диапазонов (1…3) / (0…2), удаляя из множества «неверные» варианты. Фильтр можно построить на основе словаря -> «позиция в числе»: цифры-кандидаты…
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
19.02.2023, 23:08
Gdez,

Не по теме:

в приложении Тинькоф есть игра 5 букв и я на этом примере пытался объяснить сыну принцип работы нейронной сети, решающей данную задачу. Полным перебором задача решается быстрее, но это не так интересно)

1
7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59
20.02.2023, 21:22  [ТС]
Цитата Сообщение от Red white socks Посмотреть сообщение
Берем 1234 - 0 быков, 0 коров. Кладем его в корзину 00. Берем 6543 - 1 бык, 1 корова. Кладем в корзину 11. И так далее по всем числам.
В результате в какой корзине будет больше чисел, такой ответ и сообщаем.
Это же ужас как долго по времени выйдет. Можно это как-нибудь оптимизировать? Иначе все числа без повторов цифр перебирать и каждый раз создавать новый элемент словаря - явно задачка не из быстрых
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
20.02.2023, 22:26
Dezertir747,
В этой задаче, разумеется, не требуется соблюдать какой-либо формат. Все детали реализации остаются на ваше усмотрение, главное, чтобы бот позволял играть в «Коровы и быки» и перезагадывал число в процессе, не обманывая при этом игрока (не загадывая число, противоречащее прошлым попыткам).
Один из вариантов:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from random import choice
 
def first(res, mask, que):
    c, b = divmod(mask, 10)
    result = []
    for elem in res:
        if len(set(elem) & set(que)) == c:
            m = sum(elem[i] == que[i] for i in range(4))
            if m == b:
                result.append(elem)
    return result
 
def other(res, que):
    result = []
    cnt = 0
    for e in ms:
        r = first(res, e, que)
        if len(r) > cnt:
            result = r.copy()
            cnt = len(r)
            m = e
    return result, m
 
 
masks = (10, 20, 21, 30)
ms = [10, 11, 20, 21, 22, 30, 31, 32, 33, 40, 41, 42, 43, 44]
res = [str(i) for i in range(1000, 10000) if len(set(str(i)))==4]
 
q = input()
mask = choice(masks)
res = first(res, mask, q)
print(mask)
while mask != 44:
    q = input()
    res, mask = other(res, q)
    print(mask)
    # print(res)
0
7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59
20.02.2023, 22:40  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
Один из вариантов:
Спасибо!!! Но можно было и просто посоветовать, а не писать код)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
20.02.2023, 23:01
Dezertir747, Совет выше изложил (рандомный первый ответ; не «загадывание» числа, а хранение множества «подходящих» чисел; правда словарь не понадобился) А это реализация…
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
21.02.2023, 07:21
Цитата Сообщение от Dezertir747 Посмотреть сообщение
Это же ужас как долго по времени выйдет
Перебрать 10К чисел? Если полсекунды для вас долго - ну делайте на плюсах тогда, что ли...
0
7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59
21.02.2023, 20:36  [ТС]
[quote="Red white socks;16765172"]ну делайте на плюсах тогда, что ли...[/qu
Цитата Сообщение от Gdez Посмотреть сообщение
Совет выше изложил (рандомный первый ответ; не «загадывание» числа, а хранение множества «подходящих» чисел; правда словарь не понадобился) А это реализация…
Да я сначала не разобрался просто в коде, извиняюсь. Ещё раз большое спасибо за код!
0
1 / 1 / 0
Регистрация: 10.01.2022
Сообщений: 2
06.03.2023, 01:32
извините, что душню, но числа мы берём не радномные, а только те, у которых разные цифры, а это насколько я помню:
(9*10*10*10) - всего 9000 чисел, пусть на каждое мы тратим 5 операций, тогда на один запрос нам нужно 45000 операций, а это на нормальной системе: 0,0045с

Добавлено через 12 минут
ой, (9*9*8*7) - 4536 чисел, 22680 операций, 0,002268с
0
0 / 0 / 0
Регистрация: 20.02.2023
Сообщений: 3
18.03.2023, 12:43
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Импорт модулей
import random 
 
# Глобальные списки
digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
 
# Функция для генерации случайного числа
def generateNum():
    return random.sample(digits, 4)
 
    
# Функция для подсчета быков и коров
def numOfBullsCows(number, guess):
    bull_cow = [0, 0]
    guesslist = [int(x) for x in str(guess)]
    # Цикл для поиска быков и коров
    for i, j in zip(number, guesslist):
        # Есть ли цифра из ввода в искомом числе
        if j in number:
            # Если место цифры ввода и цифры искомого числа совпадают
            if j == i:
                bull_cow[0] += 1
            # Если место цифры ввода и цифры искомого числа не совпадают
            else:
                bull_cow[1] += 1
    return bull_cow
 
 
# Генерация числа
number = generateNum()
 
# Модификация для услонения игры
# Пользователь вводит число попыток, за которое он должен угадать число
# Если попытки истрачиваютя, пользователь проигрывает
tries = int(input('Введите кол-во попыток: '))
print()
k = 0
 
# Игровой процесс 
while tries > 0:
    guess = int(input("Введите число: "))
    bull_cow = numOfBullsCows(number, guess)
    print(f"{bull_cow[0]} быков, {bull_cow[1]} коров\n")
    tries -= 1
    k += 1
    if bull_cow[0] == 4:
        print(f"Вы угадали за {k} попыток")
        break
else:
    print(f"Вы истратили все свои попытки. Число было {number}")
0
 Аватар для was3110
6 / 6 / 0
Регистрация: 29.03.2012
Сообщений: 18
16.07.2023, 14:55
Случайно увидел эту тему. Я считал, что этот вопрос уже в Рунете снят. Здесь и калькулятор и видео. О каких больших объемах вычислений Вы говорите, если число перестановок =5040
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
18.07.2023, 15:17
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import random
 
def num_to_digits(num):
    return [int(digit) for digit in str(num)]
 
def count_cows_bulls(secret_num, guess_num):
    secret_digits = num_to_digits(secret_num)
    guess_digits = num_to_digits(guess_num)
    bulls = sum([secret == guess for secret, guess in zip(secret_digits, guess_digits)])
    cows = len(set(secret_digits) & set(guess_digits)) - bulls
    return cows, bulls
 
def is_valid_new_secret(history, new_secret):
    for guess, cows, bulls in history:
        new_cows, new_bulls = count_cows_bulls(new_secret, guess)
        if new_cows != cows or new_bulls != bulls:
            return False
    return True
 
def generate_new_secret(history):
    while True:
        new_secret = random.randint(1000, 9999)
        if is_valid_new_secret(history, new_secret):
            return new_secret
 
def play_game():
    history = []
    secret_num = random.randint(1000, 9999)
    print("Welcome to Cows and Bulls! I have a 4 digit number. Can you guess it?")
    while True:
        guess_num = int(input("Enter your guess: "))
        while guess_num < 1000 or guess_num > 9999:
            print("Please enter a 4 digit number.")
            guess_num = int(input("Enter your guess: "))
        cows, bulls = count_cows_bulls(secret_num, guess_num)
        history.append((guess_num, cows, bulls))
        print(f"Cows: {cows}, Bulls: {bulls}")
        if bulls == 4:
            print("Congratulations! You guessed the number.")
            play_again = input("Do you want to play again? (yes/no): ")
            if play_again.lower() != 'yes':
                break
            else:
                history = []
                secret_num = random.randint(1000, 9999)
 
play_game()
Добавлено через 8 минут
Только он почему-то ломается
Enter your guess: 1023
Cows: 0, Bulls: 2
Enter your guess: 1045
Cows: 0, Bulls: 2
Enter your guess: 1067
Cows: 0, Bulls: 2
Enter your guess: 1089
Cows: 1, Bulls: 2
Enter your guess:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.07.2023, 15:17
Помогаю со студенческими работами здесь

Быки и коровы
Ребят нужна помощь в написании програмы-игры Быки и коровы. Смысл в том что програма создает 4 значное число (цифры не должны повторяться),...

Напишите программу, обрабатывающую один раунд игры «Быки и коровы»
Напишите программу, обрабатывающую один раунд игры «Быки и коровы». Пользователь вводит две строки. Гарантируется, что это две строки...

Напишите программу, обрабатывающую один раунд игры «Быки и коровы»
Напишите программу, обрабатывающую один раунд игры «Быки и коровы». Пользователь вводит две строки. Гарантируется, что это две строки...

Как написать оценку хода к "Быки и коровы"?
Я написал почти весь код. Не могу написать только оценку хода. Помогите пожалуйста import random bull=0 cow=0 #Отдел генерации ...

Быки и коровы
Напишите программу, обрабатывающую один раунд игры «Быки и коровы». Пользователь вводит две строки. Гарантируется, что это две строки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru