दोषरहित अंग्रेजी भाषा पाठ संपीड़न चुनौती [बंद]


12

चुनौती:

आपकी चुनौती (आपको इसे स्वीकार करने के लिए चुनना चाहिए) 5MB " विलियम शेक्सपियर की पूरी कृतियाँ" को संपीड़ित और डिकम्पोज करना है जैसा कि यहां पाया गया है: http://www.gutenberg.org/cache/epub/100/pg100.txt

(MD5: a810f89e9f8e213aebd06b9f8c5157d8)

नियम:

  • आपको इनपुट के माध्यम से और आउटपुट के माध्यम से लेना होगा ...STDINSTDOUT
  • ... और आपको इनपुट के लिए एक समान विघटित परिणाम प्रदान करना होगा
    • (यह कहना है कि आपको ऊपर के समान एमडी 5 प्राप्त करने में सक्षम होना चाहिए ।)cat inpt.txt | ./cmprss | ./dcmpress | md5
    • (के माध्यम से कुछ भी STDERRत्याग किया जाना है।)
  • आपको अपने कुल स्रोत कोड के लिए 2048 से कम वर्णों का उपयोग करना होगा
    • (यह वह जगह है नहीं कोड गोल्फ। आप कर रहे हैं नहीं स्रोत-कोड की लंबाई के आधार रन बनाए जा रहा है। यह है कुछ ऐसी चीज़ें परिमित रखने के लिए शासन था।)
    • (यदि आपने इसे अलग कर दिया है तो सभी स्रोत कोड की संक्षिप्त लंबाई लें।)
  • आप चाहिए भी (सैद्धांतिक) इसी तरह की प्रक्रिया सादे-पाठ आदानों करने में सक्षम हो।
    • (उदाहरण के लिए हार्ड कोडिंग एक तंत्र जो केवल उपलब्ध शेक्सपियर इनपुट को आउटपुट करने में सक्षम है, अस्वीकार्य है।)
    • (अन्य दस्तावेजों का संकुचित आकार अप्रासंगिक है - बशर्ते कि विघटित परिणाम वैकल्पिक इनपुट के समान हो।)
  • आप भाषा के किसी भी विकल्प का उपयोग कर सकते हैं।
    • (उदा। का उपयोग कर awkऔर संपीड़ित का उपयोग करने के लिए स्वतंत्र महसूस करें java)
  • आप दो अलग-अलग प्रोग्राम लिख सकते हैं या उन्हें कृपया "स्विच" के कुछ रूप के साथ जोड़ सकते हैं।
    • (संपीड़न और विघटन मोड दोनों को कैसे लागू किया जाए, इसके स्पष्ट प्रदर्शन होने चाहिए)
  • आप किसी भी बाहरी कमांड (जैसे के माध्यम से ) का उपयोग नहीं कर सकते हैंexec()
    • (यदि आप एक शेल भाषा का उपयोग कर रहे हैं - क्षमा करें। आपको बिल्ट-इन के साथ करना होगा। शेयरिंग और आनंद के लिए "अस्वीकार्य" उत्तर पोस्ट करने के लिए आपका स्वागत है - लेकिन इसका निर्णय नहीं किया जाएगा! )
  • आप किसी भी अंतर्निहित या लाइब्रेरी प्रदान किए गए कार्यों का उपयोग नहीं कर सकते हैं, जिनका उद्देश्य उद्देश्य डेटा को संपीड़ित करना है (जैसे gz, आदि)
    • (एन्कोडिंग को बदलना इस संदर्भ में संपीड़न नहीं माना जाता है। कुछ विवेक को यहां लागू किया जा सकता है। प्रस्तुत करने में अपने समाधान की स्वीकार्यता पर बहस करने के लिए स्वतंत्र महसूस करें।)
  • कृपया भाग लेने के लिए चुनने के लिए मज़े करने की कोशिश करें!

सभी अच्छी प्रतियोगिताओं में जीत की एक उद्देश्यपूर्ण परिभाषा होती है; Ergo:

  • बशर्ते सभी नियमों का पालन किया जाए, सबसे छोटा संपीड़ित उत्पादन ( STDOUTबाइट्स में) जीतता है।
    • (अपने उत्पादन की रिपोर्ट कृपया ./cmprss | wc -c)
  • ड्रा (समान आउटपुट आकार) की स्थिति में, अधिकांश समुदाय अप-वोटेड जीतता है।
  • दूसरे ड्रा (समान समुदाय अप-वोट) की स्थिति में, मैं एक विजेता को पूरी तरह से व्यक्तिपरक परीक्षा के लालित्य और शुद्ध प्रतिभा के आधार पर चुनूंगा। ;-)

कैसे जमा करें:

कृपया इस टेम्प्लेट का उपयोग करके अपनी प्रविष्टि को प्रारूपित करें:

<language>, <compressed_size>
-----------------------------

<description>  (Detail is encouraged!)

    <CODE...
    ...>

<run instructions>

मैं पाठकों और सबमिटरों को टिप्पणियों के माध्यम से समझाने के लिए प्रोत्साहित करूंगा - मेरा मानना ​​है कि लोगों के लिए कोडगुल्फ़.स्टैक के माध्यम से सीखने और बेहतर प्रोग्रामर बनने का वास्तविक अवसर है।

जीतना:

मैं जल्द ही छुट्टी पर हूं: मैं अगले कुछ हफ्तों में सबमिशन की निगरानी कर सकता हूं (या नहीं कर सकता हूं) और 19 सितंबर को चुनौती को बंद कर दूंगा। मुझे उम्मीद है कि यह लोगों को सोचने और प्रस्तुत करने का एक अच्छा अवसर प्रदान करता है - और तकनीकों और विचारों के सकारात्मक बंटवारे के लिए।

यदि आपने भाग लेने (पाठक या प्रस्तुतकर्ता के रूप में) से कुछ नया सीखा है तो कृपया प्रोत्साहन की टिप्पणी छोड़ दें।


1
आपको यह टैग करना चाहिए code-challenge
kirbyfan64sos

1
क्या इनपुट को फ़ंक्शन तर्क के रूप में लिया जाता है? उदाहरण के लिए जावास्क्रिप्ट जैसे भाषाओं को कमांड लाइन AFAIK से नहीं चलाया जा सकता है। मेरे मामले में, ब्राउज़र में इसे चलाना बहुत आसान होगा।
22

1
टेम्प्लेट क्यों? क्या आप एक स्टैक स्निपेट बनाने जा रहे हैं जो इस पर निर्भर करता है?
पीटर टेलर

2
यदि कोई कोड आकार सीमा नहीं है, तो मुझे 0 बाइट को प्रिंट करने वाले एक कंप्रेस प्रोग्राम को लिखने से क्या रोकता है, और शेक्सपियर के संपूर्ण कार्यों को प्रिंट करने के लिए हार्ड-कोडित एक डिकम्प्रेस प्रोग्राम है?
लिन

4
एक नियम जोड़ा जा सकता है जो कहता है कि कोड को सैद्धांतिक रूप से अन्य इनपुट के साथ काम करना चाहिए , जो समस्या को हल करता है @Mauris।
kirbyfan64sos

जवाबों:


5

पर्ल 5, 3651284

बस एक सरल शब्द-आधारित शब्दकोश योजना है। कॉर्पस की शब्द आवृत्ति का विश्लेषण करता है, और इसका उपयोग यह निर्धारित करने के लिए करता है कि प्रति शब्द ओवरहेड के एक या दो बाइट्स का उपयोग करना है या नहीं। बाइट्स के लिए दो विशेष प्रतीकों का उपयोग करता है \ 0 और \ 1 क्योंकि वे कॉर्पस में दिखाई नहीं देते हैं। अन्य प्रतीकों के बहुत सारे उपयोग किए जा सकते हैं। ऐसा नहीं किया गया। कोई हफ़मैन एन्कोडिंग या उस जैज़ में से कोई भी नहीं करता है।

संपीड़न स्क्रिप्ट shakespeare.pl:

use strict;
use warnings;
use bytes;

my $text = join "", <>;
my @words = split/([^a-zA-Z0-9]+)/, $text;


my %charfreq;
for( my $i = 0; $i<length($text); ++$i ) {
    $charfreq{ substr($text, $i, 1) }++
}
for my $i ( 0..255 ) {
    my $c = chr($i);
    my $cnt = $charfreq{$c} // 0;
}



my %word_freq;
foreach my $word ( @words ) {
    $word_freq{ $word }++;
}


my $cnt = 0;
my ( @dict, %rdict );
foreach my $word ( sort { $word_freq{$b} <=> $word_freq{$a} || $b cmp $a } keys %word_freq ) {
    last if $word_freq{ $word } == 1; 


    my $repl_length = $cnt < 127 ? 2 : 3;
    if( length( $word ) > $repl_length ) {
        push @dict, $word;
        $rdict{ $word } = $cnt;
        $cnt++;
    }
}


foreach my $index ( 0..$
    print "$dict[$index]\0";
}
print "\1";


foreach my $word ( @words ) {
    my $index = $rdict{ $word };
    if ( defined $index && $index <= 127 ) {
        print "\0" . chr( $index );
    } elsif ( defined $index ) {
        my $byte1 = $index & 127;
        my $byte2 = $index >> 7;
        print "\1" . chr( $byte2 ) . chr( $byte1 );
    } else {
        print $word;
    }
}

अपघटन लिपि deshakespeare.pl:

use strict;
use warnings;
use bytes;

local $/;
my $compressed = <>;
my $text = $compressed;
$text =~ s/^.+?\x{1}//ms;
my $dictionary = $compressed;
$dictionary =~ s/\x{1}.*$//ms;


my $cnt = 0;
my @dict;
foreach my $word ( split "\0", $dictionary ) {

    push @dict, $word;
}


my @words = split /(\x{0}.|\x{1}..)/ms, $text;
foreach my $word ( @words ) {
    if( $word =~ /^\x{0}(.)/ms ) {
        print $dict[ ord( $1 ) ];
    } elsif( $word =~ /^\x{1}(.)(.)/ms ) {
        my $byte1 = ord( $1 );
        my $byte2 = ord( $2 );
        my $index = ( $byte1 << 7 ) + $byte2;
        print $dict[ $index ];
    } else {
        print $word;
    }
}

रन का उपयोग करें:

perl shakespeare.pl < pg100.txt >pg100.txt.compressed
perl deshakespeare.pl <pg100.txt.compressed >pg100.txt.restored
diff pg100.txt pg100.txt.restored
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.