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

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

19.02.2023, 19:49. Показов 12315. Ответов 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
3750 / 1944 / 613
Регистрация: 21.11.2021
Сообщений: 3,706
19.07.2023, 12:18
Студворк — интернет-сервис помощи студентам
Написал программу согласно ТЗ, которая играет сама с собой и может изменять задуманное число после каждого ответа противника. В программе есть и "честный" режим, где загаданное число не изменяется до конца игры. Можно запускать на несколько циклов игры для подсчета среднего количества попыток за игру. Правда, это довольно медленный режим, 1000 игр обсчитывает где-то за полминуты.
Результаты: при "хитром" режиме число угадывается в среднем за 7 попыток (точнее за 7,01), т.е. в основном за 7 и очень редко больше, а в "честном" режиме - в среднем за 5,5 попыток, т.е. в половине случаев за 5 и в половине за 6.
Так что хитрость здесь реально работает и позволяет продержаться на 1,5 попытки дольше.

Код программы:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from itertools import permutations
from random import choice
 
def get_numbers():
    return [''.join(x) for x in permutations('0123456789', 4)]
 
def get_bulls_cows(n, q):
    bulls = 0
    cows = 0
    for i in range(4):
        for j in range(4):
            if n[i] == q[j]:
                if i == j:
                    bulls += 1
                else:
                    cows += 1
    return bulls, cows
 
def get_q_qnumbers_for_bk(q_numbers, q, b, k):
    res = []
    if b == None and k == None:
        return choice(q_numbers), q_numbers
    else:
        for n in q_numbers:
            bb, kk = get_bulls_cows(n, q)
            if bb == b and kk == k:
                res.append(n)
    return choice(res), res
 
def get_bk_and_numbers_for_question(numbers, q):
    d = {(4, 0): 1, (3, 0): 24, (2, 0): 180, (2, 2): 6, (2, 1): 72, (1, 0): 480,
       (1, 1): 720, (1, 2): 216, (1, 3): 8, (0, 0): 360, (0, 1): 1440, (0, 2): 1260, (0, 3): 264, (0, 4): 9}
    res = {}
    for n in numbers:
        b,k = get_bulls_cows(n, q)
        res.setdefault((b,k), []).append(n)
    return max(res.items(), key=lambda x: d[x[0]])
 
def game(fox, num_rep, show):
    res = 0
    for i in range(num_rep):
        if show:
            print(f'\nИгра №{i+1}')
        counter = 0
        q_numbers = get_numbers()
        n = choice(q_numbers)
        if show:
            print(f'Машина загадала {n}')
            if fox:
                print('Машина имеет право изменять это число по ходу игры.')
        q = b = k = None
        prev_q_arr = []
        prev_n_arr = []
        while True:
            counter += 1
            if show:
                input('Для продолжения нажмите Enter.')
                print(f'\nПопытка {counter}')
            if q:
                prev_q_arr.append(f'{q}: {b,k}')
            q, q_numbers = get_q_qnumbers_for_bk(q_numbers, q, b, k)
            if len(q_numbers) == 1:
                if show:
                    print(f'Вы загадали {q_numbers[0]}')
                break
            bb, kk = get_bulls_cows(n, q)
            if show:
                if fox:
                    print(f'{q} ?')
                    print(f'Было загадано {n}, ответ на это быков-коров: ({bb}, {kk})')
                else:
                    print(f'{q} ? (загадано {n})')
            if not q_numbers:
                print(f'Что-то пошло не так. Игра прекращается.')
                break
            if fox:
                (b, k), q_numbers = get_bk_and_numbers_for_question(q_numbers, q)
                if (b,k) != (bb, kk):
                    prev_n_arr.append(n)
                    while True:
                        n = choice(q_numbers)
                        if not n in prev_n_arr:
                            break
                    if show:
                        print(f'Но машина  поменяла его на {n}, чтобы ответ был быков-коров: {(b,k)}')
                        if prev_q_arr:
                            print(f'На предыдущие запросы ответы нового числа {n} те же самые:')
                            for pq in prev_q_arr:
                                bbb, qqq = get_bulls_cows(n, pq)
                                print(f'запрос ({pq}), ответ {(bbb, qqq)}')
            else:
                b,k = get_bulls_cows(n,q)
            if (b,k) == (4,0):
                if show:
                    print(f'Вы угадали!')
                break
            if show:
                print(f'Машина отвечает что быков-коров: {b, k}')
        if show:
            print(f'Угадано с {counter}-й попытки.')
        res += counter
    res /= num_rep
    return res
 
print('\nПрограмма играет сама с собой, она может либо честно загадывать число, либо хитрить.')
fox = input('Хотите запустить в режиме хитрости? да (1), нет (2): ') == '1'
show = input(f'Показывать ход игры? да (1), нет (2): ') == '1'
n_rep = min(1000, int(input('Число циклов игры (не больше 1000): ')))
print(f'\nПрограмма запускается в {"хитром" if fox else "честном"} режиме на {n_rep} игр.')
if not show:
    print('Время ожидания - до полуминуты.')
t = game(fox, n_rep, show)
print(f'В среднем {t} попыток на игру за {n_rep} сеансов игры.')
1
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 16
21.03.2025, 16:31
Gdez, А ты можешь написать комментарии к работе программе?
0
3 / 2 / 1
Регистрация: 16.12.2024
Сообщений: 23
23.03.2025, 20:03
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
52
import random
 
 
def get_digits(number):
    return [int(d) for d in str(number)]
 
 
def count_bulls_and_cows(secret, guess):
    bulls = sum(s == g for s, g in zip(secret, guess))
    cows = len(set(secret) & set(guess)) - bulls
    return bulls, cows
 
 
def is_compatible(number, history):
    digits = get_digits(number)
    for guess, bulls, cows in history:
        guess_digits = get_digits(guess)
        current_bulls, current_cows = count_bulls_and_cows(digits, guess_digits)
        if current_bulls != bulls or current_cows != cows:
            return False
    return True
 
 
def generate_new_number(history):
    while True:
        number = random.randint(1000, 9999)
        digits = get_digits(number)
        if len(set(digits)) == 4 and is_compatible(number, history):
            return number
 
 
def main():
    history = []
    secret_number = 6543
    secret_digits = get_digits(secret_number)
    attempts = [7890, 6438, 6543]
 
    for attempt in attempts:
        attempt_digits = get_digits(attempt)
        bulls, cows = count_bulls_and_cows(secret_digits, attempt_digits)
        history.append((attempt, bulls, cows))
        print(f"Попытка: {attempt}, Быки: {bulls}, Коровы: {cows}")
 
        if bulls == 4:
            print("Игрок угадал число! Перезагадываем...")
            secret_number = generate_new_number(history)
            secret_digits = get_digits(secret_number)
            print(f"Новое загаданное число: {secret_number}")
 
 
if __name__ == "__main__":
    main()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2025, 20:03

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru