Chương trình mã hóa tin nhắn thành văn bản của chính nó


13

Viết chương trình mã hóa văn bản đã cho thành văn bản của chính nó, được cung cấp làm đầu vào, mà không làm gián đoạn logic của nó. Chương trình cũng phải hoạt động như một bộ giải mã, khôi phục thông điệp gốc từ văn bản của nó. Nó phải giữ lại các chức năng mã hóa / giải mã sau khi chuyển đổi.

Nói một cách chính thức hơn, chương trình bắt buộc P phải thực hiện các phép biến đổi sau với văn bản thông báo đã cho M:
P (M, P) -> P *
P * (P *) -> M

Ở đây P * là chương trình được chuyển đổi, cũng phải đáp ứng các quy tắc trên, đó là:
P * (M2, P *) -> P **
P ** (P **) -> M2
, v.v ... Mỗi mã hóa tiếp theo không xóa văn bản được mã hóa trước đó, vì vậy P ** mang hai thông điệp - M và M2.

Cách dễ nhất để chương trình phân biệt giữa các chế độ mã hóa / giải mã là sự hiện diện của đối số phụ M, nhưng quyết định cuối cùng là tùy thuộc vào bạn, miễn là nó được nêu rõ. Chương trình có thể đọc văn bản của chính nó từ tệp. Nếu ngôn ngữ được chọn không có nghĩa cho việc này, văn bản nguồn có thể được chuyển đến chương trình theo bất kỳ cách nào khác.

Có những giải pháp tầm thường, tất nhiên, vì vậy đây là một cuộc thi phổ biến. Tuy nhiên, tôi áp đặt các hạn chế cấm bình luận trong văn bản chương trình.


Nếu tôi gọi chương trình đã chuyển đổi P * bằng một văn bản mới, P ** có chứa cả hai văn bản hay chỉ là văn bản cuối cùng không?
Tal

Vì vậy, tôi được cung cấp mã chương trình là đầu vào khi mã hóa và giải mã?
Martin Ender

Làm thế nào để chương trình có ý định phân biệt giữa việc được yêu cầu giải mã một tin nhắn được mã hóa và được yêu cầu mã hóa một tin nhắn mà chính nó là một tin nhắn được mã hóa?
celtschk

2
@celtschk đánh giá theo ký hiệu OP: nếu chương trình của bạn được cung cấp hai đầu vào, hãy mã hóa đầu vào đầu tiên trong đầu vào thứ hai. nếu chương trình chỉ được cung cấp một đầu vào, hãy trích xuất chuỗi được mã hóa gần đây nhất trong đầu vào đó.
Martin Ender

4
Có cách nào để phục hồi P * từ P ** không? Nếu không, tại sao yêu cầu " P ** mang hai thông điệp - M và M2 "? Tôi xin lỗi, nhưng mặc dù thử thách này có vẻ thú vị, nhưng thông số kỹ thuật này quá khó hiểu đối với tôi.
Ilmari Karonen

Câu trả lời:


8

Perl

Đây là một lớp lót trong Perl chỉ vì nó có thể.

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

Các tin nhắn được viết sau __DATA__, gần đây nhất đầu tiên.


Làm thế nào về cạnh tranh lành mạnh và biểu hiện duy nhất?
xem

Đó là một giá trị khá lớn của một trong những bạn đã có ở đó.
Gilles 'SO- ngừng trở nên xấu xa'

4

Con trăn

Bạn biết gì? Tại sao không làm cho nó một biểu thức duy nhất?

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)

Tin nhắn cũ; Hàm P nhận các đối số như được chỉ định và xuất ra mã kết quả / văn bản được giải mã.

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") + ")");
    }
}

Không chắc chắn nếu tôi hiểu chính xác tuyên bố vấn đề: bộ giải mã của tôi sẽ giải mã bất kỳ chương trình nào và trả về tin nhắn mới nhất được mã hóa trong chương trình đã cho.

Mã kiểm tra:

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

Lô hàng

@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

Lưu ý rằng cần phải có một sự trở lại vận chuyển sau 'dòng cuối cùng' của goto :EOF.

Điều này có hai đầu vào từ stdin. Đầu tiên là những gì bạn muốn làm; ehoặc d(mã hóa và giải mã). Đầu vào thứ hai phụ thuộc vào đầu tiên - nếu đầu vào thứ nhất là e, thì đầu vào thứ hai sẽ là thông điệp mà bạn muốn mã hóa - nếu có d, thì đầu vào thứ hai sẽ là số lượng tin nhắn bạn muốn giải mã (đó sẽ là được cung cấp sau khi mã hóa một tin nhắn).

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

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

0

Rắn hổ mang

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)

Trong khi ý tưởng là tầm thường, thì việc thực hiện ý tưởng nói trên lại ít như vậy.

Mã hóa

Mã hóa một tin nhắn trong chương trình sẽ thêm dòng .message = .message ? xngay sau đó def main. Dòng này kiểm tra xem .messagecó phải không và nếu có thì nó đặt .messagethành một mảng số nguyên chứa các giá trị mã ký tự của mỗi ký tự trong thông báo; nil-check và định vị tránh ghi đè tin nhắn mới bằng tin nhắn cũ. Chương trình mới được lưu vàoencode.cobra

Giải mã

Giải mã chương trình sẽ thêm ba dòng ở cuối phương thức chính khiến chương trình chuyển đổi mã char .messagethành chuỗi, sau đó được lưu vào message.txtkhi chương trình mới được chạy. Chương trình mới sau đó được lưu vào decode.cobravà trình biên dịch được gọi trên đó.

decode.cobra được sử dụng như một tệp tạm thời và không thể được sử dụng để mã hóa hoặc giải mã tin nhắn khác, sử dụng bản gốc hoặc encode.cobra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.