打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【每周一坑】程序猿的浪漫

最近公众号上的自媒体们炸了,因为苹果爸爸把腾讯爸爸的赞赏给关闭了!

讲真,这对咱们编程教室的影响还是很大的。之前每次发完文章,晚饭还能靠打赏加个鸡腿儿,这下泡汤……



来看本周的题目。

前几日刷朋友圈时看到这样一个故事:

读艺术相关科系的她,透过联谊认识了一位程序员,两人凑巧都是离乡背井在外地读书,更巧合的是他们都在同一个城市、同一个小区域。某天凌晨,两人聊了许多,他突然传了一串数字,73、76、79、86、85,「这是我想对你说的」。说完这句话,他就离线睡觉去了。她熬夜苦撑终于找到「ASCII对照表」,原来5个数字代表的是,「I LOV U」。后来他们就在一起了。

长久以来,大家对程序员的印象是“呆板”、”内向”等,殊不知他们也有浪漫的一面。把找不到对象归因于职业性质,这个锅,面向对象的编程语言不背!(但这个报道真不是来黑程序员的吗……)

那么问题来了:在 python 中有 hashlib 和 base64 两大加密模块,将一串字符串先经过 hashlib.md5 加密,然后再经过 base64 加密,最后得到一串字符:

'NDRiMWZmMmVjZTk5MTFjMWI1MDNkYTY0MzZlYTAzMTA=\n'

在此给出 4 个选项

  1. 我们在一起吧

  2. 我选择原谅你

  3. 别说话,吻我

  4. 多喝热水

请各位大侦探们使用科学的方法算出我说的什么吧!

参考资料:
python中的hashlib和base64加密模块使用实例:http://www.jb51.net/article/54631.htm

附加题:
有另一半或者近期准备表白同学可以试着发送一段加密字符给 ta,看看 ta 的反应。
欢迎在留言区说出你的故事。


【田忌赛马】解答

第一题比较简单,就是按照背景介绍,根据马匹的情况,将数组重新分配即可。

g = [3,6,9] t = [2,5,8]
def race(g,t):    # 重新分配    return [(g[0],t[2]),(g[1],t[0]),(g[2],t[1])]

附加题一出题有误,这里向大家诚挚地道歉,公子的选马策略并不影响最后的赢得比赛的概率。

附加题二描述得也不太清楚,误导了一些同学。本意是,改成五档后,齐王仍然遵守规则,田忌继续不按套路出牌,最终田忌赢得比赛的所有可能。

所以结果是 27。算出来上千的同学不用困惑,题之歧义,非战之罪。下次我们会避免。

解决思路是,遍历所有可能的对阵情况,筛选出所有田忌赢得比赛的结果,并输出。

在给出答案之前,简单介绍需要用到的两个函数:

itertools.permutations(iterable[, r])

创建一个迭代器,返回 iterable 中所有长度为 r 的项目序列,在本题,我们使用此函数获得某一方所有派遣马匹的方式。

示例:

>>>permutations('ABCD', 2) AB AC AD BA BC BD CA CB CD DA DB DC >>>permutations(range(3))
012 021 102 120 201 210

zip([iterable, ...])

zip() 是 Python 的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个 tuple(元组),然后返回由这些 tuples 组成的 list(列表)。本题中,我们使用此函数获得双方马匹的对阵情况。

>>>a = [1,2,3] >>>b = [4,5,6] >>>list(zip(a,b)) [(1, 4), (2, 5), (3, 6)]

整体代码如下:

import itertools
tianji = [1,3,5,7,9] qiwang = [2,4,6,8,10]

def fj2(qiwang,tianji):    # 获取田忌所有派遣马匹的方式    tianji_l = list(itertools.permutations(tianji,len(tianji)))    
   # 全部赛果    res_all_turns = []    
   # 遍历所有的方式    for i in tianji_l:        
   # 某一轮的比赛结果        res_one_turn = []        
       # 某一轮比拼中,双方马匹对阵情况        for horses in zip(i,qiwang):            
           if horses[0] < horses[1]:                res_one_turn.append('lose')            
           else:                res_one_turn.append('win')      
       if res_one_turn.count('win') >= 3:            res_all_turns.append('win')  
   return len(res_all_turns) print(fj2(qiwang,tianji))

也可参考 @王任 的解答:

http://paste.ubuntu.com/24401290/

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python 排列组合的计算
Python中itertools.permutations的用法解析
python内置函数-排列组合函数
算法创作|纸牌三角形
面试题-有1、2、3、4数字能组成多少互不相同无重复数的三位数?
从零开始学Python:第22课-Python标准库初探
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服