Décodez le message caché!

11

introduction

Un jour, vous vous relaxiez dans votre bureau de la CIA, quand soudain vous voyez une alerte sur votre ordinateur. Vos programmes viennent d'intercepter des centaines de messages codés! Un examen rapide révèle la règle d'encodage, mais vous avez besoin d'un programme pour décoder rapidement.

Défi

Vous recevrez une liste de chaînes, séparées par des virgules. Chaque chaîne contiendra soit:

  • Une partie du message codé
    • Il fait partie du message codé s'il n'est pas dans le formulaire a=b. Notez qu'il fait partie du message s'il l'est ab=c. Ajoutez cette chaîne au message codé.
  • Une partie du schéma de codage
    • Ce sera sous la forme de a=b. Cela signifie que tous les a du message doivent être remplacés par des b. Notez que cela pourrait l'être a==, ce qui signifie que tous les a`s doivent être remplacés par des = 's.

Votre programme doit ensuite sortir le message, décodé en utilisant le schéma trouvé.

Autres informations: votre entrée ne contiendra que des virgules pour séparer les chaînes. Il peut contenir d'autres caractères, comme! 1 #, etc. Il ne contiendra pas de lettres majuscules. Les informations de décodage ne se décodent pas les unes les autres. Seul le message est affecté par les informations de décodage. Un seul remplacement sera donné pour chaque personnage, par exemple non"io,"i=u","i=g"

Exemples

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

Production:test 1

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

Production:potatoes=life

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

Production:another

C'est le , donc la réponse la plus courte en octets gagne!

pydude
la source
oh ouais, désolé! montage
pydude
Qu'en est-il de la transitivité et de la circularité, par exemple "massega","e=a","a=e"et similaires?
Jonathan Allan
1
les bits d'informations de décodage ne se décodent pas mutuellement. Seul le message est affecté par les informations de décodage.
pydude
1
aussi, un seul remplacement sera donné pour chaque personnage, par exemple no"io,"i=u","i=g"
pydude
1
Merci, je suggère d'ajouter ces informations aux spécifications.
Jonathan Allan

Réponses:

1

Gelée , 19 octets

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

Essayez-le en ligne!

Comment?

ḊṖ⁼“=” - 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
la source
Très intéressant, que veut dire m2 "tranche modulo 2"?
Magic Octopus Urn
mest un atome dyadique qui prend chaque élément droit de gauche *. Ici, par exemple, ['x','=','y','<space>','a','=','b']m2céderait ['x','y','a','b']. (* sauf si la droite est nulle lorsqu'elle ajoute à la place une réflexion.)
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})

Cette lambdafonction reçoit une liste de chaînes (entrée) et renvoie une chaîne (le message décodé).

Exemples:

>>> 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
la source
Avez-vous besoin de: -1 ou travaillerez-vous: 2?
DSM
1
@DSM Je pense que c'est nécessaire parce que ce '=' == x[1:2]sera vrai pour x = 'a=bc', ce qui ne fait pas partie du schéma d'encodage
vaultah
1
Ahh, bon point!
DSM
2

Haskell, 85 octets

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

Usage

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

La description

f crée une table de recherche.

concat[c|c<-x,[]==f[c]] extrait le message.

map(\v->maybe v id$lookup v$f x) améliore la recherche.

Rainer P.
la source
2

JavaScript (ES6), 87 octets

(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 uniquement
la source
1

Rétine, 84 82 77 74 octets

Prend une liste séparée par des virgules en entrée. Notez la nouvelle ligne de fin

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

Essayez-le en ligne!

Explication:

Tout d'abord, nous déplaçons toutes les expressions du formulaire .=.à la fin de la chaîne et les séparons du message avec une double virgule ( ,,). C'est ainsi que dans l'étape suivante, nous pouvons trouver tous les encodages en vérifiant si chaque caractère devant le ,,a une correspondance =.après. Ceci est réalisé par M!&`(.).*,,.*\1=.|.+,lequel trouve toutes ces correspondances et les place dans une liste de chaînes séparées par un saut de ligne. Nous modifions ensuite chaque chaîne pour ne contenir qu'un seul caractère non codé ou la version codée du caractère. Enfin, nous remplaçons tous les sauts de ligne et virgules par la chaîne vide afin que notre sortie soit bien formatée.

accro aux mathématiques
la source
0

Lot, 188 octets

@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

Explication: boucle deux fois la liste des chaînes ( foraime commodément une chaîne au format CSV). La première fois, recherche les chaînes qui ne contiennent pas un =comme deuxième caractère et les concatène au résultat. La deuxième fois, recherche les chaînes qui contiennent un =comme deuxième caractère et effectue la substitution. (encore plus commodément, la substitution est déjà au format Batch.)

Neil
la source
0

PHP, 116 octets

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

Version en ligne

Jörg Hülsermann
la source
0

PHP, 89 87 octets

deux versions:

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

prend l'entrée des arguments de la ligne de commande; courir avec -nr.

  • parcourir les arguments en créant des paramètres pour strtr
    (traduction si l'argument contient =, message sinon).
  • effectuer strtr.
Titus
la source
0

05AB1E , 31 octets

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

Essayez-le en ligne!

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.
Urne de poulpe magique
la source