এমন প্রোগ্রাম যা কোনও বার্তাকে তার নিজস্ব লেখায় এনকোড করে


13

এমন একটি প্রোগ্রাম লিখুন যা প্রদত্ত পাঠকে তার যুক্তিতে বাধা না দিয়ে ইনপুট হিসাবে সরবরাহিত নিজের পাঠ্যে এনকোড করে। প্রোগ্রামটি অবশ্যই একটি ডিকোডার হিসাবে কাজ করতে হবে, এর পাঠ্য থেকে মূল বার্তাটি পুনরুদ্ধার করবে। রূপান্তর হওয়ার পরে অবশ্যই এটির এনকোডিং / ডিকোডিং কার্যগুলি ধরে রাখতে হবে।

আরও আনুষ্ঠানিকভাবে বলতে গেলে, প্রয়োজনীয় প্রোগ্রাম পি অবশ্যই প্রদত্ত বার্তার পাঠ্য এম: পি (এম, পি) -> পি * পি * (পি *) -> এম এর সাথে নিম্নলিখিত রূপান্তরগুলি সম্পাদন করবে

এখানে পি * হ'ল রূপান্তরিত প্রোগ্রাম, যা অবশ্যই উপরের বিধিগুলি পূরণ করতে হবে, এটি হল:
পি * (এম 2, পি *) -> পি **
পি ** (পি **) -> এম 2
এবং আরও ... প্রতিটি পরবর্তী এনকোডিং আগের এনকোডযুক্ত পাঠ্যটি মুছবে না, সুতরাং পি ** দুটি বার্তা বহন করবে - এম এবং এম 2।

প্রোগ্রামটির এনকোডিং / ডিকোডিং মোডের মধ্যে পার্থক্য করার সবচেয়ে সহজ উপায় হ'ল অতিরিক্ত যুক্তি এম এর উপস্থিতি দ্বারা, তবে চূড়ান্ত সিদ্ধান্তটি আপনার উপর নির্ভর করে শর্ত থাকে যে এটি স্পষ্টভাবে বলা আছে is প্রোগ্রামটি ফাইল থেকে এটির নিজস্ব পাঠ্য পড়তে পারে । যদি নির্বাচিত ভাষার কাছে এর অর্থ না থাকে তবে উত্স পাঠ্যটি অন্য কোনও উপায়ে প্রোগ্রামে পাঠানো যেতে পারে।

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


আমি যদি একটি নতুন পাঠ্য সহ রূপান্তরিত প্রোগ্রাম পি * কে কল করি তবে পি ** এ দুটি পাঠ্যই বা কেবল সর্বশেষটি থাকতে পারে?
তাল

সুতরাং এনকোডিং এবং ডিকোডিংয়ের সময় আমাকে প্রোগ্রামগুলি ইনপুট হিসাবে দেওয়া হচ্ছে?
মার্টিন ইন্ডার

প্রোগ্রামটি কীভাবে কোনও এনকোডযুক্ত বার্তা ডিকোড করার অনুরোধ জানানো হচ্ছে, এবং একটি বার্তা এনকোড করতে বলা হচ্ছে যা নিজেই একটি এনকোড বার্তা বলে মনে হয়?
celtschk

2
@celtschk অপারেশন স্বরলিপি দ্বারা বিচার করা: আপনার প্রোগ্রামটি যদি দুটি ইনপুট দেওয়া হয় তবে দ্বিতীয় ইনপুটটিতে প্রথম ইনপুট এনকোড করুন। প্রোগ্রামটি যদি কেবল একটি ইনপুট দেওয়া হয় তবে সেই ইনপুটটিতে সদ্যই এনকোড করা স্ট্রিংটি বের করুন।
মার্টিন ইন্ডার

4
পি ** থেকে পি * পুনরুদ্ধার করার কোনও উপায় থাকার কথা রয়েছে কি? যদি তা না হয় তবে কেন প্রয়োজন যে " পি ** " এম এবং এম 2 " দুটি বার্তা বহন করে ? আমি দুঃখিত, তবে যদিও এই চ্যালেঞ্জটি আকর্ষণীয় বলে মনে হচ্ছে, তবে অনুমানটি আমার পক্ষে খুব বিভ্রান্তিকর।
ইলমারি করোনেন

উত্তর:


8

পার্ল

পার্লের এটি এক-লাইনার কেবল এটি সম্ভব হওয়ার কারণে।

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

বার্তাগুলি পরে লেখা হয় __DATA__, সবচেয়ে সাম্প্রতিক প্রথম।


স্বাস্থ্যকর প্রতিযোগিতা এবং একক প্রকাশ সম্পর্কে কীভাবে?
seequ

এটি আপনি পেয়েছেন একটি এটির বেশ বড় মূল্য।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

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বার্তায় প্রতিটি বর্ণের বর্ণচিহ্নের কোড মান সহ একটি পূর্ণসংখ্যা অ্যারেতে সেট করে; শূন্য-চেক এবং অবস্থান কোনও পুরানো বার্তায় নতুন বার্তাটি ওভাররাইট করা এড়ায়। নতুন প্রোগ্রাম এ সংরক্ষণ করা হয়encode.cobra

গঠনের কথা মাথায় রেখে

প্রোগ্রামটির ডিকোডিংটি মূল পদ্ধতির শেষে তিনটি লাইন যুক্ত করবে যার ফলে প্রোগ্রামটি চর কোডগুলিকে .messageএকটি স্ট্রিংয়ে রূপান্তরিত করে , যা message.txtনতুন প্রোগ্রামটি চালিত হওয়ার পরে সংরক্ষণ করা হয়। তারপরে নতুন প্রোগ্রামটি সেভ করা হবে decode.cobraএবং এতে সংকলকটি ডাকা হবে।

decode.cobra একটি অস্থায়ী ফাইলের মতো ব্যবহৃত হয় এবং অন্য কোনও বার্তা এনকোড বা ডিকোড করতে, আসলটি বা ব্যবহার করতে পারে না encode.cobra

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.