鱼C论坛

 找回密码
 立即注册
查看: 5923|回复: 31

[技术交流] Python:每日一题 93(答题领鱼币)

[复制链接]
发表于 2017-9-6 17:02:03 | 显示全部楼层 |阅读模式

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

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

x
我们知道计算器显示数字是用的7段数码字,就如下图所示。
1.jpg

把它旋转180°,会变成另外的数字。
2.jpg

当然有些看起来像英文字母LhE,我们把这些看作36进制的数字(正好36进制用0~9和A~Z来表示)。
现在给出一个数字,把它旋转后得到的36进制数再转为10进制的数作为结果。
如123,旋转为16进制E21,10进制为18217
如6574,旋转为16进制hL59,10进制为820557


  1. def fun(num):
  2.     ......
复制代码


我的解法:
游客,如果您要查看本帖隐藏内容请回复



本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-9-6 17:09:10 | 显示全部楼层
看看帖子里藏了啥好东西~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 18:09:56 | 显示全部楼层
  1. def fun(b):
  2.     a=[0,1,2,'e','h',5,9,'l',8,6]
  3.     c=""
  4.     for i in str(b):
  5.         c = str(a[int(i)])+c
  6.     print (c)
  7.     x=0
  8.     for i in range(len(c)):
  9.         if c[-i-1] == 'e':
  10.             temp=14
  11.         elif c[-i-1] == 'h':
  12.             temp=17
  13.         elif c[-i-1] == 'l':
  14.             temp= 21
  15.         else:
  16.             temp=int(c[-int(i)-1])
  17.         x=x+36**i*temp
  18.     print(x)
  19.         
  20. fun(6574)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2017-9-6 18:20:28 | 显示全部楼层
利用字符串操作
python3 貌似不允许 03 04 这样直接 0 开头的数字,输入字符串'03' '04'会更好
  1. def fun(num):
  2.     maps = str.maketrans("0123456789","012EH59L86")
  3.     return int(str(num).translate(maps)[::-1], 36)
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

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

使用道具 举报

发表于 2017-9-6 19:03:20 | 显示全部楼层
学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 22:05:24 | 显示全部楼层
  1. def fun(num):
  2.     s = list(str(num))
  3.     s.reverse()
  4.     pattern = {'3':'e', '4':'h', '7':'l', '6':'9','9':'6'}
  5.     s = [pattern[x] if x in pattern else x for x in s]
  6.     return int(''.join(s), 36)
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

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

使用道具 举报

发表于 2017-9-6 22:39:11 | 显示全部楼层
  1. def fun(num):
  2.    str0 = ''
  3.    sum = 0
  4.    num0 = str(num)
  5.    for i in num0[::-1]:
  6.       if(i in ('1','2','5','8')):
  7.          str0+=i
  8.       elif(i=='3'):
  9.          str0+='E'
  10.       elif(i=='4'):
  11.          str0+='H'
  12.       elif(i in ('6','9')):
  13.          str0+=str(15-int(i))
  14.       elif(i=='7'):
  15.          str0+='L'
  16.    for i in str0:
  17.        index0=len(str0)-str0.index(i)-1
  18.        if(i=='E'):
  19.           sum+=14*(36**index0)
  20.        elif(i=='H'):
  21.           sum+=17*(36**index0)
  22.        elif(i=='L'):
  23.           sum+=21*(36**index0)
  24.        else:
  25.           sum+=int(i)*(36**index0)
  26.    print(sum)
  27. import math
  28. num = int(input('请输入一个数:'))
  29. fun(num)
复制代码

运行结果:
请输入一个数:123
18217

请输入一个数:6574
820557

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

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

使用道具 举报

发表于 2017-9-6 22:46:49 | 显示全部楼层
看了各位大神的解法,才发现各位的思路都是太巧妙了,一个是直接把数字对应16进制再到十进制后的值,一个是利用列表的下标和值,一个是利用maketrans方法,太巧妙了,相比之下,自己的一步一步的算,差距相当大啊,加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 22:51:04 | 显示全部楼层
solomonxian 发表于 2017-9-6 18:20
利用字符串操作
python3 貌似不允许 03 04 这样直接 0 开头的数字,输入字符串'03' '04'会更好

本来还想写,一看写不出更好的放弃了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 23:55:13 | 显示全部楼层
def fun(num):
    from functools import reduce
    a = str(num)
    b = list(a)
    b.reverse()

    if '3' in b:
        theindex = b.index('3')
        b[theindex] = '14'

    if '4' in b:
        theindex = b.index('4')
        b[theindex] = '17'

    if '6' in b:
        theindex = b.index('6')
        b[theindex] = 'wait'

    if '7' in b:
        theindex = b.index('7')
        b[theindex] = '21'

    if '9' in b:
        theindex = b.index('9')
        b[theindex] = '6'

    if 'wait' in b:
        theindex = b.index('wait')
        b[theindex] = '9'
   
    def calc(x, y):
        return x * 36 + y

    c = list(map(int, b))
    d = reduce(calc, c)
    return d

if __name__ =='__main__':
    print(fun(123))
    print(fun(6574))

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

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

使用道具 举报

发表于 2017-9-7 17:06:39 | 显示全部楼层
大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-7 18:29:18 | 显示全部楼层
古堡主人。 发表于 2017-9-6 22:51
本来还想写,一看写不出更好的放弃了

你不是来做练习的嘛,写自己的啊,哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-7 22:11:53 | 显示全部楼层
完全不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-8 11:46:33 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 17:54:30 | 显示全部楼层
def fun(num):
    result = 0
    i = 0
    for item in num:
        if item == '3':
            result += 14*(36**i)
        elif item == '4':
            result += 17*(36**i)
        elif item == '6':
            result += 9*(36**i)
        elif item == '7':
            result += 21*(36**i)
        elif item == '9':
            result += 6*(36**i)
        else:
            result += int(item)*(36**i)
        i += 1
     
    return result

num = input('请输入:')
result = fun(num)
print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-14 10:37:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-26 21:14:34 | 显示全部楼层
。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-4 16:58:52 | 显示全部楼层
  1. s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  2. turn = {'0':'0','1':'1','2':'2','3':'E','4':'H','5':'5','6':'9','7':'L','8':'8','9':'6'}
  3. def fun(num):
  4.     newNumIn36 = [turn[i] for i in str(num)]
  5.     newNumIn36 = newNumIn36[::-1]
  6.    
  7.     return sum([s.index(newNumIn36[i]) * (36 ** (len(str(num))-i-1)) for i in range(len(str(num)))])

  8. print(fun(123))
  9. print(fun(6574))


  10. ## 题目写错啦!
  11. ##  如123,旋转为16进制E21(应该是36进制E21),10进制为18217
  12. ##  如6574,旋转为16进制hL59(应该是36进制hL59),10进制为820557
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 17:28:17 | 显示全部楼层
没有考虑任何效率问题直接做了一张转换表。最后用INT函数将36进制的数据转换为10进制
  1. def go36(num):
  2.     l= {'0':'0','1':'1','2':'2','3':'e','4':'h','5':'5','6':'9','7':'l','8':'8','9':'6'}
  3.     r = str()
  4.     for i in list(str(num)):
  5.         r=(l[i])+r
  6.     return int(r,36)

  7. if __name__ == '__main__':
  8.     print(go36(123))
  9.     print(go36(6574))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 12:32:01 | 显示全部楼层
def fun(num):
    num1 = []
    num = str(num)
    b = reversed(num)
    for i in b:
        num1.append(int(i))
    print(num1)
    num_dict = {4:18,7:22,3:15}
    j = len(num1)
    print(j)
    sum1 = 0
    for i in num1:
        k = i
        if i in num_dict:
            k = num_dict[i]
            print(k)
        sum1 += (36**(j-1)) * k
        j -= 1
    print(sum1)
    #num = int((list(str(num))))
    #print(num)
fun(123456789)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 12:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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