Entschlüssle die versteckte Nachricht!


11

Einführung

Eines Tages haben Sie sich gerade in Ihrem Büro bei der CIA entspannt, als plötzlich eine Warnung auf Ihrem Computer angezeigt wird. Ihre Programme haben gerade Hunderte von codierten Nachrichten abgefangen! Eine schnelle Untersuchung zeigt die Regel für die Codierung, aber Sie benötigen ein Programm, um schnell zu decodieren.

Herausforderung

Sie erhalten eine Liste von Zeichenfolgen, die durch Kommas getrennt sind. Jede Zeichenfolge enthält entweder:

  • Teil der codierten Nachricht
    • Es ist Teil der codierten Nachricht, wenn es nicht im Formular vorliegt a=b. Beachten Sie, dass es ist ein Teil der Nachricht , wenn es ab=c. Fügen Sie diese Zeichenfolge der codierten Nachricht hinzu.
  • Teil des Codierungsschemas
    • Dies wird in Form von sein a=b. Das bedeutet, dass alle a in der Nachricht durch b ersetzt werden müssen. Beachten Sie, dass dies möglich ist a==, was bedeutet, dass alle a`s durch = 's ersetzt werden müssen.

Ihr Programm muss dann die Nachricht ausgeben, die mit dem gefundenen Schema dekodiert wurde.

Sonstige Informationen: Ihre Eingabe enthält nur Kommas zum Trennen der Zeichenfolgen. Es kann andere Zeichen wie! 1 # usw. enthalten. Es enthält keine Großbuchstaben. Teile der Dekodierungsinformationen dekodieren sich nicht gegenseitig. Nur die Nachricht ist von den Decodierungsinformationen betroffen. Für jedes Zeichen wird nur ein Ersatz gegeben, z. B. nein"io,"i=u","i=g"

Beispiele

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

Ausgabe:test 1

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

Ausgabe:potatoes=life

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

Ausgabe:another

Dies ist , also gewinnt die kürzeste Antwort in Bytes!


oh ja, sorry! Bearbeiten
Pydude

Was ist mit Transitivität und Zirkularität, z. B. "massega","e=a","a=e"und dergleichen?
Jonathan Allan

1
Bits von Decodierungsinformationen decodieren sich nicht gegenseitig. Nur die Nachricht ist von den Decodierungsinformationen betroffen.
Pydude

1
Außerdem wird nur ein Ersatz für jedes Zeichen gegeben, z. B. no"io,"i=u","i=g"
pydude

1
Vielen Dank, ich schlage vor, diese Informationen zur Spezifikation hinzuzufügen.
Jonathan Allan

Antworten:


1

Gelee , 19 Bytes

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

Probieren Sie es online aus!

Wie?

ḊṖ⁼“=” - 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

Sehr interessant, was bedeutet m2 "Modulo 2 Slice"?
Magic Octopus Urn

mist ein dyadisches Atom, das jedes rechts-te Element von links * nimmt. Hier ['x','=','y','<space>','a','=','b']m2würde zum Beispiel nachgeben ['x','y','a','b']. (* es sei denn, rechts ist Null, wenn stattdessen eine Reflexion angehängt wird.)
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})

Diese lambdaFunktion empfängt eine Liste von Zeichenfolgen (Eingabe) und gibt eine Zeichenfolge (die dekodierte Nachricht) zurück.

Beispiele:

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

Benötigen Sie: -1 oder werden: 2 funktionieren?
DSM

1
@DSM Ich denke, es wird benötigt, weil '=' == x[1:2]es wahr sein wird x = 'a=bc', was nicht Teil des Codierungsschemas ist
vaultah

1
Ahh, guter Punkt!
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]]

Verwendung

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

Beschreibung

f erstellt eine Nachschlagetabelle.

concat[c|c<-x,[]==f[c]] extrahiert die Nachricht.

map(\v->maybe v id$lookup v$f x) führt die Suche durch.


2

JavaScript (ES6), 87 Byte

(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

Retina, 84 82 77 74 Bytes

Nimmt eine durch Kommas getrennte Liste als Eingabe. Beachten Sie den nachfolgenden Zeilenumbruch

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

Probieren Sie es online aus!

Erläuterung:

Zuerst verschieben wir alle Ausdrücke des Formulars .=.an das Ende der Zeichenfolge und trennen diese von der Nachricht durch ein Doppelkomma ( ,,). Dies ist so, dass wir im nächsten Schritt alle Codierungen finden können, indem wir prüfen, ob jedes Zeichen vor dem ,,eine Übereinstimmung hat =.. Dies wird erreicht, indem M!&`(.).*,,.*\1=.|.+,alle diese Übereinstimmungen gefunden und in eine durch Zeilenvorschub getrennte Liste von Zeichenfolgen eingefügt werden. Wir ändern dann jede Zeichenfolge so, dass sie entweder nur ein nicht codiertes Zeichen oder die codierte Version des Zeichens enthält. Schließlich ersetzen wir alle Zeilenvorschübe und Kommas durch die leere Zeichenfolge, damit unsere Ausgabe gut formatiert wird.


0

Stapel, 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

Erläuterung: Durchläuft die Liste der Zeichenfolgen zweimal ( formag eine Zeichenfolge im CSV-Format). Sucht beim ersten Mal nach Zeichenfolgen, die kein =zweites Zeichen enthalten, und verkettet sie mit dem Ergebnis. Sucht beim zweiten Mal nach Zeichenfolgen, die ein =zweites Zeichen enthalten, und führt die Ersetzung durch. (Noch bequemer ist, dass die Ersetzung bereits im Stapelformat erfolgt.)



0

PHP, 89 87 Bytes

zwei Versionen:

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

Nimmt Eingaben von Befehlszeilenargumenten entgegen. laufen mit -nr.

  • Durchlaufen Sie Argumente, um Parameter für zu erstellen strtr
    (Übersetzung, wenn das Argument enthält =, Nachricht else).
  • durchführen strtr.

0

05AB1E , 31 Bytes

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

Probieren Sie es online aus!

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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.