পার্ল, 438 291 অক্ষর
দ্বারা অনুপ্রাণিত চুপসে কম্প্রেশন জেফ Burdges ব্যবহার , Ventero এর সংকুচিত রুবি কোড এবং লিঙ্গুয়া :: টীকা :: নাম্বার এর জেবি ব্যবহার , আমি 291 অক্ষর (অবশ্য বাইটস) decompression কোড সহ আমার এন্ট্রি নিচে কম্প্রেস দেয়। যেহেতু প্রোগ্রামটিতে কিছু মুদ্রণযোগ্য অক্ষর রয়েছে, তাই আমি এটি মাইম বেস 64 ফর্ম্যাটে সরবরাহ করেছি :
dXNlIENvbXByZXNzOjpabGliO2V2YWwgdW5jb21wcmVzcyAneNolkMFqAkEMhu8+RVgELdaIXmXB
S2/FFyhF4k7cHTqTsclMZd++M3pJvo+QH5JiDJ9exkKrj/PqXOKV1bod77qj9b2UeGBZ7w/bpd9s
3rCDruf3uWtwS3qS/vfROy0xsho+oWbB3d+b19YsJHWGhIHp5eQ8GzqSoWkk/xxHH36a24OkuT38
K21kNm77ND81BceCWtlgoBAq4NWrM7gpyzDhxGKQi+bA6NIfG5K4/mg0d0kgTwwdvi67JHVeKKyX
l3acoxnSDYZJveVIBnGGrIUh1BQYqZacIDKc5Gvpt1vEk3wT3EmzejcyeIGqTApZmRftR7BH3B8W
/5Aze7In
প্রোগ্রামটি আনঙ্কড করতে, আপনি নিম্নলিখিত সহায়ক পার্ল স্ক্রিপ্টটি ব্যবহার করতে পারেন:
use MIME::Base64;
print decode_base64 $_ while <>;
নামের একটি ফাইলে আউটপুট সংরক্ষণ করুন 12days.plএবং এটি দিয়ে চালান perl -M5.01 12days.pl। উল্লিখিত হিসাবে, কোডটি কাজ করার জন্য আপনার কাছে লিঙ্গুয়া :: EN :: নম্বর মডিউল স্থাপন করা দরকার।
আপনি যদি ভাবছেন তবে কোডটির পঠনযোগ্য অংশটি কেবল এ জাতীয় দেখাচ্ছে:
use Compress::Zlib;eval uncompress '...'
যেখানে আরএফসি 1950 সংক্ষেপিত পার্ল কোডের ...254 বাইট রয়েছে । সঙ্কুচিত, কোডটি 361 টি বর্ণের দীর্ঘ এবং এর মতো দেখতে:
use Lingua'EN'Numbers"/e/";s==num2en(12-$i++)." "=e,y"." "for@n=qw=drummers.drumming pipers.piping lords.a.leaping ladies.dancing maids.a.milking swans.a.swimming geese.a.laying golden.rings calling.birds french.hens turtle.doves.and=;say"on the ".num2en_ordinal($_)." day of christmas my true love gave to me @n[$i--..@n]a partridge in a pear tree
"for 1..12
এই কোডটি লেখা একটি অদ্ভুত ধরণের গল্ফিং অনুশীলন ছিল: সর্বাধিক পুনরাবৃত্তি ঘটায় এবং স্বতন্ত্র অক্ষরের সংখ্যা হ্রাস করা যখন সংক্ষেপণের পরে প্রাসঙ্গিক মেট্রিকের আকার হয় তখন কাঁচা চরিত্রের সংখ্যা হ্রাস করার চেয়ে অনেক বেশি গুরুত্বপূর্ণ ।
শেষ কয়েক অক্ষরগুলি আটকানোর জন্য, আমি একটি সাধারণ প্রোগ্রাম লিখেছিলাম যা এই কোডটির ছোট বিভিন্ন প্রকার চেষ্টা করে যা সবচেয়ে ভাল সংকোচিত হয় তা সন্ধান করতে। সংকোচনের জন্য, আমি কেন সিলভারম্যানের কেজেআইপি ইউটিলিটি ব্যবহার করেছি, যা সাধারণত সর্বোচ্চ সংকোচনের সেটিংসে এমনকি স্ট্যান্ডার্ড জালিবের চেয়ে ভাল সংকোচনের রেশন (গতির দামে) দেয়। অবশ্যই, যেহেতু কেজেআইপি কেবল জিপ সংরক্ষণাগার তৈরি করে, তাই আমি তখন সংরক্ষণাগার থেকে কাঁচা ডিফল্ট স্ট্রিমটি বের করতে এবং এটি একটি আরএফসি 1950 শিরোনাম এবং চেকসামে আবদ্ধ করতে হয়েছিল। আমি তার জন্য ব্যবহৃত কোডটি এখানে:
use Compress::Zlib;
use 5.010;
@c = qw(e i n s);
@q = qw( " );
@p = qw( = @ ; , );
@n = ('\n',"\n");
$best = 999;
for$A(qw(e n .)){ for$B(@q){ for$C(@q,@p){ for$D(@p){ for$E(@q,@p){ for$F(qw(- _ . N E)){ for$G("-","-"eq$F?():$F){ for$H(@c){ for$I(@c,@p){ for$N(@n){ for$X(11,"\@$I"){ for$Y('$"','" "',$F=~/\w/?$F:()){ for$Z('".num2en_ordinal($_)."'){
$M="Lingua'EN'Numbers";
$code = q!use MB/A/B;sDDnum2en(12-$H++).YDe,yCFC Cfor@I=qwEdrummersFdrumming pipersFpiping lordsGaGleaping ladiesFdancing maidsGaGmilking swansGaGswimming geeseGaGlaying goldenFrings callingFbirds frenchFhens turtleFdovesFandE;say"on the Z day of christmas my true love gave to me @I[$H--..X]a partridge in a pear treeN"for 1..12!.$/;
$code =~ s/[A-Z]/${$&}/g;
open PL, ">12days.pl" and print PL $code and close PL or die $!;
$output = `kzipmix-20091108-linux/kzip -b0 -y 12days.pl.zip 12days.pl`;
($len) = ($output =~ /KSflating\s+(\d\d\d)/) or die $output;
open ZIP, "<12days.pl.zip" and $zip = join("", <ZIP>) and close ZIP or die $!;
($dfl) = ($zip =~ /12days\.pl(.{$len})/s) or die "Z $len: $code";
$dfl = "x\xDA$dfl" . pack N, adler32($code);
$dfl =~ s/\\(?=[\\'])|'/\\$&/g;
next if $best <= length $dfl;
$best = length $dfl;
$bestcode = $code;
warn "$A$B$C$D$E$F$G$H$I $X $Y $best: $bestcode\n";
open PL, ">12days_best.pl" and print PL "use Compress::Zlib;eval uncompress '$dfl'" and close PL or die $!;
}}}}}}
print STDERR "$A$B$C$D$E$F\r";
}}}}}}}
এটি যদি কোনও ভয়ঙ্কর ক্লুজের মতো লাগে তবে এটি হ'ল এটি।
Interestতিহাসিক আগ্রহের জন্য, এখানে আমার আসল 438-চর সমাধান যা লাইন ব্রেক এবং বিরামচিহ্ন সহ আরও ভাল আউটপুট উত্পন্ন করে:
y/_/ /,s/G/ing/for@l=qw(twelve_drummers_drummG eleven_pipers_pipG ten_lords-a-leapG nine_ladies_dancG eight_maids-a-milkG seven_swans-a-swimmG six_geese-a-layG five_golden_rGs four_callG_birds three_french_hens two_turtle_doves);s/e?t? .*/th/,s/vt/ft/for@n=@l;@n[9..11]=qw(third second first);say map("\u$_,\n","\nOn the $n[11-$_] day of Christmas,\nMy true love gave to me",@l[-$_..-1]),$_?"And a":A," partridge in a pear tree."for 0..11
এই সংস্করণটির হাইলাইটস রিগেক্সপসের জুটি s/e?t? .*/th/,s/vt/ft/, যা উপহার লাইনের শুরুতে কার্ডিনালগুলি থেকে 4 থেকে 12 এর জন্য অর্ডিনালগুলি তৈরি করে।
এই কোডটি অবশ্যই উপরোক্ত বর্ণিত জ্লিব ট্রিকটি ব্যবহার করে সংকুচিত করা যেতে পারে, তবে দেখা যাচ্ছে যে আউটপুটটি সংক্ষিপ্ত করা আরও কার্যকর, নিম্নলিখিত 338-বাইট প্রোগ্রাম উপস্থাপন করে (আবার বেস 64) বিন্যাসে:
dXNlIENvbXByZXNzOjpabGliO3NheSB1bmNvbXByZXNzICd42uWTwU7DMAyG730KP8DGOyA0bsCB
vYBp3MYicSo7W9e3xx3ijCIQDHZIUjn683+/k3ZPAjUSDKxWIeACZYC7qGw1o226hwWqHghSORKM
6FMtkGnT3cKEWpXDSMACCBOhQlWim+7jUKO+SGg5dT8XqAetiSD4nrmPBMDPvXywtllF18OgJH2E
SGJfcR+Ky2KL/b0roMeUWEZ4cXb7biQeGol4LZQUSECdyn4A0vjUBvnMXCcYiYy2uE24ONcvgdOR
pBF9lYDNKObwNnPOTnc5kYjH2JZotyogI4c1Ueb06myXH1S48eYeWbyKgclcJr2D/dnwtfXZ7km8
qOeUiXBysP/VEUrt//LurIGJXCdSWxeHu4JW1ZnS0Ph8XOKloIecSe39w/murYdvbRU+Qyc=
আমার কাছে একই ডিফল্ট স্ট্রিম থেকে নির্মিত গানের একটি 312-বাইট গিজিপ সংরক্ষণাগার রয়েছে। আমি মনে করি আপনি এটি একটি "zcat লিপি" বলতে পারেন। :)