Розшифруйте приховане повідомлення!


11

Вступ

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

Виклик

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

  • Частина кодованого повідомлення
    • Вона є частиною кодованого повідомлення, якщо воно не має форми a=b. Зауважте, що воно є частиною повідомлення, якщо воно є ab=c. Додайте цей рядок до кодованого повідомлення.
  • Частина схеми кодування
    • Це буде у формі a=b. Це означає, що всі повідомлення в повідомленні повинні бути замінені на b. Зауважте, що це може бути a==, тобто всі `s повинні бути замінені на = 's.

Потім ваша програма повинна вивести повідомлення, розшифроване за допомогою знайденої схеми.

Інша інформація: Ваш вхід міститиме лише коми для розділення рядків. Він може містити інші символи, наприклад! 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

Що з транзитивністю та круговістю, наприклад, "massega","e=a","a=e"тощо?
Джонатан Аллан

1
біти інформації про декодування не декодують один одного. Інформація про декодування впливає лише на повідомлення.
підуде

1
також буде надана лише одна заміна на кожен символ, наприклад, ні"io,"i=u","i=g"
підуд

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 "модуль 2 шматочка"?
Magic Octopus Urn

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'

Вам потрібно: -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 />


1

Сітківка, 84 82 77 74 байт

Візьме список відокремлених комами як вхідний. Зверніть увагу на останній рядок

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

Спробуйте в Інтернеті!

Пояснення:

Спочатку переносимо всі вирази форми .=.до кінця рядка і відокремлюємо їх від повідомлення подвійною комою ( ,,). Це так, що на наступному кроці ми можемо знайти всі кодування, перевіривши, чи має кожен символ перед знаком ,,відповідності =.згодом. Це досягається тим, 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). Перший раз шукає рядки, які не містять =як другий символ, і з'єднує їх у результат. Вдруге шукає рядки, які містять =як другий символ, і виконує підміну. (ще зручніше, що заміна вже в форматі Batch.)



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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.