Anda adalah agen rahasia yang mencoba berkomunikasi dengan tanah air Anda. Tentu saja informasi itu perlu disembunyikan sehingga tidak ada orang yang mencuri pesan Anda. Apa yang lebih cocok daripada kucing? Semua orang suka gambar lucu kucing [rujukan?] , Jadi mereka tidak akan curiga ada informasi rahasia yang bersembunyi di sana!
Terinspirasi oleh algoritme permainan yang digunakan Monako untuk menyimpan informasi level dari level bersama , tugas Anda adalah menulis program yang menyandikan informasi ke dalam warna warna yang paling tidak signifikan.
Format pengodean:
- 24 bit pertama menentukan panjang byte-string yang tersisa dalam bit
- Gambar dibaca dari kiri ke kanan dan dari atas ke bawah, jelas dimulai dari piksel kiri atas
- Saluran dibaca dari merah ke hijau ke biru
- Bit paling signifikan dari setiap saluran dibaca
- Bit disimpan dalam urutan Big Endian
Aturan:
- Program Anda membutuhkan byte-string tunggal untuk dikodekan dan nama file gambar tunggal untuk gambar dasar
- Gambar yang dihasilkan harus keluar sebagai file PNG warna asli
- Anda dapat menggunakan I / O dalam bentuk apa pun yang Anda suka (ARGV, STDIN, STDOUT, menulis / membaca dari file), selama Anda menyatakan bagaimana menggunakan program Anda
- Anda harus memilih gambar acak kucing lucu dan menyandikan program Anda ke dalamnya untuk menunjukkan bahwa program Anda berfungsi
- Anda dapat mengasumsikan bahwa Anda hanya memberikan input yang valid, jika jumlah bit tidak mencukupi, gambar tidak dalam format warna yang sebenarnya, gambar tidak ada atau masalah serupa Anda dapat melakukan apa yang Anda inginkan
- Anda dapat mengasumsikan bahwa gambar yang disediakan tidak mengandung saluran alfa
- Panjangnya dihitung dalam UTF-8 byte tanpa BOM
Anda dapat menggunakan skrip PHP ini untuk menguji solusi Anda, berikan nama file PNG sebagai argumen baris perintah pertama:
<?php
if ($argc === 1) die('Provide the filename of the PNG to read from');
$imageSize = @getimagesize($argv[1]);
if ($imageSize === false) die('Not a PNG file');
list($width, $height) = $imageSize;
$image = imagecreatefrompng($argv[1]);
$read = 0;
$bits = '';
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$colorAt = imagecolorat($image, $x, $y);
$red = ($colorAt >> 16) & 0xFF;
$green = ($colorAt >> 8) & 0xFF;
$blue = ($colorAt >> 0) & 0xFF;
$bits .= ($red & 1).($green & 1).($blue & 1);
$read += 3;
if ($read == 24) {
$length = (int) bindec($bits);
$bits = '';
}
else if ($read > 24 && ($read - 24) > $length) {
$bits = substr($bits, 0, $length);
break 2;
}
}
}
if (strlen($bits) !== $length) die('Not enough bits read to fulfill the length');
$parts = str_split($bits, 8);
foreach ($parts as $part) {
echo chr(bindec($part));
}