您的工作是接收一个字符串,并生成一个表示该字符串的NxN映像。您还必须编写接收图像并将其转换回字符串的算法。评分将包括这两种算法的字节计数:
加密算法+解密算法。
您应该分别发布每一篇文章,分别显示加密和解密算法的字节计数。
例如,在蓝色通道中使用一个简单的基于ASCII的隐写算法的“编程难题和代码高尔夫”:
#2e7250,#6ea972,#04eb6f,#0fc767,#74ab72,#ee6161
#b73b6d,#1aae6d,#f37169,#bda56e,#1fe367,#e99620
#706450,#0d3575,#146b7a,#4ea47a,#2a856c,#95d065
#3f2d73,#cef720,#bab661,#d1b86e,#f22564,#12b820
#0f3d43,#c86e6f,#1ee864,#a66565,#247c20,#c3bb47
#0e296f,#89d46c,#585b66,#c08f20,#455c20,#136f20实际图像(

)

您可以看到,蓝色通道只保存此图像的ascii值:
50 = 80(P) 72 = 114(r) 6f = 111(o) 67 = 103(g) 72 = 114(r) 61 = 97(a)
6d = 109(m) 6d = 109(m) 69 = 105(i) 6e = 110(n) 67 = 103(g) 20 = 32( )
50 = 80(P) 75 = 117(u) 7a = 122(z) 7a = 122(z) 6c = 108(l) 65 = 101(e)
73 = 115(s) 20 = 32( ) 61 = 97(a) 6e = 110(n) 64 = 100(d) 20 = 32( )
43 = 67(C) 6f = 111(o) 64 = 100(d) 65 = 101(e) 20 = 32( ) 47 = 71(G)
6f = 111(o) 6c = 108(l) 66 = 102(f) 20 = 32( ) 20 = 32( ) 20 = 32( )而其余的频道持有随机生成的值,以“调味”各种颜色在图像中。当将消息从图像中拉回来时,我们只需忽略其他通道值,然后在蓝色通道中提取十六进制位,重新构造字符串:
"Programming Puzzles and Code Golf"注意,用于填充方框中字符串的空格未包含在最终解密输出中。虽然必须在图像中填充字符串,但可以假设输入字符串不会以空格结尾。
0x0000-0xFFFF (随机选择)之间。0x000000-0xFFFFFF,不需要使用图像创建,除非您想玩它或者它的字节更少。如果选择输出为十六进制字符串,请在十六进制字符串前面加上#、E.G. #FFFFFF或#05AB1E。您可以使用制表符、逗号或其他水平感的东西分隔,但必须保持方格模式;换句话说,您必须使用适当的换行符分隔。N≈SQRT(Input#Length())。如果输入长度不是一个完美的正方形,那么您应该在N和pad上加上空格。发布于 2016-12-05 16:50:36
使用红色频道。
05AB1E使用CP-1252编码。
DgDtî©n-Äð×JvyÇh`4F15Ý.Rh«}})'#ì®ä
D # duplicate input
gDtî©n-Ä # abs(len(input)-round_up(sqrt(len(input)))^2)
ð×J # join that many spaces to end of input
v # for each char in string
yÇ # get ascii value
h` # convert to base-16 number
4F # 4 times do:
15Ý.Rh # push random base-16 number
« # concatenate
}} # end inner and outer loop
) # wrap in list
'#ì # prepend a "#" to each element in list
®ä # split in pieces round_up(sqrt(len(input))) long在网上试试!
˜vy3£¦HçJ}ðÜ
˜ # deep flatten input to a list
v # for each color in the list
y3£ # take the first 3 chars
¦ # remove the hash sign
H # convert from base-16 to base-10
ç # get the ascii char with that value
J # join to string
} # end loop
ðÜ # remove trailing spaces在网上试试!
具有等字节计数的
Dgð×J¹gtî©n£发布于 2016-11-13 23:27:20
E(char*J){size_t L=ceil(sqrt(strlen(J)));int U;srand(time(NULL));for(int i=0;i<L;i++){for(int f=0;f<L;f++){printf("#%02X%02X%02X ",rand()%256,(U<strlen(J))?(int)J[U]:32,rand()%256);U+=1;}printf("\n");}}在RGB频谱的绿色通道中编码输入字符串的每个字符,同时将另外两个通道设置为随机十六进制值。将通过STDIN的输入作为字符串并输出到STDOUT --以正方形形状表示的六角色代码的多行字符串。假设安装了Python3和ImageMagick,并且将上面的文件编译成当前工作目录( CWD )中的一个名为a.out的文件,则可以使用以下命令从文本输出直接将结果映像(名为Output.png )发送到CWD:
./a.out "<Multiline Input>"|python3 -c "import sys,subprocess;Input=sys.stdin.read();print('# ImageMagick pixel enumeration: {0},{0},255,rgb\n'.format(len(Input.split('\n')[1].split()))+'\n'.join(['%d,%d:(%d,%d,%d)'%(g,i,int(j[1:][:2],16),int(j[1:][2:4],16),int(j[1:][4:6],16))for g,h in enumerate(Input.split('\n'))for i,j in enumerate(h.split())]))"|convert - -scale 1000% Output.png下面是使用Programming Puzzles and Code Golf作为输入字符串由上面的逗号创建的示例输出映像:

D(int c,char**U){char T[c];for(int Y=1;Y<c;Y++){char G[2]={U[Y][3],U[Y][4]};T[Y-1]=(char)strtol(G,NULL,16);}int C=c-1;T[C]='\0';while(T[C]==' '){T[C]='\0';C-=1;}printf("%s\n",T);}通过STDIN获取输入--一个以空格分隔的十六进制颜色字符串序列,每个字符串都以双引号(")括起来(char** argv in main),并且在main中调用时,int argc作为整数输入。输出给STDOUT一个表示解码消息的单行/多行字符串。
随着时间的推移,我会尽可能多地打这些球。
此外,如果将这两个方法都放入同一个文件中,则可以使用以下main方法将所有方法与每个函数放在一起,以获得正确的输入:
int main(int argc,char**argv){if(strcmp(argv[1],"E")==0){Encode(argv[2]);}else{Decode(argc,argv);}}使用这种编码,您必须提供E作为第一个参数来调用编码方法,然后调用单个字符串参数,而对于解码,您只需要提供空格分隔的十六进制颜色字符串序列,每个字符串都包含在双引号(")中。
最后,如果你想,你可以得到充分准备,准备使用的版本这里,虽然它不是高尔夫,但也不输出任何警告或错误的编译。
发布于 2016-11-13 00:51:35
在输出的末尾有一个尾随的新行,但是它在解密后不会显示出来。十六进制函数(整数过载)会砍掉前面的0's,所以我不得不用字符串0来填充它。如果可以在分隔符之间声明这两个函数,我可以保存一些字节。
delimiter //create function a(i text)returns text begin declare r int;declare q,p text;while mod(length(i),sqrt(length(i)))<>0 do set i:=concat(i,' ');end while;set r:=1;set q:="";while r<=length(i) do set p:=",";if mod(r,sqrt(length(i)))=0 then set p:="\r\n";end if;set q:=concat(q,'#',right(concat(0,hex(floor(rand()*256))),2),right(concat(0,hex(floor(rand()*256))),2),hex(mid(i,r,1)),p);set r:=r+1;end while;return q;end//
delimiter ;delimiter //create function b(i text)returns text begin declare x int;declare y text;set x:=0;set y:="";while instr(i,'#')>0 do set i:=substr(i,instr(i,'#')+5);set y:=concat(y,unhex(left(i,2)));end while;return trim(y);end//
delimiter ;用法:
select a('test')
select b('#7D1874,#FFB465')
select b(a('test'))https://codegolf.stackexchange.com/questions/99563
复制相似问题