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