Gzip फ़ाइलों के लिए एक कंप्रेसिंग उपयोग लिखें


11

इस चुनौती का कार्य निम्नानुसार है:

एक प्रोग्राम लिखें जो स्टडिन या किसी अन्य जगह से उचित आकार की फ़ाइल (मान लें <16 एमबी) (हालांकि आपको पसंद है, लेकिन हार्डकोड नहीं होना चाहिए), और संपीड़ित आउटपुट को stdout पर रखें। आउटपुट एक वैध gzip संपीड़ित फ़ाइल होनी चाहिए और यदि संपीड़ित फ़ाइल गनज़िप के माध्यम से चलती है, तो उसे पहले की तरह ही फ़ाइल मिलनी चाहिए।

नियम

  • इस प्रतियोगिता के शुरू होने से पहले उपयोग की जाने वाली प्रोग्रामिंग भाषा अवश्य जानी चाहिए
  • आपके कार्यक्रम का स्कोर स्रोत कोड या इकट्ठे कार्यक्रम के पात्रों की संख्या है (जो भी छोटा है)
  • आपको किसी भी प्रकार के मौजूदा कंप्रेशन लाइब्रेरी का उपयोग करने की अनुमति नहीं है।
  • मज़े करो!

2
क्या अंतर्निहित पुस्तकालयों के उपयोग की अनुमति है?
१०:४३ पर हॉलवबो

@ पहलवबो: नहींं। इसे भूल गए। Thx
फूज़ेक्नल

2
संभवतः ऐसा करने का सबसे अच्छा तरीका यह है कि हर ब्लॉक की शुरुआत में इनपुट को "निम्न ब्लॉक असम्पीडित है" मार्कर्स के साथ इनपुट किया जाए।
आनन।

gzip एक प्रोग्रामिंग भाषा है। हालांकि ट्यूरिंग एक पूर्ण नहीं है।
एलेक्जेंड्रू

1
यह गन्स और जिप्स समस्या के समान है। जब तक कोई भी कोडगॉल्फ डॉट कॉम पर नहीं है, तब तक कोई भी उनके जवाब यहां क्यों देगा, जब तक कि वे इसे कोडगुल्फ डॉट कॉम (जैसे, गोल्फस्क्रिप्ट) द्वारा समर्थित भाषा में हल नहीं करना चाहते।
क्रिस जस्टर-यंग

जवाबों:


10

C # (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

  • मैं किसी भी पुस्तकालयों का उपयोग गज़िप, अपस्फीति या CRC32 करने के लिए नहीं कर रहा हूँ। यह सब वहाँ है।

  • यह "कंप्रेसर" 6 के एक कारक द्वारा filesize बढ़ाता है। लेकिन यह वैध gzip प्रारूप में है!

  • GNU गनज़िप और WinRAR का उपयोग करके परीक्षण किया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.