पर्ल, 438 291 चार्ट
जेफ बर्गेज द्वारा DEFLATE कम्प्रेशन के प्रयोग से प्रेरित होकर , वेंटरो के कंप्रेस्ड रूबी कोड और JB के लिंगुआ का उपयोग :: EN :: नंबर , मैं डिक्रिप्ट कोड सहित 291 चार्ट (अच्छी तरह से, बाइट्स) में अपनी प्रविष्टि को कम करने में कामयाब रहा। चूंकि कार्यक्रम में कुछ गैर-मुद्रण योग्य वर्ण हैं, इसलिए मैंने इसे MIME Base64 प्रारूप में प्रदान किया है :
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 '...'
जहाँ RFC 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
इस कोड को लिखना एक अजीब प्रकार का गोल्फ अभ्यास था: यह अधिकतम दोहराव को दर्शाता है और उपयोग किए जाने वाले विभिन्न वर्णों की संख्या को कम करने के लिए कच्चे वर्ण गणना को कम करने की तुलना में बहुत अधिक महत्वपूर्ण है जब संपीड़न के बाद प्रासंगिक मीट्रिक का आकार होता है ।
पिछले कुछ वर्णों को निचोड़ने के लिए, मैंने इस कोड के छोटे बदलावों को आज़माने के लिए एक सरल प्रोग्राम लिखा, जो सबसे अच्छा कंप्रेस करता है। संपीड़न के लिए, मैंने केन सिल्वरमैन की KZIP उपयोगिता का उपयोग किया , जो आमतौर पर अधिकतम संपीड़न सेटिंग्स पर भी मानक ज़ालिब की तुलना में बेहतर संपीड़न राशन (गति की लागत पर) प्राप्त करता है। बेशक, चूंकि KZIP केवल ज़िप अभिलेखागार बनाता है, मुझे तब संग्रह से कच्ची DEFLATE स्ट्रीम निकालनी थी और इसे RFC 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";
}}}}}}}
यदि यह एक भयानक kluge की तरह दिखता है, तो यह इसलिए है क्योंकि यह वास्तव में यही है।
ऐतिहासिक रुचि के लिए, यहां मेरा मूल 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
इस संस्करण की मुख्य विशेषताएं regexps की जोड़ी s/e?t? .*/th/,s/vt/ft/
, जो कार्डिनल्स से 4 से 12 के लिए उपहार लाइनों की शुरुआत में अध्यादेशों का निर्माण करती हैं।
यह कोड, निश्चित रूप से, ऊपर वर्णित Zlib चाल का उपयोग करके भी संपीड़ित किया जा सकता है, लेकिन यह पता चला है कि बस उत्पादन को संपीड़ित करना अधिक कुशल है, निम्नलिखित 338-बाइट प्रोग्राम (बेस 64 प्रारूप में, फिर से) उपज:
dXNlIENvbXByZXNzOjpabGliO3NheSB1bmNvbXByZXNzICd42uWTwU7DMAyG730KP8DGOyA0bsCB
vYBp3MYicSo7W9e3xx3ijCIQDHZIUjn683+/k3ZPAjUSDKxWIeACZYC7qGw1o226hwWqHghSORKM
6FMtkGnT3cKEWpXDSMACCBOhQlWim+7jUKO+SGg5dT8XqAetiSD4nrmPBMDPvXywtllF18OgJH2E
SGJfcR+Ky2KL/b0roMeUWEZ4cXb7biQeGol4LZQUSECdyn4A0vjUBvnMXCcYiYy2uE24ONcvgdOR
pBF9lYDNKObwNnPOTnc5kYjH2JZotyogI4c1Ueb06myXH1S48eYeWbyKgclcJr2D/dnwtfXZ7km8
qOeUiXBysP/VEUrt//LurIGJXCdSWxeHu4JW1ZnS0Ph8XOKloIecSe39w/murYdvbRU+Qyc=
मेरे पास लिरिक्स का 312-बाइट gzip आर्काइव भी है, जो उसी DEFLATE स्ट्रीम से निर्मित है। मुझे लगता है कि आप इसे "ज़कात स्क्रिप्ट" कह सकते हैं। :)