आप अपने पिता के साथ संवाद करने की कोशिश कर रहे एक गुप्त एजेंट हैं। बेशक जानकारी को छिपाने की जरूरत है ताकि कोई भी ईव्स आपके संदेश को न छोड़े। एक बिल्ली की तुलना में बेहतर क्या होगा? सभी को बिल्लियों की अजीब तस्वीरें पसंद हैं [उद्धरण वांछित] , इसलिए उन्हें वहां छिपी गुप्त जानकारी पर संदेह नहीं होगा!
एल्गोरिथ्म से प्रेरित गेम मोनाको साझा स्तरों की स्तर की जानकारी को बचाने के लिए उपयोग करता है यह एक प्रोग्राम लिखने के लिए आपके कार्य है जो किसी छवि के रंगों के कम से कम महत्वपूर्ण बिट में जानकारी को एन्कोडेड करता है।
एन्कोडिंग प्रारूप:
- पहले 24 बिट में शेष इनकोडिंग बाइट-स्ट्रिंग की लंबाई निर्धारित बिट्स
- छवि को बाएं से दाएं और ऊपर से नीचे तक पढ़ा जाता है, जाहिर है ऊपरी बाएँ पिक्सेल में शुरू होता है
- चैनल लाल से हरे से नीले तक पढ़े जाते हैं
- प्रत्येक चैनल से कम से कम महत्वपूर्ण बिट पढ़ा जाता है
- बिग एंडियन क्रम में बिट्स सहेजे गए हैं
नियम:
- आपका प्रोग्राम एन्कोडेड होने के लिए एक सिंगल बाइट-स्ट्रिंग लेता है और बेस इमेज के लिए सिंगल इमेज फाइलनेम
- परिणामी छवि को एक सच्चे रंग PNG फ़ाइल के रूप में सामने आना चाहिए
- जब तक आप अपने प्रोग्राम का उपयोग करना चाहते हैं, तब तक आप (ARGV, STDIN, STDOUT, किसी फ़ाइल से लिखना / पढ़ना) में I / O का उपयोग कर सकते हैं।
- आपको एक अजीब बिल्ली की एक यादृच्छिक छवि चुननी होगी और अपने कार्यक्रम को उसमें यह दिखाना होगा कि आपका कार्यक्रम काम करता है
- आप यह मान सकते हैं कि आपको केवल वैध इनपुट प्रदान किया जाता है, यदि बिट्स की मात्रा पर्याप्त नहीं है, तो छवि वास्तविक रंग प्रारूप में नहीं है, छवि मौजूद नहीं है या इसी तरह की समस्याएं जो आप चाहते हैं वह कर सकती हैं।
- आप मान सकते हैं कि प्रदान की गई छवि में कोई अल्फा चैनल नहीं है
- लंबाई को बिना बॉम के UTF-8 बाइट्स में गिना जाता है
आप अपने समाधान का परीक्षण करने के लिए इस PHP स्क्रिप्ट का उपयोग कर सकते हैं, पहले कमांड लाइन तर्क के रूप में PNG फ़ाइल का नाम प्रदान करें:
<?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));
}