Sen anavatanınla iletişim kurmaya çalışan gizli bir ajansın. Elbette bilgilerin gizlenmesi gerekiyor, böylece hiç kimse mesajınızı bırakmıyor. Bir kediden daha uygun ne olabilir ki? Herkes kedilerin komik resimlerini sever [alıntı gerekli] , bu yüzden orada saklanan gizli bilgilerden şüphelenmezler!
Monaco oyunu, paylaşılan seviyelerin seviye bilgilerini kaydetmek için kullandığı algoritmadan esinlenerek, bilgileri bir resmin renklerinin en az anlamlı bitine kodlanmış bir program yazmak sizin görevinizdir.
Kodlama formatı:
- İlk 24 bit, kalan kodlanmış bayt dizesinin bit cinsinden uzunluğunu belirler.
- Görüntü soldan sağa ve yukarıdan aşağıya okunur, açık bir şekilde sol üst pikselden başlayarak okunur
- Kanallar kırmızıdan yeşile maviye okunur
- Her kanaldan en az anlamlı bit okunur
- Bitler Big Endian sırasına göre kaydedilir
Kurallar:
- Programınız kodlanacak tek bir bayt dizisi ve temel görüntü için tek bir görüntü dosya adı alır.
- Ortaya çıkan görüntü, gerçek bir renkli PNG dosyası olarak ortaya çıkmalıdır
- Programınızı nasıl kullanacağınızı belirttiğiniz sürece, G / Ç'yi istediğiniz biçimde (ARGV, STDIN, STDOUT, bir dosyadan yazma / okuma) kullanabilirsiniz.
- Komik bir kedinin rastgele görüntüsünü seçmeli ve programınızın çalıştığını göstermek için programınıza kodlamalısınız.
- Yalnızca geçerli girdi sağladığınızı, bitlerin miktarı yeterli değilse, resmin gerçek renk biçiminde olmadığını, resmin mevcut olmadığını veya istediğiniz gibi yapabileceğiniz benzer sorunları olduğunu varsayabilirsiniz.
- Sağlanan görüntünün alfa kanalı içermediğini varsayabilirsiniz.
- Uzunluk BOM olmadan UTF-8 bayt olarak sayılır
Çözümünüzü test etmek için bu PHP betiğini kullanabilir, PNG dosyasının adını ilk komut satırı argümanı olarak kullanabilirsiniz:
<?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));
}