Cezar Cypher jest bardzo prosty szyfr podstawieniowy gdzie każda litera jest przesunięta o stałą przesunięcia (zapętlenie wokół Z do A). Podobnie, możemy również szyfr Cezara dla zestawu drukowalnych znaków ASCII. Są to 95 znaków od punktów kodowych 0x20 do 0x7E. Dla danego offsetu d
, mamy map punkt kodu C
do
(C - 32 + d) % 95 + 32
który przesuwa wszystkie postacie o d
i zapętla się z ~
miejsca na miejsce. Znaki spoza tego zakresu (znaki sterujące, takie jak znaki nowej linii, tabulatory i znaki spoza zakresu ASCII) pozostają nienaruszone.
Musisz napisać dwa programy lub funkcje (potencjalnie w różnych językach), które wymagają przesunięcia d
i ciągu. Pierwszy program powinien zwrócić lub wydrukować szyfr Cezara wejścia. Drugi program powinien zwrócić lub wydrukować odwrotny szyfr Cezara (tzn. Używając przesunięcia -d
). Możesz przyjmować dane wejściowe za pomocą STDIN, argumentu wiersza poleceń lub argumentu funkcji.
Aby uczynić rzeczy bardziej interesującymi, drugi program musi być szyfrem Cezara pierwszego programu. Oznacza to, że jeśli przekażesz kod źródłowy pierwszego programu samemu sobie, dla jakiegoś niezerowego przesunięcia d
, wyjściem musi być drugi program.
Oba programy, jak również ciągi wejściowe, muszą zawierać tylko drukowalne znaki ASCII, znaki nowej linii i tabulatory. Żaden program nie może zawierać żadnych komentarzy ani odczytywać własnego kodu źródłowego, nazwy pliku lub identyfikatora procesu bezpośrednio ani pośrednio.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach). Ponieważ oba programy muszą mieć ten sam rozmiar, musisz policzyć go tylko raz.
źródło
Python 2, 147
Najwyraźniej nie zastanawiałem się zbytnio nad tym, ponieważ byłoby to daremne w Pythonie. Istnieją po prostu dwa osobne programy, z których nieużywany jest zamknięty w ciągu.
Przesunięcie między tymi dwoma programami wynosi 39.
Naprzód
Definiuje funkcję Z przyjmującą ciąg Unicode i przesunięcie.
Odwrotność
Definiuje funkcję akceptującą ciąg Unicode i przesunięcie.
źródło
Python 3 - 248 bajtów
Moim celem było zrobienie tego jako jedno-liniowy Python. Sukces bramkowy, ale teraz nie przeszkadza mi gra w golfa.
Szyfruj:
Odszyfruj:
Edycja: Naprawiono, aby nie wpływać na znaki poza drukowanym zakresem ASCII
Przesunięcie od szyfrowania do odszyfrowania wynosi 20. Użyj, wprowadzając najpierw przesunięcie, a następnie ciąg znaków, np
Wyjaśnienie
Kluczowe są następujące transformacje:
Pierwszy pozwala na użycie
or
, podczas gdy drugi ignoruje ciąg średników.Zauważ, że
"".__doc__[2]
zwraca ciągr
(wzięty zstr
). Jest to konieczne, aby zapobiec sytuacji, w której ciąg pojedynczego cudzysłowu w programie deszyfrującym będzie zawierał pomyłki w środku.źródło
Rubin,
131125 bajtówOto moje własne zgłoszenie (które napisałem wcześniej jako dowód koncepcji, ale jakoś udało mi się naruszyć własne zasady). Nie używam żadnego kodu między tymi dwoma zgłoszeniami (w końcu chcę, żebyście to pobili), ale zamiast tego składa się z dwóch wierszy, z których jeden zamienia się w ciąg bełkotu.
Szyfr do przodu:
Szyfr odwrotny:
Oba fragmenty definiują funkcję (wywoływaną
Y
w pierwszej iJ
drugiej), która pobiera liczbę całkowitą i ciąg i wypisuje przekształcony ciąg do STDOUT. Przesunięcie między dwoma częściami kodu wynosi40
.źródło
oOo CODE ,
750744 bajtów, cały kod używany w obu programachZa długo, ale prawdopodobnie jest to odpowiednie narzędzie ...
Szyfruj:
Odszyfruj:
Tłumaczenia Brainfuck:
oOo CODE to wariant Brainfuck, w którym liczy się tylko wielkość liter.
Zajmuje pierwszy bajt i używa swojego kodu znakowego jako
d
(więc nowa linia oznacza d = 10). Reszta danych wejściowych to ciąg znaków. EOF wynosi 0.źródło
GolfScript,
9564 bajtów, cały kod używany w obu programachSzyfruj:
Odszyfruj:
Format wejściowy:
Wyjaśnienie
Odszyfruj:
Szyfruj:
źródło
JavaScript (wersja robocza ES7) -
167165 bajtówPożyczanie po użyciu ciągów @feersum i użyciu średnika przez @MartinButtner;)
Szyfruj:
Odszyfruj:
Przesunięcie w użyciu: 55
źródło
or <empty string> and <function>
a nie tylkoor <function>
.> <> (Ryba) , 467 bajtów
Szyfruj:
Odszyfruj:
Oba programy są przesunięte o 3 i przyjmują dane z formularza:
Przesunięcie musi składać się z 2 cyfr, więc należy wprowadzić przesunięcie o wartości 5
05
.To długie przesłanie, ale prawie wszystkie znaki niepełniące są używane przez oba programy . Istnieje wiele białych znaków, które można zdecydowanie zagrać w golfa, ale pomyślałem, że program będzie w ten sposób bardziej interesujący.
Ten obraz pokazuje znaki używane przez oba programy.
Wyjaśnienie
Główną konstrukcją, która to umożliwia, jest
_{} -> b~!
możliwość dowolnego pomijania znaków w programie deszyfrującym. W jaki sposób?Podsumowując, program szyfrujący nic nie robi, ale program deszyfrujący pomija następną instrukcję. Można to następnie rozszerzyć na
_{}! -> b~!$
, co pozwala zamiast tego dowolnie pomijać znaki w programie szyfrującym .Poza tym większość reszty programu wypycha liczby, wykonuje operacje na tych liczbach, a następnie znajduje sposoby na ich wykasowanie. Na przykład użyteczną konstrukcją jest
~~ -> ""
wyskakiwanie dwóch wartości dla programu szyfrującego, ale nie wypycha niczego w programie deszyfrującym.> <>, 149 bajtów
Oto mniej interesująca wersja, która wykorzystuje fakt, że nieprzekazywane instrukcje są skutecznie komentarzami w językach 2D.
Szyfruj:
Odszyfruj:
Oba programy są przesunięte o 84 i przyjmują dane w taki sam sposób jak powyżej. Pierwsza instrukcja decyduje, którą połowę programu wykonać, z
i
(wejściem) utrzymującym przepływ programu w prawo w programie szyfrującym i^
przekierowującym przepływ programu w górę (zapętlanie i powrót z dołu) w programie deszyfrującym.Wyjaśnienie
Dla odpowiedniej połowy programu szyfrującego (program deszyfrujący jest podobny):
Narzędzie do kodowania
Nie jest to związane z resztą powyższego postu, ale pomyślałem, że opublikuję to, ponieważ muszę go użyć: P.
źródło
Perl - 131
Pobiera dane wejściowe z argumentów wiersza poleceń.
Przesunięcie o 26 daje drugiemu:
źródło