डायनामिक ASCII एनकोडर!


16

परिचय

कुछ ASCII पात्र इन दिनों इतने महंगे हैं ...

पैसे बचाने के लिए आपने एक प्रोग्राम लिखने का फैसला किया है, जिसमें सस्ते अक्षरों का उपयोग करके महंगे चरित्रों को एनकोड किया गया है।

हालाँकि, चरित्र की कीमतें बार-बार बदलती हैं और आप हर बार अपने कार्यक्रम को संशोधित करने और किसी अलग चरित्र को डिकोड करने की आवश्यकता नहीं चाहते हैं! आपको अधिक गतिशील समाधान की आवश्यकता होगी।

चुनौती

आपका कार्य दो प्रोग्राम लिखना है: एक एनकोडर और एक डिकोडर

एनकोडर पाँच सस्ती वर्णों की एक सूची, और एक एकल महंगा चरित्र को स्वीकार करना चाहिए।

यह सस्ती पात्रों से बना एक एकल स्ट्रिंग का उत्पादन करना चाहिए, जो महंगे चरित्र को एन्कोड करता है।

यह स्ट्रिंग 4 वर्णों से अधिक लंबी नहीं हो सकती हैसस्ती । हालाँकि, यह एन्कोडिंग में सभी सस्ती पात्रों का उपयोग करने की आवश्यकता नहीं है और एन्कोडिंग अलग-अलग लंबाई के हो सकते हैं।


विकोडक स्ट्रिंग एनकोडर द्वारा outputted, और उत्पादन महंगा चरित्र को स्वीकार करना चाहिए।

डिकोडर एन्कोडेड स्ट्रिंग के अलावा कोई इनपुट स्वीकार नहीं करेगा। यह इनपुट के किसी भी (वैध) संयोजन के लिए एनकोडर के आउटपुट से अनमॉडिफाइड होकर काम करना चाहिए। दूसरे शब्दों में, आपका डिकोडर प्रोग्राम को यह पता नहीं होता है कि कौन से अक्षर महंगे या सस्ते हैं।

स्कोरिंग

सबसे छोटा संयुक्त कोड जीतता है!

टिप्पणियाँ

  • सभी वर्ण या तो अपरकेस अक्षर [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 सस्ते पात्रों के लिए ASCII कोडों का जोड़? वास्तव में, इस प्रश्न का केवल एक आधार है यदि आपका डिकोडर उत्पन्न होने वाली सभी एन्कोडिंग संभावनाओं के लिए डिकोड होना चाहिए।
कोल

स्पष्ट होने के लिए: एनकोडर संभावनाएं केवल उदाहरण हैं और हम प्रत्येक चरित्र को एन्कोड कर सकते हैं जैसे हम चाहते हैं, हां?
डेनिस

@ डेनिस हां, वे सिर्फ उदाहरण हैं।
2

@ कोई वास्तविक एल्गोरिथ्म दिए बिना , क्योंकि यहां मुख्य चुनौती है, मेरा मानना ​​है कि यह संभव है। सांकेतिक शब्दों में बदलने के लिए केवल 62 संभावित महंगे पत्र हैं, और इन 4 एससीआई अक्षर के साथ 92 तक एनकोडेड किया जा सकता है, A999914 के अनुसार । (इस एक के लिए PhiNotPi के सैंडबॉक्स टिप्पणी के लिए बहुत बड़ा धन्यवाद - मैंने गणना नहीं की कि वास्तव में कितने एन्कोड किए जा सकते हैं)
jrich

@UndefinedFunction मुझे एहसास है कि अब आप क्या चाहते हैं: डेनिस के सवाल का जवाब दिया कि मैं किस बारे में उलझन में था।
कोल

जवाबों:


5

पायथ, 46 बाइट्स

एनकोडर, 22 बाइट्स

@smfql{Td^<Szd4S4-Cw48

डिकोडर, 24 बाइट्स

C+48xsmfql{Td^<sS{zd4S4z

वाह, यह पूरी तरह से फिट बैठता है। 75 अलग-अलग चार-संयोजन और 75 की एक चार-रेंज।
जेक्यूब

मुझे लगता है कि आप की जगह ले सकता S4के साथ Tऔर दोनों कार्यक्रमों में हर एक बाइट सहेजें।
जकूबे

7

CJam, 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

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

मैंने इसे एक प्रोग्रामिंग पहेली के रूप में देखा है। मुझे लगता है कि यह थोड़ा दुखद है, कि यहाँ पर लगभग सब कुछ गोल्फ है, क्योंकि आप अच्छी तरह से प्रलेखित, पठनीय कोड से बहुत कुछ सीख सकते हैं, लेकिन यह सिर्फ मेरी राय है। और मैं इसे अनुरोध की तरह गोल्फ;)


इसका परीक्षण कैसे करें? कृपया कुछ उदाहरण साझा करें।
श्रवण यादव

महान विवरण के लिए +1! लगता है कि इस समस्या से
निपटने के

1
यह मेरी विचार प्रक्रिया के समान था सिवाय इसके कि मुझे अनोखे कमजोर संयोजनों (जहां आपने सबसे बड़ा अंक अंकों की मात्रा से अधिक नहीं होने का वर्णन किया था) के लिए एक व्यावहारिक दृष्टिकोण था। के माध्यम से पीछा करने के लिए यश।
पैट्रिक रॉबर्ट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.