解码隐藏的消息!


11

介绍

有一天,您只是在CIA的办公室里放松,突然间您在计算机上看到警报。您的程序刚刚截获了数百条编码消息!快速检查可以发现编码规则,但是您需要一个程序才能快速解码。

挑战

您将得到一个字符串列表,以逗号分隔。每个字符串将包含:

  • 编码消息的一部分
    • 如果不是形式,则它是编码消息的一部分a=b。请注意,如果,则它是消息的一部分ab=c。将此字符串添加到编码消息中。
  • 编码方案的一部分
    • 这将采用的形式a=b。这意味着消息中的所有a必须替换为b。请注意,它可能是a==,表示所有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

传递性和圆度(例如)"massega","e=a","a=e"如何?
乔纳森·艾伦,

1
解码信息的各个位不会相互解码。只有消息受解码信息影响。
pydude

1
同样,每个字符将只提供一个替换,例如,否"io,"i=u","i=g"
pydude

1
谢谢,我建议将此信息添加到规范中。
乔纳森·艾伦,

Answers:


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切片”是什么意思?
魔术章

m是二元原子,它接受left *的每个右元素。例如,此处['x','=','y','<space>','a','=','b']m2将产生['x','y','a','b']。(*除非在附加反射时将right设置为零,否则为零。)
Jonathan Allan'4

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

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'4

1
@DSM我认为这是必需的,因为这'=' == x[1:2]对于for x = 'a=bc'来说是正确的,这不是编码方案的一部分
vaultah

1
啊,好点!
DSM'4

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
M!&`(。)。* ,,。* \ 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格式的字符串)。第一次,查找不包含=作为第二个字符的字符串,并将它们连接到结果。第二次,查找确实包含=作为第二个字符的字符串,并执行替换。(更方便的是,替换已采用批处理格式。)



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

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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.