【每周一坑】田忌赛马

本周的题目取自著名的历史典故:田忌赛马

背景资料如下

田忌经常与齐国众公子赛马,设重金赌注。田忌的上宾孙膑发现他们的马脚力都差不多,马分为上、中、下三等,于是对田忌说:“您只管下大赌注,我能让您取胜。”田忌相信并答应了他,与齐王和各位公子用千金来赌注。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,用您的上等马对付他们的中等马,用您的中等马对付他们的下等马。”已经比了三场比赛,田忌一场败而两场胜,最终赢得齐王的千金赌注。

现在我们将齐王的马抽象为一个列表 [3,6,9],田忌的马抽象为另一个列表 [2,5,8],分别代表各自的下、中、上等马。设计一个函数 race(),将两个列表作为参数传递给 race(),将背景资料的策略抽象为代码使田忌赢得比赛,函数返回每轮对阵情况,结果示例:

def race(qiwang,tianji):    '''    >>> race([3,6,9],[2,5,8])    [(9,2),(6,8),(3,5)]    '''

附加题:

1、如果你是某公子手下的谋士,已知同级别中己方的马优于田忌的马,事先不知道对方派遣顺序,不过可以根据上一轮对方的派出的马匹制定本轮的选择。为公子制定一种派遣策略,使赢得比赛的几率最大。
提示:田忌的策略可用 random 确定

import random g = [3,6,9] t = [2,5,8]
# 田忌的策略
def tianji_s():    return random.shuffle(t)
# 公子的策略
def gongzi_s():    '''    your code here    '''
# 至少 1000 次测试
for i in range(1000):
   '''    your code here    '''

2、现在将马分为 优、上、中、下、劣 五等,五局三胜制,抽象为列表[2,4,6,8,10] 与 [1,3,5,7,9] ,其他条件不变,计算出田忌有多少种赢得比赛的可能。

期待各位同学对于本周题目的代码提交。

提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。

往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。


【乒乓数】 解答

乒乓序列从1开始计数,并且始终向上或向下计数。在元素k处,如果k是7的倍数或包含数字7,方向将切换,定义一个函数 pingpong ,传入一个正整数参数 n ,返回第 n 个乒乓数。

def pingpong(n,k=7):    '''传入一个正整数参数 n 和特殊数 k,返回第 n 个乒乓数    n - 第 n 个乒乓数    k - 给定的特殊数,默认为 7    '''    # count 计数,随着循环增加    # num 为 第 count 个数时的乒乓数    # status 为增或减状态,在 正负 1 之间切换,默认为 1    count,num,status = 1,1,1    # 断言 n,k 为正整数,否则抛出错误    assert isinstance(n,int) and n > 0 ,'input error'    assert isinstance(k,int) and k > 0 ,'input error'    while count < n:
       # 判断切换条件        if str(k) in str(count) or count % k == 0:            status *= -1        # 累加或累减        num += status        count += 1    return num

这道题的关键在于预设一个递增或递减的状态,结合 if 判断下一次运算是加 1 还是减 1 ,很多同学都采取了相同的计算原理,写出了比较简洁的代码,参考:

@皮特尔:https://codeshare.io/5vAV3l
@bolin:http://paste.ubuntu.com/24332853/
@LDJ:https://github.com/NyanCat12/CrossinWeekly/blob/master/20170407/pingpong.py
@Nicked:https://github.com/nicktimebreak/CrossinWeekly/blob/master/pingpong.py

另外 @徐大龙 同学使用了 generator 的方式计算,也值得参考:
https://github.com/PeytonXu/learn-python/blob/master/cases/pingpong/pingpong.py


(0)

相关推荐

  • 小白必学教程:Python变量的定义和使用

    所有的一种编程语言都需要处理数据,如数字.字符串.字符等等,我们可以直接使用数据,或者把它保存到一个变量中,以方便以后使用. 变数(Variable)可看作是一个专门用于在程序中"装入&qu ...

  • Python|求1到n的阶乘之和

    问题描述"从键盘输入n,求1+2!+3!+...+n!的和"对于此题,我们可以用定义一个函数来解决,接着用一个for循环语句来设置从1到n,接下来一起来编写这个代码吧.解决方案假定 ...

  • 【浅析高数】指数比阶乘,极限几何

    高斯函数 函数y=[x]称为取整函数,也称高斯函数.其中不超过实数x的最大整数称为x的整数部分,记作[x]或INT(x).该函数被广泛应用于数论,函数绘图和计算机领域 一个正整数的阶乘是所有小于及等于 ...

  • Python|如何判断丑数

    问题描述编写一个程序判断给定的整数是否为丑数.丑数就是只包含质因数 2,3, 5 的正整数.说明:(1)1是丑数.(2)输入不会超过 32 位有符号整数的范围: [-2³¹,  2³¹-1].解决方案 ...

  • 【每周一坑】疯狂的小母牛 +【解答】数据库

    之前我们的"每周一坑"栏目挖了一个"单词本"的系列.不过看起来大家都这种中长线项目兴趣不大啊--最近的一期,直到最近几天才有一位同学提交了解答. 所以我决定暂停 ...

  • 【每周一坑】数据库 +【解答】自动翻译

    我们的系列坑 单词本 今天继续第3期. 上次我们的目标是加入自动翻译,需要用到网络接口,可以看作是一个最简单的爬虫.详细方法稍后分析,先来谈谈今天的任务: 使用数据库存储单词数据 交互效果与之前相同, ...

  • 【每周一坑】自动翻译 | 【解答】单词本

    上次我们挖了一个系列坑:[每周一坑]单词本. 第一期的目标,是实现控制台下的单词录入及保存功能.各位都有实现吗?在本文后半段,我们会来做具体分析. 在这之前,先给出新的目标: 自动给添加的单词增加翻译 ...

  • 【每周一坑】单词本 +【解答】三国演义中谁的存在感最强

    "每周一坑"这个系列在本教室的文章中,阅读量不算高.但我屡次在和读者沟通时听到说"我都有跟着每周一坑里的题在做".这是个有意思的普遍现象:内容的价值和传播度并不 ...

  • 【每周一坑】三国演义中谁的存在感最强 +【解答】暴力计算圆周率

    自然语言处理(NLP)是人工智能的一个重要领域.在对中文做自然语言处理的时候,一个很基础的操作就是分词:因为中文不像英语有现成的单词划分,需要将汉字序列切分成一个个单独的词,以便于后续的处理和分析. ...

  • 【每周一坑】暴力计算圆周率 +【解答】生成/识别二维码

    我们之前有出过一些和概率相关的问题.比如 几道有趣的概率题.三门问题.田忌赛马.蜥蜴流感与贝叶斯定理.我讲过,用计算机程序来解编程题有个很有意思的思路,就是暴力解法.就是利用电脑的计算能力,去模拟大量 ...

  • 【每周一坑】生成/识别二维码 +【解答】新个税计算器

    二维码的本质是将文本信息转化成符合一定格式的平面图片信息,以便于计算机/手机通过摄像头或扫码设备快速而准确地识别,实现信息的传递.从某种角度来说,二维码可算是打通次元壁的途径,将互联网与现实世界更便捷 ...

  • 【每周一坑】新个税计算器 + 【解答】数字水印

    根据全国人大常委会关于修改个人所得税法的决定,10月1日起,纳税人的工资.薪金所得将适用新的费用减除标准(通常说的"起征点"),由每月3500元提高到每月5000元,并适用新的个税 ...

  • 【每周一坑】图像的指纹:数字水印 + 【解答】鸡兔同笼

    曾经有过这样的新闻:某公司的员工将内网论坛上的言论截屏发布到互联网上,引发了热议.于是公司通过截图定位到了员工的身份,将其开除. 有人可能好奇,仅凭截图就能知道是谁干的吗?这里就是用到了"数 ...