Napisz dwa programy:
- Jeden, który odczytuje ciąg i klucz i koduje ciąg w szyfr szynowy za pomocą tego klucza. - Podobnie napisz program dla funkcji odwrotnej: odszyfrowanie ogrodzenia za pomocą klucza.
Dla tych, którzy nie wiedzą, czym jest szyfr ogrodzeniowy, jest to w zasadzie metoda pisania zwykłego tekstu w sposób, w jaki tworzy liniowy wzór w spiralny sposób. Przykład - gdy ogrodzenie z szyny „FOOBARBAZQUX” jest ogrodzone przy użyciu klucza 3.
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
Odczytując powyższą spiralę linia po linii, tekst szyfru zmienia się w „FAZOBRAQXOBU”.
Czytaj więcej na stronie - Szyfr ogrodzeniowy - Wikipedia .
Kod w dowolnym języku jest mile widziany.
Najkrótsza odpowiedź w bajtach wygrywa.
code-golf
cryptography
cipher
ShuklaSannidhya
źródło
źródło
Odpowiedzi:
Python 133 bajty
Przykładowe użycie:
Uwaga: wyniki z parzystej liczby szyn są inne niż dla kodu, który podałeś, ale wydają się poprawne. Na przykład 6 szyn:
odpowiada
AKUBJLTVCIMSWDHNRXEGOQYFPZ
, a nieAKUTBLVJICMSWXRDNHQYEOGZFP
jak tworzony jest kod.Podstawową ideą jest to, że każdą szynę można znaleźć bezpośrednio, biorąc wycinki łańcuchów
[i::m]
, gdziei
jest numer szyny (0
-indexed) im
jest(num_rails - 1)*2
. Wewnętrzne szyny dodatkowo muszą się przeplatać[m-i::m]
, osiągnięte przez zapięcie i połączenie dwóch zestawów znaków. Ponieważ drugi z nich może potencjalnie być o jeden znak krótszy,jest dopełniany znakiem, który zakłada się, że nigdzie się nie pojawia (to_
), a następnie znak ten jest usuwany, jeślikonieczne, jest konwertowany na listę i uzupełniany pustym łańcuchem.Nieco bardziej czytelna dla człowieka forma:
źródło
APL
5241Jeśli wejściowy ciąg tekstowy i oraz numer klucza n są wstępnie zainicjalizowane, rozwiązanie można skrócić o 9 znaków. Uruchomienie rozwiązania na przykładach podanych przez primo daje identyczne odpowiedzi:
Po dalszej refleksji wydaje się, że istnieje rozwiązanie oparte na krótszym indeksie:
źródło
Python 2 , 124 + 179 = 303 bajty
Kodować:
Wypróbuj online!
Rozszyfrować:
Wypróbuj online!
źródło
MATL, 70 bajtów (ogółem)
Wypróbuj w MATL Online.
Wypróbuj wiele przypadków testowych
Pobiera flagę jako trzecie wejście,
F
aby zaszyfrować ciąg,T
odszyfrować go (dzięki Kevin Cruijssen za ten pomysł).Zaczęło się to od odpowiedzi Julii, dopóki nie zdałem sobie sprawy, że ścisłe pisanie stało się zbyt duże, szczególnie do rozszyfrowania. Oto kod Julii, który miałem do szyfrowania (przeniesiony do wersji V0.6 dla TIO):
Julia 0.6 , 191 bajtów
Wypróbuj online!
Wyjaśnienie:
Operacja ogrodzenia szynowego
może być postrzegany jako odczyt r = 3 znaki wejściowe, następnie odczytanie znaków r-2 oraz przedrostek i przyrostek z wartościami pozornymi (wartości zerowe), a następnie ponowne odczytanie znaków r itp., za każdym razem tworząc nową kolumnę:
następnie odwracanie co drugą kolumnę (ponieważ zag zygzak idzie w górę zamiast w dół, co robi różnicę, gdy r> 3), następnie odczytywanie tej macierzy wzdłuż wierszy i usuwanie fałszywych znaków.
Odszyfrowanie nie wydawało się mieć takich oczywistych wzorców, ale kiedy szukałem tego, natknąłem się na ten post , który powiedział mi, że (a) był to dobrze znany i (być może?) Algorytm szyfrów szynowych oraz ( b) rozszyfrowanie było prostym ponownym użyciem tej samej metody, nadaniem mu wskaźników ciągu i uzyskaniem wskaźników tych wskaźników po zaszyfrowaniu i odczytaniu tekstu zaszyfrowanego w tych miejscach.
Ponieważ odszyfrowanie musi działać w oparciu o indeksy, kod ten szyfruje również przez sortowanie indeksów ciągu, a następnie w tym przypadku po prostu indeksuje te uporządkowane indeksy.
źródło
Chcę wyjaśnić w tym kodzie.
źródło
Java 10,
459451445439327 bajtów-12 bajtów dzięki @ceilingcat .
-112 bajtów łączących dwie funkcje z dodatkową flagą trybu jako wejście.
Funkcja przyjmuje trzecie wejście
M
. Jeśli tak,true
to szyfruje, a jeśli tak,false
to rozszyfrowuje.Wypróbuj online.
Wyjaśnienie:
źródło