7 / 6 / 1
Регистрация: 02.12.2022
Сообщений: 59

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

19.02.2023, 19:49. Показов 12115. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru