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

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

19.02.2023, 19:49. Показов 12103. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru