Kotak Steganografis
Tugas Anda adalah mengambil string, dan menghasilkan NxN
gambar yang mewakili string ini. Anda juga harus menulis algoritma yang mengambil gambar dan mengubahnya kembali menjadi string juga. Skor akan mencakup jumlah byte dari kedua algoritma:
Algoritma "Enkripsi" + Algoritma "Dekripsi" .
Anda harus memposting masing-masing secara terpisah, dengan byte-hitungan untuk kedua algoritma enkripsi dan dekripsi ditampilkan secara individual.
Contoh Algoritma
Misalnya, inilah "Programming Puzzles and Code Golf" menggunakan algoritme steganografi sederhana berbasis ASCII di saluran Biru:
#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
Anda dapat melihat saluran biru cukup memegang nilai ascii untuk gambar ini:
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( )
Sementara saluran lainnya menyimpan nilai yang dihasilkan secara acak untuk "meningkatkan" variasi warna dalam gambar. Saat menarik pesan keluar dari gambar, kita bisa mengabaikan nilai saluran lainnya, dan menarik bit heks di saluran biru, merekonstruksi string:
"Programming Puzzles and Code Golf"
Perhatikan bahwa spasi yang digunakan untuk menempelkan string dalam kuadrat tidak termasuk dalam output dekripsi akhir. Meskipun Anda harus membuat string pada gambar, Anda dapat mengasumsikan bahwa string input tidak akan berakhir dengan spasi.
Aturan
- Anda harus menyandikan 1 karakter per piksel, saluran yang dipilih untuk menyandikan char adalah sewenang-wenang.
- Saluran dari warna RGB lainnya harus diacak, selain dari yang Anda pilih untuk menyandikan string; ini berarti saluran akhir tanpa kode Anda harus antara
0x0000-0xFFFF
(dipilih secara acak). - Mengekspresikan hasil akhir sebagai array 2D nilai warna RGB baik-baik saja
0x000000-0xFFFFFF
, tidak perlu menggunakan pembuatan gambar kecuali jika Anda ingin bersenang-senang dengannya atau jika kurang byte. Jika Anda memilih untuk menampilkan sebagai string hex, awali string hex dengan#
EG#FFFFFF
atau#05AB1E
. Anda dapat memisahkan dengan tab, koma, atau apa pun yang akan masuk akal secara horizontal, tetapi harus mempertahankan pola kuadrat; dengan kata lain, Anda harus menggunakan pemisahan baris baru yang sesuai. - Outputnya harus dalam kotak, dan string harus diisi dengan spasi di ujungnya untuk mengakomodasi ini. Ini artinya
N≈SQRT(Input#Length())
. Jika panjang input bukan kotak yang sempurna, Anda harus membulatkanN
dan menempelkan spasi. - Seperti yang dinyatakan sebelumnya, jika Anda melapisi dengan spasi dalam gambar, Anda tidak harus memasukkan karakter empuk dalam output "dekripsi" akhir.
- Anda dapat mengasumsikan bahwa:
- String input tidak akan berakhir dengan spasi.
- String input hanya akan menggunakan karakter ASCII yang dapat dicetak.
- Ini adalah kode-golf , kemenangan jumlah byte terendah.
sumber
Jawaban:
05AB1E , 34 + 12 = 46 byte
Menggunakan saluran merah.
05AB1E menggunakan pengkodean CP-1252 .
Menyandi:
Cobalah online!
Membaca sandi:
Cobalah online!
Metode padding alternatif dengan jumlah byte yang sama
sumber
C, 201 (Encoding) + 175 (Decoding) = 376 byte
Untuk Menyandikan:
Mengkodekan setiap karakter string input dalam saluran hijau spektrum RGB sambil mengatur dua saluran lainnya sebagai nilai hex acak. Mengambil input melalui STDIN sebagai string dan output ke STDOUT string multiline kode warna hex dalam bentuk kotak. Dengan asumsi Anda telah menginstal Python 3 dan ImageMagick, dan file di atas dikompilasi ke dalam file yang bernama
a.out
dalam direktori kerja saat ini (CWD), Anda dapat langsung mendapatkan gambar yang dihasilkan, dinamaiOutput.png
, ke CWD dari output tekstual menggunakan perintah berikut:Berikut adalah contoh gambar output yang dibuat oleh commamd di atas menggunakan
Programming Puzzles and Code Golf
sebagai string input:Untuk Mendekodekan:
Membawa input melalui STDIN urutan string kode warna heksa yang dipisahkan ruang dengan masing-masing tertutup dalam tanda kutip ganda (
"
) (char** argv
dalammain
) dan juga, ketika dipanggilmain
,int argc
untuk input integer. Output ke STDOUT string tunggal / multi-line yang mewakili pesan yang diterjemahkan.Saya akan mencoba bermain golf ini dari waktu ke waktu kapan pun dan di mana pun saya bisa.
Juga, jika Anda menyamakan kedua metode ke dalam file yang sama, Anda dapat menggunakan
main
metode berikut untuk menyatukan semuanya dengan setiap fungsi mendapatkan input yang benar:dan menggunakan ini, untuk pengkodean Anda harus memberikan
E
sebagai argumen pertama untuk memanggil metode pengkodean diikuti oleh argumen string tunggal, sedangkan untuk decoding, semua yang perlu Anda berikan adalah urutan string kode warna hex yang dipisahkan ruang dengan masing-masing tertutup dalam tanda kutip ganda ("
).Akhirnya, jika Anda ingin, Anda bisa mendapatkan sepenuhnya siap, versi siap digunakan di sini , meskipun tidak golfed, tetapi juga tidak output setiap peringatan atau kesalahan pada kompilasi.
sumber
Python 2,
164160 +9493 = 253 byteDisimpan 1 + 1 byte berkat Wheat Wizard.
-5 byte berkat Kade
Encoder: string harus dilampirkan dalam tanda kutip, misalnya
"CodeGolf"
, keluaran adalah gambar ascii PPM.Decoder: Mengambil input nama file sebagai argumen baris perintah
Pemakaian:
Contoh:
Teka-teki Pemrograman dan Golf Kode
Anda juga dapat memilih dari semua yang Anda inginkan, dan kemudian memilih yang lain, sementara tidak tersedia untuk sementara waktu tersedia di sini dan kemudian dengan mudah, dengan mudah dan mudah. Pada hari-hari terakhir dan kemudian hanya bersama-sama dolores dan kembali. Tidak ada foto yang tersedia, tidak ada laut takimata sanctus est Lorem ipsum dolor sit amet. Anda juga dapat memilih dari semua yang Anda inginkan, dan kemudian memilih yang lain, sementara tidak tersedia untuk sementara waktu tersedia di sini dan kemudian dengan mudah, dengan mudah dan mudah. Pada hari-hari terakhir dan kemudian hanya bersama-sama dolores dan kembali. Tidak ada foto yang tersedia, tidak ada laut takimata sanctus est Lorem ipsum dolor sit amet.
sumber
for
int
dari ini adalah 4 yang kemudian+1
diedit, jadi 5-1
.print
dan'
di decoder. Saya juga cukup yakin Anda bisa melakukanint((len(s)+1)**.5)
untuk menghemat beberapa byte.' '.join("%d %d %d"
ke''.join(3*"%d "
karena saya cukup yakin ruang tambahan tidak masalah.Scala, 97 + 68 = 165 byte
Enkripsi (97 byte):
Mengambil String dan mengembalikan Iterator dari Sequences of Integers.
Dekripsi (68 byte):
Mengambil Iterator dari Sequences of Integers dan mengembalikan sebuah string.
Penjelasan:
.
sumber
Perl, (103 + 1) + (36 + 2) = 142 byte
Encoder teks ke gambar (dijalankan dengan
-p
penalti 1 byte;-p0
(untuk byte tambahan penalti) diperlukan jika Anda ingin menangani baris baru dalam string input):Decoder gambar ke teks (dijalankan dengan
-p0
penalti 2 byte):Ini menggunakan
#abcdef
format gambar berbasis teks, dan mengkodekan dalam saluran biru. Berikut adalah contoh dari kemungkinan output yang diberikanProgramming Puzzles and Code Golf
sebagai input:Penjelasan pembuat enkode:
Saya sangat senang penggunaan ini
\K
berhasil; itu menentukan di mana untuk mengganti, dan menempatkannya di dalam sebuah loop, tampaknya bahwa terjadinya pada iterasi loop terakhir adalah yang terpenting. Jadis/(.*?\K,){$a}/\n/g
akan cocok dengan string minimum panjang dari bentuk apa pun koma apa pun koma ... apa pun koma, yang memiliki$a
koma, tetapi bagian yang diganti sebenarnya dari pertandingan hanya akan menjadi koma terakhir. Ini memiliki efek mengganti setiap$a
koma dengan baris baru, memberi kita bentuk persegi untuk gambar.Keuntungan besar Perl untuk tantangan ini (selain konverter karakter string-ke-heksadesimal, yang sangat nyaman) adalah bahwa ia memiliki dekoder yang sangat pendek (begitu singkat, pada kenyataannya, bahwa meskipun Perl memiliki builtin untuk mengubah heksadesimal menjadi string, itu lebih pendek untuk tidak menggunakannya). Begini cara kerjanya:
Satu-satunya contoh dari dua karakter tepat sebelum karakter non-alfanumerik adalah saluran biru (yang ingin kami ekstrak), yang muncul tepat sebelum koma dan baris baru; dan dua karakter yang muncul sebelum satu sama
#
lain daripada yang pertama. Kami tidak ingin kategori pertandingan yang terakhir, tetapi mereka pasti akan tumpang tindih dengan kategori sebelumnya, dan dengan demikian akan dikeluarkan oleh cek pertandingan yang tumpang tindih.sumber
MySQL, 438 + 237 = 675 byte
Ada garis baru di akhir output, tetapi tidak muncul setelah didekripsi. Fungsi hex (integer overload) akan memangkas memimpin 0's, jadi saya harus memasangnya dengan string 0. Saya bisa menyimpan beberapa byte jika saya bisa mendeklarasikan kedua fungsi di antara pembatas.
Enkripsi
Dekripsi
Pemakaian:
sumber
C #, 312 + 142 = 454 byte
Pengkodean:
Decoding:
Program lengkap:
sumber
Mathematica, 111 + 65 = 176 byte
Encoder
Dekoder
sumber
Memproses,
220209194 +171167151 =391380376361345 byteMemperbarui:
Dihapus tidak berguna
noStroke()
dan membuat keduanya for-loop one-statementer.Dihapus tidak berguna
image(p,0,0);
, berikan nama file decryptor sebagai parameterAlgoritma Enkripsi
Memanggil fungsi:
g("Programming Puzzles and Code Golf");
Ini adalah fungsi yang mengambil String, dan menciptakan output, sebelum menyimpannya sebagai
t.png
. Ini menggunakanred
nilai untuk menyimpan teks tersembunyi.Algoritma Dekripsi
Fungsi panggilan dengan:
u(file_name);
Ini juga merupakan fungsi yang mencari gambar yang ditentukan oleh parameter, dan kemudian menampilkan string yang tersembunyi (karena lebih pendek daripada mengembalikan string).
Kode diperluas
(Algoritma Enkripsi)
String dilewatkan ketika fungsi dipanggil. Baris pertama dari fungsi menghitung panjang sisi persegi dengan mengambil
ceil
dari akar kuadratnya. Kemudian kita memasukkan for-loop, di mana kita mengaturstroke
(warna tepi) untuk memiliki nilai ASCII karakter sebagai merah, dan nilai acak untuk biru dan hijau. Setelah kita melakukan ini, kita membuatrect
(persegi panjang) dengan width =1
dan height =1
, yaitu pixel (untuk beberapa alasan aneh, saya tidak dapat menggunakanpoint
dengan benar). Di baris terakhir, gambar yang dihasilkan kemudian disimpan sebagait.png
.(Algoritma Dekripsi)
Fungsi ini memiliki nama file sebagai parameter (sebagai string). Kemudian gambar dalam file tersebut disimpan dalam variabel untuk digunakan nanti. Setelah kita selesai dengan itu, kita mengatur string
""
daripada membuat string baru hanya untuk menahan string yang tersembunyi. Kemudian kita beralih melalui gambar melalui dua bersarang untuk-loop, dan kami menambahkan ke string nilai karakter dari nilai merah piksel. Akhirnya, kami mencetak string yang dihasilkan setelah menghapus spasi di depan (menggunakan regex). Alasan kami mencetak teks tersembunyi daripada mengembalikannya adalah karena cara ini lebih pendek dan kami menghemat byte.Teks mentah tantangan terenkripsi:
sumber
Jelly, 40 + 20 = 60 byte dalam codepage Jelly
Encoder (teks → gambar):
Cobalah online!
Dekoder (gambar → teks):
Cobalah online!
Contoh keluaran yang bisa dihasilkan oleh program (ini menyimpan informasi dalam saluran merah):
Dalam tantangan yang lebih besar ini, keleness Jelly mulai berkurang sedikit, membutuhkan beberapa karakter "struktural" untuk menyelesaikan ambiguitas parsing, tapi tetap saja masih sangat singkat. Inilah cara kerja pembuat enkode:
Dan inilah cara dekoder bekerja:
sumber