Pecahkan kode pesan tersembunyi!

11

pengantar

Suatu hari, Anda hanya bersantai di kantor Anda di CIA, ketika tiba-tiba Anda melihat peringatan di komputer Anda. Program Anda baru saja mencegat ratusan pesan kode! Pemeriksaan cepat mengungkapkan aturan untuk penyandian, tetapi Anda membutuhkan program untuk dapat memecahkan kode dengan cepat.

Tantangan

Anda akan diberikan daftar string, dipisahkan dengan koma. Setiap string akan mengandung:

  • Bagian dari pesan kode
    • Ini adalah bagian dari pesan kode jika tidak ada dalam formulir a=b. Perhatikan bahwa ini adalah bagian dari pesan jika ya ab=c. Tambahkan string ini ke pesan kode.
  • Bagian dari skema pengkodean
    • Ini akan dalam bentuk a=b. Itu berarti bahwa semua a dalam pesan harus diganti dengan b. Perhatikan bahwa bisa jadi a==, artinya semua a harus diganti dengan = 's.

Program Anda kemudian harus menampilkan pesan, diterjemahkan menggunakan skema yang ditemukan.

Info lain: Masukan Anda hanya akan mengandung koma untuk memisahkan string. Itu bisa berisi karakter lain, seperti! 1 #, dll. Itu tidak akan mengandung huruf besar. Bit info decoding tidak saling mendekode. Hanya pesan yang terpengaruh oleh informasi pengodean ulang. Hanya satu pengganti yang akan diberikan untuk setiap karakter, misalnya tidak"io,"i=u","i=g"

Contohnya

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

Keluaran:test 1

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

Keluaran:potatoes=life

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

Keluaran:another

Ini , jadi jawaban tersingkat dalam byte menang!

pydude
sumber
oh ya maaf! editting
pydude
Bagaimana dengan transitivitas dan sirkularitas, mis "massega","e=a","a=e" dan sejenisnya?
Jonathan Allan
1
bit info decoding tidak saling mendekode. Hanya pesan yang terpengaruh oleh informasi pengodean ulang.
pydude
1
juga, hanya satu pengganti yang akan diberikan untuk setiap karakter, misalnya tidak "io,"i=u","i=g"
pydude
1
Terima kasih, saya sarankan menambahkan informasi ini ke spesifikasi.
Jonathan Allan

Jawaban:

1

Jelly , 19 byte

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

Cobalah online!

Bagaimana?

ḊṖ⁼“=” - 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
sumber
Sangat menarik, apa artinya m2 "modulo 2 slice"?
Magic Gurita Guci
madalah atom diad yang mengambil setiap elemen kanan-kiri *. Di sini, misalnya, ['x','=','y','<space>','a','=','b']m2akan menghasilkan ['x','y','a','b']. (* kecuali benar nol ketika menambahkan refleksi.)
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})

lambdaFungsi ini menerima daftar string (input) dan mengembalikan string (pesan yang diterjemahkan).

Contoh:

>>> 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'
kubah
sumber
Apakah Anda memerlukan: -1 atau akan: 2 berfungsi?
DSM
1
@ DSM Saya pikir ini diperlukan karena '=' == x[1:2]akan berlaku untuk x = 'a=bc', yang bukan bagian dari skema pengkodean
vaultah
1
Ahh, poin bagus!
DSM
2

Haskell, 85 byte

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

Pemakaian

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

Deskripsi

f membuat tabel pencarian.

concat[c|c<-x,[]==f[c]] mengekstrak pesan.

map(\v->maybe v id$lookup v$f x) melakukan pencarian.

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

Khusus ASCII
sumber
1

Retina, 84 82 77 74 byte

Mengambil daftar yang dipisahkan koma sebagai input. Perhatikan baris baru yang tertinggal

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

Cobalah secara Online!

Penjelasan:

Pertama, kami memindahkan semua ekspresi formulir .=.ke akhir string dan memisahkannya dari pesan dengan koma ganda ( ,,). Ini agar pada langkah selanjutnya, kita dapat menemukan semua penyandian dengan memeriksa apakah setiap karakter di depan ,,memiliki kecocokan =.sesudahnya. Ini dicapai dengan M!&`(.).*,,.*\1=.|.+,menemukan semua kecocokan tersebut dan menempatkannya ke dalam daftar string yang dipisahkan oleh umpan baris. Kami kemudian memodifikasi setiap string hanya berisi salah satu karakter yang tidak ter-enkripsi atau versi karakter yang disandikan. Akhirnya kami mengganti semua umpan baris dan koma dengan string kosong sehingga output kami diformat dengan baik.

pecandu matematika
sumber
0

Batch, 188 byte

@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

Penjelasan: Loop melalui daftar string dua kali ( forsuka suka string dalam format CSV). Pertama kali, mencari string yang tidak mengandung =karakter kedua, dan menggabungkannya dengan hasilnya. Kedua kalinya, mencari string yang mengandung =karakter kedua, dan melakukan substitusi. (bahkan lebih mudah, substitusi sudah dalam format Batch.)

Neil
sumber
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 Online

Jörg Hülsermann
sumber
0

PHP, 89 87 byte

dua versi:

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

mengambil input dari argumen baris perintah; jalankan bersama -nr.

  • loop through argumen yang menciptakan parameter untuk strtr
    (terjemahan jika argumen berisi =, pesan lain).
  • tampil strtr.
Titus
sumber
0

05AB1E , 31 byte

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

Cobalah 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.
Guci Gurita Ajaib
sumber