Napisz program, który koduje dany tekst we własnym tekście, podanym jako dane wejściowe, bez zakłócania jego logiki. Program musi również działać jako dekoder, przywracając oryginalną wiadomość z jej tekstu. Po transformacji musi zachować swoje funkcje kodowania / dekodowania.
Mówiąc bardziej formalnie, wymagany program P musi wykonać następujące przekształcenia z podanym tekstem komunikatu M:
P (M, P) -> P *
P * (P *) -> M
Tutaj P * jest przekształconym programem, który również musi spełniać powyższe reguły, to znaczy:
P * (M2, P *) -> P **
P ** (P **) -> M2
i tak dalej ... Każdy kolejne kodowanie nie usuwa wcześniej zakodowanego tekstu, więc P ** przenosi dwie wiadomości - M i M2.
Najłatwiejszym sposobem na rozróżnienie między trybami kodowania / dekodowania jest obecność dodatkowego argumentu M, ale ostateczna decyzja należy do Ciebie, pod warunkiem, że jest to wyraźnie określone. Program może odczytać własny tekst z pliku. Jeśli wybrany język nie ma na to środków, tekst źródłowy można przekazać do programu w jakikolwiek inny sposób.
Istnieją oczywiście trywialne rozwiązania, więc jest to raczej konkurs popularności. Niemniej jednak nakładam ograniczenie zabraniające komentowania w tekście programu.
źródło
Odpowiedzi:
Perl
Jest to jedna linijka w Perlu tylko dlatego, że jest to możliwe.
Wiadomości są pisane później
__DATA__
, od najnowszych.źródło
Pyton
Wiesz co? Dlaczego nie zrobić z tego pojedynczego wyrażenia?
Stara wiadomość; Funkcja P przyjmuje podane argumenty i wyświetla wynikowy kod / zdekodowany tekst.
źródło
JavaScript
Nie jestem pewien, czy poprawnie rozumiem instrukcję problemu: mój dekoder dekoduje dowolny program i zwraca najnowszą wiadomość zakodowaną w danym programie.
Kod testowy:
źródło
Partia
Uwaga: po „ostatnim wierszu” musi znajdować się znak powrotu karetki
goto :EOF
.To wymaga dwóch danych wejściowych ze standardowego wejścia. Pierwszym z nich jest to, co chcesz zrobić;
e
, lubd
(kodowanie i dekodowanie). Drugie wejście zależy od pierwszego - jeśli pierwsze wejściee
, to drugie wejście będzie wiadomością, którą chcesz zakodować - jeśli takd
, to drugie wejście będzie numerem wiadomości, którą chcesz zdekodować (która będzie być dostarczone po zakodowaniu wiadomości).źródło
Kobra
Chociaż pomysł jest trywialny, wykonanie tego pomysłu jest mniej ważne.
Kodowanie
Kodowanie wiadomości w programie doda wiersz
.message = .message ? x
natychmiast podef main
. Ta linia sprawdza, czy.message
jest zero, a jeśli tak, to ustawia.message
tablicę liczb całkowitych zawierającą wartości kodów znaków każdego znaku w komunikacie; funkcja zerowania i pozycjonowania pozwala uniknąć zastąpienia nowej wiadomości starszą. Nowy program zostanie zapisany wencode.cobra
Rozszyfrowanie
Dekodowanie programu doda trzy linie na końcu głównej metody, co spowoduje, że program przekonwertuje kody char
.message
na ciąg znaków, który zostanie następnie zapisanymessage.txt
po uruchomieniu nowego programu. Nowy program jest następnie zapisywanydecode.cobra
i wywoływany na nim kompilator.decode.cobra
jest używany jako plik tymczasowy i nie może być używany do kodowania lub dekodowania innej wiadomości, użyj oryginału lubencode.cobra
źródło