Schreiben Sie ein Programm, das bestimmten Text in einen eigenen Text codiert, der als Eingabe bereitgestellt wird, ohne seine Logik zu stören. Das Programm muss auch als Decoder arbeiten und die ursprüngliche Nachricht aus ihrem Text wiederherstellen. Es muss seine Codierungs- / Decodierungsfunktionen nach der Transformation beibehalten.
Genauer gesagt muss das erforderliche Programm P die folgenden Transformationen mit dem gegebenen Nachrichtentext M durchführen:
P (M, P) -> P *
P * (P *) -> M
Hier ist P * das transformierte Programm, das auch die obigen Regeln erfüllen muss, das heißt:
P * (M2, P *) -> P **
P ** (P **) -> M2
und so weiter ... Jeder Bei der nachfolgenden Codierung wird zuvor codierter Text nicht gelöscht, sodass P ** zwei Nachrichten enthält - M und M2.
Der einfachste Weg für das Programm, zwischen Codierungs- / Decodierungsmodi zu unterscheiden, ist das Vorhandensein des zusätzlichen Arguments M, aber die endgültige Entscheidung liegt bei Ihnen, sofern dies klar angegeben ist. Das Programm liest möglicherweise seinen eigenen Text aus der Datei. Wenn die gewählte Sprache keine Mittel dafür hat, kann der Quelltext auf andere Weise an das Programm übergeben werden.
Natürlich gibt es triviale Lösungen, daher ist dies eher ein Beliebtheitswettbewerb. Trotzdem schränke ich das Verbieten von Kommentaren im Programmtext ein.
quelle
Antworten:
Perl
Dies ist ein Einzeiler in Perl, nur weil es möglich ist.
Die Nachrichten werden nach
__DATA__
der neuesten zuerst geschrieben.quelle
Python
Weißt du was? Warum nicht einen einzelnen Ausdruck daraus machen?
Alte Nachricht; Die Funktion P nimmt die angegebenen Argumente und gibt den resultierenden Code / dekodierten Text aus.
quelle
JavaScript
Ich bin mir nicht sicher, ob ich die Problembeschreibung richtig verstehe: Mein Decoder decodiert alle Programme und gibt die neueste Nachricht zurück, die im angegebenen Programm codiert ist.
Testcode:
quelle
Stapel
Beachten Sie, dass nach 'der letzten Zeile' von ein Wagenrücklauf erfolgen muss
goto :EOF
.Dies nimmt zwei Eingaben von stdin entgegen. Der erste ist, was Sie tun möchten;
e
, oderd
(codieren und decodieren). Der zweite Eingang hängt vom ersten ab - wenn der erste Eingang iste
, dann ist der zweite Eingang die Nachricht, die Sie codieren möchten - wenn dies der Fall istd
, ist der zweite Eingang die Nummer der Nachricht, die Sie decodieren möchten (das wird bereitgestellt werden, nachdem eine Nachricht verschlüsselt wurde).quelle
Kobra
Während die Idee trivial ist, ist die Ausführung der Idee weniger.
Codierung
Das Codieren einer Nachricht im Programm fügt die Zeile
.message = .message ? x
unmittelbar danach hinzudef main
. Diese Zeile prüft, ob.message
Null ist, und wenn ja, setzt sie.message
auf ein ganzzahliges Array gesetzt, das die Zeichencodewerte jedes Zeichens in der Nachricht enthält. Durch die Null-Prüfung und -Positionierung wird vermieden, dass die neue Nachricht mit einer älteren überschrieben wird. Das neue Programm wird in gespeichertencode.cobra
Dekodierung
Beim Dekodieren des Programms werden am Ende der Hauptmethode drei Zeilen hinzugefügt, die bewirken, dass das Programm die Zeichencodes in
.message
eine Zeichenfolge konvertiert , die dannmessage.txt
beim Ausführen des neuen Programms gespeichert wird. Das neue Programm wird dann in gespeichertdecode.cobra
und der Compiler wird darauf aufgerufen.decode.cobra
wird wie eine temporäre Datei verwendet und kann nicht zum Kodieren oder Dekodieren einer anderen Nachricht verwendet werden. Verwenden Sie das Original oderencode.cobra
quelle