Napisz program lub funkcję (lub zestaw programów / funkcji) do szyfrowania i deszyfrowania danych, biorąc pod uwagę następującą specyfikację:
Szyfrowanie
Oblicz hash XOR danych wejściowych przez XOR-ing każdy bajt ze sobą.
XOR każdy bajt danych wejściowych tego skrótu.
Przesunąć wynik o cztery bity w lewo.
Wypełnij lewą stronę pierwszymi czterema bitami skrótu XOR.
Wypełnij prawą stronę ostatnimi czterema bitami skrótu XOR.
Przykład
Biorąc pod uwagę dane wejściowe:
"G0lf"
(0x47306C66
)Oblicz skrót XOR:
0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D
XOR każdy bajt według skrótu:
0x3A4D111B
Oczekiwany wynik (po zmianie i padzie):
"s¤Ñ\x11½"
(0x73A4D111BD
)
Zasady
Twój program / funkcja może wprowadzać / wyprowadzać dowolny typ sensu w wybranym języku golfowym (String, Byte Array itp.), O ile dane wejściowe / wyjściowe są rzeczywistymi bajtami. Na przykład nie można wyprowadzać ciągu szesnastkowego.
Szyfrowanie i deszyfrowanie można rozdzielić na osobne programy (wynikiem będzie ich łączny rozmiar) lub jeden. Pojedyncze metody mogą argumentować, czy powinny szyfrować, czy deszyfrować.
Dane wejściowe do szyfrowania mogą mieć co najmniej 1 bajt.
Dane wejściowe do deszyfrowania mogą mieć co najmniej 2 bajty.
Bajki niedrukowalne nie muszą być poprzedzane znakami ucieczki.
źródło
Odpowiedzi:
CJam, 28 + 27 = 55 bajtów
Dla każdej części przedstawiam jeden program, który oczekuje, że wejście / wyjście ma postać tablicy liczb całkowitych, i taki, który używa łańcucha. Powyższa liczba bajtów dotyczy wersji tablicy liczb całkowitych, ale skrypt połączony i objaśnienie dotyczą wersji opartej na łańcuchach (które można wykorzystać do przetestowania przykładu podanego w pytaniu).
Szyfrowanie
Deszyfrowanie
Oto skrypt testowy, który wykonuje pełną podróż w obie strony i drukuje zaszyfrowany kod przed ponownym odszyfrowaniem.
Wyjaśnienie
źródło
CJam, 36 + 34 = 70 bajtów
Nieco inne podejście przy użyciu formularzy binarnych
Szyfrowanie :
Jak to działa:
Deszyfrator :
Jak to działa:
Wypróbuj szyfrator i deszyfrator online
źródło
Pyth, 69 bajtów
Łączy to szyfrowanie i deszyfrowanie, wystarczy dodać
0
jako argument zaszyfrowanie lub1
deszyfrowanie. Powód tego jest prosty. Konwersja ciągów na bity (lub 4-bitową liczbę całkowitą) lub odwrotnie jest naprawdę bardzo długa w Pyth. Łącząc obie funkcje w jeden program, mogę zaoszczędzić wiele bajtów.Demonstracje online: szyfrowanie i deszyfrowanie .
Wyjaśnienie:
Pierwsza część konwertuje dane wejściowe na listę 4-bitowych liczb całkowitych (każdy znak jest konwertowany na 2 4-bitową liczbę całkowitą) i zapisuje je
K
.Druga część określa wartości skrótu i zapisuje je
J
. JeśliQ==0
oblicza je xor, w przeciwnym razie przyjmuje pierwszą i ostatnią wartośćK
.Następna część wykonuje xor przy użyciu wartości skrótu. Gdy
Q == 0
jest wykonywany na pełnej liścieK
, w przeciwnym razie tylko na liścieK
bez pierwszej i ostatniej wartości.Ostatnia część konwertuje z
K
powrotem na znaki:źródło
JavaScript ( ES6 ) 83 + 73 = 156
Obie funkcje przyjmują dane wejściowe jako i wypisują tablicę liczb reprezentujących bajty.
Szyfruj
858483Odszyfruj
7573Demonstracja (tylko Firefox)
Używanie ciągów 131 + 129 = 260
I dla zabawy ... oto niektóre wersje, które zamiast tego używają ciągów wejściowych / wyjściowych.
źródło