कुछ प्रकार के डेटा को संपीड़ित करना संभव है, जैसे कि मानव पाठ या स्रोत कोड, सीधे-पंक्ति व्याकरण के साथ। आप मूल रूप से एक व्याकरण बनाते हैं जिसकी भाषा में एक शब्द है - असम्पीडित डेटा। इस कार्य में, आपको एक प्रोग्राम लिखना होगा जो डेटा कंप्रेशन के इस तरीके को लागू करता है।
इनपुट
इनपुट 65535 बाइट्स लंबाई की एक स्ट्रिंग नहीं है। यह गारंटी है, कि इनपुट नियमित अभिव्यक्ति से मेल खाता है [!-~]+
(यानी व्हाट्सएप को छोड़कर कम से कम एक मुद्रण योग्य ASCII चरित्र)।
एक उदाहरण इनपुट है
abcabcbcbcabcacacabcabab
उत्पादन
आउटपुट नियमों का एक समूह है जो एक व्याकरण बनाता है जो बिल्कुल एक शब्द (इनपुट) का वर्णन करता है। प्रत्येक nonterminal को दशमलव संख्या 9. से अधिक द्वारा निरूपित किया जाता है। प्रारंभ चिन्ह प्रतीक संख्या दस है। उदाहरण इनपुट के अनुरूप एक उदाहरण आउटपुट नीचे दिया गया है; इसके सिंटैक्स का वर्णन नीचे किया गया है:
10=11 11 12 12 11 13 13 11 14 14
11=a 12
12=b c
13=a c
14=a b
प्रत्येक नियम में <nonterminal>=<symbol> <symbol> ...
दाईं ओर एक अनियंत्रित व्हॉट्सएप-अलग-अलग प्रतीकों की संख्या होती है। प्रत्येक आउटपुट जो निम्न प्रतिबंधों का पालन करता है और वास्तव में इनपुट स्ट्रिंग मान्य है।
प्रतिबंध
लोगों को अजीब चीजें करने से रोकने के लिए, कई तरह की पाबंदियां लग रही हैं:
प्रत्येक नॉनटर्मिनल को एक नियम के दाईं ओर कम से कम दो बार दिखाई देना चाहिए। उदाहरण के लिए, इनपुट के लिए निम्नलिखित व्याकरण
abcabc
अवैध है क्योंकि नियम 12 केवल एक बार दिखाई देता है:10=12 11=a b c 12=11 11
दो आसन्न प्रतीकों का कोई अनुक्रम सभी नियमों के सभी दाएं हाथ के किनारों में एक से अधिक बार दिखाई नहीं दे सकता है, भले ही वे ओवरलैप करें। उदाहरण के लिए, इनपुट के लिए निम्नलिखित व्याकरण
abcabcbc
अवैध है क्योंकि अनुक्रमbc
दो बार दिखाई देता है:10=11 11 b c 11=a b c
एक मान्य व्याकरण होगा:
10=11 11 12 11=a 12 12=b c
आपका प्रोग्राम प्रत्येक वैध इनपुट के लिए एक मिनट से भी कम समय में समाप्त होना चाहिए जो 65535 बाइट्स से अधिक नहीं है।
हमेशा की तरह, आप अपनी भाषा या किसी भी लाइब्रेरी फ़ंक्शन की किसी भी सुविधा का उपयोग नहीं कर सकते हैं जो समाधान को तुच्छ बनाता है या इसका एक बड़ा हिस्सा लागू करता है।
नमूना इनपुट
निम्नलिखित सी कार्यक्रम के साथ नमूना इनपुट उत्पन्न करें।
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
unsigned int i,j = 0,k;
if (argc != 3
|| 2 != sscanf(argv[1],"%u",&i)
+ sscanf(argv[2],"%u",&k)) {
fprintf(stderr,"Usage: %s seed length\n",argv[0]);
return EXIT_FAILURE;
}
srand(i);
while(j < k) {
i = rand() & 0x7f;
if (i > 34 && i != 127) j++, putchar(i);
}
return EXIT_SUCCESS;
}
ऊपर कार्यक्रम द्वारा उत्पन्न नमूना इनपुट आमतौर पर अच्छे संपीड़न परिणाम नहीं देगा। उदाहरण इनपुट के रूप में मानव पाठ या स्रोत कोड का उपयोग करने पर विचार करें।
मानदंड जीतना
यह कोड गोल्फ है; कम से कम स्रोत कोड जीत के साथ कार्यक्रम। अतिरिक्त क्रेडिट के लिए, एक प्रोग्राम लिखें जो आउटपुट से इनपुट को फिर से संगठित करता है।