Decodifique a mensagem oculta!

11

Introdução

Um dia, você estava relaxando em seu escritório na CIA, quando de repente você vê um alerta no seu computador. Seus programas acabaram de interceptar centenas de mensagens codificadas! Um exame rápido revela a regra da codificação, mas você precisa de um programa para decodificar rapidamente.

Desafio

Você receberá uma lista de strings, separadas por vírgulas. Cada sequência conterá:

  • Parte da mensagem codificada
    • É parte da mensagem codificada, se for não na forma a=b. Observe que faz parte da mensagem, se estiver ab=c. Adicione essa sequência à mensagem codificada.
  • Parte do esquema de codificação
    • Isso será na forma de a=b. Isso significa que todos os a na mensagem devem ser substituídos por b. Observe que poderia ser a==, o que significa que todos os a`s devem ser substituídos por = 's.

Seu programa deve enviar a mensagem, decodificada usando o esquema encontrado.

Outras informações: sua entrada conterá apenas vírgulas para separar as strings. Pode conter outros caracteres, como! 1 #, etc. Não conterá letras maiúsculas. Bits de informações de decodificação não decodificam um ao outro. Somente a mensagem é afetada pelas informações de decodificação. Apenas uma substituição será dada para cada personagem, por exemplo, não"io,"i=u","i=g"

Exemplos

Entrada:"ta","y=s","y","a=e","b=t","b"," ","j","j=1"

Resultado:test 1

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

Resultado:potatoes=life

Entrada:"p","=","==n","ot","p=a","hiz","i=e","z=r"

Resultado:another

Isso é , então a resposta mais curta em bytes vence!

pydude
fonte
oh sim, desculpe! edição
pydude
E quanto à transitividade e circularidade, por exemplo, "massega","e=a","a=e"e similares?
Jonathan Allan
1
bits de informações de decodificação não decodificam um ao outro. Somente a mensagem é afetada pelas informações de decodificação.
Pydude # 5/17
1
Além disso, será dada para cada personagem apenas uma substituição, por exemplo, não"io,"i=u","i=g"
pydude
1
Obrigado, sugiro adicionar essas informações à especificação.
Jonathan Allan

Respostas:

1

Geléia , 19 bytes

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

Experimente online!

Quão?

ḊṖ⁼“=” - 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
fonte
Muito interessante, o que significa m2 "modulo 2 slice"?
Magic Octopus Urn
mé um átomo diádico que retira todos os elementos da direita * da esquerda *. Aqui, por exemplo, ['x','=','y','<space>','a','=','b']m2renderia ['x','y','a','b']. (* Menos certo é zero quando ele acrescenta uma reflexão em seu lugar.)
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})

Esta lambdafunção recebe uma lista de strings (entrada) e retorna uma string (a mensagem decodificada).

Exemplos:

>>> 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
fonte
Você precisa: -1 ou irá: 2 funcionar?
DSM
1
@DSM Eu acho que ela é necessária porque '=' == x[1:2]será verdade para x = 'a=bc', que não é uma parte do esquema de codificação
vaultah
1
Ahh, bom ponto!
DSM
2

Haskell, 85 bytes

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

Uso

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

Descrição

f cria uma tabela de pesquisa.

concat[c|c<-x,[]==f[c]] extrai a mensagem.

map(\v->maybe v id$lookup v$f x) realiza a pesquisa.

Rainer P.
fonte
2

JavaScript (ES6), 87 bytes

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

Somente ASCII
fonte
1

Retina, 84 82 77 74 bytes

Leva uma lista separada por vírgula como entrada. Observe a nova linha à direita

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

Experimente Online!

Explicação:

Primeiro, movemos todas as expressões do formulário .=.para o final da string e as separamos da mensagem com uma vírgula dupla ( ,,). Isso é feito para que, na próxima etapa, possamos encontrar todas as codificações verificando se cada caractere à frente da ,,tem uma correspondência =.posteriormente. Isso é alcançado através do M!&`(.).*,,.*\1=.|.+,qual encontra todas essas correspondências e as coloca em uma lista de cadeias separada por avanço de linha. Em seguida, modificamos cada sequência para conter apenas um caractere não codificado ou a versão codificada do caractere. Finalmente, substituímos todos os feeds de linha e vírgulas pela string vazia, para que nossa saída seja formatada corretamente.

viciado em matemática
fonte
0

Lote, 188 bytes

@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

Explicação: Percorre a lista de cadeias duas vezes ( forgosta de uma cadeia no formato CSV). Na primeira vez, procura por seqüências que não contenham um =como o segundo caractere e concatena-as com o resultado. Na segunda vez, procura por seqüências que contenham um =caractere como o segundo caractere e executa a substituição. (ainda mais convenientemente, a substituição já está no formato de lote).

Neil
fonte
0

PHP, 116 bytes

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

Versão Online

Jörg Hülsermann
fonte
0

PHP, 89 87 bytes

duas versões:

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

recebe entrada de argumentos de linha de comando; corra com -nr.

  • percorrer argumentos criando parâmetros para strtr
    (tradução se argumento contiver =, mensagem mais).
  • executar strtr.
Titus
fonte
0

05AB1E , 31 bytes

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

Experimente 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 de polvo mágico
fonte