メッセージを独自のテキストにエンコードするプログラム


13

ロジックを中断することなく、入力として提供されるテキストを独自のテキストにエンコードするプログラムを作成します。プログラムはデコーダーとしても機能し、テキストから元のメッセージを復元する必要があります。変換後もエンコード/デコード機能を保持する必要があります。

より正式には、必要なプログラムPは、指定されたメッセージテキストMを使用して次の変換を実行する必要があります
。P(M、P)-> P *
P *(P *)-> M

ここで、P *は変換されたプログラムであり、上記のルールも満たす必要があります。つまり、
P *(M2、P *)-> P **
P **(P **)-> M2
など...後続のエンコードでは、以前にエンコードされたテキストが消去されないため、P **は2つのメッセージMとM2を運びます。

プログラムがエンコード/デコードモードを区別する最も簡単な方法は、追加の引数Mを使用することです。ただし、最終的な決定は、明確に指定されていれば、ユーザー次第です。プログラム、ファイルから独自のテキストを読み取る場合があります。選択した言語にこの手段がない場合、ソーステキストを他の方法でプログラムに渡すことができます。

もちろん些細な解決策もあるので、これはかなり人気のあるコンテストです。それにもかかわらず、私はプログラムのテキストにコメントを禁止する制限を課しています。


変換されたプログラムP *を新しいテキストで呼び出す場合、P **には両方のテキストが含まれていますか、それとも最後のテキストのみが含まれていますか?
タル14年

それで、エンコードとデコードの際に入力としてプログラムコードが与えられますか?
マーティンエンダー14年

プログラムは、エンコードされたメッセージをデコードするように求められることと、たまたまエンコードされたメッセージであるメッセージをエンコードするように求められることを区別することをどのように意図していますか?
celtschk 14年

2
OP表記で判断する@celtschk:プログラムに2つの入力が与えられている場合、最初の入力を2番目の入力にエンコードします。プログラムに入力が1つしか与えられていない場合は、その入力で最後にエンコードされた文字列を抽出します。
マーティンエンダー

4
P **からP *を回復する方法はありますか?そうでない場合、「P **が2つのメッセージを運ぶ-MとM2」を必要とするのはなぜですか?申し訳ありませんが、この課題は興味深いように見えますが、仕様は私にとってあまりにも紛らわしいです。
イルマリカロネン14年

回答:


8

Perl

可能だからこそ、これはPerlのワンライナーです。

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

メッセージはの後__DATA__に書き込まれ、最新のものが最初です。


健康的な競争と単一の表現はどうですか?
seequ 14年

それはあなたがそこに持っているもののかなり大きな価値です。
ジル 'SO-悪であるのをやめる'

4

Python

あのね?なぜそれを単一の表現にしないのですか?

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から2つの入力を受け取ります。最初はあなたがやりたいことです。e、またはd(エンコードおよびデコード)。2番目の入力は最初に依存します-最初の入力がのe場合、2番目の入力はエンコードするメッセージになります-の場合d、2番目の入力はデコードするメッセージの番号になります(つまり、メッセージのエンコード後に提供されます)。

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ます。この行は、.messagenilであるかどうかをチェックし、nilである場合.message、メッセージ内の各文字の文字コード値を含む整数配列に設定します。nil-checkとポジショニングにより、新しいメッセージが古いメッセージで上書きされるのを防ぎます。新しいプログラムはに保存されますencode.cobra

デコード

プログラムをデコードすると、mainメソッドの最後に3行が追加されます。これにより、プログラムは文字コードを.message文字列に変換しmessage.txt、新しいプログラムの実行時に保存されます。次に、新しいプログラムが保存されdecode.cobra、その上でコンパイラが呼び出されます。

decode.cobra 一時ファイルのように使用され、別のメッセージのエンコードまたはデコード、元のファイルの使用、または encode.cobra

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.