পার্ল, 181
/ /;use String::CRC32;use Compress::Zlib;sub k{$_=pop;pack'Na*N',y///c-4,$_,crc32$_}$_="\x89PNG\r\n\cZ\n".k(IHDR.pack NNCV,$',$',8,6).k(IDAT.compress pack('CH*',0,$`x$')x$').k IEND
আকার 180 বাইট এবং বিকল্পের -p
প্রয়োজন (+1)। স্কোরটি তখন 181।
যুক্তিগুলি একটি লাইনে STDIN এর মাধ্যমে দেওয়া হয়, একটি স্পেস দ্বারা পৃথক করে, হেক্স মান (16 অক্ষর) হিসাবে রঙ এবং প্রস্থ / উচ্চতার জন্য পিক্সেলের সংখ্যা, যেমন:
echo "FFFF00FF 200" | perl -p solidpng.pl >yellow200.png
ফাইলের আকার 832 বাইট। একই রঙের সর্বাধিক আকারের চিত্র (n = 999) এর 6834 বাইট রয়েছে (10 এমবি নীচে)।
সমাধান দুটি গ্রন্থাগার ব্যবহার করে:
use Digest::CRC crc32;
সিআরসি 32 মানগুলির শেষ অংশে।
use IO::Compress::Deflate deflate;
ইমেজ ডেটা সংকুচিত করতে।
দুটি গ্রন্থাগার চিত্রের সাথে সম্পর্কিত নয়।
Ungolfed:
# Perl option "-p" adds the following around the program:
# LINE:
# while (<>) {
# ... # the program goes here
# } continue {
# print or die "-p destination: $!\n";
/ /; # match the separator of the arguments in the input line
# first argument, color in hex: $`
# second argument, width/height: $' #'
# load the libraries for the CRC32 fields and the data compression
use String::CRC32;
use Compress::Zlib;
# function that generates a PNG chunk:
# N (4 bytes, big-endian: data length
# N: chunk type
# a* (binary data): data
# N: CRC32 of chunk type and data
sub k {
$_ = pop; # chunk data including chunk type and
# excluding length and CRC32 fields
pack 'Na*N',
y///c - 4, # chunk length #/
# netto length without length, type, and CRC32 fields
$_, # chunk type and data
crc32($_) # checksum field
}
$_ = # $_ is printed by option "-p".
"\x89PNG\r\n\cZ\n" # PNG header
# IHDR chunk: image header with
# width, height,
# bit depth (8), color type (6),
# compresson method (0), filter method (0), interlace method (0)
. k('IHDR' . pack NNCV, $', $', 8, 6)
# IDAT chunk: image data
. k('IDAT' .
compress # compress/deflate data
pack('CH*', # scan line with filter byte
0, # filter byte: None
($` x $') # pixel data for one scan line #'`
) x $' # n lines #'
)
# IHDR chunk: image end
. k('IEND');
সম্পাদনাগুলি
use IO::Compress::Deflate':all';
দ্বারা প্রতিস্থাপিত হয় use Compress::Zlib;
। পরেরটি compress
ডিফল্ট দ্বারা ডিফল্ট ফাংশনটি রফতানি করে । ফাংশনটির জন্য আর্গুমেন্ট হিসাবে রেফারেন্সের প্রয়োজন হয় না এবং ফলাফলটি সরাসরি দেয় returns এটি পরিবর্তনশীল থেকে মুক্তি পেতে দেয় $o
।
মাইকেল এর উত্তরের জন্য ধন্যবাদ :
প্রচুর টিপস সহ ভাদিমর মন্তব্যের জন্য ধন্যবাদ :
use String::CRC32;
তুলনায় খাটো use Digest::CRC crc32;
।
y///c-4
তুলনায় খাটো -4+y///c
।
- স্ক্যান লাইনটি এখন টেমপ্লেটটি
CH*
দিয়ে মানটির পুনরাবৃত্তি সহ নির্মিত হয়।
$i
একটি মান উল্লেখ ব্যবহার করে অপসারণ ।
- খণ্ড প্রকারের জন্য স্ট্রিংয়ের পরিবর্তে বেয়ার শব্দ।
- বিকল্পগুলি এখন
-p
স্পেস বিভাজকের সাথে মিলে একটি STDIN ইনপুট লাইন (বিকল্প ) মিলিয়ে পঠিত হয় / /
। তারপরে প্রথম বিকল্পটি রয়েছে $`
এবং দ্বিতীয় যুক্তিটি প্রবেশ করবে $'
।
- অপশনটি
-p
স্বয়ংক্রিয়ভাবেও প্রিন্ট করে $_
।
"\cZ"
তুলনায় খাটো "\x1a"
।
আরও ভাল সংকোচনের
কোড আকারে ইমেজ ডেটা আরও সংকুচিত করা যেতে পারে, যদি ফিল্টারিং প্রয়োগ করা হয়।
আনফিল্টারযুক্ত ফাইলের আকার FFFF0FF
200
: 832 বাইট
ফিল্টার Sub
(অনুভূমিক পিক্সেল পার্থক্য): 560 বাইট
$i = ( # scan line:
"\1" # filter "Sub"
. pack('H*',$c) # first pixel in scan line
. ("\0" x (4 * $n - 4)) # fill rest of line with zeros
) x $n; # $n scan lines
Sub
প্রথম লাইনের Up
জন্য এবং অবশিষ্ট লাইনের জন্য ফিল্টার করুন : 590 বাইট
$i = # first scan line
"\1" # filter "Sub"
. pack('H*',$c) # first pixel in scan line
. ("\0" x (4 * $n - 4)) # fill rest of line with zeros
# remaining scan lines
. (
"\2" # filter "Up"
. "\0" x (4 * $n) # fill rest of line with zeros
) x ($n - 1);
প্রথমে আনফিল্টার করা লাইন, তার পরে ফিল্টার করুন Up
: 586 বাইট
$i = # first scan line
pack('H*', ("00" . ($c x $n))) # scan line with filter byte: none
# remaining scan lines
. (
"\2" # filter "Up"
. "\0" x (4 * $n) # fill rest of line with zeros
) x ($n - 1);
এছাড়াও Compress::Zlib
সুর করা যেতে পারে; সর্বোচ্চ সংকোচনের স্তরটি compress
দুটি বাইটের ব্যয়ে কার্যকারণে সংক্ষেপণের স্তরের জন্য অতিরিক্ত বিকল্প দ্বারা সেট করা যেতে পারে :
compress ..., 9;
yellow200.png
ফিল্টারিং ছাড়াই উদাহরণস্বরূপ ফাইলের আকার 832 বাইট থেকে 472 বাইটে হ্রাস পায়। Sub
ফিল্টার সহ উদাহরণটিতে প্রয়োগ করা হয়েছে , ফাইলের আকার 560 বাইট থেকে 445 বাইটে সঙ্কুচিত হয়ে যায় ( pngcrush -brute
আরও কমপ্রেস করতে পারে না)।
999x999
ফাইলের 30720 পিক্সেলের বেশি রয়েছে তাই এটি স্ব-বিরোধী বলে মনে হচ্ছে।