问题介绍
假设有小费和小王俩好基友,天天形影不离,二人分在一个组。
为了减少迟到的现象,班主任规定如下:
- 迟到一次,则当事人记一分。(迟到)
- 小组两人在某一天同时迟到,则小组总分再记一分。(连坐)
- 一周内如果每天都迟到,则当事人再扣一分。(太皮了)
三种情况可累加记分,一周结算一次小组总分。
肯定有人想说
举个例子好了
下图为某一周的出勤情况:从图中看出小费同学比较皮,天天迟到!小王同学有两天和小费同学一起开黑,导致了迟到。
所以总的小组计分为10分!
那么问题来了:如果已知某一周小组的总分情况,列出可能的出勤表
咸鱼采用的暴力破解法
有两个对象,每个对象有5个记录。每次记录的值有两种情况,我们可以暴力枚举出所有的情况。
一共也才2的10次方,1024种情况。对于计算机来说,当然是小菜一碟咯。
所有上面的出勤图就可以简化为0-1数值图:
接下来问题就变成,如何枚举出这1024种情况?
- 2行5列一共10个值,循环列出0-1111111111二进制数的情况,高位补0。
- 如上图,2列是独立的,我们只需求出5位的情况,两列互相遍历即可。
- 用python自带的 itertools库,分分钟枚举完成。
1 | import itertools |
只要有了枚举的所有情况,判断计分则是很容易的事情。
1 | def credit1(L): #迟到一次扣一分 |
时间问题,不容小觑
因为时间在跨月份
是时候有点麻烦,不能用普通的++,但我们可以用datetime
库呀。
输入一个起始时间,我们要得到那一周的5天。timedelta()
函数你值得拥有。
1 | from datetime import datetime,timedelta |
最后我们在输出 出勤情况的时候,将那个简化后的二维数组List=>
日历对应起来。
1 | def todate(L,date): |
假设我们输入date=20180305,score=0
输出如下结果:1
2
3
4
5
6['2018-03-04-小费(正常)', '2018-03-04-小王(正常)',
'2018-03-05-小费(正常)', '2018-03-05-小王(正常)',
'2018-03-06-小费(正常)', '2018-03-06-小王(正常)',
'2018-03-06-小费(正常)', '2018-03-06-小王(正常)',
'2018-03-06-小费(正常)', '2018-03-06-小王(正常)']
[Finished in 0.2s]
假设我们输入date=20180305,score=1
输出如下结果:
最后一点废话
有一篇关于itertools的文章这段代码很Pythonic | 相见恨晚的 itertools 库 安利一下。此文章的python源代码
马上就要毕业了,再也没有当学生那种无忧无虑的感觉了。以前贪玩欠的债,找工作的时候哭出来。
去面试才知道自己有多菜,所幸我还比较naive
,未来珍惜时间,好好学习。狗住,加油!