ডায়নামিক এএসসিআইআই এনকোডার!


16

ভূমিকা

কিছু ASCII অক্ষর আজকাল এত ব্যয়বহুল ...

অর্থ সাশ্রয়ের জন্য আপনি এমন একটি প্রোগ্রাম লেখার সিদ্ধান্ত নিয়েছেন যা ব্যয়বহুল অক্ষরগুলিকে সাশ্রয়ী মূল্যের সাহায্যে এনকোড করে।

যাইহোক, চরিত্রের দামগুলি ঘন ঘন পরিবর্তিত হয় এবং প্রতিবার আপনার আলাদা আলাদা অক্ষরকে এনকোড করা বা ডিকোড করতে আপনার প্রোগ্রামটি পরিবর্তন করতে চান না! আপনার আরও একটি গতিশীল সমাধান প্রয়োজন।

চ্যালেঞ্জ

আপনার কাজটি দুটি প্রোগ্রাম লেখার জন্য: একটি এনকোডার এবং একটি ডিকোডার

এনকোডার পাঁচটি সস্তা অক্ষরের একটি তালিকা এবং একটি একক ব্যয়বহুল চরিত্র গ্রহণ করা উচিত।

এটি ব্যয়বহুল চরিত্রটি এনকোড করে সাশ্রয়ী অক্ষরগুলি দিয়ে তৈরি একটি স্ট্রিং আউটপুট করা উচিত।

এই স্ট্রিংটি সাশ্রয়ী মূল্যের জন্য 4 টির বেশি অক্ষরের বেশি হতে পারে । তবে, এটি এনকোডিংয়ের সমস্ত সস্তা অক্ষর ব্যবহার করতে হবে না এবং এনকোডিংগুলি বিভিন্ন দৈর্ঘ্যের হতে পারে।


ডিকোডার স্ট্রিং এনকোডার দ্বারা outputted, এবং আউটপুট ব্যয়বহুল চরিত্র গ্রহণ করা উচিত।

ডিকোডারটি এনকোডড স্ট্রিং ব্যতীত অন্য কোনও ইনপুট গ্রহণ করবে না। এটি অবশ্যই ইনপুটগুলির কোনও (বৈধ) সংমিশ্রণের জন্য এনকোডারটির আউটপুট থেকে অবিস্মরণিত, কাজ করবে। অন্য কথায়, আপনার ডিকোডার প্রোগ্রামটি জানে না কোন বর্ণগুলি ব্যয়বহুল বা সস্তা are

স্কোরিং

সংক্ষিপ্ততম সম্মিলিত কোড জয়!

মন্তব্য

  • সমস্ত অক্ষর হয় বড় হাতের অক্ষর [A-Z], ছোট হাতের অক্ষর [a-z], বা সংখ্যা হবে [0-9]

  • সস্তা অক্ষরের তালিকায় সদৃশ থাকবে না। কোনও চরিত্রই সস্তা এবং ব্যয়বহুল উভয়ই হতে পারে।

  • এনকোডার এবং ডিকোডার একই ভাষায় লিখতে হবে না, তবে তারা হতে পারে। আপনি একটি প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন।

  • ইনপুট এবং আউটপুট আপনার ভাষার জন্য যে কোনও যুক্তিসঙ্গত বিন্যাসে থাকতে পারে।

  • দুটি প্রোগ্রাম কোনও ভেরিয়েবল বা ডেটা ভাগ না করতে পারে।

সারসংক্ষেপ

  • কিছু সস্তা অক্ষর এবং একটি ব্যয়বহুল অক্ষরের ইনপুট এনকোডারকে দেওয়া হয়।

  • এনকোডার ব্যয়বহুল চরিত্রটি এনকোডিং করে সস্তা ব্যয়গুলির একটি স্ট্রিং আউটপুট দেয়।

  • ডিকোডারকে এনকোডারটির আউটপুট দেওয়া হয় এবং ব্যয়বহুল চরিত্রটি আউটপুট করে।

উদাহরণ

ইনপুট:     a, b, c, d, e     f

এনকোডার সম্ভাবনা:     a     eeee     caec

সঙ্কেতমোচক:     f


ইনপুট:     a, b, c, d, e     h

এনকোডার সম্ভাবনা:     bc     cea     eeaa

সঙ্কেতমোচক:     h


ইনপুট:     q, P, G, 7, C     f

এনকোডার সম্ভাবনা:     777     P7     PPCG

সঙ্কেতমোচক:     f


এটি সত্যিই কেবল আমার হতে পারে, এবং আমি যদি এই প্রশ্নের জন্য ক্ষমাপ্রার্থী তবে আপনি কীভাবে সাশ্রয়ী চরিত্রগুলি সহ আপনার বার্তাটি এনকোড করার কথা? 5 স্বল্প ব্যয়যুক্ত অক্ষরের জন্য এএসসিআইআই কোড যুক্ত? প্রকৃতপক্ষে, যদি আপনার ডিকোডারটি অবশ্যই উত্পন্ন সমস্ত এনকোডিং সম্ভাবনার জন্য ডিকোড করতে হবে তবে এই প্রশ্নের একটি ভিত্তি রয়েছে।
কোলে

পরিষ্কার হতে হবে: এনকোডার সম্ভাবনা কেবল উদাহরণ এবং আমরা প্রতিটি চরিত্রকে যেমন ইচ্ছা তেমনভাবে এনকোড করতে পারি, হ্যাঁ?
ডেনিস

@ ডেনিস হ্যাঁ, সেগুলি কেবল উদাহরণ।
জুনিচ

@ কোল একটি প্রকৃত অ্যালগরিদম না দিয়েই , যেহেতু এখানে প্রধান চ্যালেঞ্জ, আমি বিশ্বাস করি যে এটি সম্ভব is এনকোড করার জন্য কেবলমাত্র 62 টি ব্যয়বহুল চিঠি রয়েছে এবং এ 239914 অনুসারে 92 টি পর্যন্ত 4 টি এ্যাসকি অক্ষর এনকোড করা যায় । (এই এক জন্য PhiNotPi এর স্যান্ডবক্স মন্তব্যের বিশাল ধন্যবাদ - আমি নিরূপণ করা হয়নি ঠিক কত এনকোড হতে পারে)
jrich

@ সংজ্ঞায়িত ফাংশন আমি বুঝতে পারলাম আপনি কী করতে চেয়েছিলেন: ডেনিসের প্রশ্নের উত্তর আমি কী সম্পর্কে বিভ্রান্ত হয়েছিল তার উত্তর দিয়েছি।
কোলে

উত্তর:


5

পাইথ, 46 বাইট

এনকোডার, 22 বাইট

@smfql{Td^<Szd4S4-Cw48

ডিকোডার, 24 বাইট

C+48xsmfql{Td^<sS{zd4S4z

বাহ, এটি পুরোপুরি ফিট করে। 75 টি বিভিন্ন চর-সংমিশ্রণ এবং 75-এর একটি চর-পরিসীমা
জাকুব

আমি মনে করি আপনি উভয় প্রোগ্রামে প্রতিটি বাইট S4সঙ্গে প্রতিস্থাপন Tএবং সংরক্ষণ করতে পারেন ।
জাকুব

7

সিজেম, 55 50 48 47 বাইট

এনকোডার, 24 22 21 বাইট

l$:L4m*{$L|L=},rc'0-=

এটি অনলাইনে চেষ্টা করুন।

ডিকোডার, 31 28 27 26 বাইট

4_m*{$4,|4,=},l_$_|f#a#'0+

এটি অনলাইনে চেষ্টা করুন।


আপনি যেখান থেকে ব্যবহার করছেন সেখানে কি সিজেএম সিনট্যাক্স শীট রয়েছে? সোর্সফোর্জে থাকা একটি এবং অন্য পিডিএফ চিট শীটে আপনার মতো ব্যবহার করা সমস্ত অক্ষর নেই'
লুমিনাস

'অপারেটর নয়। আপনি এটি সিনট্যাক্স পৃষ্ঠায় খুঁজে পেতে পারেন ।
ডেনিস

4

গাওক, 163 + 165 = 328

গাওক ৪.১.১ এর সাথে পরীক্ষিত, তবে এটি পুরানো গাক সংস্করণেও কাজ করা উচিত। মাক সঙ্গে কাজ করতে কিছুটা সংশোধন করা (দীর্ঘায়িত) করা দরকার।

এনকোডার (163):

{for(gsub(", ",_);sprintf("%c",++r)!=$NF;asort(a))split($1,a,_);r-=r>64?53:46;for(k=4^5;r-=_~i;j=_)for(i=++k;gsub(++j,_,i);)split(k,b,_);for(j in b)printf a[b[j]]}

ডিকোডার (165):

{split($1,a,_);for(i in a)d[a[i]]=a[i];asort(d);for(k=4^5;c!~$1;x+=_~i){i=++k;for(c=j=_;gsub(++j,_,i);split(k,b,_));for(g in b)c=c d[b[g]]}printf"%c",x+(x>10?54:47)}

ঠিক আছে, এটি কার্যকর হয় তবে আমি সচেতন যে এটি এটির জন্য সর্বোত্তম পদ্ধতির নাও হতে পারে। পঞ্চম সাশ্রয়ী চিঠিটি কীসের জন্য আমার কোনও ধারণা নেই, কারণ আমি কেবল চারটি ব্যবহার করি।

এগুলি শুধুমাত্র একক ব্যবহারের জন্য। আপনি যদি দ্বিতীয় কোডটি প্রবেশ করতে চান তবে আপনাকে সেগুলি পুনরায় চালু করতে হবে। এনকোড করার জন্য ইনপুটটিতে কমাগুলির পরে ফাঁকা স্থানগুলি প্রয়োজন।

আমি যা ভেবেছিলাম

আমার প্রথম প্রশ্নটি ছিল "এই 4 টি চরিত্র থেকে কোনও ডিকোডার কি পেতে পারে?" (আমি তাদেরকে ক, খ, সি এবং ডি বলব) এবং আমার প্রাথমিক ধারণাটি ছিল নীচের সম্পর্কগুলি থেকে of বিট তথ্য প্রাপ্ত করা:

a>b
a>c
a>d
b>c
b>d
c>d

বাহ, 6 বিট, এটি নিখুঁত! আমি ভেবেছিলাম এটি প্রতিভা, কিন্তু পরীক্ষার ফলে এটি কাজ করবে না। কেবলমাত্র 24 টি সংমিশ্রণ রয়েছে। অভিশাপ।

পরবর্তী পদক্ষেপটি আমি ইতিমধ্যে যা জানতাম তার ভিত্তিতে গণনা করার চেষ্টা করছিলাম। সুতরাং স্ট্রিংটিতে উপস্থিত প্রথম অক্ষরটি 0 হয়ে যাবে, তারপরে স্ট্রিংয়ের সাথে প্রবর্তিত দ্বিতীয় অক্ষরটি 1 হয়ে যাবে। তবে এটি 62 টি প্রয়োজনীয় সংমিশ্রণে আমার কাছে নিয়ে আসেনি।

0000
0001
0010
0011
0012
0100
0101
0102
0110
0111
0112
0120
0121
0122
0123

তবে আমি যেভাবেই হোক ধারণাটি পছন্দ করি।

ঠিক আছে, তবে এটি আমাকে আঘাত করেছিল যে আমি এই দুটিকে একত্রিত করতে পারি, কারণ ইনপুটটিতে থাকা চরিত্রগুলির ইতিমধ্যে সম্পর্ক রয়েছে এবং তাদের একটি মান দেওয়ার জন্য পরিচয় না করা পর্যন্ত আমাকে অপেক্ষা করতে হবে না।

কিভাবে এটা কাজ করে

দ্রষ্টব্য: গল্ফযুক্ত সংস্করণগুলি ঠিক কীভাবে এটি কাজ করে তা নয়, তবে নীতিটি একই ছিল।

ডিকোডারের জন্য:

একটি অ্যারে নির্মিত হয়, যার সূচীতে চারটি অঙ্কের সংখ্যা রয়েছে যার বৃহত্তম অঙ্কটি সেই সংখ্যার স্বতন্ত্র সংখ্যাগুলির সংখ্যার চেয়ে বেশি নয়। এই শর্তটিতে 75 টি আলাদা চার অঙ্কের সংখ্যা রয়েছে। আমি তাদের জোর করে ফেলেছি, কারণ এগুলি নির্মাণের কোনও উপায় আমি এখনও বের করতে পারিনি, এবং আমি নিশ্চিত না যে এটি যেভাবেই করা উচিত এটিকে আরও ছোট করা হবে। আমি যখন এগুলি খুঁজে পাই তখন আমি এগুলিকে ক্রমযুক্ত দামি অক্ষরগুলি অর্পণ করি।

তারপরে আমি ইনপুট স্ট্রিং থেকে প্রতিটি অক্ষরকে একটি অঙ্ক দিয়ে প্রতিস্থাপন করি সবচেয়ে ক্ষুদ্রতম (উদাহরণস্বরূপ 'এ' এর চেয়ে 'এ' এর চেয়ে ছোট) 1 হয়ে যায়, দ্বিতীয়টি সর্বনিম্ন 2 হয়, এবং 4 অবধি 4 অবধি অবশ্যই ইনপুটটিতে কতগুলি পৃথক অক্ষর রয়েছে তার উপর নির্ভর করে, সর্বোচ্চ অঙ্কটি কী ফলাফল স্ট্রিং হবে।

তারপরে আমি সহজভাবে অ্যারে উপাদানটি মুদ্রণ করি, যার একটি সূচক হিসাবে স্ট্রিং থাকে।

এনকোডারটি সেই অনুযায়ী কাজ করে।

কিভাবে ব্যবহার করে

হয় কোডটি সরাসরি একটি অর্ভ বাশ লাইন কমান্ডে অনুলিপি করুন বা দুটি ফাইল "এনকোড.ওক" এবং "ডিকোড.ওক" করুন এবং সেই অনুযায়ী কোডটি আটকে দিন। অথবা আরও ভালভাবে নীচের কোডটি ব্যবহার করুন যা এন / ডিকোডিংয়ের পরে স্বয়ংক্রিয়ভাবে প্রস্থান করে, বা প্রস্থানটি শেষে প্রস্থানটি সরিয়ে একাধিকবার ব্যবহার করা যেতে পারে।

encode.awk

{
    if(!x) # only do first time
        for(i=1e3;i++<5e3;delete a)
        {
            for(m=j=0;p=substr(i,++j,1);p>m?m=p:0)++a[p];
            length(a)>=m&&i!~0?c[(x>9?55:48)+x++]=i:_
        }
    r=u=_; # clear reused variables 
    for(gsub(",",FS);sprintf("%c",++r)!=$NF;); # more flexible concerning
    --NF;                                      # spaces in input
    split($0,b);
    asort(b);
    split(c[r],a,_);
    for(j in a)u=u b[a[j]]; # prettier printing than golfed version
    print u
    exit # <=== remove to encode input file
}

decode.awk

{
    if(!x) # only do first time 
        for(i=1e3;i++<5e3;delete a)
        {
            for(m=j=0;p=substr(i,++j,1);p>m?m=p:_)++a[p];
            length(a)>=m&&i!~0?c[i]=sprintf("%c",(x>9?55:48)+x++):_
        }
    delete t; delete d; o=_; # clear reused variables 
    split($1,a,_);
    for(i in a)t[a[i]]=1;
    for(i in t)d[++y]=i;
    asort(d);
    for(i in a)for(j in d)if(d[j]~a[i])o=o j;
    print c[o]
    exit # <=== remove to encode input file
}

এখানে ব্যবহারের উদাহরণ দেওয়া হল:

me@home:~/$ awk -f encode.awk
w, 0, R, 1, d X
10R1
me@home:~/$ awk -f decode.awk
10R1
X

মনে রাখবেন যে প্রতিটি কমা পরে স্থান প্রয়োজন, যদি আপনি গল্ফ সংস্করণ ব্যবহার করেন।

আপনি যদি চান তবে কিছু নমুনা ডেটা তৈরি করতে আপনি এই সংক্ষিপ্ত এবং নোংরা স্ক্রিপ্টটি ব্যবহার করতে পারেন

BEGIN{
    for(srand();i++<1000;)
    {
        erg="";
        for(j=0;j++<5;)
        {
            while(erg~(a[j]=substr(c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",rand()*62+1,1)));
            erg=erg a[j]
        }
        print a[1]", "a[2]", "a[3]", "a[4]", "a[5](rand()>.5?" ":rand()>.5?"  ":"   ")substr(c,rand()*62+1,1)
    }
}

এবং মজার কিছু করুন

me@home:~/$ awk -f gen.awk|awk -f encode.awk|awk -f decode.awk|sort -u|wc -l
62

আমি এটি আরও প্রোগ্রামিং ধাঁধা হিসাবে দেখেছি। আমি মনে করি এটি কিছুটা দুঃখজনক, যে এখানে প্রায় সমস্ত কিছুই গল্ফড, কারণ আপনি ভাল ডকুমেন্টেড, পঠনযোগ্য কোড থেকে আরও অনেক কিছু শিখতে পারেন তবে এটি কেবল আমার অভিমত। এবং আমি এটি অনুরোধ মত গল্ফড;)


এটি পরীক্ষা কিভাবে? কিছু উদাহরণ শেয়ার করুন।
শ্রাবণ যাদব

মহান ব্যাখ্যা জন্য +1! এই সমস্যার কাছে যাওয়ার বিভিন্ন উপায় রয়েছে বলে মনে হচ্ছে :)
জুনিচ

1
এটি আমার চিন্তার প্রক্রিয়াটির সাথে অনেকটা অনুরূপ ছিল তবে আমি বুঝতে পারি না যে অনন্য দুর্বল সংমিশ্রণগুলি (যেখানে আপনি সর্বাধিক অঙ্ককে অঙ্কের পরিমাণের চেয়ে বেশি নয় বলে বর্ণনা করেছেন) কার্যকর ছিল। মাধ্যমে অনুসরণ করার জন্য।
প্যাট্রিক রবার্টস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.