鱼C论坛

 找回密码
 立即注册
查看: 3733|回复: 16

[技术交流] python小练习(037):猜数字游戏

[复制链接]
发表于 2016-12-5 00:32:39 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jerryxjr1220 于 2016-12-5 00:40 编辑

python小练习(036):传送门

今天我们来玩一个猜数字游戏,规则如下:

1. 这个数字由6位数字构成

2. 第一次猜测: 543037  -->  猜对了其中的2位(位置和数字都正确)

3. 第二次猜测: 909852  -->  猜对了其中的3位(位置和数字都正确)

4. 第三次猜测: 849661  -->  猜对了其中的2位(位置和数字都正确)

5. 第四次猜测: 139545  -->  全部猜错(位置和数字都不正确)

6. 第五次猜测: 978672  -->  猜对了其中的2位(位置和数字都正确)

7. 第六次猜测: 205168  -->  猜对了其中的1位(位置和数字都正确)

你能猜出这个数字是什么吗?

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2016-12-5 13:14:20 | 显示全部楼层
本帖最后由 SixPy 于 2016-12-5 13:15 编辑
  1. ss='''
  2. 2. 第一次猜测: 543037  -->  猜对了其中的2位(位置和数字都正确)

  3. 3. 第二次猜测: 909852  -->  猜对了其中的3位(位置和数字都正确)

  4. 4. 第三次猜测: 849661  -->  猜对了其中的2位(位置和数字都正确)

  5. 5. 第四次猜测: 139545  -->  全部猜错,  0位(位置和数字都不正确)

  6. 6. 第五次猜测: 978672  -->  猜对了其中的2位(位置和数字都正确)

  7. 7. 第六次猜测: 205168  -->  猜对了其中的1位(位置和数字都正确)
  8. '''

  9. import re
  10. ptn=re.compile(r'(\d{6}).*?(\d)位')
  11. ls=[(set(enumerate(s)),int(n))for s,n in ptn.findall(ss)]

  12. for x in range(10**5,10**6):
  13.     for st,n in ls:
  14.         if len(set(enumerate(str(x))) & st) != n:
  15.             break
  16.     else:
  17.         print(x)

复制代码
  1.                
  2. 943862
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-5 13:18:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-5 20:04:07 | 显示全部楼层
解答:
  1. #coding:utf-8
  2. data = [['909852',3],['849661',2],['543037',2],['978672',2],['205168',1],['139545',0]]
  3. def stringcheck(string,data):
  4.     l = len(string)
  5.     for d in data:
  6.         c = 0
  7.         for i in range(l):
  8.             if string[i] == d[0][i]:
  9.                 c += 1
  10.         if c != d[1]:
  11.             return False
  12.     return True

  13. for i in range(100000,1000000):
  14.     if stringcheck(str(i),data):
  15.         print (i)
  16.         break
复制代码

输出:
943862
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-4 13:17:08 | 显示全部楼层
本帖最后由 776667 于 2017-5-25 17:12 编辑
  1. def number_check(data_x):
  2.     for i in range(100000,1000000):
  3.         check = 0
  4.         for j in data_x:
  5.             count = 0
  6.             for n in range(6):
  7.                 if str(i)[n] == j[0][n]:
  8.                     count += 1
  9.             if count == j[1]:
  10.                 check += 1
  11.         if check == 6:
  12.             return i

  13. if __name__ == '__main__':
  14.     data_x = [['909852',3],['849661',2],['543037',2],['978672',2],['205168',1],['139545',0]]
  15.     print(number_check(data_x))
复制代码

  1. def similarity(num1,num2):
  2.     num1,num2 = str(num1),str(num2)
  3.     flag = sum([1 for i in range(len(num1)) if num1[i] == num2[i]])
  4.     return flag

  5. for x in range(100000,1000000):
  6.     if similarity(x,543037)==2 and similarity(x,909852)==3 and similarity(x,849661)==2 and similarity(x,139545)==0 and similarity(x,978672)==2 and similarity(x,205168)==1:
  7.         print(x)
  8.         break
复制代码

  1. 943862
  2. >>>
复制代码



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

使用道具 举报

发表于 2018-1-16 17:15:05 | 显示全部楼层
  1. def result(answer, guess):
  2.     answer = str(answer)
  3.     guess = str(guess)
  4.     correct = 0
  5.     for i in range(6):
  6.         if answer[i] == guess[i]:
  7.             correct += 1
  8.     return correct


  9. a = {543037:2, 909852:3, 849661:2, 139545:0, 978672:2, 205168:1}
  10. for answer in range(100000, 1000000):
  11.     x = [result(answer, guess) == a[guess] for guess in a]
  12.     if sum(x) == 6:
  13.         print(answer)
  14.         break

  15. #  943862
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-6 16:05:36 | 显示全部楼层
要崩溃了,一切尽在不言中,幸好最后算对了,这个列表的地址问题折腾死了。
  1. import itertools as it

  2. m = [[5,4,3,0,3,7],[9,7,8,6,7,2],[2,0,5,1,6,8]]



  3. def ma():
  4.     f = []
  5.     s = [0,1,3,4,5]
  6.     s1 = [9,0,9,8,5,2]
  7.     s2 = [8,4,9,6,6,1]
  8.    
  9.     for t0 in it.combinations(s,3):
  10.         t1 = [j for j in s if j not in t0]
  11.         t_x = [0]*6

  12.         t_x[t0[0]],t_x[t0[1]],t_x[t0[2]] =s1[t0[0]],s1[t0[1]],s1[t0[2]]
  13.         t_x[t1[0]],t_x[t1[1]] = s2[t1[0]],s2[t1[1]]
  14.         t_y = t_x
  15.         f.append(t_y)
  16.    
  17.     l = []
  18.    
  19.     for x in f:
  20.         count = 0
  21.         h =m[0]
  22.         f = 0
  23.         for i in [0,1,3,4,5]:
  24.             if x[i] == h[i]:
  25.                 count +=1
  26.         if count>0:
  27.             count1 = 0
  28.             h1 =m[1]
  29.             for i in [0,1,3,4,5]:
  30.                 if x[i] == h1[i]:
  31.                     count1 +=1
  32.             if count1>0:
  33.                 f = 1
  34.               

  35.         if f ==1:
  36.             l.append(x)
  37.    
  38.     return l

  39. def just():
  40.     s = ma()
  41.     r = []
  42.     for i in range(9):
  43.         for j in s:
  44.             
  45.             j[2] = i
  46.             
  47.             f = []
  48.             for k in m:
  49.                 count =0
  50.                 for l in range(6):
  51.                     if j[l] == k[l]:
  52.                         count +=1
  53.                 f.append(count)
  54.             if f[0] ==2 and f[1]==2 and f[2] ==1:
  55.                 jk = j.copy()
  56.                 r.append(jk)
  57.     print(r)
  58.                
  59. just()
  60.             
复制代码

现在可以看看你们的答案了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-6 16:10:01 | 显示全部楼层
血的教训,如果在for循环中更改原列表信息,再添加的话,得到的永远是最后一个列表,因为每次添加的仅仅是列表的原地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-6 16:18:03 | 显示全部楼层
你们的答案居然这么简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-6 17:24:36 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2018-2-6 17:28 编辑
JAY饭 发表于 2018-2-6 16:18
你们的答案居然这么简单


这题会解了,然后你可以去看看更难的这题http://bbs.fishc.com/thread-76863-1-1.html


顺便介绍你去看看这篇http://bbs.fishc.com/thread-96997-1-1.html
用对了工具,解这种线性规划问题都是秒出答案的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-6 19:42:16 | 显示全部楼层
jerryxjr1220 发表于 2018-2-6 17:24
这题会解了,然后你可以去看看更难的这题http://bbs.fishc.com/thread-76863-1-1.html

还在写总结,写完就去做下一题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 13:15:58 | 显示全部楼层
jerryxjr1220 发表于 2018-2-6 17:24
这题会解了,然后你可以去看看更难的这题http://bbs.fishc.com/thread-76863-1-1.html

被虐哭了,那个题我真的不会,写了三四个版本,越写越复杂,给点思路吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 14:35:22 | 显示全部楼层
JAY饭 发表于 2018-2-7 13:15
被虐哭了,那个题我真的不会,写了三四个版本,越写越复杂,给点思路吧

知道你不会,所以已经提示你了啊。
先去看看这篇http://bbs.fishc.com/thread-96997-1-1.html
用这个线性规划库解,就是秒出答案的。
解答好像我也写过了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 21:06:15 | 显示全部楼层
jerryxjr1220 发表于 2018-2-7 14:35
知道你不会,所以已经提示你了啊。
先去看看这篇http://bbs.fishc.com/thread-96997-1-1.html
用这个线 ...

立马去看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-10 13:38:33 | 显示全部楼层
你介绍的模块我这边出了问题,无论输入什么,solve()后什么都没输出。
还是用自己的方式,写了那个比较大数的程序,像5,6位的猜数都是秒出,但是那个16位数算不出来,哎
  1. import itertools as it
  2. t = '''2659862637316867 ;2
  3. 1841236454324589 ;3
  4. 3041631117224635 ;3
  5. 4895722652190306 ;1
  6. 1748270476758276 ;3
  7. 5251583379644322 ;2
  8. 2326509471271448 ;2
  9. 2321386104303845 ;0
  10. 6442889055042768 ;2
  11. 6913859173121360 ;1
  12. 6375711915077050 ;1
  13. 8690095851526254 ;3
  14. 2615250744386899 ;2
  15. 8157356344118483 ;1
  16. 7890971548908067 ;3
  17. 4513559094146117 ;2
  18. 3174248439465858 ;1
  19. 4296849643607543 ;3
  20. 9742855507068353 ;3
  21. 5855462940810587 ;3
  22. 3847439647293047 ;1
  23. 5616185650518293 ;2'''

  24. s = []
  25. for i in t.split('\n'):
  26.     f = i.strip()
  27.     m = []
  28.     for j in f.split(';'):
  29.         j = j.strip()
  30.         m.append(j)
  31.     s.append(m)

  32. s1 =[]
  33. for each in s:
  34.     m = []
  35.     for i in each[0]:
  36.         m.append(int(i))
  37.     s1.append((m,int(each[1])))

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

  40. def shai_1():
  41.     weizhi1 = []
  42.     for i in s1:
  43.         m = []
  44.         for j in range(16):
  45.             if i[0][j] != t[0][j]:
  46.                 m.append(j)
  47.         weizhi1.append(m)
  48.    
  49.     return weizhi1

  50. weizhi = shai_1()


  51. def sheng():
  52.     S = []
  53.     for t in it.combinations(weizhi[0],s1[0][1]):
  54.         s_t = ['x']*16
  55.         for x1 in range(s1[0][1]):
  56.             s_t[t[x1]] = s1[0][0][t[x1]]
  57.         s_x = s_t[:]
  58.         S.append((s_x,t))
  59.     return S
  60.         

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

  62.     if len(t)==16:
  63.         V = 1
  64.         for a in range(21):
  65.             count = 0
  66.             for each in range(16):
  67.                 if S[each] == s1[a][0][each]:
  68.                     count +=1
  69.             if count != s1[a][1]:
  70.                 V =0
  71.                 break
  72.         if V == 1:
  73.             print(S)
  74.                     
  75.         return 1
  76.     for i in range(c,21):
  77.         s_t = S[:]
  78.         flag = 1
  79.         for j in weizhi[i]:
  80.             if s_t[j] == s1[i][0][j]:
  81.                 flag = 0
  82.                 break
  83.         if flag == 1:
  84.             t1 = [k for k in weizhi[i] if k not in t]
  85.             for x in it.combinations(t1,s1[i][1]):
  86.                 t2 = t
  87.                 s_y = s_t[:]
  88.                 for y in range(s1[i][1]):
  89.                     s_y[x[y]] = s1[i][0][x[y]]
  90.                 s_z = s_y[:]
  91.                 t2 += x
  92.                 c = i
  93.                 shai_2(s_z, t2, c, weizhi)


  94. def main():
  95.     M = sheng()
  96.     for i in M:
  97.         S,t = i[0],i[1]
  98.         shai_2(S,t,1,weizhi)

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

使用道具 举报

发表于 2018-2-10 13:49:14 | 显示全部楼层
真的难受,只要没解出来就始终放不下,好几天了。

我的思路是先将所有列表,列出。
然后将全错的那个移出列表,
将整个列表与全错列表对比,留下对的所有位置参数,记作weizhi列表
从总列表的第一个列表开始,尝试用itertools.combinations()  随机选出对应正确个数数量的元素,
然后在后续的列表同样用itertools.combinations()随机取当前对应的正确个数的元素
但是上面后续过程  谨遵一个规则,就是被筛选的列表里不能有和之前列表的同位置 的相同元素,
这样避免了每个列表对应个数的不正确取值
然后用递归,逐步递归,到满足列表需求长度的时候开始测试,只有通过所有列表测试的列表
才能被打印出来。
思路就是这样,想的太头疼了,确实想不出很明了简单的思路和解法

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

使用道具 举报

发表于 2018-2-10 13:57:22 | 显示全部楼层
这个欧拉的185题,和你的题目,都是秒解,可惜大数怎么都算不出
1518242156(1).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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