鱼C论坛

 找回密码
 立即注册
查看: 5852|回复: 50

[技术交流] Python:每日一题 39

[复制链接]
发表于 2017-5-6 11:27:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ooxx7788 于 2017-5-6 19:08 编辑

今天的题目比较有意思。
会给你一个列表,有四个数,[2,3,1,6]
你需要做的是,把这四个数字组成一个时间格式,并使得这个时间是所有组合中最晚的组合。
例如[2,3,1,6]可以组成,13:26,16:23等等,但是最晚的时间是23:16。所以请返回23:16这个结果。
如果四个数无法组成时间格式,返回""。
答案一样会延迟放出。你猜我到底是会还是不会呢?

测试代码如下,test.py还是请去33,34中寻找。

  1. test.assert_equals(late_clock([9, 1, 2, 5]), '21:59')
  2. test.assert_equals(late_clock([0, 2, 2, 2]), '22:20')
  3. test.assert_equals(late_clock([9, 0, 1, 1]), '19:10')
  4. test.assert_equals(late_clock([2, 3, 2, 4]), '23:42')
  5. test.assert_equals(late_clock([1, 2, 8, 9]), '19:28')
  6. test.assert_equals(late_clock([4, 7, 8, 9]), '')
复制代码


这么多大佬发过了,我也发个我的吧。就不设置隐藏了。
  1. def late_clock(digits):
  2.     """
  3.     有四个数,[2,3,1,6],把这四个数字组成一个时间格式,并使得这个时间是所有组合中最晚的组合。
  4.     """
  5.     from itertools import permutations
  6.     temp = sorted([each[:2]+":"+each[2:] for each in [''.join(map(str, each)) for each in list(permutations(digits))]])
  7.     result = []
  8.     for each in temp:
  9.         if int(each[0:2]) < 24 and int(each[3:]) < 60:
  10.             result.append(each)
  11.     return result[-1] if result else ''
复制代码


再发送几个评分比较高的代码。给大家参考。
  1. 这是和我比较相似的,筛选类的。
  2. from itertools import permutations

  3. def late_clock(digits):
  4.   for p in permutations(sorted(digits, reverse=True)):
  5.     if p[0] > 2 or (p[0] == 2 and p[1] > 3) or p[2] > 5: continue
  6.     return '{}{}:{}{}'.format(*p)
复制代码

  1. 这是正则筛选的。
  2. import re
  3. from itertools import permutations
  4. def late_clock(digits):
  5.     s = max(a for a in (''.join(map(str, a)) for a in permutations(digits)) if re.fullmatch(r'(?:2[0-3]|[01]\d)[0-5]\d', a))
  6.     return '%s:%s' % (s[:2], s[2:])
复制代码

  1. 这是递归式的。我自己最开始写的也是一个递归式的。但是无法通过[1,2,8,9]这种组合,不过这位完成了,不过从代码上面来看,不太好懂。
  2. def late_clock(digits):
  3.     def loc_num(arr, n):
  4.         req_num = req_idx = -1
  5.         for k in range(len(arr)):
  6.             if arr[k] <= n:
  7.                 if arr[k] >= req_num:
  8.                     req_num = arr[k]
  9.                     req_idx = k
  10.         arr[req_idx] = -1
  11.         return req_num

  12.     from copy import deepcopy
  13.     digits_copy = deepcopy(digits)

  14.     t = [0] * 4
  15.     nl = [2, 3, 5, 9]
  16.     for i in range(len(nl)):
  17.         if i == 1:
  18.             t[i] = loc_num(digits, nl[i]) if t[i - 1] == nl[i - 1] else loc_num(digits, nl[i] ** 2)
  19.         else:
  20.             t[i] = loc_num(digits, nl[i])

  21.     if min(t) < 0:
  22.         nl = [1, 9, 5, 9]
  23.         t = [loc_num(digits_copy, nl[i]) for i in range(len(nl))]

  24.     return '%s%s:%s%s' % (t[0], t[1], t[2], t[3])
复制代码

  1. 还有这种,使用datetime进行格式筛选的。也是不错的方法。
  2. from datetime import time
  3. from itertools import permutations

  4. def late_clock(digits):
  5.     ret = []
  6.     for ll in permutations(digits):
  7.         try:
  8.             hr = ll[0] * 10 + ll[1]
  9.             mm = ll[2] * 10 + ll[3]
  10.             ret.append(time(hr, mm))
  11.         except ValueError: pass
  12.     return max(ret).strftime('%H:%M')
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-6 15:21:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 16:26:32 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-5-6 17:11 编辑
  1. from itertools import permutations as pt
  2. def late_clock(lst):
  3.     maxtime = -1
  4.     for each in pt([str(i) for i in lst], 4):
  5.         hour = int(''.join(each[:2]))
  6.         minute = int(''.join(each[2:]))
  7.         if 0<=hour<=23 and 0<=minute<=59:
  8.             maxtime = max(maxtime, hour*100+minute)
  9.         else:
  10.             continue
  11.     return '' if maxtime == -1 else '%02d:%02d' % (int(maxtime//100), maxtime%100)

  12. print(late_clock([1,7,3,1]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 16:33:16 | 显示全部楼层

大神,不对哦~
'22:2' should equal '22:20'

第2个就错咯。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 16:37:38 | 显示全部楼层
ooxx7788 发表于 2017-5-6 16:33
大神,不对哦~
'22:2' should equal '22:20'

发现了,改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 16:39:17 | 显示全部楼层

还是不对哦
'21:58' should equal '21:59'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 16:50:15 | 显示全部楼层
ooxx7788 发表于 2017-5-6 16:39
还是不对哦
'21:58' should equal '21:59'

好蛋疼,21.58 % 1以后竟然是0.5799999.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 16:52:26 | 显示全部楼层
jerryxjr1220 发表于 2017-5-6 16:50
好蛋疼,21.58 % 1以后竟然是0.5799999.....

嘿嘿,都有maxtime了,何必再用%来出结果呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 16:53:22 | 显示全部楼层
jerryxjr1220 发表于 2017-5-6 16:50
好蛋疼,21.58 % 1以后竟然是0.5799999.....

。。。
第三次改的,还是不对哦!
'22:02' should equal '22:20'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 16:55:34 | 显示全部楼层
ooxx7788 发表于 2017-5-6 16:52
嘿嘿,都有maxtime了,何必再用%来出结果呢

maxtime 是小数,本想是规范化显示,比如00:00这种显示,我又改了一下,00:00也应该正常输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 16:58:42 | 显示全部楼层
ooxx7788 发表于 2017-5-6 16:53
。。。
第三次改的,还是不对哦!
'22:02' should equal '22:20'

print(late_clock([2,2,2,0]))
输出是
22:20

不对么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 17:02:20 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-5-6 17:04 编辑
jerryxjr1220 发表于 2017-5-6 16:58
print(late_clock([2,2,2,0]))
输出是
22:20


'17:30' should equal '17:31'
噗...服务器测试,这个还是不对。数字应该就是1 7 3 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 17:02:55 | 显示全部楼层
jerryxjr1220 发表于 2017-5-6 16:58
print(late_clock([2,2,2,0]))
输出是
22:20

2220前面一版的,答案也是不对的,不过这一版的对了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 17:03:46 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-5-6 17:05 编辑
ooxx7788 发表于 2017-5-6 17:02
'17:30' should equal '17:31'
噗...服务器测试,这个还是不对。数字应该就是1 7 3 0


print(late_clock([1,7,3,0]))

显示是
17:30啊

我现在都没用小数计算了,直接先×100 再取%100,应该不会有误差问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 17:04:19 | 显示全部楼层
jerryxjr1220 发表于 2017-5-6 17:03
print(late_clock([1,7,3,0]))

显示是


错了,是1731,我刚刚改过了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 17:07:41 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-5-6 17:11 编辑

我晕,
print(maxtime*100%100)
竟然还真是小数。。。。
30.999999999999773

我认输了,彻底放弃小数,全部改为整数运算
  1. from itertools import permutations as pt
  2. def late_clock(lst):
  3.     maxtime = -1
  4.     for each in pt([str(i) for i in lst], 4):
  5.         hour = int(''.join(each[:2]))
  6.         minute = int(''.join(each[2:]))
  7.         if 0<=hour<=23 and 0<=minute<=59:
  8.             maxtime = max(maxtime, hour*100+minute)
  9.         else:
  10.             continue
  11.     return '' if maxtime == -1 else '%02d:%02d' % (maxtime//100, maxtime%100)

  12. print(late_clock([1,7,3,1]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 17:18:08 | 显示全部楼层
这题告诉我们计算机的小数是多么的不可靠,所以能用整数的,还是尽量避免用小数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-6 17:36:08 From FishC Mobile | 显示全部楼层
jerryxjr1220 发表于 2017-5-6 17:18
这题告诉我们计算机的小数是多么的不可靠,所以能用整数的,还是尽量避免用小数

和小数较劲干什么哦,转乘字符串,直接替换掉小数点不就行了嘛!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 18:20:26 | 显示全部楼层
本帖最后由 小锟 于 2017-5-6 18:37 编辑
  1. import re
  2. import itertools
  3. b = [('','')]
  4. test = [4,7,8,9]
  5. test = [str(i) for i in test]
  6. for i in itertools.permutations(test,4):
  7.     i = ''.join(i)
  8.     a = re.compile(r'([0-1][0-9]|2[0-3])([0-5][0-9])')
  9.     if re.findall(a,i):
  10.         if re.findall(a,i) [0][0]>=b[0][0] and re.findall(a,i) [0][1]>=b[0][1]:
  11.             b = re.findall(a,i)
  12. if b != [('','')]:
  13.     print '%s:%s' % (b[0][0],b[0][1])
  14. else :
  15.     print ''
复制代码

终于改好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 18:23:40 | 显示全部楼层
程序写的比较乱,是边写边改的。上边的测试都通过了,不知还有没有bug。
  1. def late_clock(lst):
  2.     lst.sort(reverse = True)
  3.     list2 = lst[:]
  4.     if 2 in list2:
  5.         list2.remove(2)
  6.         list1 = []
  7.         list1.append(2)
  8.         for i in range(3, -1, -1):
  9.             if i in list2:
  10.                 list2.remove(i)
  11.                 list1.append(i)
  12.                 if list2[0] < 6:
  13.                     list1.extend(list2)
  14.                     return '%d%d:%d%d'%tuple(list1)
  15.                 if list2[-1] < 6:
  16.                     list1.extend(reversed(list2))
  17.                     return '%d%d:%d%d'%tuple(list1)
  18.         list2 = lst[:]
  19.     if 1 in list2:
  20.         list2.remove(1)
  21.         list1 = []
  22.         list1.append(1)
  23.         list1.append(list2[0])
  24.         list2.pop(0)
  25.     elif 0 in list2:
  26.         list2.remove(0)
  27.         list1 = []
  28.         list1.append(0)
  29.         list1.append(list2[0])
  30.         list2.pop(0)
  31.     else:
  32.         return ''
  33.     if list2[0] < 6:
  34.         list1.extend(list2)
  35.         return '%d%d:%d%d'%tuple(list1)
  36.     if list2[-1] < 6:
  37.         list1.extend(reversed(list2))
  38.         return '%d%d:%d%d'%tuple(list1)
  39.     return ''
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 11:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表