Member 13672432 Ответов: 3

Как я могу изменить этот код, чтобы он функционировал логически?


Есть такая игра. Вы угадываете 4 цифры случайного числа. Он выводит количество правильных цифр в правильном месте, но также и правильные цифры в неправильном месте. Например, если код был 2188 и угадайте, что выход будет 1888 1 и 1. Этот фрагмент кода вызывает проблемы логически. Предположим, что tag_guess-это массив из 4 ложных значений.

Проблема в том, что он выводит неверно. Когда код был 4405 и угадайте 4444 он вывел 2 правильных НО 2 исправьте в неправильном месте. Логически говоря, он должен вывести 2 правильных 0 правильных в неправильном месте. Он должен вырваться из оператора if и игнорировать 44 в 4405 году как это уже было сопоставлено и отмечено как истинное. Мне нужно создать массив с именем tag_code и суммировать все это с помощью цикла for и while. Как мне это сделать?


wronPlace= 0
if tag_guess[0]== False:
    if guess[0]== code[1]:
        tag_guess[0]== True
        wronPlace= (wronPlace+1)
    elif guess[0]== code[2]:
        tag_guess[0]== True
        wronPlace= (wronPlace+1)
    elif guess[0]== code[3]:
        tatg_guess[0]== True
        wronPlace= (wronPlace+1)
if tag_guess[1]== False:
    if guess[1]== code[0]:
        tag_guess[1]== True
        wronPlace= (wronPlace+1)
    elif guess[1]== code[2]:
        tag_guess[1]== True
        wronPlace= (wronPlace+1)
    elif guess[1]== code[3]:
        tag_guess[1]== True
        wronPlace= (wronPlace+1)
if tag_guess[2]== False:
    if guess[2]== code[0]:
        tag_guess[2]== True
        wronPlace= (wronPlace+1)
    elif guess[2]== code[1]:
        tag_guess[2]== True
        wronPlace= (wronPlace+1)
    elif guess[2]== code[3]:
        tag_guess[2]== True
        wronPlace= (wronPlace+1)
if tag_guess[3]== False:
   if guess[3]== code[0]:
       tag_guess[3]== True
       wronPlace= (wronPlace+1)
   elif guess[3]== code[1]:
       tag_guess[3]== True
       wronPlace= (wronPlace+1)
   elif guess[3]== code[2]:
       tag_guess[3]== True
       wronPlace= (wronPlace+1)


Что я уже пробовал:

Я пробовал делать цикл for, но у меня плохо получается делать что-то более сложное, пока я не смогу сначала заложить базовый уровень понимания простого кода. Код должен пропускать числа в коде и угадывать, которые были помечены как истинные/правильные, как и другие. Помогите!

3 Ответов

Рейтинг:
9

Auro.brze

На самом деле вам не нужно 2 для петель. Попробовать это:

from collections import Counter


def main():
    answers = [3, 3, 4, 4]
    guesses = [3, 5, 6, 4]

    answers_counter = Counter(answers)
    guesses_counter = Counter(guesses)
    diff_counter = answers_counter - guesses_counter
    number_of_all_correct_digits = len(answers) - len(diff_counter.values())

    number_of_correct_digits_in_correct_place = len(
        list(filter(lambda x: x == 0, [a - g for a, g in zip(answers, guesses)])))

    number_of_correct_digits_in_wrong_place = number_of_all_correct_digits - number_of_correct_digits_in_correct_place

    return number_of_correct_digits_in_correct_place, number_of_correct_digits_in_wrong_place

if __name__ == "__main__":
    r1, r2 = main()
    print(r1)
    print(r2)

""" r1 and r2 are the correct digits in wrong place and correct digits in correct place

Вам, конечно, нужно сделать "догадки" и фактические входные данные для массива, но вот решение.


Member 13672432

Спасибо!!

Рейтинг:
22

Patrice T

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

Совет: сделайте guess массивом точно так же, как code и arr, он откроет дверь для циклов и уменьшения размера кода, как только он заработает.

[Обновление]

Цитата:
Не могли бы вы мне в этом помочь? У меня уже есть arr но я не могу использовать его для этого

вы создали arr чтобы предотвратить совпадение 2 раз одной и той же догадки, вам нужен еще один массив, чтобы предотвратить совпадение 2-х раз одного и того же кода.
- присвоение имени массиву arr это плохая идея, так как она используется для маркировки совпадающих догадок, вы можете назвать ее tag_guess.
- создайте еще один массив с именем tag_code и вы используете его, чтобы предотвратить марширование 2 раза одного и того же кода.
- Вместо того чтобы использовать переменные для каждой догадки, используйте массив. Это сделает ваш код пригодным для использования циклов (и уменьшения размера кода).

[Обновление]
Ваш код должен выглядеть так:
if tag_guess[0]== False:
    if guess[0]== code[1] and tag_code[1]== False:
        tag_guess[0]== True
        tag_code[1]== True
        wronPlace= (wronPlace+1)


Member 13672432

Не могли бы вы мне в этом помочь? У меня уже есть arr но я не могу использовать его для этого

Patrice T

обновление решения.

Member 13672432

как должен быть упорядочен массив tag_code?

Patrice T

То же самое, что и код

Рейтинг:
12

Richard MacCutchan

Create a list that contains the answer.
Loop1:
    Compare each digit of the guess with each digit of the list.
    For each point in the answer where the digits match do:
        Remove the digit from the list, and the guess, or replace them with some other character
        Add 1 to the "right digit in the right place" count
    Repeat Loop1 for all digits in the guess

Loop2:
    For each remaining digit in the guess
    If the digit can be found in the answer then do:
        Add 1 to the "right digit in the wrong place" count
        remove the digit from the answer.
    Repeat Loop2 until all comparisons have been made, or no digits remain in either list


Member 13672432

Спасибо, я попробую это сделать, но все еще немного не понимаю, как это запрограммировать. Должен ли это быть цикл while или for?

Richard MacCutchan

Я использовал for петля в каждом случае, используя range() исходя из длины списка. Вам нужен while петля вокруг всего этого, чтобы позволить пользователю ввести больше догадок.

Member 13672432

спасибо Вам за помощь!