【Educoder作业】问题求解——字符信息

【Educoder作业】问题求解——字符信息

这次作业就是处理字符,关键在于字符串的一些函数要掌握熟练。

T1 解析二维码

这个题是容易的,只需要做到 8 8 8位取出来就行,具体处理题目描述里已经给出了。

########## Begin ##########
def parseQR(x) :
    l = len(x)
    ret = ''
    for i in range(l // 8) :
        # i * 8, (i + 1) * 8 - 7
        mdl = x[i * 8 : (i + 1) * 8]
        val = int(mdl, 2)
        ret = ret + chr(val)
    return ret
########## End ##########
code = input()       #01串
info = parseQR(code) #转换成原始信息
print('%s\n-> %s' % (code, info))

T2 自定义加密

这个题也一样,题目让干啥就干啥,函数运用灵活一点即可。
异或操作可以转换成整数后直接用^即可。

########## Begin ##########
def enChar(x) :
    val = ord(x)
    mdl = bin(val)
    mdl = mdl.replace('0b', '')
    mdl = '0' * (8 - len(mdl)) + mdl
    mdl = mdl[7] + mdl[: 7]
    key, ret = '10100101', ''
    for i in range(8) :
        # mdl[i], key[i]
        ret = ret + str(eval(mdl[i]) ^ eval(key[i]))
    return ret


########## End ##########

def deChar(y):      #解密一个字符,密文为y,以'00000101'为例
    x,key = '','10100101'     #key为密钥,x存放解密结果
    for i in range(len(y)):   #1)密文与密钥进行异或运算,得'10100000'
        if y[i]==key[i]:          #相同为0
            x=x+'0'
        else:                     #相异为1
            x=x+'1'
    x = x[1:len(x)]+x[0]      #2)循环左移1位,得'01000001',要进一步转换成十进制
    x = int(x,2)                  #将二进制转换为十进制,得65
    x = chr(x)                #3)求ASCII码对应的字符,得'A'
    return x                  #4)得解密结果x

def enText(txt):      #加密一段明文
    enTxt = ''
    for x in txt:     #逐一加密每个字符
        enTxt = enTxt+enChar(x)+' ' #之间加上空格,方便阅读
    return enTxt

def deText(txt):      #解密一段密文
    txt=txt.replace(' ','')      #删去空格
    deTxt = ''
    for i in range(len(txt)//8): #逐一解密每个字节
        y = txt[8*i:8*(i+1)]
        deTxt = deTxt+deChar(y)
    return deTxt

txt = input()         #明文
enTxt = enText(txt)   #加密
deTxt = deText(enTxt) #解密
print('明文:', txt)
print('加密:', enTxt)
print('解密:', deTxt)

T3 身份证校验码

本题的话,把权重和答案放进一个列表和字符串里是很明智的,写起来会很好看而且短。

########## Begin ##########
ans = '10X98765432'
v = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
def checksum(x) :
    l, Sum = len(x), 0
    for i in range(l) :
        # x[i]
        Sum += int(x[i]) * v[i]
    return ans[Sum % 11]
########## End ##########

ID = input()      #身份证前17位
cs = checksum(ID) #求校验码
print('%s -> %s' % (ID, cs))

T4 行程编码

或许需要一些小技巧,我们用一个 t m p tmp tmp记录一下字符出现了多少次,然后如果当前字符和上一个不一样,我们就把次数和上一个字符加进答案,次数重置为 1 1 1;如果一样就次数 + 1 +1 +1
注意要单独输出最后一个。

########## Begin ##########
def RLE(x) :
    ret = ''
    l, tmp = len(x), 1
    for i in range(1, l) :
        if x[i] == x[i - 1] :
            tmp += 1
        else :
            ret = ret + str(tmp) + x[i - 1]
            tmp = 1
    ret = ret + str(tmp) + x[l - 1]
    return ret
########## End ##########

x = input()  #原始数据
y = RLE(x)   #行程编码
print('原始数据:', x)
print('行程编码:', y)

T5 氨基酸分子量

本题和 T 3 T3 T3类似,把质量和代表元素的字符塞进字符串和列表是明智的,我们用 i n d e x index index函数完成对字符串的索引就可以减少大量特判。

########## Begin ##########
Idx = 'OCNSH'
v = [16, 12, 14, 32, 1]
def molecularWeight(x) :
    t, l, Sum = 0, len(x), 0
    while t < l :
        w = v[Idx.index(x[t])]
        t += 1
        mdl = 0
        while t < l and x[t].isdigit() :
            mdl = mdl * 10 + int(x[t])
            t = t + 1
        if not mdl :
            mdl = 1
        Sum += mdl * w
    return Sum
########## End ##########

formula = input()  #分子式
weight  = molecularWeight(formula)   #分子量
print('%s的分子量是:%d'%(formula, weight))

T6 分数加法

处理这种问题一定要秉承这统一的原则,就是如果给的分数是个整数,那我们就要把它变成 / 1 /1 /1的形式,这样的话后续就不会有特殊的地方。否则需要特判,非常难受。

########## Begin ##########
def Gcd(x, y) :
    if x % y == 0 :
        return y
    return Gcd(y, x % y)

def add(x, y) :
    mx, my = x.split('/'), y.split('/')
    # mx[0] / mx[1], my[0] / my[1]
    if len(mx) < 2 :
        mx.append('1')
    if len(my) < 2 :
        my.append('1')
    vx, vy = [], []
    vx.append(int(mx[0])); vx.append(int(mx[1]))
    vy.append(int(my[0])); vy.append(int(my[1]))
    # vx[0] / vx[1], vy[0] / vy[1]
    Up, Down = vx[0] * vy[1] + vy[0] * vx[1], vx[1] * vy[1]
    d = Gcd(Up, Down)
    Up = Up // d; Down = Down // d
    if Down == 1 :
        return str(Up)
    else :
        return str(Up) + '/' + str(Down)
########## End ##########

x = input()
y = input()
z = add(x, y) #分数相加
print('%s + %s = %s' % (x, y, z))

  • 17
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值