gawk, 163 + 165 = 328
4.1.1 gawk के साथ परीक्षण किया गया है, लेकिन पुराने gawk संस्करणों में भी काम करना चाहिए। मॉक के साथ काम करने के लिए थोड़ा संशोधित (लंबा) होना चाहिए।
एनकोडर (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 पात्रों में से एक डिकोडर को क्या मिल सकता है?" (मैं उन्हें ए, बी, सी और डी) कहूंगा, और मेरा प्रारंभिक विचार निम्नलिखित संबंधों से सूचना के 6 बिट प्राप्त करना था:
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 अलग चार अंकों की संख्या है। मैं उन पर बल देता हूं, क्योंकि अभी तक मैं उनके निर्माण का कोई तरीका नहीं निकाल सका हूं, और मुझे यकीन नहीं है कि यह किसी भी तरह से जागने के लिए कम होगा। जब मुझे ये मिलते हैं तो मैं उन्हें महंगे चरित्रों को असीम क्रम में सौंपता हूं।
फिर मैं इनपुट स्ट्रिंग से प्रत्येक वर्ण को एक अंक के साथ बदल देता हूं। सबसे छोटा (उदाहरण के लिए 'B' 'a' की तुलना में छोटा) 1 हो जाता है, दूसरा सबसे छोटा 2 हो जाता है, और इसलिए 4. अप करने के लिए 4. निश्चित रूप से यह इस बात पर निर्भर करता है कि इनपुट में कितने अलग-अलग वर्ण हैं, उच्चतम अंक क्या है परिणामी स्ट्रिंग होगी
फिर मैं केवल एरे तत्व को प्रिंट करता हूं, जिसमें एक इंडेक्स के रूप में वह स्ट्रिंग है।
एनकोडर तदनुसार कार्य करता है।
कैसे इस्तेमाल करे
या तो एक awk bash लाइन कमांड में कोड को सीधे कॉपी करें या दो फाइल "encode.awk" और "decode.awk" बनाएं और तदनुसार कोड पेस्ट करें। या इससे भी बेहतर निम्नलिखित कोड का उपयोग करें, जो एन / डिकोडिंग के बाद स्वचालित रूप से बाहर निकलता है, या अंत में निकास कमांड को हटाकर कई बार उपयोग किया जा सकता है।
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
मैंने इसे एक प्रोग्रामिंग पहेली के रूप में देखा है। मुझे लगता है कि यह थोड़ा दुखद है, कि यहाँ पर लगभग सब कुछ गोल्फ है, क्योंकि आप अच्छी तरह से प्रलेखित, पठनीय कोड से बहुत कुछ सीख सकते हैं, लेकिन यह सिर्फ मेरी राय है। और मैं इसे अनुरोध की तरह गोल्फ;)