प्रोग्राम जो एक संदेश को अपने पाठ में एनकोड करता है


13

एक प्रोग्राम लिखिए जो दिए गए पाठ को अपने स्वयं के पाठ में एन्कोड करता है, इनपुट के रूप में प्रदान किया जाता है, बिना उसके तर्क को बाधित किए। कार्यक्रम को डिकोडर के रूप में भी काम करना चाहिए, मूल संदेश को उसके पाठ से पुनर्स्थापित करना। यह परिवर्तन के बाद अपने एन्कोडिंग / डिकोडिंग कार्यों को बनाए रखना चाहिए।

औपचारिक रूप से बोलते हुए, आवश्यक प्रोग्राम P को दिए गए संदेश टेक्स्ट M: P (M, P) -> P * P * (P *) -> M के साथ निम्नलिखित परिवर्तन करना चाहिए

यहाँ P * रूपांतरित कार्यक्रम है, जिसे उपरोक्त नियमों को भी पूरा करना होगा, वह है:
P * (M2, P *) -> P **
P ** (P **) -> M2
और इसी तरह ... प्रत्येक बाद में एन्कोडिंग पहले एन्कोडेड पाठ को नहीं मिटाता है, इसलिए पी ** दो संदेशों को ले जाता है - एम और एम 2।

एन्कोडिंग / डिकोडिंग मोड के बीच अंतर करने के लिए कार्यक्रम का सबसे आसान तरीका अतिरिक्त तर्क एम की उपस्थिति से है, लेकिन अंतिम निर्णय आप पर है, बशर्ते यह स्पष्ट रूप से कहा गया हो। प्रोग्राम पढ़ सकता है यह फ़ाइल से स्वयं का पाठ है। यदि इसके लिए चुनी गई भाषा का अर्थ नहीं है, तो स्रोत पाठ को किसी अन्य तरीके से कार्यक्रम में पारित किया जा सकता है।

बेशक, तुच्छ समाधान हैं, इसलिए यह एक लोकप्रियता प्रतियोगिता है। फिर भी, मैं कार्यक्रम के पाठ में टिप्पणियों को मना करने पर प्रतिबंध लगाता हूं।


यदि मैं एक नए पाठ के साथ परिवर्तित कार्यक्रम P * को कॉल करता हूं, तो P ** में दोनों पाठ या केवल अंतिम एक है?
ताल

तो मुझे प्रोग्राम कोड इनपुट के रूप में दिया जाता है जब एन्कोडिंग और डिकोडिंग?
मार्टिन एंडर

एक एन्कोडेड संदेश को डिकोड करने के लिए कहा जा रहा है, और एक संदेश को एनकोड करने के लिए कहा जा रहा है, जो केवल एक एन्कोडेड संदेश होने के लिए होता है?
celtschk

2
ओपीएस नोटेशन द्वारा @celtschk को देखते हुए: यदि आपके प्रोग्राम को दो इनपुट दिए गए हैं, तो दूसरे इनपुट में पहले इनपुट को एनकोड करें। यदि प्रोग्राम को केवल एक इनपुट दिया जाता है, तो उस इनपुट में हाल ही में एन्कोड किए गए स्ट्रिंग को निकालें।
मार्टिन एंडर

4
क्या P ** से P * को पुनर्प्राप्त करने का कोई तरीका है? यदि नहीं, तो क्यों आवश्यक है कि " P ** दो संदेश - M और M2 " वहन करता है ? मुझे खेद है, लेकिन यद्यपि यह चुनौती दिलचस्प लग रही है, लेकिन युक्ति मेरे लिए बहुत भ्रमित करने वाली है।
इल्मरी करोनें

जवाबों:


8

पर्ल

यह पर्ल में एक-लाइनर सिर्फ इसलिए है क्योंकि यह संभव है।

if($ARGV[0]){open(F,__FILE__);while(<F>){print;print"$ARGV[0]\n"if/^_/;}}else{print<DATA>;}
__DATA__

संदेश के बाद लिखा जाता है __DATA__, सबसे हाल ही में पहले।


स्वस्थ प्रतिस्पर्धा और एकल अभिव्यक्ति के बारे में कैसे?
देखिए

यह एक बहुत बड़ा मूल्य है जो आपको वहां मिला है।
गिलेस एसओ- बुराई को रोकना '

4

अजगर

आपको पता है कि? इसे एक ही अभिव्यक्ति क्यों नहीं बनाते?

P = (lambda M,P=None:(lambda t:P[:74]+repr(M)[1:-1]+"'))"if P else M[74:-3])(''))
Pc = "(lambda M,P=None:(lambda t:P[:74]+repr(M)[1:-1]+\"'))\"if P else M[74:-3])(''))"
P2c = P('Hi there, mate!', Pc)
print "Encode tests:"
print " P2 = P('Hi there, mate!', Pc) =", P2c
exec 'P2 = ' + P2c
print " P2(\"Test 2's the best.\", P2c) =", P2("Test 2's the best.", P2c)

print "Decode tests:"
print "P2(P2) =", P2(P2c)
print "P(P2)  =", P(P2c)
print "P2(P)  =", P2(Pc)
print "P(P)   =", P(Pc)

पुराना संदेश; फ़ंक्शन पी निर्दिष्ट के रूप में तर्कों को लेता है और परिणामस्वरूप कोड / डिकोड किए गए पाठ को आउटपुट करता है।

def P(data,func=None):
    text = ""
    if func:
        return func[:35]+data+'"\n'+'\n'.join(func.split('\n')[2:])
    return data[35:].split('\n')[0][:-1]

# The source code.
Pc = """def P(data,func=None):
    text = ""
    if func:
        return func[:35]+data+'"\\n'+'\\n'.join(func.split('\\n')[2:])
    return data[35:].split('\\n')[0][:-1]"""

P2c = P('Hi there, mate!', Pc)
print "Encode test:"
print "P('Hi there, mate!', P) ->"
print P2c

# This is outputted by P('Hi there, mate!', code-of-P)
def P2(data,func=None):
    text = "Hi there, mate!"
    if func:
        return func[:35]+data+'"\n'+'\n'.join(func.split('\n')[2:])
    return data[35:].split('\n')[0][:-1]

print "P2('Text 2', P2) -<"
print P2('Text 2', P2c)

print "Decode test:"
print "P2(P2) =", P2(P2c)
print "P(P2)  =", P(P2c)
print "P2(P)  =", P2(Pc)
print "P(P)   =", P(Pc)

2

जावास्क्रिप्ट

var transform = function (p, m) {
    var _M_ = '';
    var source = arguments.callee.toString();
    var msgre = /(_M_ = ').*(';)/;
    var regex = new RegExp(source.replace(/[.*+?^$\[\]{}()\\|]/g, "\\$&").replace(msgre, "$1(.*)$2"));

    var a = p.toString().match(regex);

    if (!a) {
        throw "first argument must be a transform function"
    } else {
        a = a[1];
    }

    if (typeof m == "undefined") {
        return eval("[" + a.split("|")[0] + "]").map(x=>String.fromCharCode(x)).join("");
    } else {
        a = m.toString().split("").map(x => x.charCodeAt(0)) + (a.length ? "|" + a: a);
        return eval("(" + source.replace(msgre, "$1" + a + "$2") + ")");
    }
}

सुनिश्चित नहीं है कि अगर मैं समस्या कथन को सही ढंग से समझता हूं: मेरा डिकोडर किसी भी प्रोग्राम को डिकोड करेगा और दिए गए प्रोग्राम में एन्कोडेड नवीनतम संदेश लौटाएगा।

टेस्ट कोड:

P1 = transform(transform, "first message");
P2 = P1(P1, "second message");

console.log(P1(P1));
console.log(P2(P2));

console.log(P2(P1));
console.log(P1(P2));

// Unspecified behavior
console.log(transform(transform))

2

जत्था

@echo off

setLocal enableDelayedExpansion
for /f %%a in (%0) do set a=%%a

if "%~1"=="e" (
    set /a a+=1
    echo !a! %~2 >> %0
    echo message encoded as !a!
) else if "%~1"=="d" for /f "skip=12 tokens=1*" %%a in (%0) do if "%%a"=="%~2" echo %%b

goto :EOF

ध्यान दें कि 'अंतिम पंक्ति' के बाद गाड़ी वापसी की आवश्यकता है goto :EOF

यह स्टड से दो इनपुट लेता है। पहला जो आप करना चाहते हैं; e, या d(सांकेतिक शब्दों में बदलना और डिकोड)। दूसरा इनपुट पहले पर निर्भर करता है - यदि पहला इनपुट है e, तो दूसरा इनपुट वह संदेश होगा जिसे आप एनकोड करना चाहते हैं - यदि यह है d, तो दूसरा इनपुट उस संदेश की संख्या होगी जिसे आप डिकोड करना चाहते हैं (वह होगा) एक संदेश एन्कोडिंग के बाद प्रदान किया जाएगा)।

H:\uprof>ed.bat e "Just a message"
message encoded as 1

H:\uprof>ed.bat d 1
Just a message

0

कोबरा

use System.Diagnostics
class Program
    var message as int[]? = nil
    def decode(program as String)
        temp = List<of String>(program.split('\n'))
        temp.insert(4, '\t\tEnvironment.exit(0)')
        temp.add('\t\tmessage = \'\'')
        temp.add('\t\tfor i in .message, message += Convert.toString(i to char)')
        temp.add('\t\tFile.writeAllText(\'message.txt\', message)')
        program = temp.join('\n')
        File.writeAllText('decode.cobra', program)
        process = Process()
        process.startInfo.fileName = 'cmd.exe'
        process.startInfo.arguments = '/C cobra decode.cobra'
        process.start
    def encode(message as String, program as String)
        temp = List<of String>()
        for i in message.toCharArray, temp.add(Convert.toString(i to int))
        message = '@' + Convert.toString(c'[')
        for n in temp.count-1, message += temp[n] + ','
        message += temp.pop + ']'
        temp = List<of String>(program.split('\n'))
        temp.insert(26,'\t\t.message = .message ? [message]')
        program = temp.join('\n')
        File.writeAllText('encode.cobra', program)
    def main
        #call methods here
        #.encode(message, program)
        #.decode(program)

जबकि विचार तुच्छ है, उक्त विचार का निष्पादन कम है।

एन्कोडिंग

कार्यक्रम में एक संदेश एन्कोडिंग के .message = .message ? xतुरंत बाद लाइन जोड़ देगा def main। यह रेखा चेक करती है कि .messageक्या शून्य है, और यदि ऐसा है, तो यह .messageएक पूर्णांक सरणी पर सेट होता है जिसमें संदेश में प्रत्येक वर्ण के वर्ण कोड मान होते हैं; nil-check और पोजिशनिंग नए संदेश को पुराने के साथ अधिलेखित करने से बचें। नया प्रोग्राम सहेजा गया हैencode.cobra

डिकोडिंग

प्रोग्राम को डिकोड करना मुख्य विधि के अंत में तीन लाइनें जोड़ देगा जो प्रोग्राम को चार कोड .messageको स्ट्रिंग में बदलने का कारण बनता है , जिसे तब message.txtनया प्रोग्राम चलाने पर सहेजा जाता है। नए प्रोग्राम को तब सेव किया जाता है decode.cobraऔर कंपाइलर को उस पर लगाया जाता है।

decode.cobra एक अस्थायी फ़ाइल की तरह उपयोग किया जाता है और इसका उपयोग किसी अन्य संदेश को एन्कोड या डिकोड करने के लिए नहीं किया जा सकता है, मूल का उपयोग करें या encode.cobra

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.