স্ট্রেট-লাইনের ব্যাকরণ সহ মানব পাঠ্য বা উত্স কোডের মতো কিছু ধরণের ডেটা সংকোচন করা সম্ভব। আপনি মূলত এমন একটি ব্যাকরণ তৈরি করেন যার ভাষায় হুবহু একটি শব্দ রয়েছে - সঙ্কুচিত ডেটা। এই টাস্কে, আপনাকে এমন একটি প্রোগ্রাম লিখতে হবে যা ডেটা কমপিশনের এই পদ্ধতিটি প্রয়োগ করে।
ইনপুট
ইনপুটটি 65535 বাইটের চেয়ে বেশি দৈর্ঘ্যের একটি স্ট্রিং। এটি গ্যারান্টিযুক্ত, ইনপুটটি নিয়মিত অভিব্যক্তির সাথে মিলে যায় [!-~]+
(যেমন কমপক্ষে একটি মুদ্রণযোগ্য এএসসিআইআই অক্ষর সাদা স্থান বাদে)।
একটি উদাহরণ ইনপুট হয়
abcabcbcbcabcacacabcabab
আউটপুট
আউটপুটটি নিয়মের একটি সেট যা ব্যাকরণ তৈরি করে যা ঠিক একটি শব্দ (ইনপুট) বর্ণনা করে। প্রতিটি অযৌক্তিক 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;
}
উপরের প্রোগ্রাম দ্বারা উত্পন্ন নমুনা ইনপুটটি সাধারণত ভাল সংকোচনের ফলাফলে আসে না। উদাহরণ হিসাবে ইনপুট হিসাবে মানব পাঠ্য বা উত্স কোড ব্যবহার বিবেচনা করুন।
জয়ের মানদণ্ড
এটি কোড গল্ফ; সংক্ষিপ্ত উত্স কোড সহ প্রোগ্রামটি জয়ী। অতিরিক্ত creditণের জন্য, এমন একটি প্রোগ্রাম লিখুন যা আউটপুট থেকে ইনপুটটিকে পুনর্গঠন করে।