【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))
更多推荐
所有评论(0)