জিজিপ ফাইলগুলির জন্য একটি সংকোচনের ব্যবহার লিখুন


11

এই চ্যালেঞ্জটির কাজটি নিম্নরূপ:

এমন একটি প্রোগ্রাম লিখুন যা স্টিডিন বা অন্য কোথাও থেকে যুক্তিসঙ্গত আকারের একটি ফাইল (<16 এমবি বলুন) পড়ুন (তবে আপনি পছন্দ করেন তবে অবশ্যই হার্ডকোড করা উচিত নয়), এবং সংকোচিত আউটপুটটি স্ট্যাডআউটে রাখুন। আউটপুট অবশ্যই একটি বৈধ gzip সংক্ষেপিত ফাইল হতে হবে এবং যদি সংকোচিত ফাইলটি বন্দুকের মাধ্যমে চালিত হয় তবে এটি আগের মতো ঠিক একই ফাইলটি পাওয়া উচিত।

বিধি

  • এই প্রতিযোগিতা শুরুর আগে অবশ্যই ব্যবহৃত প্রোগ্রামিং ভাষাটি অবশ্যই জানা উচিত
  • আপনার প্রোগ্রামের স্কোরটি সোর্স কোড বা একত্রিত প্রোগ্রামের অক্ষরের সংখ্যা (যা খাটো যাই হোক না কেন)
  • আপনাকে কোনও ধরণের বিদ্যমান সংকোচনের গ্রন্থাগার ব্যবহার করার অনুমতি নেই।
  • আনন্দ কর!

2
অন্তর্নির্মিত লাইব্রেরি ব্যবহারের অনুমতি আছে কি?
হলভাবো

@ হালভাবো: না ভুলে গেছি Thx
FUZxxl

2
সম্ভবত এটি করার সর্বোত্তম উপায়টি হ'ল প্রতিটি ব্লকের শুরুতে "নিম্নলিখিত ব্লকটি সঙ্কুচিত হয়" চিহ্নিতকারীদের সাথে ইনপুটটি প্যাড করা।
আনন

জিজিপ একটি প্রোগ্রামিং ভাষা। যদিও কোনও টিউরিং সম্পূর্ণ নয়।
আলেকজান্দ্রু

1
এটি গানস এবং জিপস সমস্যার সাথে অনেকটা অভিন্ন । কোডগলফ.কমের চেয়ে যে কেউ এখানে কেন তাদের উত্তর পোস্ট করবে তা আমার ছাড়াই, যদি না তারা কোডগলফটকম (যেমন, গল্ফস্ক্রিপ্ট) সমর্থন করে না এমন ভাষায় এটি সমাধান করতে না পারে।
ক্রিস জেস্টার-ইয়ং

উত্তর:


10

সি # (534 টি অক্ষর)

using System.IO;using B=System.Byte;class X{static void Main(string[]a){var f=File.ReadAllBytes(a[0]);int l=f.Length,i=0,j;var p=new uint[256];for(uint k=0,r=0;k<256;r=++k){for(j=0;j<8;j++)r=r>>1^(r&1)*0xedb88320;p[k]=r;}uint c=~(uint)0,n=c;using(var o=File.Open(a[0]+".gz",FileMode.Create)){o.Write(new B[]{31,139,8,0,0,0,0,0,4,11},0,10);for(;i<l;i++){o.Write(new B[]{(B)(i<l-1?0:1),1,0,254,255,f[i]},0,6);c=p[(c^f[i])&0xFF]^c>>8;}c^=n;o.Write(new[]{(B)c,(B)(c>>8),(B)(c>>16),(B)(c>>24),(B)l,(B)(l>>8),(B)(l>>16),(B)(l>>24)},0,8);}}}

আরও অনেক পাঠযোগ্য:

using System.IO;
using B = System.Byte;
class X
{
    static void Main(string[] a)
    {
        // Read file contents
        var f = File.ReadAllBytes(a[0]);
        int l = f.Length, i = 0, j;

        // Initialise table for CRC hashsum
        var p = new uint[256];
        for (uint k = 0, r = 0; k < 256; r = ++k)
        {
            for (j = 0; j < 8; j++)
                r = r >> 1 ^ (r & 1) * 0xedb88320;
            p[k] = r;
        }

        uint c = ~(uint) 0, n = c;

        // Write the output file
        using (var o = File.Open(a[0] + ".gz", FileMode.Create))
        {
            // gzip header
            o.Write(new B[] { 31, 139, 8, 0, 0, 0, 0, 0, 4, 11 }, 0, 10);
            for (; i < l; i++)
            {
                // deflate block header plus one byte of payload
                o.Write(new B[] { (B) (i < l - 1 ? 0 : 1), 1, 0, 254, 255, f[i] }, 0, 6);
                // Compute CRC checksum
                c = p[(c ^ f[i]) & 0xFF] ^ c >> 8;
            }
            c ^= n;
            o.Write(new[] {
                // CRC checksum
                (B) c, (B) (c >> 8), (B) (c >> 16), (B) (c >> 24),
                // original file size
                (B) l, (B) (l >> 8), (B) (l >> 16), (B) (l >> 24)
            }, 0, 8);
        }
    }
}

মন্তব্যসমূহ:

  • প্রথম কমান্ড-লাইন আর্গুমেন্ট হিসাবে ফাইলের পথ প্রত্যাশা করে।

  • আউটপুট ফাইল হ'ল ইনপুট ফাইল + .gz

  • আমি জিজেপ, ডিলেট বা সিআরসি 32 করার জন্য কোনও লাইব্রেরি ব্যবহার করছি না। এটা সব সেখানে।

  • এই "সংকোচকারী" 6 এর একটি ফ্যাক্টর দ্বারা ফাইলের আকার বাড়ায় তবে এটি বৈধ gzip ফর্ম্যাটে!

  • জিএনইউ গানজিপ এবং উইনআরআর ব্যবহার করে পরীক্ষিত।

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