#coding=utf-8

def init_set():
r10=range(10)
return [(i, j, k, l)
for i in r10 for j in r10 for k in r10 for l in r10
if (i != j and i != k and i != l and j != k and j != l and k != l) ] #对给定的两组数,计算xAyB.不知道能不能更快些
def get_match_ab(target, source):
la, lb = 0, 0
for (i, t) in enumerate(target):
for (j, s) in enumerate(source):
if s == t:
if i == j:
la += 1
else:
lb += 1
#break this loop since we already found match
break
return (la, lb) #by lancer
#思路很好,把原来的16次比较变成了8次
#经过timeit验证确实速度有所提高
def get_match_ab2(target, source):
table = [-1] * 10
la, lb = 0, 0
for i in xrange(len(source)):
table[source[i]] = i
for i in xrange(len(target)):
if table[target[i]] == i:
la += 1
elif table[target[i]] != -1:
lb += 1
return (la, lb) #nums: the number_set list to be checked
#guess: last guess
#a, b: the number of aAbB
#@return: the rest number_sets which matche last guess
def check_and_remove(nums, guess, a, b):
rest_nums = []
for num_set in nums:
if (a, b) == get_match_ab(num_set, guess):
rest_nums.append(num_set)
return rest_nums #计算在nums中选择target以后,所有ab分支里面的剩余组合个数
def calc_ab_counts(target, nums):
#a * 10 + b is used to indicate an "a & b" combination
ab_map = {}
#init ab_map
abs = (0, 1, 2, 3, 4, 10, 11, 12, 13, 20, 21, 22, 30, 31, 40)
for ab in abs:
ab_map[ab] = 0
#let's do the calculation
for num_set in nums:
(a, b) = get_match_ab(num_set, target)
ab_map[a * 10 + b] += 1
return [ab_map[ab] for ab in abs] #计算一个选择相对于选择集的“标准差”
def calc_standard_deviation(target, nums):
ab_counts = calc_ab_counts(target, nums)
total = sum(ab_counts)
avg = float(total) / len(ab_counts)
sd = sum([(abc - avg)**2 for abc in ab_counts])
return sd #根据现有集合寻找下一个集合
#采用“最小标准差”作为衡量标准
def next_guess(nums):
min_sd = 0
min_set = ()
touched = False
for num_set in nums:
sd = calc_standard_deviation(num_set, nums)
if not touched or min_sd > sd:
touched = True
min_set = num_set
min_sd = sd
return min_set #根据现有集合寻找下一个集合
#随机选取,会有4-5个超过八次
def next_guess2(nums):
return nums[0] #折衷的方法:小于500用最小标准差
def next_guess3(nums):
if len(nums) > 500:
return大专栏  python猜数字游戏快速求解解决方案> next_guess2(nums)
else:
return next_guess(nums) #计算熵
import math
def calc_entropy(target, nums):
ab_counts = calc_ab_counts(target, nums)
total = sum(ab_counts)
hs = []
for abc in ab_counts:
h = 0
if abc:
p = float(abc) / total
h = p * math.log(p, 2)
hs.append(h)
return sum(hs) #使用信息量作为衡量标准
def next_guess4(nums):
min_sd = 0
min_set = ()
touched = False
for num_set in nums:
sd = calc_entropy(num_set, nums)
if not touched or min_sd > sd:
touched = True
min_set = num_set
min_sd = sd
return min_set def make_decision_tree():
from Queue import Queue
result = ((0, 1, 2, 3), {})
queue = Queue()
rest_nums = init_set()
queue.put((rest_nums, result))
#all xAyB set
abs = [(a, b) for a in range(5) for b in range(5 - a)] while not queue.empty():
(rest_nums, (guess, mapping)) = queue.get()
for (a, b) in abs:
new_rest_nums = check_and_remove(rest_nums, guess, a, b)
length = len(new_rest_nums)
if length == 1:
if a != 4: #b can't be other than 0 when a == 4
mapping[a * 10 + b] = new_rest_nums[0]
elif length > 1:
new_guess = next_guess4(new_rest_nums) #TODO: 替换guess函数调整算法
new_result = (new_guess, {})
mapping[a * 10 + b] = new_result
queue.put((new_rest_nums, new_result))
return result max_level = 0
level7_plus_tups = []
def pprint_result(result, level = 0):
global max_level, max_level_tup
(tup, mapping) = result
print tup
level += 1
if level > max_level:
max_level = level
if len(mapping) == 0:
print
else:
for key in mapping:
val = mapping[key]
#打印前缀
print u"%d|t" * level % tuple(range(1, level + 1)),
print u"%d:" % (level + 1),
#打印xAyB
print u"%dA%dB" % (key / 10, key % 10),
if len(val) == 4: #direct result
#打印结果
print val
if level >= 7:
level7_plus_tups.append((level, val))
else:
pprint_result(val, level) #来玩玩www.iplaypy.com
print u"Notice: 4A0B is NOT included, since it result to Game Over"
pprint_result(make_decision_tree())
print
print u"max level is:", max_level + 1
print u"level7 plus tuples:"
for (level, tup) in level7_plus_tups:
print u"level:", level + 1, u"ttup:", tup
print

python猜数字游戏快速求解解决方案的更多相关文章

  1. python猜数字游戏console版本

    加入python学习小组后的第一次作业,python GUI写猜数字游戏.由于加班比较多,第一步先实现console版本,下一步再实现GUI版本. 虽然猜数字游戏是个小游戏,但是涉及到的基础知识点还是 ...

  2. java & python猜数字游戏对比

    1.java版 package day03; import java.util.Random;import java.util.Scanner; /** * 猜数字游戏 * 随机生成一个1-100之间 ...

  3. python 猜数字游戏

    import random print('==============学无止境==========') secret=random.randint(1,10) print('sec:',secret) ...

  4. 猜数字游戏--基于python

    """题目:练习使用python写一个猜数字的游戏,数字范围0-100,每次猜错,需要给出缩小后的范围,每个人只有10次的猜测机会,猜测机会用完游戏结束!"&q ...

  5. python学习:猜数字游戏

    猜数字游戏   系统生成一个100以内的随机整数, 玩家有6次机会进行猜猜看,每次猜测都有反馈(猜大了,猜小了,猜对了-结束) 6次中,猜对了,玩家赢了. 否则系统赢了   #!/usr/bin/en ...

  6. Python实现猜数字游戏1.0版

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=702 """ 功能: 随机生成一个数字,最多有3次猜测机会,如果第一次没有猜对,则从第 ...

  7. [易学易懂系列|rustlang语言|零基础|快速入门|(23)|实战1:猜数字游戏]

    [易学易懂系列|rustlang语言|零基础|快速入门|(23)|实战1:猜数字游戏] 项目实战 实战1:猜数字游戏 我们今天来来开始简单的项目实战. 第一个简单项目是猜数字游戏. 简单来说,系统给了 ...

  8. 通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile

      通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁 ...

  9. 通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数

    通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账 ...

随机推荐

  1. win10环境下pycharm成功安装torch,解决报错:from torch._C import * ImportError: DLL load failed: 找不到指定的模块

    https://blog.csdn.net/watermelon12138/article/details/97624733

  2. Spring集成MyBatis配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. regex(python)

    正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/26 16:39 # @Author : jackendoff ...

  4. linux中常见压缩文件格式

    文件后缀名 说明 *.zip zip 程序打包压缩的文件 *.rar rar 程序压缩的文件 *.7z 7zip 程序压缩的文件 *.tar tar 程序打包,未压缩的文件 *.gz gzip 程序( ...

  5. Codeforces1304D Shortest and Longest LIS

    前置扯淡 %%@\(wucstido\),思路是在是巧妙---link Description 给一个长度为\(n\)由 \(<\) 和 \(>\)组成的字符串,表示序列中相邻位置的数的大 ...

  6. TPO1-3Timberline Vegetation on Mountains

    At the upper timberline the trees begin to become twisted and deformed. This is particularly true fo ...

  7. 发生 Configuration system failed to initialize 错误的一个特例

    一般情况下,.net 程序启动时发生 Configuration system failed to initialize 错误, 大都与 config 文件中 <configSections&g ...

  8. 面试常见二叉树算法题集锦-Java实现

    1.求二叉树的深度或者说最大深度 /* ***1.求二叉树的深度或者说最大深度 */ public static int maxDepth(TreeNode root){ if(root==null) ...

  9. 二十一、NFS服务

    文件系统是基于存储设备的,比如硬盘,并且包含文件物理位置的维护.文件系统也可以说是虚拟数据或网络数据存储的方法,比如NFS.我是这样理解的:首先,什么是文件系统,这里我们已经明确了,就是组织的一种形式 ...

  10. PAT甲级——1050 String Subtraction

    1050 String Subtraction Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the remain ...