隐秘方块
您的工作是接受一个字符串,并生成一个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"
请注意,用于在正方形中填充字符串的空格未包含在最终的解密输出中。虽然您必须在图像中填充字符串,但是可以假设输入字符串不会以空格结尾。
规则
- 您必须为每个像素编码1个字符,选择用于编码char的通道是任意的。
- 其他RGB颜色的通道必须是随机的,而不是您选择将字符串编码到的通道。这意味着您最终的非编码频道必须介于
0x0000-0xFFFF
(随机选择)之间。 - 将最终结果表示为RGB颜色值的2D数组很好
0x000000-0xFFFFFF
,无需使用图像创建,除非您想玩它或它的字节数更少。如果选择输出为十六进制字符串,请在十六进制字符串前面加上#
EG#FFFFFF
或#05AB1E
。您可以使用制表符,逗号或其他任何在水平方向上有意义的分隔符,但必须保持正方形图案。换句话说,您必须使用适当的换行符分隔。 - 输出必须为正方形,并且字符串末尾必须用空格填充以适应此情况。这意味着
N≈SQRT(Input#Length())
。如果输入长度不是理想的平方,则应四舍五入N
并用空格填充。 - 如前所述,如果在图像中填充空格,则不得在最终的“解密”输出中包括填充字符。
- 您可以假设:
- 输入字符串不会以空格结尾。
- 输入字符串将仅使用可打印的ASCII字符。
- 这是代码高尔夫球,最低字节数获胜。