¡Decodifica el mensaje oculto!

11

Introducción

Un día, estabas relajado en tu oficina en la CIA, cuando de repente ves una alerta en tu computadora. ¡Sus programas acaban de interceptar cientos de mensajes codificados! Un examen rápido revela la regla para la codificación, pero necesita un programa para decodificar rápidamente.

Desafío

Se le dará una lista de cadenas, separadas por comas. Cada cadena contendrá:

  • Parte del mensaje codificado
    • Es parte del mensaje codificado, si es que no en la forma a=b. Tenga en cuenta que es parte del mensaje si lo es ab=c. Agregue esta cadena al mensaje codificado.
  • Parte del esquema de codificación.
    • Esto será en forma de a=b. Eso significa que todas las a en el mensaje deben ser reemplazadas por b. Tenga en cuenta que podría ser a==, lo que significa que todos los a`s deben reemplazarse con = 's.

Su programa debe enviar el mensaje, decodificado usando el esquema encontrado.

Otra información: su entrada solo contendrá comas para separar las cadenas. Podría contener otros caracteres, como! 1 #, etc. No contendrá letras mayúsculas. Los bits de información de decodificación no se decodifican entre sí. Solo el mensaje se ve afectado por la información de decodificación. Solo se dará un reemplazo para cada personaje, por ejemplo, no"io,"i=u","i=g"

Ejemplos

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

Salida:test 1

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

Salida:potatoes=life

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

Salida:another

Este es el , por lo que la respuesta más corta en bytes gana.

Pydude
fuente
oh si, lo siento edición
pydude 05 de
¿Qué pasa con la transitividad y la circularidad, por ejemplo, "massega","e=a","a=e"y similares?
Jonathan Allan
1
bits de información de decodificación no se decodifican entre sí. Solo el mensaje se ve afectado por la información de decodificación.
pydude
1
Además, solo se dará un reemplazo para cada personaje, por ejemplo, no"io,"i=u","i=g"
pydude
1
Gracias, sugiero agregar esta información a la especificación.
Jonathan Allan

Respuestas:

1

Jalea , 19 bytes

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

Pruébalo en línea!

¿Cómo?

ḊṖ⁼“=” - 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
fuente
Muy interesante, ¿qué significa m2 "módulo 2 rebanada"?
Magic Octopus Urn
mes un átomo diádico que toma cada elemento derecho-izquierdo de izquierda *. Aquí, por ejemplo, ['x','=','y','<space>','a','=','b']m2cedería ['x','y','a','b']. (* a menos que la derecha sea cero cuando agrega una reflexión en su lugar.)
Jonathan Allan
5

Pitón 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 lambdafunción recibe una lista de cadenas (entrada) y devuelve una cadena (el mensaje decodificado).

Ejemplos:

>>> 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
fuente
¿Necesita: -1 o: 2 funcionará?
DSM
1
@DSM Creo que es necesario porque '=' == x[1:2]será cierto para x = 'a=bc', que no es parte del esquema de codificación
vaultah
1
Ahh, buen punto!
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"

Descripción

f crea una tabla de búsqueda.

concat[c|c<-x,[]==f[c]] Extrae el mensaje.

map(\v->maybe v id$lookup v$f x) realiza la búsqueda.

Rainer P.
fuente
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 />

Solo ASCII
fuente
1

Retina, 84 82 77 74 bytes

Toma una lista separada por comas como entrada. Tenga en cuenta la nueva línea final

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

Pruébalo en línea!

Explicación:

Primero, movemos todas las expresiones del formulario .=.al final de la cadena y las separamos del mensaje con una coma doble ( ,,). Esto es para que en el siguiente paso, podamos encontrar todas las codificaciones comprobando si cada carácter anterior ,,tiene una coincidencia =.después. Esto se logra mediante el M!&`(.).*,,.*\1=.|.+,cual encuentra todas esas coincidencias y las coloca en una lista de cadenas separadas por salto de línea. Luego modificamos cada cadena para que solo contenga un carácter no codificado o la versión codificada del carácter. Finalmente, reemplazamos todos los avances de línea y comas con la cadena vacía para que nuestra salida tenga un formato agradable.

adicto a las matemáticas
fuente
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

Explicación: recorre la lista de cadenas dos veces (convenientemente forle gusta una cadena en formato CSV). La primera vez, busca cadenas que no contengan un =como el segundo carácter y las concatena con el resultado. La segunda vez, busca cadenas que contienen un =como el segundo carácter y realiza la sustitución. (Aún más convenientemente, la sustitución ya está en formato Batch).

Neil
fuente
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;

Versión en línea

Jörg Hülsermann
fuente
0

PHP, 89 87 bytes

dos versiones:

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

toma datos de los argumentos de la línea de comandos; correr con -nr.

  • recorrer los argumentos creando parámetros para strtr
    (traducción si el argumento contiene =, mensaje más).
  • realizar strtr.
Titus
fuente
0

05AB1E , 31 bytes

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

Pruébalo en línea!

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 pulpo mágico
fuente