Écrivez un programme qui code un texte donné dans son propre texte, fourni en entrée, sans perturber sa logique. Le programme doit également fonctionner comme un décodeur, en restaurant le message d'origine à partir de son texte. Il doit conserver ses fonctions d'encodage / décodage après transformation.
Plus formellement, le programme requis P doit effectuer les transformations suivantes avec le texte de message donné M:
P (M, P) -> P *
P * (P *) -> M
Ici P * est le programme transformé, qui doit également satisfaire aux règles ci-dessus, c'est-à-dire:
P * (M2, P *) -> P **
P ** (P **) -> M2
et ainsi de suite ... Chacun l'encodage suivant n'efface pas le texte précédemment encodé, donc P ** transporte deux messages - M et M2.
Le moyen le plus simple pour le programme de distinguer les modes d'encodage / décodage est la présence de l'argument supplémentaire M, mais la décision finale vous appartient, à condition qu'elle soit clairement indiquée. Le programme peut lire son propre texte dans le fichier. Si la langue choisie n'a pas de moyen pour cela, le texte source peut être transmis au programme de toute autre manière.
Il existe bien sûr des solutions triviales, il s'agit donc plutôt d'un concours de popularité. Néanmoins, j'impose une restriction interdisant les commentaires dans le texte du programme.
la source
Réponses:
Perl
Il s'agit d'un one-liner en Perl simplement parce que c'est possible.
Les messages sont écrits après
__DATA__
, le plus récent en premier.la source
Python
Vous savez quoi? Pourquoi ne pas en faire une seule expression?
Ancien message; La fonction P prend les arguments comme spécifié et sort le code / texte décodé résultant.
la source
Javascript
Je ne sais pas si je comprends correctement l'énoncé du problème: mon décodeur décode tout programme et renvoie le dernier message codé dans le programme donné.
Code de test:
la source
Lot
Notez qu'il doit y avoir un retour chariot après «la dernière ligne» de
goto :EOF
.Cela prend deux entrées de stdin. Le premier est ce que vous voulez faire;
e
, oud
(encoder et décoder). La deuxième entrée dépend de la première - si la première entrée este
, alors la deuxième entrée sera le message que vous voulez encoder - si c'est le casd
, alors la deuxième entrée sera le numéro du message que vous souhaitez décoder (qui sera être fourni après avoir encodé un message).la source
Cobra
Bien que l' idée soit banale, l' exécution de cette idée l'est moins.
Codage
L'encodage d'un message dans le programme ajoutera la ligne
.message = .message ? x
immédiatement aprèsdef main
. Cette ligne vérifie si.message
est nul, et si oui, elle définit.message
alors un tableau d'entiers contenant les valeurs de code de caractère de chaque caractère du message; la vérification zéro et le positionnement évitent d'écraser le nouveau message par un ancien. Le nouveau programme est enregistré dansencode.cobra
Décodage
Le décodage du programme ajoutera trois lignes à la fin de la méthode principale, ce qui obligera le programme à convertir les codes de caractères en
.message
une chaîne, qui sera ensuite enregistréemessage.txt
lors de l'exécution du nouveau programme. Le nouveau programme est ensuite enregistré dansdecode.cobra
et le compilateur est appelé dessus.decode.cobra
est utilisé comme un fichier temporaire et ne peut pas être utilisé pour encoder ou décoder un autre message, utilisez l'original ouencode.cobra
la source