注意到输出只有 6 中可能字符,考虑将每个字符映射为 0 到 5 的数,这样两个字符就可以合并为一个字符,长度减半,代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
freopen("1.txt","r",stdin);
freopen("2.txt","w",stdout);
char c=getchar(),c2=getchar();
while(c!=EOF&&c2!=EOF){
if(c==' ')c=0;
if(c=='*')c=1;
if(c=='.')c=2;
if(c=='#')c=3;
if(c=='-')c=4;
if(c=='\n')c=5;
if(c2==' ')c2=0;
if(c2=='*')c2=1;
if(c2=='.')c2=2;
if(c2=='#')c2=3;
if(c2=='-')c2=4;
if(c2=='\n')c2=5;
cout<<char(36+c*6+c2);//36换成其它6的倍数都行
c=getchar();
c2=getchar();
}
return 0;
}
输出时在解密即可。
#include<bits/stdc++.h>
char g(int x){if(x==0)return' ';if(x==1)return'*';if(x==2)return'.';if(x==3)return'#';if(x==4)return'-';if(x==5)return'\n';}std::string s="$$$$$$$$++++B$$$$$$$++++++B$$$$$$$99228B$$$$$$839223825$$$$$$'92223996$$$$$$'9$$$$$$9;$$$$$$$$222220$$$$$$$826$$$$'23B$$$$$$$9-999$$$$$$$$'33$$$$$88;$$$$$$99+++-996$$$$$$886$$$$'33B$$$$$23+,++19820$$$$'23$$$$$82;$$$$$&21++++-822$$$$$'9$$$$$$9;$$$$$&21+*$%++22B$$$$$$99$$$$99B$$$$$999$$$$999E999999999999999999999999999999;828223382822338282233:@@@@@@@@?E999999999999999999999@@@@@@@@@;8322823832282383228239999999999E999999999999999999996$'@@@@@;822822382282238228223$$:@@@@?E999999999999999999996$'@@@@@;883228388322838832283$$:@@@@?E999999999999999999996$'999996";main(){for(int c:s){std::cout<<g(c/6-6)<<g(c%6);}return 0;}
但这样还是比不过这个帖子里的 python 代码,我们也要用 python。
注意到 base85 可以处理不可见字符,而 63≤256,所以可以 3 个字符压成一个,再用 base85,代码不知道能变短多少,没写。
我能写题解吗