Расшифруйте скрытое сообщение!

11

Вступление

Однажды вы просто отдыхали в своем офисе в ЦРУ, когда вдруг на вашем компьютере появилось предупреждение. Ваши программы только что перехватили сотни закодированных сообщений! Быстрая проверка показывает правило для кодирования, но вам нужна программа для быстрого декодирования.

Вызов

Вам будет предоставлен список строк, разделенных запятыми. Каждая строка будет содержать либо:

  • Часть закодированного сообщения
    • Это часть закодированного сообщения, если оно не в форме a=b. Обратите внимание , что это является частью сообщения , если оно ab=c. Добавьте эту строку в закодированное сообщение.
  • Часть схемы кодирования
    • Это будет в форме a=b. Это означает, что все a в сообщении должны быть заменены на b. Обратите внимание, что это может быть a==, это означает, что все `ы должны быть заменены на = '.

Ваша программа должна затем вывести сообщение, декодированное по найденной схеме.

Другая информация: Ваш ввод будет содержать только запятые для разделения строк. Он может содержать другие символы, например! 1 # и т. Д. Он не будет содержать заглавных букв. Биты информации декодирования не декодируют друг друга. Только сообщение затронуто информацией декодирования. Для каждого персонажа будет дана только одна замена, например, нет"io,"i=u","i=g"

Примеры

Входные данные:"ta","y=s","y","a=e","b=t","b"," ","j","j=1"

Выход:test 1

Входные данные:"z=p","zota","g=e","yugkb","y=t","u=o","k=s","li","fg","b=="

Выход:potatoes=life

Входные данные:"p","=","==n","ot","p=a","hiz","i=e","z=r"

Выход:another

Это , поэтому выигрывает самый короткий ответ в байтах!

pydude
источник
о да, извините! редактирование
pydude
Как насчет транзитивности и округлости, например, "massega","e=a","a=e"и тому подобное?
Джонатан Аллан
1
биты информации декодирования не декодируют друг друга. Только сообщение затронуто информацией декодирования.
pydude
1
Кроме того, только одна замена будет дана для каждого символа, например, нет"io,"i=u","i=g"
pydude
1
Спасибо, предлагаю добавить эту информацию в спецификацию.
Джонатан Аллан

Ответы:

1

Желе , 19 байт

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

Попробуйте онлайн!

Как?

ḊṖ⁼“=” - 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
Джонатан Аллан
источник
Очень интересно, что означает m2 "modulo 2 slice"?
Волшебная урна осьминога
mявляется диадическим атомом, который берет каждый правый элемент слева *. Вот, например, ['x','=','y','<space>','a','=','b']m2уступил бы ['x','y','a','b']. (* если право не равно нулю, когда вместо него добавляется отражение.)
Джонатан Аллан
5

Питон 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})

Эта lambdaфункция получает список строк (входные) и возвращает строку (декодированное сообщение).

Примеры:

>>> 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'
vaultah
источник
Вам нужно: -1 или будет: 2 работать?
DSM
1
@DSM Я думаю, что это необходимо, потому что '=' == x[1:2]это будет верно x = 'a=bc', что не является частью схемы кодирования
vaultah
1
Ах, хорошая мысль!
DSM
2

Haskell, 85 байт

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

использование

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

Описание

f создает таблицу поиска.

concat[c|c<-x,[]==f[c]] извлекает сообщение.

map(\v->maybe v id$lookup v$f x) совершает поиск.

Райнер П.
источник
2

JavaScript (ES6), 87 байт

(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 />

ASCII-только
источник
1

Retina, 84 82 77 74 байта

Принимает разделенный запятыми список в качестве входных данных. Обратите внимание на завершающий перевод строки

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

Попробуйте онлайн!

Объяснение:

Сначала мы перемещаем все выражения формы .=.в конец строки и отделяем их от сообщения двойной запятой ( ,,). Это связано с тем , что на следующем этапе, мы можем найти все кодировки, проверяя , если каждый символ вперед из ,,имеет соответствие =.впоследствии. Это достигается тем, M!&`(.).*,,.*\1=.|.+,что находит все такие совпадения и помещает их в разделенный строкой список строк. Затем мы модифицируем каждую строку, чтобы она содержала только один незашифрованный символ или зашифрованную версию символа. Наконец, мы заменяем все переводы строк и запятые на пустую строку, чтобы наш вывод был хорошо отформатирован.

математик наркоман
источник
0

Пакет, 188 байт

@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

Объяснение: Дважды просматривает список строк (удобно forиспользовать строку в формате CSV). Первый раз ищет строки, которые не содержат в =качестве второго символа, и объединяет их с результатом. Во второй раз ищет строки, которые содержат в =качестве второго символа, и выполняет подстановку. (еще удобнее, замена уже в пакетном формате.)

Нил
источник
0

PHP, 116 байт

<?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;

Онлайн версия

Йорг Хюльсерманн
источник
0

PHP, 89 87 байт

две версии:

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);

принимает входные данные из аргументов командной строки; беги с -nr.

  • цикл по аргументам, создающим параметры для strtr
    (трансляция, если аргумент содержит =, сообщение остальное)
  • выполнять strtr.
Titus
источник
0

05AB1E , 31 байт

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

Попробуйте онлайн!

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.
Урна волшебного осьминога
источник