Dekoduj ukrytą wiadomość!

11

Wprowadzenie

Pewnego dnia po prostu odpoczywałeś w swoim biurze w CIA, kiedy nagle zobaczyłeś alert na swoim komputerze. Twoje programy właśnie przechwyciły setki zakodowanych wiadomości! Szybkie sprawdzenie ujawnia zasadę kodowania, ale potrzebujesz programu, aby szybko dekodować.

Wyzwanie

Otrzymasz listę ciągów znaków oddzielonych przecinkami. Każdy ciąg będzie zawierał:

  • Część zakodowanej wiadomości
    • Jest to część zakodowanej wiadomości, jeżeli jest nie w formie a=b. Zauważ, że jest to część wiadomości, jeśli tak jest ab=c. Dodaj ten ciąg do zakodowanej wiadomości.
  • Część schematu kodowania
    • Będzie to miało postać a=b. Oznacza to, że wszystkie a w wiadomości muszą zostać zastąpione przez b. Zauważ, że może tak być a==, co oznacza, że ​​wszystkie a muszą zostać zastąpione przez =.

Twój program musi następnie wygenerować komunikat, odkodowany przy użyciu znalezionego schematu.

Inne informacje: dane wejściowe będą zawierać tylko przecinki do oddzielania ciągów. Może zawierać inne znaki, takie jak! 1 # itp. Nie będzie zawierać wielkich liter. Fragmenty informacji dekodujących nie dekodują się nawzajem. Informacje dekodujące mają wpływ tylko na wiadomość. Dla każdej postaci zostanie podany tylko jeden zamiennik, np. Nie"io,"i=u","i=g"

Przykłady

Wejście:"ta","y=s","y","a=e","b=t","b"," ","j","j=1"

Wynik:test 1

Wejście:"z=p","zota","g=e","yugkb","y=t","u=o","k=s","li","fg","b=="

Wynik:potatoes=life

Wejście:"p","=","==n","ot","p=a","hiz","i=e","z=r"

Wynik:another

To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

pydude
źródło
o tak, przepraszam! edycja
pydude
Co z przechodniością i okrągłością, np. "massega","e=a","a=e"I tym podobne?
Jonathan Allan,
1
bity informacji dekodujących nie dekodują się nawzajem. Informacje dekodujące mają wpływ tylko na wiadomość.
pydude
1
ponadto dla każdej postaci zostanie podana tylko jedna zamiana, np. no"io,"i=u","i=g"
pydude
1
Dzięki, sugeruję dodanie tej informacji do specyfikacji.
Jonathan Allan,

Odpowiedzi:

1

Galaretka , 19 bajtów

ḊṖ⁼“=”
ÇÐfKm2yÇÐḟF$

Wypróbuj online!

W jaki sposób?

ḊṖ⁼“=” - Link 1, isMappngElement?: string
Ḋ      - dequeue
 Ṗ     - pop
   “=” - char-list,['=']
  ⁼    - equal?

ÇÐfKm2yÇÐḟF$ - Main link: list of strings
 Ðf          - filter keep:
Ç            -     last link (1) as a monad
   K         - join with spaces
    m2       - modulo 2 slice (every other character)
           $ - last two links as a monad:
        Ðḟ   -     filter discard:
       Ç     -         last link (1) as a monad
          F  -     flatten
      y      - translate right according to the mapping of left
Jonathan Allan
źródło
Bardzo ciekawe, co oznacza m2 „plasterek 2 modulo”?
Magic Octopus Urn
mto dyadyczny atom, który bierze każdy prawy element lewego *. Tutaj na przykład ['x','=','y','<space>','a','=','b']m2dałoby się ['x','y','a','b']. (* chyba że prawo jest równe zero, jeśli zamiast tego dodaje odbicie).
Jonathan Allan,
5

Python 3, 98

lambda l:''.join(x*('='!=x[1:-1])for x in l).translate({'='!=x[1:-1]or ord(x[0]):x[2:]for x in l})

Ta lambdafunkcja otrzymuje listę ciągów (dane wejściowe) i zwraca ciąg znaków (zdekodowany komunikat).

Przykłady:

>>> f(['ta', 'y=s', 'y', 'a=e', 'b=t', 'b', ' ', 'j', 'j=1'])
'test 1'
>>> f(['z=p', 'zota', 'g=e', 'yugkb', 'y=t', 'u=o', 'k=s', 'li', 'fg', 'b=='])
'potatoes=life'
>>> f(['p', '=', '==n', 'ot', 'p=a', 'hiz', 'i=e', 'z=r'])
'another'
sklepienie
źródło
Czy potrzebujesz: -1 czy będzie: 2 działać?
DSM
1
@DSM Myślę, że jest to potrzebne, ponieważ '=' == x[1:2]będzie prawdziwe x = 'a=bc', co nie jest częścią schematu kodowania
vaultah
1
Ahh, dobra uwaga!
DSM
2

Haskell, 85 bajtów

f x=[(a,b)|[a,'=',b]<-x]
h x=map(\v->maybe v id$lookup v$f x)$concat[c|c<-x,[]==f[c]]

Stosowanie

>h ["p","=","==n","ot","p=a","hiz","i=e","z=r"]
>"another"

Opis

f tworzy tabelę odnośników.

concat[c|c<-x,[]==f[c]] wyodrębnia wiadomość.

map(\v->maybe v id$lookup v$f x) kończy wyszukiwanie.

Rainer P.
źródło
2

JavaScript (ES6), 87 bajtów

(l,s='',d={})=>l.map(v=>/.=./.test(v)?d[v[0]]=v[2]:s+=v)&&[...s].map(c=>d[c]||c).join``

<input id=a oninput="try{b.innerText=((l,s='',d={})=>l.map(v=>/.=./.test(v)?d[v[0]]=v[2]:s+=v)&&[...s].map(c=>d[c]||c).join``)(eval(`[${a.value}]`))}catch(e){}"/>
<p id=b />

Tylko ASCII
źródło
1

Retina, 84 82 77 74 bajtów

Pobiera na wejściu listę rozdzielaną przecinkami. Zwróć uwagę na końcowy znak nowej linii

^ | $
,,
+ `, (. =.) (,. *)
2 USD 1 USD
M! & `(.). * ,,. * \ 1 =. |. +,
% `(.). *, $ |. * (.)
1 USD 2 USD
\ n |,

Wypróbuj online!

Wyjaśnienie:

Najpierw przenosimy wszystkie wyrażenia formularza .=.na koniec ciągu i oddzielamy je od komunikatu podwójnym przecinkiem ( ,,). Jest tak, że w następnym kroku możemy znaleźć wszystkie kodowania, sprawdzając, czy każdy znak przed znakiem ,,ma =.później dopasowanie . Uzyskuje się to poprzez M!&`(.).*,,.*\1=.|.+,znalezienie wszystkich takich dopasowań i umieszczenie ich na oddzielonej kanałem linii ciągów znaków. Następnie modyfikujemy każdy ciąg, aby zawierał tylko jeden niekodowany znak lub zakodowaną wersję znaku. Na koniec zamieniamy wszystkie wiersze i przecinki pustym ciągiem, dzięki czemu nasze dane wyjściowe są ładnie sformatowane.

ćpun matematyki
źródło
0

Partia, 188 bajtów

@echo off
set/pm=
set c=
for %%s in (%m%)do call:c %%s "%%c%%%%~s" not
for %%s in (%m%)do call:c %%s "%%c:%%~s%%"
echo %c%
exit/b
:c
set s=%~1
if %3 "%s:~1,1%"=="=" call set c=%~2

Objaśnienie: Pętle dwukrotnie przewija listę ciągów (wygodnie forlubi ciąg znaków w formacie CSV). Za pierwszym razem szuka ciągów, które nie zawierają =jako drugiego znaku, i łączy je z wynikiem. Za drugim razem szuka ciągów zawierających =jako drugi znak i dokonuje podstawienia. (jeszcze wygodniej, podstawienie jest już w formacie wsadowym).

Neil
źródło
0

PHP, 116 bajtów

<?foreach($_GET as$i)$i[1]=="="&&strlen($i)==3?$r[]=$i:$s.=$i;foreach($r as$l)$s=str_replace($l[0],$l[2],$s);echo$s;

Wersja online

Jörg Hülsermann
źródło
0

PHP, 89 87 bajtów

dwie wersje:

while(a&$s=$argv[++$i])3==strlen($s)&"="==$s[1]?$t[$s[0]]=$s[2]:$m.=$s;echo strtr($m,$t);
while(a&$s=$argv[++$i])preg_match("#^.=.$#",$s)?$t[$s[0]]=$s[2]:$m.=$s;echo strtr($m,$t);

pobiera dane wejściowe z argumentów wiersza poleceń; biegać z -nr.

  • przeglądaj argumenty, tworząc parametry dla strtr
    (tłumaczenie, jeśli argument zawiera =, komunikat inny).
  • wykonać strtr.
Tytus
źródło
0

05AB1E , 31 bajtów

vy'=åyg3Q&iyˆyS}})øJÁ¨`¹¯KJ.Ás‡

Wypróbuj online!

vy              }
  '=åyg3Q&                      # See if it's length 3 with an equals in the mid.
          iyˆyS                 # If so, add to global array, split into chars.
               } 
                 )øJÁ¨`         # Transpose, join, and remove the middle =.
                       ¹¯KJ     # Push original input without decryption key.
                           .Ás‡ # Shift stack to the right, swap and transliterate.
Urna Magicznej Ośmiornicy
źródło