专栏首页Crossin的编程教室【每周一坑】乒乓数

【每周一坑】乒乓数

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

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 喜大普奔!Django官方文档终于出中文版了

    之前对于 Django 的学习我一直推荐看官方文档,但不得不加上一句“如果你英语水平允许的话……”。现在总算是等来好日子了。各位想向网站/服务器开发方向进阶的同...

    Crossin先生
  • 如何用Python抓抖音上的小姐姐

    爬虫的案例我们已讲得太多。不过几乎都是网页爬虫。即使有些手机才能访问的网站,我们也可以通过 Chrome 开发者工具的手机模拟功能来访问,以便于分析请求并抓取。...

    Crossin先生
  • 【Python 第55课】 正则表达式(1)

    今天来挖个新坑,讲讲正则表达式。 什么是正则表达式?在回答这个问题之前,先来看看为什么要有正则表达式。 在编程处理文本的过程中,经常会需要按照某种规则去查找一些...

    Crossin先生
  • 均摊复杂度和防止复杂度的震荡

    关于上一节中我们对添加操作的时间复杂度归结为O(n)是考虑了扩容操作(resize)在内的。就addLast(e)操作而言,时间复杂度为O(1),在考虑最坏情况...

    wfaceboss
  • 【leetcode刷题】T39-字符串中的第一个唯一字符

    Given a string, find the first non-repeating character in it and return it's ind...

    木又AI帮
  • Kafka集群常用命令

    ZONGLYN
  • 391.完美矩形,如果用扫描线算法你会怎么做

    我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。

    我脱下短袖
  • C#中DataTable转化为List<T>解析

        在.net项目中使用到DataTable和List<T>集合的地方较多, 泛型的好处: 它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。...

    彭泽0902
  • Java开发环境系列:Oracle数据库的安装与使用

    1)下载客户端(两个文件),下载前Accept License Agreement,地址:https://www.oracle.com/technetwork/...

    架构师小跟班
  • 美大学研究移动空调机器人

    据《华盛顿邮报》2016年6月30日报道,美国马里兰大学环境能源工程设计中心的研究人员正在研制一款名为Roving Comforter (RoCo)的移动机器人...

    人工智能快报

扫码关注云+社区

领取腾讯云代金券