鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: jerryxjr1220

[已解决]鱼C论坛python精英挑战赛(02期)

[复制链接]
发表于 2017-6-20 22:28:07 | 显示全部楼层
jerryxjr1220 发表于 2017-6-20 22:14
这题我觉得对你来说太easy了
我比较想看你上一期挑战赛题目的解答

这就尴尬了~
第一题,我的方法和你的差不多,所以,就在想一个与众不同而又高效的算法,头好痛~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 00:16:25 | 显示全部楼层
lh625243422 发表于 2017-6-20 20:13
不要用pow试试
是math.pow的锅
你的第一句可以去掉,因为pow是内置函数的,结果也是整数

真的么,我去试试,感谢,太棒了
抱大腿
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 00:19:47 | 显示全部楼层
修改了一下
  1. ##设置一个题目里面的62进制的列表
  2. def make_table():
  3.     table = []
  4.     for i in range(48,58):
  5.         table.append(chr(i))
  6.     for i in range(65,91):
  7.         table.append(chr(i))
  8.     for i in range(97,123):
  9.         table.append(chr(i))
  10.     return table

  11. ##判断高进制的字符串是哪一个,目的是:比较的时候以高进制的为主体
  12. def judge_high(rawData,newData):
  13.     ##如果位数相同,那么最高位小的,便是高进制的
  14.     if len(rawData) is len(newData):        
  15.         if rawData[0] > newData[0]:
  16.             return (newData,rawData)
  17.         else:
  18.             return (newData,rawData)
  19.     ##如果位数不相同,位数小的便是高进制的
  20.     else:
  21.         if len(rawData) > len(newData):
  22.             return (newData,rawData)
  23.         else:
  24.             return (rawData,newData)
  25.         
  26. ##判断高低进制字符串起始比较的进制大小
  27. def judge_system(highData,lessData):
  28.     table = make_table()
  29.     highMaxSys = table.index(max(highData))
  30.     lessMaxSys = table.index(max(lessData))
  31.     ##高进制字符串最大元素小于低进制字符串最大元素的时候
  32.     if highMaxSys < lessMaxSys:
  33.         highMaxSys = lessMaxSys + 1
  34.     return (highMaxSys + 1,lessMaxSys + 1)

  35. ## 计算字符串转化到十进制是多少
  36. def compute(data,sys):
  37.     table = make_table()
  38.     temp = 0
  39.     for i in range(len(data)):
  40.         temp += table.index(data[i]) * pow(sys,len(data)-i-1)
  41.     return temp

  42. ##  进行十进制的比较,相等的话返回进制数
  43. def compare(highData,lessData,highSys,lessSys):
  44.     for i in range(highSys,63):
  45.         for j in range(lessSys,i+1):
  46.             if compute(highData,i) == compute(lessData,j):
  47.                 return (i,j)
  48.             
  49. def Calc(rawdata,newdata):
  50.     table = make_table()
  51.     if rawdata is newdata: ##两字符串相同的情况
  52.         return (table.index(max(rawdata))+1,table.index(max(rawdata))+1)
  53.     else:
  54.         highData,lessData = judge_high(rawdata,newdata)##判断谁是高进制字符串
  55.         highSys,lessSys = judge_system(highData,lessData)##判断高低字符串最低比较进制
  56.         ##若存在进制之间的转换,则返回对应进制数
  57.         try:
  58.             n,m = compare(highData,lessData,highSys,lessSys)
  59.         except:
  60.             return '无法进行转换'
  61.         
  62.         if highData == rawdata:
  63.             return (n,m)
  64.         else:
  65.             return (m,n)

  66. Test = [('A', '11'),
  67.         ('18', '18'),
  68.         ('ABC', '41I'),
  69.         ('3d8B', '254731'),
  70.         ('FISHC', '18DCFB0'),
  71.         ('python', 'B1687AEA1'),
  72.         ('10110111010010010010101000101010', '11TIFA8BPMTL0'),
  73.         ('10110111010010010010101000101010010101010101010010101001010100101101010101010010101001010100101010101010010101001010010101001010', '5Zr1zn3pm5znjGepqkPmDC')]

  74. for i in range(len(Test)):
  75.     print(Calc(Test[i][0],Test[i][1]))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-21 07:03:45 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-6-21 07:06 编辑


这题其实很简单的,大家不要想得太复杂,可以尽量简化代码。
我解这题才写了4行代码
第一行定义函数,第二行定义转换表,第三行定义进制转换,第四行返回结果,正正好好。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 08:10:46 From FishC Mobile | 显示全部楼层
SixPy 发表于 2017-6-20 21:55


有点看不懂,好多知识点还没学到
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 08:12:06 From FishC Mobile | 显示全部楼层
jerryxjr1220 发表于 2017-6-21 07:03
这题其实很简单的,大家不要想得太复杂,可以尽量简化代码。
我解这题才写了4行代码
第一 ...


真的假的,尽管我知道大佬很牛逼
但巧妇难为无米之炊啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-21 08:40:34 | 显示全部楼层
Teagle 发表于 2017-6-21 08:12
真的假的,尽管我知道大佬很牛逼
但巧妇难为无米之炊啊

等这期挑战赛截止日期之后,我会贴我的解答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 09:02:25 From FishC Mobile | 显示全部楼层
要不先私聊给我,打死不泄露,而且我也不修改答案了,我倒想先一步一窥天机
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 14:43:02 | 显示全部楼层
简约版:
  1. def calc(str1, str2, indexs='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'):
  2.     length1, length2 = len(str1), len(str2)
  3.    
  4.     one = {sum([pow(i, length1-t-1) * indexs.index(str1[t]) for t in range(length1)]):i
  5.      for i in range(62, indexs.index(max(str1)), -1)}
  6.     two = {sum([pow(i, length2-t-1) * indexs.index(str2[t]) for t in range(length2)]):i
  7.      for i in range(62, indexs.index(max(str2)), -1)}
  8.    
  9.     oneAndTwo = set({i for i in one.keys()} & {i for i in two.keys()}).pop()
  10.    
  11.     return one[oneAndTwo], two[oneAndTwo]
复制代码


正规版:
  1. def from_to(num, base=2, dicts='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'):

  2.     num = str(num)
  3.     length = len(num)

  4.     return sum([pow(base, length-i-1) * dicts.index(num[i]) for i in range(length)])

  5. def calc(str1, str2, indexs='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'):
  6.     str1, str2 = str(str1), str(str2)

  7.     one = {from_to(str1, i, dicts=indexs):i for i in range(62, indexs.index(max(str1)), -1)}
  8.     two = {from_to(str2, i, dicts=indexs):i for i in range(62, indexs.index(max(str2)), -1)}
  9.     oneAndTwo = set({i for i in one.keys()} & {i for i in two.keys()}).pop()
  10.    
  11.     return one[oneAndTwo], two[oneAndTwo]
复制代码


思路都是一样的,转换成相同进制比较。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 15:32:37 | 显示全部楼层
  1. def Calc(rawdata,newdata):
  2.    firstarr=suan(rawdata)
  3.    secondarr=suan(newdata)
  4.    firstlen=len(rawdata)
  5.    firstsc=max(firstarr)+1
  6.    secondlen=len(newdata)
  7.    secondsc=max(secondarr)+1
  8.    return searchstr(firstarr,secondarr,firstsc,secondsc,firstlen,secondlen,True)  if firstsc>secondsc else searchstr(secondarr,firstarr,secondsc,firstsc,secondlen,firstlen,False)
  9. def suan(str1):
  10.     str2=list(str1)
  11.     j=len(str1)
  12.     for i in range(0,j):
  13.         temp=ord(str2[i])
  14.         tempsub=48 if temp<65 else 55 if temp<97 else 61
  15.         str2[i]=temp-tempsub
  16.     return str2
  17. def searchstr(firstarr,secondarr,firstsc,secondsc,firstlen,secondlen,fx):
  18.    temparr=list(reversed(secondarr))
  19.    for i in range(firstsc,63):
  20.       summ=0
  21.       for j in range(0,firstlen):
  22.          summ=summ+pow(i,firstlen-j-1)*firstarr[j]
  23.          for j in range(secondsc,63):
  24.             tempsum=0
  25.             temp=summ
  26.             for k in range(0,secondlen):
  27.                if temp % j==temparr[k]:
  28.                   tempsum=tempsum+temparr[k]*pow(j,k)
  29.                   temp=(temp //j)
  30.                else:
  31.                   break
  32.             if tempsum==summ:
  33.                if fx==True:
  34.                   return (i,j)
  35.                else:
  36.                   return(j,i)

  37. Test = [('A', '11'),
  38.         ('18', '18'),
  39.         ('ABC', '41I'),
  40.         ('3d8B', '254731'),
  41.         ('FISHC', '18DCFB0'),
  42.         ('python', 'B1687AEA1'),
  43.         ('10110111010010010010101000101010', '11TIFA8BPMTL0'),
  44.         ('10110111010010010010101000101010010101010101010010101001010100101101010101010010101001010100101010101010010101001010010101001010', '5Zr1zn3pm5znjGepqkPmDC')]
  45. for i in range(0,len(Test)):
  46.    print(Calc(Test[i][0],Test[i][1]))

  47.         
  48.    
  49.    
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 答题奖励

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 18:14:43 | 显示全部楼层
本帖最后由 SixPy 于 2017-6-21 18:17 编辑
  1. def calc(str1, str2):
  2.     indx = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  3.     cov_10 = lambda s:{sum(indx.index(c)*b**i for i,c in enumerate(reversed(s))):b
  4.                                               for b in range(62, indx.index(max(s)), -1)}   
  5.     one,two = cov_10(str1),cov_10(str2)   
  6.     oneAndTwo = (one.keys() & two.keys()).pop()   
  7.     return one[oneAndTwo], two[oneAndTwo]
复制代码

评分

参与人数 1贡献 +2 收起 理由
wei_Y + 2 学习。

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 20:09:36 | 显示全部楼层
jerryxjr1220 发表于 2017-6-21 08:40
等这期挑战赛截止日期之后,我会贴我的解答

大佬我就想添加你们几个大佬为好友了,但是奈何,我论坛刚来,级别低,还没有权限添加好友,好惨
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-21 20:33:03 | 显示全部楼层
程序还是比较繁杂,再想想如何优化。
  1. dict1 = {str(i):i for i in range(10)}
  2. dict2 = {chr(65+i):i + 10 for i in range(26)}
  3. dict3 =  {chr(97+i):i + 36 for i in range(26)}
  4. dict1.update(dict2)
  5. dict1.update(dict3)
  6. #以上生成从0到9,从A到Z,从a到z的字典

  7. def n_to_10(s, n):
  8.     sum1 = 0
  9.     for i in s: #这里想用reduce但没有成功
  10.         sum1 = sum1 * n + dict1[i]
  11.     return sum1

  12. def calc(rawdata, newdata):
  13.     n1 = dict1[sorted(list(rawdata))[-1]] + 1
  14.     n2 = dict1[sorted(list(newdata))[-1]] + 1
  15.     for i in range(n1, 63):
  16.         for j in range(n2, 63):
  17.             if n_to_10(rawdata, i) == n_to_10(newdata, j):
  18.                 return i, j


  19. Test = [('A', '11'),
  20.         ('18', '18'),
  21.         ('ABC', '41I'),
  22.         ('3d8B', '254731'),
  23.         ('FISHC', '18DCFB0'),
  24.         ('python', 'B1687AEA1'),
  25.         ('10110111010010010010101000101010', '11TIFA8BPMTL0'),
  26.         ('10110111010010010010101000101010010101010101010010101001010100101101010101010010101001010100101010101010010101001010010101001010', '5Zr1zn3pm5znjGepqkPmDC')]
  27. for i in Test:
  28.     print(calc(i[0], i[1]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-21 21:42:23 | 显示全部楼层
冬雪雪冬 发表于 2017-6-21 20:33
程序还是比较繁杂,再想想如何优化。

解题思路基本都是一致的,只是写得有点复杂,其实可以压缩到4~5行代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 07:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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