【每周一坑】乒乓数

刚从假期回来,又要迎接周末,各位看官想必都很辛苦,所以本周每周一坑为大家准备一道简单的甜点题目,本题取材于伯克利大学 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/

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2017-04-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

百度 阿里 华为 腾讯 谷歌面试笔试题及解析

点评:其余题目请参见:http://blog.csdn.net/doc_sgl/article/details/11695671。 2、一个有10亿条记录...

5253
来自专栏安恒网络空间安全讲武堂

由suctf一道题学到的中国余子式定理

1163
来自专栏JadePeng的技术博客

从编辑距离、BK树到文本纠错

搜索引擎里有一个很重要的话题,就是文本纠错,主要有两种做法,一是从词典纠错,一是分析用户搜索日志,今天我们探讨使用基于词典的方式纠错,核心思想就是基于编辑距离,...

6126
来自专栏前端吧啦吧啦

数据结构(一)之基础知识

1104
来自专栏互联网开发者交流社区

SQL基础日期函数

1535
来自专栏数据结构与算法

P3376 【模板】网络最大流

题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入输出格式 输入格式: 第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个...

3028
来自专栏AI科技大本营的专栏

你一定能看懂的算法基础书(代码示例基于Python)

本文引自图灵教育《算法图解》 你一定能看懂的算法基础书;代码示例基于Python;400多个示意图,生动介绍算法执行过程;展示不同算法在性能方面的优缺点;教会...

5267
来自专栏数据结构与算法

1163 访问艺术馆

 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果 题目描述 Description     皮尔...

2807
来自专栏落影的专栏

程序员进阶之算法练习(十八)

前言 最近在接触新知识,也是选择2017年的方向。 其他文集更新会放缓,没有学习就没有心得,肚中无墨就无从下笔。 但是算法练习还是挺好玩的,欢迎关注algo...

3475
来自专栏苦逼的码农

从零打卡leetcode之day 3--最大子序列

看到三个for循环,时间复杂度的O(n3)。这速度,实在是太慢了。我们来优化优化。

671

扫码关注云+社区

领取腾讯云代金券