메시지를 자체 텍스트로 인코딩하는 프로그램


13

주어진 텍스트를 논리를 방해하지 않고 입력으로 제공되는 자체 텍스트로 인코딩하는 프로그램을 작성하십시오. 또한 프로그램은 텍스트에서 원래 메시지를 복원하여 디코더로 작동해야합니다. 변환 후 인코딩 / 디코딩 기능을 유지해야합니다.

보다 공식적으로 말하면, 필수 프로그램 P는 주어진 메시지 텍스트 M을 사용하여 다음 변환을 수행해야합니다.
P (M, P)-> P *
P * (P *)-> M

여기서 P * 는 변환 된 프로그램이며, 위의 규칙을 만족해야합니다. 즉
P * (M2, P *)-> P **
P ** (P **)-> M2
등 ... 각각 후속 인코딩은 이전에 인코딩 된 텍스트를 지우지 않으므로 P **는 M과 M2의 두 가지 메시지를 전달합니다.

프로그램이 인코딩 / 디코딩 모드를 구별하는 가장 쉬운 방법은 추가 인수 M의 존재에 의한 것이지만, 최종 결정은 명확하게 명시되어있는 한 귀하에게 달려 있습니다. 프로그램 파일에서 자신의 텍스트를 읽을 수 있습니다. 선택한 언어에이 기능이 없으면 소스 텍스트를 다른 방식으로 프로그램에 전달할 수 있습니다.

물론 사소한 해결책이 있기 때문에 이것은 인기있는 대회입니다. 그럼에도 불구하고, 나는 프로그램 텍스트에 주석을 금지하는 것을 제한합니다.


변환 된 프로그램 P *를 새 텍스트로 호출하면 P **에 두 텍스트 또는 마지막 텍스트 만 포함됩니까?
Tal

인코딩 및 디코딩 할 때 프로그램 코드를 입력으로 받습니까?
Martin Ender 2016 년

프로그램은 인코딩 된 메시지를 디코딩하도록 요청받는 것과 인코딩 된 메시지 자체 인 메시지를 인코딩하도록 요청하는 것을 어떻게 구별 하는가?
celtschk

2
OP 표기법으로 판단한 @celtschk : 프로그램에 두 개의 입력이 제공되면 두 번째 입력의 첫 번째 입력을 인코딩하십시오. 프로그램에 입력이 하나만 있으면 해당 입력에서 가장 최근에 인코딩 된 문자열을 추출하십시오.
Martin Ender

4
P **에서 P *를 복구 할 수있는 방법이 있습니까? 그렇지 않다면 왜 " P **가 두 개의 메시지-M과 M2를 전달 "해야합니까? 죄송하지만이 문제가 흥미로워 보이지만 사양이 너무 혼란 스럽습니다.
Ilmari Karonen 2016 년

답변:


8

이것은 가능하기 때문에 Perl에서 하나의 라이너입니다.

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

메시지는 __DATA__가장 최근에 작성된 후에 작성 됩니다.


건전한 경쟁과 단일 표현은 어떻습니까?
seequ

그것은 당신이 가진 것의 꽤 큰 가치입니다.
Gilles 'SO- 악마 그만해'

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

자바 스크립트

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에서 두 개의 입력을받습니다. 첫 번째는 당신이하고 싶은 것입니다. 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은 nil 인지 검사 하고, 그렇다면 nil .message메시지에서 각 문자의 문자 코드 값을 포함하는 정수 배열로 설정 합니다. 무 검사 및 위치 지정은 새 메시지를 이전 메시지로 덮어 쓰지 않습니다. 새로운 프로그램은encode.cobra

디코딩

프로그램을 디코딩하면 기본 메소드의 끝에 3 줄이 추가되어 프로그램이 문자 코드를 .message문자열 로 변환 한 다음 message.txt새 프로그램이 실행될 때 저장됩니다 . 그런 다음 새 프로그램이 저장되고 decode.cobra컴파일러가 호출됩니다.

decode.cobra 임시 파일처럼 사용되며 다른 메시지를 인코딩 또는 디코딩하는 데 사용할 수 없습니다. 원본 또는 encode.cobra

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.