ক্ষতিহীন ইংরেজি ভাষার পাঠ্য সংক্ষেপণ চ্যালেঞ্জ [বন্ধ]


12

চ্যালেঞ্জ:

আপনার চ্যালেঞ্জটি (আপনি এটি গ্রহণ করতে পছন্দ করা উচিত) হ'ল এখানে পাওয়া 5MB " উইলিয়াম শেক্সপিয়রের সম্পূর্ণ কাজ " সংকোচন ও সংক্ষেপণ করা : http://www.gutenberg.org/cache/epub/100/pg100.txt

(MD5 a810f89e9f8e213aebd06b9f8c5157d8:)

নিয়মাবলী:

  • আপনাকে অবশ্যই ইনপুট STDINএবং মাধ্যমে আউটপুট নিতে হবেSTDOUT ...
  • ... এবং আপনাকে অবশ্যই ইনপুটটিতে একটি অনুরূপ ডিকম্প্রেসড ফলাফল সরবরাহ করতে হবে।
    • (এটি বলতে চাইলে আপনি অবশ্যই ওপরের মতো একই এমডি 5 cat inpt.txt | ./cmprss | ./dcmpress | md5পেতে সক্ষম হবেন )
    • (এর মাধ্যমে STDERRযে কোনও কিছুই বাতিল করতে হবে))
  • আপনি আবশ্যক আপনার মোট উত্স কোডের জন্য কম 2048 অক্ষর ব্যবহার করুন।
    • (এই না কোড-গলফ। তুমি না উৎস-কোড দৈর্ঘ্যের উপর ভিত্তি করে রান করা হচ্ছে। এই হল শুধু একটি জিনিষ সসীম রাখার নিয়ম ছিল।)
    • (আপনি যদি আলাদা করে ফেলে থাকেন তবে সমস্ত উত্স কোডের সংক্ষিপ্ত দৈর্ঘ্য নিন))
  • আপনাকে অবশ্যই (তাত্ত্বিকভাবে) অনুরূপ প্লেইন-পাঠ্য ইনপুটগুলি প্রসেস করতে সক্ষম হতে হবে।
    • (উদাহরণস্বরূপ হার্ড কোডিং এমন একটি প্রক্রিয়া যা কেবলমাত্র প্রদত্ত শেক্সপিয়র ইনপুট আউটপুট করতে সক্ষম is)
    • (অন্যান্য নথির সংকুচিত আকার অপ্রাসঙ্গিক - শর্তযুক্ত সঙ্কলিত ফলাফলটি বিকল্প ইনপুটটির সমান হয়))
  • আপনি যে কোনও পছন্দ ভাষা (গুলি) ব্যবহার করতে পারেন।
    • (যেমন ব্যবহার কম্প্রেস করতে দ্বিধা বোধ করবেন awkএবং ব্যবহার ডিকম্প্রেস java)
  • আপনি দুটি পৃথক প্রোগ্রাম লিখতে পারেন বা আপনার পছন্দ মতো কিছু ফর্ম "স্যুইচ" এর সাথে সংযুক্ত করতে পারেন।
    • (কম্প্রেশন এবং ডিকম্প্রেশন উভয় পদ্ধতিতে কীভাবে আবেদন করা উচিত তার স্পষ্ট বিক্ষোভ অবশ্যই থাকতে হবে)
  • আপনি কোনও বাহ্যিক আদেশ ব্যবহার করতে পারেন না (যেমন মাধ্যমে exec()) not
    • (যদি আপনি কোনও শেল ভাষা ব্যবহার করে থাকেন - দুঃখিত, আপনাকে বিল্ট-ইনগুলি দিয়ে করতে হবে sharing ভাগ করে নেওয়ার এবং উপভোগ করার স্বার্থে আপনাকে একটি "অগ্রহণযোগ্য" উত্তর পোস্ট করতে স্বাগত জানাই - তবে এটি বিচার করা হবে না! )
  • আপনি কোনও অন্তর্নির্মিত বা লাইব্রেরি সরবরাহিত ফাংশনগুলি ব্যবহার করতে পারবেন না যা বলা হয়েছে যে ডেটা সংকুচিত করা (যেমন gz, ইত্যাদি)
    • (এনকোডিংটি পরিবর্তন করা এই প্রসঙ্গে সংক্ষেপণ হিসাবে বিবেচিত হয় না here কিছু বিচক্ষণতা এখানে প্রয়োগ করা যেতে পারে the জমা দেওয়ার ক্ষেত্রে আপনার সমাধানটির গ্রহণযোগ্যতার পক্ষে দ্বিধা বোধ করবেন না))
  • অংশগ্রহন করতে বেছে নিন মজা করার চেষ্টা করুন!

সমস্ত ভাল প্রতিযোগিতা জয়ের একটি উদ্দেশ্যমূলক সংজ্ঞা আছে; অতএব:

  • সমস্ত নিয়ম মেনে চলা হয়, ক্ষুদ্রতম সংকুচিত আউটপুট ( STDOUTবাইটগুলিতে) জয়ী হয়।
    • (আপনার আউটপুটটি দয়া করে এর মাধ্যমে রিপোর্ট করুন ./cmprss | wc -c)
  • একটি অঙ্কন (অভিন্ন আউটপুট আকার) এর ইভেন্টে, সর্বাধিক সম্প্রদায় আপ-ভোটিত জয়লাভ করে।
  • দ্বিতীয় ড্র (অভিন্ন সম্প্রদায় আপ ভোট) এর ইভেন্টে, আমি কমনীয়তা এবং খাঁটি প্রতিভা সম্পর্কিত সম্পূর্ণ বিষয়গত পরীক্ষার ভিত্তিতে একটি বিজয়ী চয়ন করব। ;-)

কীভাবে জমা দিতে হবে:

এই টেমপ্লেটটি ব্যবহার করে আপনার এন্ট্রি ফর্ম্যাট করুন:

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

<description>  (Detail is encouraged!)

    <CODE...
    ...>

<run instructions>

আমি পাঠকদের এবং দাখিলকারীদের মন্তব্যের মাধ্যমে কথোপকথনের জন্য উত্সাহিত করব - আমি বিশ্বাস করি কোডগলফ.স্ট্যাকের মাধ্যমে লোকেরা শেখার এবং আরও ভাল প্রোগ্রামার হওয়ার সত্যিকারের সুযোগ রয়েছে।

বিজয়ী:

আমি শীঘ্রই ছুটিতে চলেছি: আমি আগামী কয়েক সপ্তাহ ধরে সাবমিশনগুলি পর্যবেক্ষণ করতে (বা নাও) করতে পারি এবং 19 শে সেপ্টেম্বরে এই চ্যালেঞ্জটি বন্ধ করে দেব। আমি আশা করি লোকেরা চিন্তাভাবনা ও জমা দেওয়ার জন্য - এবং কৌশল এবং ধারণাগুলির ইতিবাচক ভাগ করে নেওয়ার জন্য এটি একটি ভাল সুযোগ দেয়।

আপনি যদি অংশ নেওয়া থেকে কিছু নতুন শিখেন (পাঠক বা দাখিলকারী হিসাবে) দয়া করে উত্সাহের মন্তব্য দিন।


1
আপনি এটি ট্যাগ করা উচিত code-challenge
kirbyfan64sos

1
কোনও ফাংশন আর্গুমেন্ট হিসাবে ইনপুট নেওয়া কি অনুমোদিত? উদাহরণস্বরূপ জাভাস্ক্রিপ্টের মতো ভাষাগুলির একটি সমাধান কমান্ড লাইন, এএফএআইকি থেকে চালানো যায় না। আমার ক্ষেত্রে এটি ব্রাউজারে চালানো সহজতর হবে।
ETH প্রোডাকশনস

1
টেমপ্লেট কেন? আপনি কি স্ট্যাক স্নিপেট তৈরি করতে যা যা এর উপর নির্ভর করে?
পিটার টেলর

2
যদি কোনও কোড আকারের সীমা না থাকে, তবে আমাকে 0 বাক্স মুদ্রিত একটি সংক্ষেপণ প্রোগ্রাম এবং শেক্সপিয়রের পুরো কাজগুলি মুদ্রণের জন্য হার্ড-কোডড একটি ডিকম্প্রেস প্রোগ্রাম লিখতে আমাকে বাধা দেয় কি?
লিন

4
একটি নিয়ম যুক্ত করা যেতে পারে যা বলে যে কোডটি তাত্ত্বিকভাবে অন্যান্য ইনপুটগুলির সাথে কাজ করা উচিত , যা @ মরিস নির্দেশিত সমস্যাটি সমাধান করে।
kirbyfan64sos

উত্তর:


5

পার্ল 5, 3651284

কেবল একটি সহজ শব্দ-ভিত্তিক অভিধানের স্কিম। কর্পসের শব্দের ফ্রিকোয়েন্সি বিশ্লেষণ করে এবং প্রতি শব্দ প্রতি এক বা দুটি বাইট ব্যবহার করতে হবে কিনা তা নির্ধারণ করতে এটি ব্যবহার করে। বাইটগুলির জন্য দুটি বিশেষ চিহ্ন ব্যবহার করে \ 0 এবং \ 1 যেহেতু সেগুলি কর্পাসে উপস্থিত হয় না। এখানে প্রচুর অন্যান্য চিহ্ন ব্যবহার করা যেতে পারে। এটি করা হয়নি। কোনও হাফম্যান এনকোডিং বা সেই জাজের কোনও কাজ করে না।

কম্প্রেশন স্ক্রিপ্ট শেক্সপিয়ার.পিএল:

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;
    }
}

ডিকম্প্রেশন স্ক্রিপ্ট দেশশপিয়ার.পিএল:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.