鱼C论坛

 找回密码
 立即注册
查看: 2326|回复: 6

[技术交流] 鱼C论坛Python精英挑战赛(01期)挑战结果

[复制链接]
发表于 2017-6-19 10:48:44 | 显示全部楼层 |阅读模式

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

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

x
鱼C论坛Python精英挑战赛(01期)挑战结果公布如下:

根据各位鱼油提交的解答程序,用了6组测试数据进行比较:

  1. Test = [['1', '2', '3', '4'],
  2.         ['AB', 'BC', 'AC', 'CB', 'BA'],
  3.         ['ABC', 'BCA', 'DAC', 'CDB', 'BDB'],
  4.         ['ACBD', 'ADBC', 'CBDD', 'CABD'],
  5.         ['AHCBDK', 'ADBEKC', 'ECBDGD', 'CABGHD'],
  6.         ['ARTIST', 'TARGET', 'CARTER', 'STARTS', 'GREATS', 'EARSET']]
复制代码


比较结果如下:
无标题.png

综合比较下来,wei_Y的低效版的准确性更高,而高效版的执行效率更出色。所以,评选wei_Y作为优胜者。

本帖被以下淘专辑推荐:

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

使用道具 举报

 楼主| 发表于 2017-6-19 10:54:23 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-6-19 10:55 编辑

其实,对于这题我也写了一个,用的思路是递归插入法。
把“母字符串”拆成“head”和“tail”两部分,每次在“tail”中插入子字符串,插入完以后就归到“head”中,以此类推。
  1. def solve(L):
  2.         def gen_sub(string, tail, head=''):
  3.                 if len(string) == 1:
  4.                         if string in tail:
  5.                                 return head + tail
  6.                         else:
  7.                                 return head + string + tail
  8.                 else:
  9.                         if string[0] in tail:
  10.                                 return gen_sub(string[1:], tail[tail.find(string[0]) + 1:], head + tail[:tail.find(string[0]) + 1])
  11.                         else:
  12.                                 return gen_sub(string[1:], tail[:], head + string[0])
  13.         from itertools import permutations as p
  14.         res = []
  15.         for each in p(L):
  16.                 s = ''
  17.                 for l in each:
  18.                         s = gen_sub(l, s)
  19.                 res.append(s)
  20.         return min(res, key=lambda s: len(s))

  21. Test = [['1', '2', '3', '4'],
  22.         ['AB', 'BC', 'AC', 'CB', 'BA'],
  23.         ['ABC', 'BCA', 'DAC', 'CDB', 'BDB'],
  24.         ['ACBD', 'ADBC', 'CBDD', 'CABD'],
  25.         ['AHCBDK', 'ADBEKC', 'ECBDGD', 'CABGHD'],
  26.         ['ARTIST', 'TARGET', 'CARTER', 'STARTS', 'GREATS', 'EARSET']]
  27. for test in Test:
  28.         print(test, solve(test), len(solve(test)))
复制代码


['1', '2', '3', '4'] 4321 4
['AB', 'BC', 'AC', 'CB', 'BA'] BACB 4
['ABC', 'BCA', 'DAC', 'CDB', 'BDB'] BCDABC 6
['ACBD', 'ADBC', 'CBDD', 'CABD'] ACABDDBC 8
['AHCBDK', 'ADBEKC', 'ECBDGD', 'CABGHD'] ECABDGHCBEDKC 13
['ARTIST', 'TARGET', 'CARTER', 'STARTS', 'GREATS', 'EARSET'] GCARTEISTARGTSET 16
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-19 11:30:30 | 显示全部楼层
这规则没说清楚啊,白激动半天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-19 11:53:07 | 显示全部楼层
WelanceLee 发表于 2017-6-19 11:30
这规则没说清楚啊,白激动半天

确实,一开始L的测试长度并没有说清楚,下次会注意,给定测试范围。
你的程序对于字符串长度短的跑出来结果都是对的,但是字符串长度长就跑不出来了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-19 19:20:41 | 显示全部楼层
不说限制范围才有意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-19 20:02:35 | 显示全部楼层
本帖最后由 wei_Y 于 2017-6-19 20:04 编辑

做了些更改。
  1. def combinations(rawList):
  2.     AllRoads = [[rawList, '']]

  3.     oldMaps = set()
  4.    
  5.     while 1:
  6.         tempAllRoads = []

  7.         for t in AllRoads:
  8.             currentWords = {i[0] for i in t[0] if i}

  9.             for j in currentWords:
  10.                 # 字符串不需要深拷贝。
  11.                 copyList = t[0].copy()
  12.                
  13.                 for index, data in enumerate(copyList):
  14.                     if data:
  15.                         if data[0] == j:
  16.                             copyList[index] = data[1:]

  17.                 strs = ''.join(copyList)
  18.                 if not len(strs):
  19.                     return t[1]+j+strs
  20.                
  21.                 if strs not in oldMaps:
  22.                     tempAllRoads.append([copyList, t[1]+j])

  23.                 oldMaps.add(strs)

  24.         AllRoads = tempAllRoads
复制代码

准确+高效。
将最后的判断从1变为0,更加准确,多迭代一次效率上相对较低。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-19 21:53:25 | 显示全部楼层
下次挑战赛啥时候开始,下次我一定要夺冠!!!
这挑战赛太棒了,大佬辛苦了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 09:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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