将消息编码为自己的文本的程序


13

编写一个程序,将给定的文本编码为自己的文本(作为输入提供),而不会破坏其逻辑。该程序还必须充当解码器,从其文本中还原原始消息。转换后必须保留其编码/解码功能。

更正式地说,所需程序P必须使用给定的消息文本M执行以下转换:
P(M,P)-> P *
P *(P *)-> M

这里P *是转换后的程序,还必须满足上述规则,即:
P *(M2,P *)-> P **
P **(P **)-> M2
,依此类推...每个后续编码不会删除先前编码的文本,因此P **携带两条消息-M和M2。

程序区分编码/解码模式的最简单方法是使用额外的参数M,但要明确指出,最终的决定权取决于您。该程序可能会从文件中读取自己的文本。如果所选语言没有实现此目的的手段,则可以通过任何其他方式将源文本传递给程序。

当然,有一些简单的解决方案,所以这是一场人气竞赛。但是,我在程序文本中施加了禁止注释的限制。


如果我用新文本调用转换后的程序P *,P **是否包含两个文本或仅包含最后一个文本?
塔尔2014年

因此,在进行编码和解码时,是否将程序代码作为输入?
Martin Ender 2014年

程序打算如何区分被要求对已编码的消息进行解码和被要求对恰好本身就是已编码的消息进行编码之间的区别?
celtschk 2014年

2
@celtschk用OP表示法判断:如果您的程序有两个输入,则将第一个输入编码为第二个输入。如果仅给程序一个输入,则提取该输入中最近编码的字符串。
Martin Ender 2014年

4
应该有什么方法可以从P **中恢复P *吗?如果不是,为什么要求“ P **携带两个消息-M和M2 ”?抱歉,尽管这个挑战看起来很有趣,但规范对我来说还是太令人困惑了。
Ilmari Karonen 2014年

Answers:



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)

旧消息;函数P接受指定的参数,并输出结果代码/解码文本。

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

的JavaScript

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

这需要来自stdin的两个输入。首先是你想做什么;ed(编码和解码)。第二个输入取决于第一个-如果第一个输入是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

解码

对该程序进行解码将在main方法的末尾添加三行,这将导致该程序将char代码转换.message为字符串,然后将其保存到message.txt新程序运行时。然后将新程序保存到,decode.cobra并在其上调用编译器。

decode.cobra 用作临时文件,不能用于编码或解码其他邮件,使用原始邮件或 encode.cobra

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.