Hình vuông Steganographic
Công việc của bạn là lấy một chuỗi và tạo một NxN
hình ảnh đại diện cho chuỗi này. Bạn cũng phải viết thuật toán lấy trong ảnh và biến nó trở lại thành một chuỗi. Việc tính điểm sẽ bao gồm số byte của cả hai thuật toán:
Thuật toán "Mã hóa" + Thuật toán "Giải mã" .
Bạn nên đăng riêng từng bài, với số byte cho cả thuật toán mã hóa và giải mã được hiển thị riêng lẻ.
Thuật toán ví dụ
Ví dụ: đây là "Câu đố lập trình và Golf Code" bằng thuật toán lập thể dựa trên ASCII đơn giản trong kênh Blue:
#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
Bạn có thể thấy kênh màu xanh chỉ đơn giản giữ các giá trị ascii cho hình ảnh này:
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( )
Trong khi các kênh còn lại giữ các giá trị được tạo ngẫu nhiên để "tăng thêm" sự đa dạng của màu sắc trong hình ảnh. Khi kéo thông điệp ra khỏi hình ảnh, chúng ta chỉ cần bỏ qua các giá trị kênh khác và kéo bit hex trong kênh màu xanh, xây dựng lại chuỗi:
"Programming Puzzles and Code Golf"
Lưu ý các khoảng trắng được sử dụng để đệm chuỗi trong ô vuông không được bao gồm trong đầu ra được giải mã cuối cùng. Mặc dù bạn phải đệm chuỗi trong ảnh, bạn có thể cho rằng chuỗi đầu vào sẽ không kết thúc bằng dấu cách.
Quy tắc
- Bạn phải mã hóa 1 ký tự cho mỗi pixel, kênh được chọn để mã hóa char là tùy ý.
- Các kênh của các màu RGB khác phải được chọn ngẫu nhiên, khác với kênh bạn chọn để mã hóa chuỗi thành; điều này có nghĩa là các kênh không được mã hóa cuối cùng của bạn sẽ cần phải nằm giữa
0x0000-0xFFFF
(được chọn ngẫu nhiên). - Biểu thị kết quả cuối cùng dưới dạng mảng 2D của các giá trị màu RGB là ổn
0x000000-0xFFFFFF
, không cần sử dụng tạo hình ảnh trừ khi bạn muốn vui vẻ với nó hoặc nếu nó ít byte hơn. Nếu bạn chọn xuất ra dưới dạng chuỗi hex, hãy đặt tiền tố cho chuỗi hex bằng#
EG#FFFFFF
hoặc#05AB1E
. Bạn có thể phân tách bằng các tab, dấu phẩy hoặc bất kỳ thứ gì khác có thể cảm nhận được theo chiều ngang, nhưng nó phải duy trì mẫu hình vuông; nói cách khác, bạn phải sử dụng phân tách dòng mới phù hợp. - Đầu ra phải ở trong một hình vuông và chuỗi phải được đệm bằng khoảng trắng ở cuối để chứa điều này. Điều này có nghĩa là
N≈SQRT(Input#Length())
. Nếu chiều dài đầu vào không phải là một hình vuông hoàn hảo, bạn nên làm trònN
và đệm với khoảng trắng. - Như đã nêu trước đây, nếu bạn đang đệm với khoảng trắng trong hình ảnh, bạn không được bao gồm các ký tự được đệm trong đầu ra "giải mã" cuối cùng.
- Bạn có thể cho rằng:
- Chuỗi đầu vào sẽ không kết thúc bằng dấu cách.
- Chuỗi đầu vào sẽ chỉ sử dụng các ký tự ASCII có thể in được.
- Đây là mã golf , số byte thấp nhất sẽ thắng.