鱼C论坛

 找回密码
 立即注册
查看: 3353|回复: 1

题目185:猜数字游戏

[复制链接]
发表于 2016-10-4 00:56:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Number Mind

The game Number Mind is a variant of the well known game Master Mind.

Instead of coloured pegs, you have to guess a secret sequence of digits. After each guess you're only told in how many places you've guessed the correct digit. So, if the sequence was 1234 and you guessed 2036, you'd be told that you have one correct digit; however, you would NOT be told that you also have another digit in the wrong place.

For instance, given the following guesses for a 5-digit secret sequence,

90342 ;2 correct
70794 ;0 correct
39458 ;2 correct
34109 ;1 correct
51545 ;2 correct
12531 ;1 correct


The correct sequence 39542 is unique.

Based on the following guesses,

5616185650518293 ;2 correct
3847439647293047 ;1 correct
5855462940810587 ;3 correct
9742855507068353 ;3 correct
4296849643607543 ;3 correct
3174248439465858 ;1 correct
4513559094146117 ;2 correct
7890971548908067 ;3 correct
8157356344118483 ;1 correct
2615250744386899 ;2 correct
8690095851526254 ;3 correct
6375711915077050 ;1 correct
6913859173121360 ;1 correct
6442889055042768 ;2 correct
2321386104303845 ;0 correct
2326509471271448 ;2 correct
5251583379644322 ;2 correct
1748270476758276 ;3 correct
4895722652190306 ;1 correct
3041631117224635 ;3 correct
1841236454324589 ;3 correct
2659862637316867 ;2 correct


Find the unique 16-digit secret sequence.


题目:

猜数字游戏 Number Mind 是著名游戏 Master Mind 的一个变种。

与着色的柱子不同,你现在必须猜测一个秘密的数的序列。每次猜测之后,你只能得知你猜中多少个正确位置。因此,如果序列是 1234,你猜是 2036,则它会告诉你,你猜对了一个数字;但是,你在错误位置上放了另一个数字时,它是不会告诉你的。

比如,给出一个 5 位的数字序列的猜测结果,

90342 ;2 位正确
70794 ;0 位正确
39458 ;2 位正确
34109 ;1 位正确
51545 ;2 位正确
12531 ;1 位正确


可以得到唯一正确的序列 39542。

基于下面的猜测结果,

5616185650518293 ;2 位正确
3847439647293047 ;1 位正确
5855462940810587 ;3 位正确
9742855507068353 ;3 位正确
4296849643607543 ;3 位正确
3174248439465858 ;1 位正确
4513559094146117 ;2 位正确
7890971548908067 ;3 位正确
8157356344118483 ;1 位正确
2615250744386899 ;2 位正确
8690095851526254 ;3 位正确
6375711915077050 ;1 位正确
6913859173121360 ;1 位正确
6442889055042768 ;2 位正确
2321386104303845 ;0 位正确
2326509471271448 ;2 位正确
5251583379644322 ;2 位正确
1748270476758276 ;3 位正确
4895722652190306 ;1 位正确
3041631117224635 ;3 位正确
1841236454324589 ;3 位正确
2659862637316867 ;2 位正确

请给出唯一正确的 16 位秘密序列。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-10 13:35:44 | 显示全部楼层
import itertools as it
t = '''2659862637316867 ;2
1841236454324589 ;3
3041631117224635 ;3
4895722652190306 ;1
1748270476758276 ;3
5251583379644322 ;2
2326509471271448 ;2
2321386104303845 ;0
6442889055042768 ;2
6913859173121360 ;1
6375711915077050 ;1
8690095851526254 ;3
2615250744386899 ;2
8157356344118483 ;1
7890971548908067 ;3 
4513559094146117 ;2 
3174248439465858 ;1 
4296849643607543 ;3
9742855507068353 ;3
5855462940810587 ;3 
3847439647293047 ;1 
5616185650518293 ;2'''

s = []
for i in t.split('\n'):
    f = i.strip()
    m = []
    for j in f.split(';'):
        j = j.strip()
        m.append(j)
    s.append(m)

s1 =[]
for each in s:
    m = []
    for i in each[0]:
        m.append(int(i))
    s1.append((m,int(each[1])))

t = s1[7]
s1.remove(t)

def shai_1():
    weizhi1 = []
    for i in s1:
        m = []
        for j in range(16):
            if i[0][j] != t[0][j]:
                m.append(j)
        weizhi1.append(m)
    
    return weizhi1

weizhi = shai_1()


def sheng():
    S = []
    for t in it.combinations(weizhi[0],s1[0][1]):
        s_t = ['x']*16
        for x1 in range(s1[0][1]):
            s_t[t[x1]] = s1[0][0][t[x1]]
        s_x = s_t[:]
        S.append((s_x,t))
    return S
        

def shai_2(S, t, c, weizhi):

    if len(t)==16:
        V = 1
        for a in range(21):
            count = 0
            for each in range(16):
                if S[each] == s1[a][0][each]:
                    count +=1
            if count != s1[a][1]:
                V =0
                break
        if V == 1:
            print(S)
                    
        return 1
    for i in range(c,21):
        s_t = S[:]
        flag = 1
        for j in weizhi[i]:
            if s_t[j] == s1[i][0][j]:
                flag = 0
                break
        if flag == 1:
            t1 = [k for k in weizhi[i] if k not in t]
            for x in it.combinations(t1,s1[i][1]):
                t2 = t
                s_y = s_t[:]
                for y in range(s1[i][1]):
                    s_y[x[y]] = s1[i][0][x[y]]
                s_z = s_y[:]
                t2 += x
                c = i
                shai_2(s_z, t2, c, weizhi)


def main():
    M = sheng()
    for i in M:
        S,t = i[0],i[1]
        shai_2(S,t,1,weizhi)

main()
    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 17:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表