在两个重复序列中找到共同项目的数量

时间:2019-06-30 13:53:59

标签: python python-3.x

我正在尝试制作一个密码识别游戏。会生成一个随机的4位数字的密码,您需要猜测一下密码,如果输入错了,它会告诉您在密码中出现了多少位数。

例如,如果密码是8823,而我猜是1788,它应该告诉我,我得到两位数正确,因为两者都出现8。但是,它只告诉我一位数字是正确的,因为这些数字是相同的数字。如果数字不同,那么就没有问题,例如,如果图钉是1234并且我猜是3456,那么它将说我有两个正确的数字,因为3和4都出现一次并且是不同的数字。

这是所有代码(我认为该区域包含问题粗体):

import random
pin=random.randint(1000,9999)
pin2=str(pin)
pin3=list(pin2)
tries=0
x=1
guess="1"
while x==1:
    pin3=list(pin2)
    guess2=int(guess)
    while guess2<1000 or guess2>9999:
        guess2=int(input("Please guess a 4 digit number: "))
        guess=str(guess2)
    tries+=1

    # BEGIN OF INDICTED CODE ============================
    correct=0
    for i, a in enumerate(pin3):
        guess3=list(guess)
        if a in guess:
            del(pin3[i])
            correct+=1
    print("You got", correct, "correct")
    # END OF INDICTED CODE ==============================

    if guess==pin2:
        x=0
    guess="1"
print("You guessed correctly")
print("You had", tries, "attempts")

谢谢。

4 个答案:

答案 0 :(得分:0)

这里

def get_num_of_common_digits(pin_number, guessed_pin_number):
    pin_number_str = str(pin_number)
    guessed_pin_number_str = str(guessed_pin_number)
    result = 0
    for x in pin_number_str:
        idx = guessed_pin_number_str.find(x)
        if idx != -1:
            guessed_pin_number_str = guessed_pin_number_str[:idx] + guessed_pin_number_str[idx+1:]
            result += 1
    return result


print(get_num_of_common_digits(8823, 1788))
print(get_num_of_common_digits(1234, 3456))
print(get_num_of_common_digits(8823, 5678))

输出

2
2
1

答案 1 :(得分:0)

这是我实施游戏的方式

from random import randint

这里我们使用列表理解来生成图钉,我们迭代4次,每次生成随机数

pin = [randint(0,9) for i in range(4)]

print(pin)
continue_game = True
correct = 0
tries = 0
guessed = []
在下面的while循环中,

使用“ map”将猜测分为四个元素的列表,然后将guess_pin列表中的每个元素与引脚列表中的每个元素进行比较。如果元素匹配,则将正确性增加1,否则将尝试性增加1。

while continue_game:
    guess = str(input("Guess pin: "))
    guess_pin = list(map(int, guess))
    print(guess_pin)
    for y in guess_pin:
        for x in pin:
            if y == x:
                correct += 1
                guessed.append(y)
            else:
                tries += 1
    if correct == 4:
        continue_game = False
    else:
        pass
    print(f"You had guessed {correct} elements, and tried {tries} times")

最后,我们检查是否正确等于4,这意味着我们已经猜到了所有数字

希望它对您有帮助

答案 2 :(得分:0)

检查一下:

def check_matching(
        guess,
        truth):
    remaining = list(truth)
    n = 0
    for x in guess:
        try:
            remaining.remove(x)
        except ValueError:
            pass
        else:
            n += 1
    return n

用法如下:

check_matching('8823', '1788')
# 2
check_matching('1234', '3456')
# 2
check_matching('8823', '5678')
# 1

这基本上取决于内置Python .remove()list方法的行为。输入可以是listtuplestr。因此,我建议坚持使用字符串,以避免添加不必要的操作。

答案 3 :(得分:0)

您可以尝试使用collections.Counter类型,它类似于允许重复项的集合(也称为bag or multiset)。

这样,您可以在两个计数器之间做一个简单的交点以查找公共元素。例如:

>>> from collections import Counter
>>> pin1 = Counter('8823')
>>> pin2 = Counter('1788')
>>> common = pin1 & pin2
>>> list(common.elements())
['8', '8']
>>> 

使用此列表的长度可以为您提供包含重复项时的常见元素数量。