有一种加密方法为:其使用一个字母串(可以含重复字母,字母个数不超过50)作为密钥。假定密钥单词串为feather,则先去掉密钥单词中的重复字母得到单词串feathr,然后再将字母表中的其它字母以反序追加到feathr的后面:
加密字母的对应关系如下:
其中第一行为原始英文字母,第二行为对应加密字母。其它字符不进行加密。编写一个程序,用这种密码加密文件。假定要加密的文件名为encrypt.txt及加密后的文件名为output.txt,并假定输入文件中字母全为小写字母,并且输入密钥也全为小写字母。
输入形式
从标准输入中输入密钥串,并从文件encrypt.txt中读入要加密的内容。
输出形式
加密后结果输出到文件output.txt中。
样例
【样例输入】
feather
和文件encrypt.txt中内容,例如被加密的文件encrypt.txt中内容为:
c language is wonderful.
【样例输出】加密后output.txt文件中内容为:
a ufqzjfzh xl gpqthmrju.
题解:首先是去重操作,本题由于对时间复杂都要求不高,所以可以采用朴素的时间复杂度为O(N2)的查找去重,先选一个字母,然后把该字母后面的相同的元素全部变为0,之后在遍历一遍,输出非零字母。然后是反序追加,同样也是采用朴素的算法,在去重数组里出现过的字母就不追加,否则就追加,追加完成后变成加密数组。最后是加密,通过加密数组实现就行了。
s=input()
zimu="abcdefghijklmnopqrstuvwxyz"
zimu=zimu[::-1]#逆序
t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]
with open('encrypt.txt','r')as f:
data = f.read()
s1=""
res=""
l= len(s)
for i in range(l):#去重
if(s[i]>='a' and s[i]<='z'):
if t[ord(s[i])-ord('a')]==0:
s1=s1+s[i]
t[ord(s[i])-ord('a')]=1
else:
continue
#print(data[ord(data[0])-ord('a')])
for i in range(26):
if t[ord(zimu[i])-ord('a')]==0:
s1=s1+zimu[i]
t[ord(zimu[i]) - ord('a')] =1
l= len(data)
for i in range(l):#加密
if(data[i]>='a' and data[i]<='z'):
res=res+s1[ord(data[i])-ord('a')]
else:
res = res + data[i]
with open('output.txt','w')as f:
f.write(res)