Napisz program, który pobiera dwa wiersze danych wejściowych i używa pierwszego jako frazy kluczowej do szyfrowania drugiego zgodnie z techniką szyfrowania Playfair.
Wikipedia szczegółowo opisuje szyfrowanie Playfair , ale aby uniknąć niejasności, oto krótkie podsumowanie:
1. Wygeneruj tabelę kluczy:
Zamień wszystkie wystąpienia J
frazy kluczowej na I
, a następnie usuń wszystkie znaki niebędące alfabetami i powtarzające się znaki. Wstaw do tabeli szyfrowania 5 × 5, wypełniając pozostałe komórki resztą alfabetu (poza tym J
, że nam się nie podoba J
).
Przykład:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Przygotuj wiadomość do zaszyfrowania
Zamień każdy J
na I
, usuń wszystkie znaki niebędące alfabetami i podziel na pary, używając do, X
aby rozbić dowolne pary zawierające tę samą literę dwa razy. Jeśli skończy się nieparzysta liczba liter, dodaj X
na końcu. (Uwaga: Cyfry muszą być pisane w całości - ONE
, TWO
, THREE
, itd. - ale można założyć, to już zostało zrobione przez Ciebie).
Przykład:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Szyfrowanie
Zaszyfruj kolejno każdą parę liter. Jeśli są w różnych wierszach i kolumnach tabeli kluczy, zastąp każdą literą z tego samego wiersza w kolumnie, w której znajduje się druga litera (np. VM
⇒ EI
, LZ
⇒ GQ
). Jeśli są w tym samym rzędzie (lub kolumnie), wybierz dwa znaki bezpośrednio po prawej stronie (lub poniżej), owijając się w razie potrzeby (np. OE
⇒ VR
, ZG
⇒ KP
).
Przykład:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
Ciąg wygenerowany przez ten proces to zaszyfrowana wiadomość, którą program powinien wypisać.
Zasady:
- Tekst wejściowy i klucz można uzyskać z
stdin
argumentów wiersza poleceń lub innych takich źródeł. Zakodowane wejście jest niedozwolone. - Twój program musi akceptować zarówno wielkie, jak i małe litery dla hasła i wiadomości.
- Zaszyfrowane dane wyjściowe mogą być pisane wielkimi lub małymi literami.
- Twój program powinien akceptować frazy kluczowe o długości co najmniej 64 znaków i teksty wiadomości o wielkości co najmniej 16 KB.
- Nie musisz obsługiwać danych wejściowych innych niż ASCII.
- Możesz zignorować możliwość wystąpienia pary liter
XX
podczas szyfrowania. - Nie ma potrzeby dodawania białych znaków do danych wyjściowych programu.
- Twoja odpowiedź powinna zawierać przykład wiadomości, frazy kluczowej i zaszyfrowanego wyjścia wygenerowanego przez Twój program.
- Jest to wyzwanie dla golfa kodowego, więc wygra odpowiedź z najkrótszym kodem (w bajtach).
UWAGA: Należy pamiętać, że kolejne litery należy łamać tylko wtedy, gdy występują w tej samej parze . Na przykład
MASSACHUSETTS
należy zaszyfrować jakoMA SX SA CH US ET TS
- podwójneS
musi być podzielone, ale podwójneT
nie.
źródło
J
” Czy żywisz podobne sentymenty do APL?Odpowiedzi:
jotI *,536431417380263218203197186167(z obszernymi sugestiami @al algorytmshark)
przykładowe zastosowanie:
poprawnie dzieli dane wejściowe:
* zamień każdy
J
naI
, prawda?źródło
Rubinowy,
461411366359352346330 znakówDzięki @daniero za uratowanie ... err, dużo bajtów. \ o /
Oto nielepszy kod:
Oto kilka przykładowych wyników:
źródło
chars
do tablicy, zakładając, że używasz Ruby 2. Możesz także użyć&
jako operatora zestawu zamiasttr
:t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}
(zapisano 7 bajtów). Dwie następne linie można połączyć w coś podobnegok,m=[1,2].map{t[gets.chop]}
(uwagachop
zamiastchomp
).&
eliminuje również potrzebęuniq
późniejszego. Achars
kwestia tablic dotyczy również linii 6.tr
do&
on-line 1 nie działa, ponieważm
nie można tego zrobićuniq
. Jednakże,k.uniq
może być skrócony do(k&k)
(1 bajt OFF).C:
495401355341 znakówNa razie jest to tylko przybliżony szkic. Powinienem móc ogolić co najmniej sto znaków.Cel osiągnięty: ponad sto znaków (obecnie 154) tajemniczo zniknęło z kodu.
Z przyjemnymi białymi znakami:
Pierwsza iteracja programu napisałem na skraju zaśnięcia, więc zawierał on wiele zbędnych bezsensownych stwierdzeń i tym podobne. Większość z nich została naprawiona, ale istnieje wiele obszarów, w których poprawa jest zdecydowanie możliwa.
źródło
Matlab - 458 znaków
Kilka przykładów:
źródło
Haskell - 711
Próbny:
Kod:
Duża wersja:
źródło
Pyth - 111
Za późno na konkurowanie, chciałem się tylko podzielić. Oto koder i dekoder
Wyjaśnienie:
Przykładowy klucz / wiadomość / wyjście:
źródło
C 516
Dodano kanały liniowe, aby poprawić prezentację
czytelności. (Obawiam się, że czytelność wyszła przez okno).Przykład:
źródło
Python 3,
709705685664Akceptuje dane wejściowe ze standardowego wejścia.
Przykład:
źródło
Python: 591 bajtów
Służy to
stdin
do uzyskania klucza i wiadomości w tej kolejności. Mam nadzieję, że używanie o płaskiej listy do przechowywania matrycy szyfrowania nie jest oszustwem, ponieważ dzięki temu praca z matrycą jest bardzo prosta. Oto kilka przykładowych przebiegów:źródło
z
dolambda x:0if b not in x else b.remove(x)or 1
. Jest też całkiem sporo białych znaków, których możesz się pozbyć. Pozwoli to również przenieść go bezpośrednio dofilter
połączenia zamiast definiować go na zewnątrz.Java - 791
Mój pierwszy golf, więc każda krytyka jest mile widziana. Używam Javy, bo nie powinienem. To nie wydaje się takie złe; mniej niż dwukrotnie większy niż obecny lider. Spodziewałem się, że będzie większy, ponieważ to, cóż, Java :)
Z automatycznym formatowaniem:
Przykładowe dane wyjściowe:
źródło
JS (węzeł) -
528466Przykładowe dane wyjściowe:
źródło
UU
. Wygląda na to, że powtarza się powtórzenieE
.PHP 582
Dekoder bez golfa
wyjścia
źródło
Perl, 265
Bardzo proste.
Zębaty:
źródło
CoffeeScript - 610
Próbny:
Kod:
Wersja bez golfa:
źródło