Wprowadzenie:
Mam mnóstwo różnych szyfrów przechowywanych w dokumencie, który kiedyś skompilowałem jako dziecko, wybrałem kilka z tych, które moim zdaniem najlepiej nadawały się na wyzwania (niezbyt trywialne i niezbyt trudne) i przekształciłem je w wyzwania. Większość z nich wciąż znajduje się w piaskownicy i nie jestem jeszcze pewien, czy opublikuję je wszystkie, czy tylko kilka. Oto drugi ( Szyfr komputerowy był pierwszym, który opublikowałem).
W przypadku szyfru Trifid (bez użycia słowa kluczowego) alfabet (i dodatkowa karta zastępcza) jest podzielona na trzy tabele 3 na 3:
table 1: table 2: table 3:
|1 2 3 |1 2 3 |1 2 3
-+----- -+----- -+-----
1|a b c 1|j k l 1|s t u
2|d e f 2|m n o 2|v w x
3|g h i 3|p q r 3|y z
Tekst, który chcemy zaszyfrować, jest pierwszym znakiem po znaku zakodowanym w numerach tabeli-wiersza-kolumny. Na przykład tekst this is a trifid cipher
staje się:
t h i s i s a t r i f i d c i p h e r
table: 3 1 1 3 3 1 3 3 1 3 3 2 1 1 1 1 3 1 1 2 1 1 2
row: 1 3 3 1 3 3 1 3 1 3 1 3 3 2 3 2 3 1 3 3 3 2 3
column: 2 2 3 1 3 3 1 3 1 3 2 3 3 3 3 1 3 3 3 1 2 2 3
Następnie umieszczamy wszystko po sobie wiersz po wierszu w powyższej tabeli w grupach po trzy:
311 331 331 332 111 131 121 121 331 331 313 133 232 313 332 322 313 313 132 333 313 331 223
A te są przekształcane z powrotem w postaci przy użyciu tych samych tabel:
s y y z a g d d y y u i q u z w u u h u y o
Należy zauważyć, że długość wejściowa powinna być coprime do 3. Więc jeśli długość jest wielokrotnością 3, dodajemy jedną lub dwie końcowe spacje, aby długość wejściowa nie była wielokrotnością 3.
Wyzwanie:
Biorąc pod uwagę ciąg sentence_to_encipher
, szyfruj go jak opisano powyżej.
Musisz tylko wyszyfrować dane sentence_to_encipher
, więc nie ma potrzeby tworzenia programu / funkcji odszyfrowującej. Mogę jednak w przyszłości podjąć wyzwanie z części 2 dla odszyfrowania (chociaż mam wrażenie, że jest to trywialne / podobne do procesu szyfrowania).
Zasady konkursu:
- Możesz założyć, że
sentence_to_encipher
będą zawierać tylko litery i spacje. - Możesz użyć zarówno wielkich, jak i wielkich liter (podaj, którego użyłeś w odpowiedzi).
- Możesz dodać jedną lub dwie spacje końcowe, gdy długość wejściowa wynosi 3, aby nie była już wielokrotnością 3.
- I / O jest elastyczny. Zarówno dane wejściowe, jak i wyjściowe mogą być łańcuchem, listą / tablicą / strumieniem znaków itp.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
- Zalecane jest również dodanie wyjaśnienia do odpowiedzi.
Przypadki testowe:
Input: "this is a trifid cipher"
Output: "syyzagddyyuiquzwuuh uyo"
Input: "test"
Output: "utbk"
Input: "output"
Possible outputs: "rrvgivx" (one space) or "rrzcc lr" (two spaces)
Input: "trifidcipher"
Possible output: "vabbuxlzz utr" (one space) or "vabbyzv rx ie " (two spaces)
Odpowiedzi:
Galaretka ,
292625 bajtówWypróbuj online!
Jak to działa
źródło
;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸y
może znieść,µ
jeśli jest to dopuszczalne dla 24.Węgiel drzewny , 39 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło
Python 2 ,
180176174165163 bajtówWypróbuj online!
Dane wejściowe mogą być wyższe lub niższe. Dane wyjściowe są pisane wielkimi literami
źródło
Pyth,
3433 bajtyPełny program Dane wejściowe są oczekiwane jako małe litery, dane wyjściowe to tablica znaków. Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .
Alternatywne rozwiązanie 34-bajtowe:
sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3
- zamiast +27 i ogona, używa.[03
padu z 0 do długości 3. Może wynosić 33, jeślis
upuszczenie prowadzi.Edycja: zapisano bajt, usuwając wiodące,
s
ponieważ tablice znaków są prawidłowymi danymi wyjściowymiźródło
Rubin ,
153145138131 bajtówWypróbuj online!
Szybkie i naiwne podejście, działa z małym tekstem. Tablice wejściowe i wyjściowe znaków.
źródło
Java (JDK) , 192 bajty
Wypróbuj online!
Bardzo naiwne podejście. Bierze małą literę
char[]
jako dane wejściowe, ale zwraca aString
.Objaśnienia
Kredyty
źródło
Integer.valueOf
doByte.valueOf
iR+=c<26?(char)(c+97):' ';
doR+=(char)(c<26?c+97:32);
R , 145 bajtów
Wypróbuj online!
I / O jako ciągi; dodaje jedną spację. Dziwne powtarzanie
[,3:1]
polega na tym, że naturalne indeksowanie tablic R jest nieco inne.źródło
APL + WIN, 102 bajty
Wyjaśnienie:
Przykład zrzutu ekranu przypadku testowego:
źródło
SAS, 305 bajtów
Serdeczne „oof” za potworność SAS. Istnieje wiele losowych formatowań ciągów, które, jak sądzę, mogę uniknąć. Jestem pewien, że są lepsze sposoby na zrobienie tego.
Dane wejściowe są wprowadzane w znakach nowego wiersza po wyciągu z kart, podobnie jak:
Wysyła zestaw danych zawierający dane wyjściowe w zmiennej
f
wraz z grupą zmiennych pomocniczych / wartości tablicowych.Nieskluczone / wyjaśnienie:
źródło
JavaScript (Node.js) ,
146 141 139136 bajtówI / O jest pisane małymi literami.
Wypróbuj online!
Skomentował
źródło
(o=...,++i)%3
znów działa w JS? Czy(o,i)
jest krotka czy coś, a obie wewnętrzne liczby całkowite są konwertowane na ich modulo-3? Jako programista Java nadal trochę mnie to myli(a,b)%c
. Ładna odpowiedź! Podoba mi się, jak konwertujesz co trzecią cyfrę, a następnie usuwasz pierwsze dwa bajty zerowe. +1 ode mnie++i
.05AB1E , 25 bajtów
Ponieważ nikt jeszcze nie opublikował odpowiedzi 05AB1E, pomyślałem, że opublikuję własne rozwiązanie. Widzę, że teraz jest bardzo podobna do odpowiedzi @ Dennis ♦ Jelly , mimo że wymyśliłem ją samodzielnie, zanim opublikowałem wyzwanie.
Dane wejściowe jako ciąg znaków, dane wyjściowe jako lista znaków. Dodaje jedną spację, jeśli długość dzieli się przez 3.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Japt , 42 bajty
Wypróbuj online!
Rdzeń tej odpowiedzi pochodzi z usuniętej odpowiedzi Kudłaty, ale nigdy nie wrócił, aby poradzić sobie z danymi wejściowymi o długości podzielnej przez 3, więc jest to wersja stała .
Wyjaśnienie:
źródło
C # (interaktywny kompilator Visual C #) , 178 bajtów
Wypróbuj online!
Mniej gra w golfa ... To wciąż mylące :)
źródło