প্রসঙ্গমুক্ত ব্যাকরণ সহ ডেটা সঙ্কুচিত করুন


9

স্ট্রেট-লাইনের ব্যাকরণ সহ মানব পাঠ্য বা উত্স কোডের মতো কিছু ধরণের ডেটা সংকোচন করা সম্ভব। আপনি মূলত এমন একটি ব্যাকরণ তৈরি করেন যার ভাষায় হুবহু একটি শব্দ রয়েছে - সঙ্কুচিত ডেটা। এই টাস্কে, আপনাকে এমন একটি প্রোগ্রাম লিখতে হবে যা ডেটা কমপিশনের এই পদ্ধতিটি প্রয়োগ করে।

ইনপুট

ইনপুটটি 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ণের জন্য, এমন একটি প্রোগ্রাম লিখুন যা আউটপুট থেকে ইনপুটটিকে পুনর্গঠন করে।


হা হা। কোলমোগোরভ-জটিলতার প্রশ্নগুলির জন্য জাভাতে ইতিমধ্যে এটি প্রয়োগ করা (তবে গল্ফড নয়) কয়েকটি সংস্করণ আমার কাছে রয়েছে ...
পিটার টেলর

@ পিটারটেলর ঠিক কোন প্রশ্ন?
FUZxxl

এটি পোস্ট করার উপযুক্ত হওয়ার জন্য অল্প অল্পের জন্য যথেষ্ট উত্তর খুঁজে পাওয়া যায় না (আমি ব্যাকরণ তৈরির কৌশল এবং ব্যাকরণ ইঞ্জিনগুলি ধীরে ধীরে যুক্ত করছি), তবে এই প্রকল্পের মূল স্ক্রিপ্টটি কোডগলফ.স্টাকেক্সেঞ্জার / প্রশ্নগুলি / ১68৮২ , কোডগল্ফ এ তাদের চেষ্টা করে .stackexchange.com / প্রশ্ন / 6043 , কোড golf.stackexchange.com/questions/4191 , codegolf.stackexchange.com/questions/4356 এবং অন্যান্য প্রশ্নের কয়েকটি উপাদান।
পিটার টেলর

উত্তর:


3

গল্ফস্ক্রিপ্ট, 111 108 টি অক্ষর

1/{.}{:^1<{^1$/,2>.{;,)^<.0?)!}*}do-1<.,1>{^1$/[10):10]*0+\+}{;^}if(\}while][0]%.,,]zip{))9+`"="+\~" "*+}%n*

এটি গল্ফস্ক্রিপ্ট ব্যবহার করে বেশ আনাড়ি পদ্ধতি। দ্বিতীয় সংস্করণ প্রাথমিক সংস্করণের তুলনায় অনেক ভাল সম্পাদন করে। এটি উদ্দেশ্যযুক্ত কোডের চেয়ে অনেক বেশি দীর্ঘ তবে আমার বাস্তবায়নে ডু-লুপগুলি বাসা বেঁধেছে এবং এটি দোভাষীর সাথে সমস্যা সৃষ্টি করেছে।

উদাহরণ:

> abcba
10=a b c b a

> abcabcbc
10=11 11 12
11=a 12
12=b c

> abcabcbcbcabcacacabcabab
10=11 12 12 13 14 14 c 11 15
11=15 13
12=c b
13=14 b
14=c a
15=a b

1

প্রত্যাহার করা হয়েছে - অ্যালগরিদম সমস্ত ক্ষেত্রে পরিচালনা করতে পারে না। সি, 422 (আউটপুটে ডুপগুলি অপসারণের জন্য স্থির করা হয়েছে, এবং বাদ দেওয়া অক্ষর)

প্রাথমিক বাস্তবায়ন, এটি গল্ফ শুরু করবে।

নিয়মগুলির যেহেতু প্রকৃতপক্ষে এই নিষ্ঠুর বলটি সংকুচিত করার দরকার নেই ...

10 সেকেন্ডের মধ্যে 65535 দৈর্ঘ্য প্রক্রিয়া করতে পারে

n,m[99999];
c,r[99999][2];

g,i,s,t;

main(){
    for(;(m[n]=getchar())>32;n++);

    while(!g){ // loop until no further changes
        g=1;
        for(s=0;s<n-1;s++) {
            for(t=s+2;t<n-1;t++)if(m[s]==m[t]&&m[s+1]==m[t+1]){
                // create rule
                r[c][0]=m[s];
                r[c++][1]=m[s+1];
                g=0;
                // substitute
                for(i=t=s;i<n;i++){
                    if(m[i]==r[c-1][0]&&m[i+1]==r[c-1][1]){
                        m[t++]=-c;
                        i++;
                    }else
                        m[t++]=m[i];
                }
                n=t;
            }
        }
    }

    for(s=-1;s<c;s++){
        printf("%d=",s+11);
        for(t=0;t<(s<0?n:2);t++){
            i=(s<0?m:r[s])[t];
            i<0?printf("%d ",10-i):printf("%c ",i);
        }
        printf("\n");
    }

}

নমুনা রান:

echo abcabcbcbcabcacacabcabab | a.out
10=11 12 13 13 12 14 14 12 12 11 
11=a b 
12=c 11 
13=c b 
14=c a


আপনার কোডটি স্পেসিফিকেশন অনুযায়ী কাজ করে না। এটি আউটপুট উত্পন্ন করে যা নিয়ম লঙ্ঘন করে দুটি অক্ষরের কোনও ক্রম দু'বার প্রদর্শিত হতে পারে না ; abcdabcd ইনপুট বিবেচনা করুন। এছাড়াও, আপনার কোড দৃশ্যত ইনপুট স্ট্রিম থেকে শেষ বাইটটি সরিয়ে দেয়। উভয় প্রভাব পর্যবেক্ষণ করতে উদাহরণের জন্য এখানে দেখুন: আদর্শ one.com/3Xvtyv
FUZxxl

এছাড়াও, আপনার নমুনা আউটপুট দৃশ্যত ভুল।
FUZxxl

আপনি ঠিক বলেছেন - আমি ব্যর্থ হয়েছি - আমি যখন কাজ থেকে ফিরে আসব তখন আমি এটির দিকে নজর দেব: পি
শিশু-খরগোশ

এটি আমার জন্য ইনপুট থেকে শেষ বাইটটি সরিয়ে ফেলছে না - এবং আমার নমুনা আউটপুটটি সঠিক (আমার জন্য) .. আসুন "বাগটি স্পট করুন" খেলি!
শিশু-খরগোশ

আপনি সুনির্দিষ্টভাবে পোস্ট করেছেন নমুনা আউটপুট। বিধি 10 এর প্রসারিত ফর্মটি নিয়ম 14 এর সাথে শেষ হয় যা "সিএ" দিয়ে শেষ হয়। শেষ সি আসলে শেষের আগে 5 পজিশন।
FUZxxl
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.