Steganografia ukrywa daną wiadomość wewnątrz danego przewoźnika, tworząc pakiet, który nie wygląda podejrzanie. W tym wyzwaniu napiszesz program, który pobiera komunikat ASCII i nośnik ASCII jako dane wejściowe, i zwraca lub drukuje pakiet identyczny z nośnikiem, z wyjątkiem tego, że znaki odpowiadające wiadomości są podwojone, w tej samej kolejności, w jakiej występują wiadomość.
Zasady:
- Jeśli nośnik zawiera już sekwencje tego samego znaku więcej niż jeden raz i nie są one używane do kodowania znaku wiadomości, program zredukuje je do jednego znaku.
- Jeśli operator nie zawiera znaków komunikatu we właściwej kolejności, program może nie zwrócić niczego, samego przewoźnika lub błędu.
- Możesz założyć, że komunikat i nośnik nie są pustymi łańcuchami ASCII.
- Kapitalizacja ma znaczenie: A nie jest równoważne z.
- Gdy więcej niż jeden pakiet jest ważny, twój program może wypisać jeden lub wszystkie z nich.
- Space to postać jak każda inna postać.
Przypadki testowe:
Pakiet operatora wiadomości „cześć”, czy to dotarło? ” „czy to się udało?” LUB „czy to się udało?” „sir” „czy to dotarło?” „czy iit przybył?” „foo” „czy dotarło?” „LUB” czy dotarło? ” LUB błąd. „Samochód” „Koty są fajne”. „CCaats arre col.” „samochód” „Koty są fajne”. „” LUB „Koty są fajne”. LUB błąd. „Kanapa” „Kanapa” „CCoouucchh” „oo” „oooooooooo” „oooo” „o o” „oooo oooa” „oo ooa”
To jest kod golfowy, więc wygrywa najmniej bajtów.
code-golf
string
steganography
jkpate
źródło
źródło
"oooo oa"
(z 2 spacjami) jest prawidłowym wyjściem dla ostatniego przypadku testowego?Odpowiedzi:
Galaretka , 28 bajtów
Pełną podejmowanie programu
carrier
imessage
jako argumenty wiersza poleceń, które drukuje wynik(dla nie-packable
message
wydruków niezmienionychcarrier
).Wypróbuj online! Lub zobacz zestaw testowy .
W jaki sposób?
źródło
JavaScript (ES6), 71 bajtów
Pobiera dane wejściowe jako
(message)(carrier)
.Wypróbuj online!
Alternatywna wersja, 66 bajtów
Jeśli możemy przyjąć wiadomość jako tablicę znaków:
Wypróbuj online!
Edycja : Podziękowania dla @tsh za zauważenie, że zapomniałem usunąć trochę kodu przy przechodzeniu z wersji nierekurencyjnych na rekurencyjne.
źródło
p=
ponieważ parametr p jest przekazywany przez parametr.Haskell,
124121107101979590 bajtówPodnosi wyjątek „Niewyczerpujące wzorce”, jeśli przewoźnik nie zawiera komunikatu.
Wypróbuj online!
Edycja: -5 bajtów dzięki @Laikoni.
źródło
m==c
: Wypróbuj online!Retina 0.8.2 , 67 bajtów
Wypróbuj online! Przenosi operatora do pierwszego wiersza, a komunikat do drugiego wiersza. Wyjaśnienie:
Przetwarza przebiegi 1 lub więcej identycznych znaków przewoźnika. Jeśli wiadomość zawiera również ciąg 1 lub więcej takich samych znaków, następnie dołącz krótszy z dwóch przebiegów do wyjścia w dwóch egzemplarzach, w przeciwnym razie dołącz do wyjścia jeden znak nośnika. Każdy ciąg znaków wyjściowych jest zakończony znakiem nowej linii, aby odróżnić go od danych wejściowych. Na
(?!¶)
końcu zapobiega wyrażeniu regularnemu, że przewoźnik jest wiadomością po wyczerpaniu wiadomości, ponieważ zwykle$
dozwolone jest dopasowanie tam¶$
, gdzie pasowałoby.Usuń wszystko, jeśli wiadomość nie została całkowicie zakodowana.
Usuń znaki nowej linii z wyniku.
źródło
Czysty , 118 bajtów
Wypróbuj online!
Najpierw bierze przewoźnika, potem wiadomość.
Błędy w
Run time error, rule '$;2' in module 'main' does not match
przypadku, gdy wiadomość nie pasuje.źródło
Rubinowy , 73 bajty
Wypróbuj online!
Funkcja rekurencyjna, przyjmuje dane wejściowe jako tablicę znaków.
Raz miałem nadzieję skorzystać z wbudowanej
squeeze
metody Ruby, która kontraktuje kolejne przebiegi tej samej postaci w jednej instancji. Ale niestety, nie - ostatnie dwa przypadki testowe wszystko tak mocno spieprzyły, że musiałem zastosować zupełnie inne podejście, co okazało się być w zasadzie odpowiedzią Arnaulda .źródło
PowerShell, 134 bajty
Skrypt zwraca,
empty string
jeśli operator nie zawiera znaków wiadomości we właściwej kolejności.Skrypt testu mniej golfowego:
Wynik:
źródło
C (gcc) , 69 + 12 = 81 bajtów
Kompiluj z (12 bajtów)
Wypróbuj online!
źródło