【每周一坑】乒乓数

简介: 刚从假期回来,又要迎接周末,各位看官想必都很辛苦,所以本周每周一坑为大家准备一道简单的甜点题目,本题取材于伯克利大学 CS61 课程 homework02。

刚从假期回来,又要迎接周末,各位看官想必都很辛苦,所以本周每周一坑为大家准备一道简单的甜点题目,本题取材于伯克利大学 CS61 课程 homework02。


求解乒乓数,题目说明:


乒乓序列从1开始计数,并且始终向上或向下计数。在元素k处,如果k是7的倍数或包含数字7,方向将切换。乒乓序列的前30个元素如下所示,方向交换在第7,14和17,21,第27和28个元素:


1 2 3 4 5 6 [7] 6 5 4 3 2 1 [0] 1 2 [3] 2 1 0 [-1] 0 1 2 3 4 [5] [4] 5 6


定义一个函数 pingpong ,传入一个正整数参数 n ,返回第 n 个乒乓数


def pingpong(n):
    '''
    >>> pingpong(7)
    7
    >>> pingpong(8)
    6
    >>> pingpong(21)
    -1
    >>> pingpong(100)
    2
    >>> pingpong(-1)
    input error
    >>> pingpong(1.0)
    input error    
    '''


附加题:


将原题中为 7 的 k 也作为参数传递给 pingpong 函数,其他条件不变。函数及返回示例如下:


def pingpong(n,k):
    '''
    >>> pingpong(7,7)
    7
    >>> pingpong(8,8)
    8
    >>> pingpong(55,6)
    3
    >>> pingpong(100,9)
    0  
    '''


同学们如果有一些有趣的题目希望拿出来讨论,欢迎分享到评论区,说不定就出现在下期 【每周一坑】 栏目中。


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


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




上期【囚徒困境】解答


首先定义三种策略:


策略函数的形式为输入上一轮对方结果(初始为空),返回是自己这一轮的行为。


nice 策略始终返回 ‘silence’


def nice(last_turn):
    return 'silence'


rat 策略始终返回 ‘betray’


def rat(last_turn):
    return 'betray'


tit_for_tat  策略根据上一轮对方的选择做选择,对方上一轮选择合作本轮则选择合作,反之亦然。默认第一轮选择 ‘silence’。


def tit_for_tat(last_turn):
    if last_turn == 'betray':
        return 'betray'
    else:
        return 'silence'


然后定义计算结果的函数,n 为总的轮数,s1,s2 分别为犯人做出的策略,在 python 中函数也是一种对象,所以我们可以直接传递不同的策略函数,避免写一堆if-else。在模拟函数中,以同样的方式调用s1,s2,但由于传递参数不同,得到效果也就不同。


def prison_delimma(n,s1,s2):
    '''计算不同策略下,经过 n 轮之后犯人各自获刑年限
    n  - 博弈总轮数
    s1 - 犯人一选择的策略
    s2 - 犯人二选择的策略
    '''
    # 初始年数与上轮选择
    p1_years,p2_years = 0
    p1_last_turn,p2_last_turn = ''
    for i in range(n):        # 本轮各自选择
        p1_choice = s1(p2_last_turn)
        p2_choice = s2(p1_last_turn)        # 确定结果
        if p1_choice == p2_choice == 'betray':
            p1_years += 2
            p2_years += 2
        elif p1_choice == p2_choice == 'silence':
            p1_years += 1
            p2_years += 1
        elif p1_choice == 'betray' != p2_choice:
            p2_years += 5
        else:
            p1_years += 5
        # 保存本轮结果
        p1_last_turn,p2_last_turn = p1_choice,p2_choice
    return p1_years,p2_years


另外,也可以参考 @王任 同学的答案,简洁直接:

http://paste.ubuntu.com/24291871/


近期文章推荐阅读:

喏,你们要的 PyCharm 快速上手指南

给伸手党的福利:Python 新手引导

只学2个月编程能写出什么代码?他们表示:You can you code!

如何用100行Python代码做出魔性声控游戏“八分音符酱”

数据分析:当赵雷唱民谣时他唱些什么?

一行代码扫出“敬业福”

我扒了杜蕾斯的微博

Python 爬虫爬取美剧网站

今天,你抢到票了吗?

爆款游戏《贪吃蛇大作战》的 Python 实现

相关文章
|
9月前
|
算法 测试技术
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
|
XML Web App开发 存储
这个文件下载问题难住了我至少三位同事
这个文件下载问题难住了我至少三位同事
LeetCode题解-让所有学生保持开心的分组方法数
LeetCode题解-让所有学生保持开心的分组方法数
|
数据采集 数据挖掘 开发工具
【每周一坑】数路径
现有一个 m × n (m,n 都小于 100)的网格,位于左上角的 A 要去寻找右下角的 B,A 只能向下或者向右行走,现在问题来了,按照刚才的规则,A 到达 B 一共有多少种不重复的路径?
|
数据采集 数据挖掘 Python
【每周一坑】阿姆斯特朗数
提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。
|
数据安全/隐私保护 Python
【每周一坑】信息加密​ +【解答】正整数分解质因数
如果之前已经有质因数,最后剩下的 i 就是最后一个质因数;如果没有,说明原数就是质数
|
9月前
|
算法
算法编程(二十九):统计一致字符串的数目
算法编程(二十九):统计一致字符串的数目
103 0
|
API UED
推特「崩了」:不登录不让看、推文数量严格设上限,马斯克反复横跳
推特「崩了」:不登录不让看、推文数量严格设上限,马斯克反复横跳
510 0
|
Python
LeetCode 447. 回旋镖的数量
给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。
97 0