首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

隐写方
EN

Code Golf用户
提问于 2016-11-12 15:40:21
回答 6查看 914关注 0票数 14

隐写平方

您的工作是接收一个字符串,并生成一个表示该字符串的NxN映像。您还必须编写接收图像并将其转换回字符串的算法。评分将包括这两种算法的字节计数:

加密算法+解密算法。

您应该分别发布每一篇文章,分别显示加密和解密算法的字节计数。

示例算法

例如,在蓝色通道中使用一个简单的基于ASCII的隐写算法的“编程难题和代码高尔夫”:

代码语言:javascript
运行
复制
#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值:

代码语言:javascript
运行
复制
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( )

而其余的频道持有随机生成的值,以“调味”各种颜色在图像中。当将消息从图像中拉回来时,我们只需忽略其他通道值,然后在蓝色通道中提取十六进制位,重新构造字符串:

代码语言:javascript
运行
复制
"Programming Puzzles and Code Golf"

注意,用于填充方框中字符串的空格未包含在最终解密输出中。虽然必须在图像中填充字符串,但可以假设输入字符串不会以空格结尾。

规则

  • 您必须对每个像素编码一个字符,选择用于编码字符的通道是任意的。
  • 其他RGB颜色的通道必须是随机的,而不是要对字符串进行编码的通道;这意味着您的最终非编码通道需要在0x0000-0xFFFF (随机选择)之间。
  • 将最终结果表示为RGB颜色值的2D数组是很好的0x000000-0xFFFFFF,不需要使用图像创建,除非您想玩它或者它的字节更少。如果选择输出为十六进制字符串,请在十六进制字符串前面加上#、E.G. #FFFFFF#05AB1E。您可以使用制表符、逗号或其他水平感的东西分隔,但必须保持方格模式;换句话说,您必须使用适当的换行符分隔。
  • 输出必须在正方形中,字符串必须在末尾填充空格才能容纳这种情况。这意味着N≈SQRT(Input#Length())。如果输入长度不是一个完美的正方形,那么您应该在N和pad上加上空格。
  • 如前所述,如果在图像中填充空格,则不能在最终的“解密”输出中包含填充字符。
  • 您可以假设:
    • 输入字符串不会以空格结尾。
    • 输入字符串将只使用可打印的ASCII字符。

  • 这是密码-高尔夫,最低字节数获胜。
EN

回答 6

Code Golf用户

回答已采纳

发布于 2016-12-05 16:50:36

05AB1E,34 + 12 = 46字节

使用红色频道。

05AB1E使用CP-1252编码。

编码:

代码语言:javascript
运行
复制
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

在网上试试!

解码:

代码语言:javascript
运行
复制
˜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

在网上试试!

具有等字节计数的

替代填充方法

代码语言:javascript
运行
复制
Dgð×J¹gtî©n£
票数 2
EN

Code Golf用户

发布于 2016-11-13 23:27:20

C,201 (编码)+ 175 (解码)= 376字节

编码:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
./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作为输入字符串由上面的逗号创建的示例输出映像:

到解码:

代码语言:javascript
运行
复制
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方法将所有方法与每个函数放在一起,以获得正确的输入:

代码语言:javascript
运行
复制
int main(int argc,char**argv){if(strcmp(argv[1],"E")==0){Encode(argv[2]);}else{Decode(argc,argv);}}

使用这种编码,您必须提供E作为第一个参数来调用编码方法,然后调用单个字符串参数,而对于解码,您只需要提供空格分隔的十六进制颜色字符串序列,每个字符串都包含在双引号(")中。

最后,如果你想,你可以得到充分准备,准备使用的版本这里,虽然它不是高尔夫,但也不输出任何警告或错误的编译。

票数 4
EN

Code Golf用户

发布于 2016-11-13 00:51:35

MySQL,438 + 237 = 675字节

在输出的末尾有一个尾随的新行,但是它在解密后不会显示出来。十六进制函数(整数过载)会砍掉前面的0's,所以我不得不用字符串0来填充它。如果可以在分隔符之间声明这两个函数,我可以保存一些字节。

加密

代码语言:javascript
运行
复制
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 ;

解密

代码语言:javascript
运行
复制
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 ;

用法:

代码语言:javascript
运行
复制
select a('test')
select b('#7D1874,#FFB465')
select b(a('test'))
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/99563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档