Bir mesajı kendi metnine kodlayan program


13

Verilen metni, mantığı bozmadan girdi olarak sağlanan kendi metnine kodlayan bir program yazın. Program ayrıca, orijinal mesajı metninden geri yükleyerek bir dekoder olarak çalışmalıdır. Dönüşümden sonra kodlama / kod çözme işlevlerini korumalıdır.

Daha resmi olarak, gerekli P programı verilen mesaj metni M ile aşağıdaki dönüşümleri gerçekleştirmelidir:
P (M, P) -> P *
P * (P *) -> M

Burada P * , yukarıdaki kuralları da yerine getirmesi gereken dönüştürülmüş programdır:
P * (M2, P *) -> P **
P ** (P **) -> M2
vb. sonraki kodlama daha önce kodlanmış metni silmez, bu nedenle P ** iki mesaj taşır - M ve M2.

Programın kodlama / kod çözme modları arasında ayrım yapmanın en kolay yolu, ekstra M argümanının varlığıdır, ancak açıkça belirtilmesi koşuluyla, nihai karar size bağlıdır. Program edebilir dosyadan o kendi metni okuyun. Seçilen dilin bunun için bir yolu yoksa, kaynak metin programa başka bir şekilde aktarılabilir.

Elbette önemsiz çözümler var, bu yüzden bu bir popülerlik yarışması. Yine de, program metninde yorumları yasaklayan bir kısıtlama getiriyorum.


Dönüştürülmüş P * programını yeni bir metinle çağırırsam, P ** her iki metni mi yoksa yalnızca sonuncuyu mu içerir?
Tal

Bu yüzden kodlama ve kod çözme sırasında girdi olarak program kodu verilir?
Martin Ender

Programın, kodlanmış bir mesajın kodunu çözmesi istenmesi ile sadece kodlanmış bir mesaj olan bir mesajı kodlaması istenmesi nasıl ayırt edilir?
celtschk

2
@ celtschk OP gösterimi ile değerlendirir: programınıza iki giriş verilirse, ikinci girişteki ilk girişi kodlayın. programa yalnızca bir giriş verilirse, bu girişte en son kodlanan dizeyi ayıklayın.
Martin Ender

4
P * 'yi P **' den geri kazanmanın herhangi bir yolu var mı? Değilse, neden " P ** iki mesaj taşır - M ve M2 "? Üzgünüm, ama bu meydan okuma ilginç görünse de, spec benim için çok kafa karıştırıcı.
Ilmari Karonen

Yanıtlar:


8

Perl

Bu, Perl'de sadece mümkün olduğu için bir astar.

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

Mesajlar __DATA__en son önce yazılır .


Sağlıklı rekabet ve tek ifade nasıl olur?
seequ

Bu, sahip olduğunuzdan oldukça büyük bir değer.
Gilles 'SO- kötü olmayı bırak'

4

piton

Biliyor musun? Neden tek bir ifade yapmıyorsunuz?

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)

Eski mesaj; P fonksiyonu argümanları belirtildiği gibi alır ve sonuçta ortaya çıkan kodu / kodu çözülmüş metni verir.

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

Sorun ifadesini doğru anladığımdan emin değilim: kod çözücüm herhangi bir programı çözer ve verilen programda kodlanmış en son mesajı döndürür.

Test kodu:

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

yığın

@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

'Son satırından' sonra satır başı olması gerektiğini unutmayın goto :EOF.

Bu stdin'den iki girdi alır. Bunlardan ilki yapmak istediğiniz şey; eveya d(kodlama ve kod çözme). İkinci giriş birinciye bağlıdır - ilk giriş ise e, ikinci giriş kodlamak istediğiniz mesaj olacaktır - eğer döyleyse, ikinci giriş kodunu çözmek istediğiniz mesajın numarası olacaktır ( bir mesaj kodlandıktan sonra sağlanmalıdır).

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

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

0

kobra

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)

İken fikri önemsiz, yürütme söz konusu fikrin daha az böyledir.

Kodlama

Programdaki bir mesajın kodlanması, .message = .message ? xhemen ardından satırı ekler def main. Bu satır .messagenil olup olmadığını kontrol eder ve eğer öyleyse, .messagemesajdaki her karakterin karakter kodu değerlerini içeren bir tamsayı dizisine ayarlanır ; sıfır kontrolü ve konumlandırma yeni mesajın üzerine eski mesaj yazılmasını engeller. Yeni programencode.cobra

Decoding

Programın kodunun çözülmesi, ana yöntemin sonuna programın karakter kodlarını .messagebir dizeye dönüştürmesine neden olan üç satır ekler ve bu da daha sonra message.txtyeni program çalıştırıldığında kaydedilir. Daha sonra yeni program kaydedilir decode.cobrave derleyici programa çağrılır.

decode.cobra geçici bir dosya gibi kullanılır ve başka bir mesajı kodlamak veya kodunu çözmek için kullanılamaz, orijinali veya encode.cobra

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.