Giải mã tin nhắn ẩn!


11

Giới thiệu

Một ngày nọ, bạn đang thư giãn trong văn phòng của mình tại CIA thì đột nhiên bạn thấy một cảnh báo trên máy tính của mình. Các chương trình của bạn vừa chặn hàng trăm tin nhắn được mã hóa! Kiểm tra nhanh cho thấy quy tắc mã hóa, nhưng bạn cần một chương trình để giải mã nhanh.

Thử thách

Bạn sẽ được cung cấp một danh sách các chuỗi, được phân tách bằng dấu phẩy. Mỗi chuỗi sẽ chứa một trong hai:

  • Một phần của tin nhắn được mã hóa
    • Nó là một phần của tin nhắn được mã hóa nếu nó không ở dạng a=b. Lưu ý rằng nó một phần của tin nhắn nếu có ab=c. Thêm chuỗi này vào tin nhắn được mã hóa.
  • Một phần của sơ đồ mã hóa
    • Điều này sẽ ở dạng a=b. Điều đó có nghĩa là tất cả a trong tin nhắn phải được thay thế bằng b's. Lưu ý rằng nó có thể a==, có nghĩa là tất cả a `phải được thay thế bằng = 's.

Chương trình của bạn sau đó phải xuất thông báo, được giải mã bằng lược đồ tìm thấy.

Thông tin khác: Đầu vào của bạn sẽ chỉ chứa dấu phẩy để phân tách các chuỗi. Nó có thể chứa các ký tự khác, như! 1 #, v.v. Nó sẽ không chứa các chữ cái viết hoa. Các thông tin giải mã không giải mã lẫn nhau. Chỉ có tin nhắn bị ảnh hưởng bởi thông tin giải mã. Chỉ có một thay thế sẽ được đưa ra cho mỗi nhân vật, ví dụ như không"io,"i=u","i=g"

Ví dụ

Đầu vào:"ta","y=s","y","a=e","b=t","b"," ","j","j=1"

Đầu ra:test 1

Đầu vào:"z=p","zota","g=e","yugkb","y=t","u=o","k=s","li","fg","b=="

Đầu ra:potatoes=life

Đầu vào:"p","=","==n","ot","p=a","hiz","i=e","z=r"

Đầu ra:another

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng!


oh vâng, xin lỗi! chỉnh sửa
pydude

Điều gì về tính siêu việt và tính tròn, ví dụ "massega","e=a","a=e"và tương tự?
Jonathan Allan

1
bit thông tin giải mã không giải mã lẫn nhau. Chỉ có tin nhắn bị ảnh hưởng bởi thông tin giải mã.
pydude

1
ngoài ra, chỉ có một sự thay thế sẽ được đưa ra cho mỗi nhân vật, ví dụ như không"io,"i=u","i=g"
pydude

1
Cảm ơn, tôi đề nghị thêm thông tin này vào đặc điểm kỹ thuật.
Jonathan Allan

Câu trả lời:


1

Thạch , 19 byte

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

Hãy thử trực tuyến!

Làm sao?

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

Rất thú vị, m2 "modulo 2 lát" nghĩa là gì?
Bạch tuộc ma thuật Urn

mlà một nguyên tử dyadic lấy mọi phần tử bên phải của *. Ở đây, ví dụ, ['x','=','y','<space>','a','=','b']m2sẽ mang lại ['x','y','a','b']. (* trừ khi quyền là 0 khi thay vào đó là phần phản chiếu.)
Jonathan Allan

5

Tră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})

lambdaHàm này nhận danh sách các chuỗi (đầu vào) và trả về một chuỗi (tin nhắn được giải mã).

Ví dụ:

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

Bạn có cần: -1 hoặc sẽ: 2 làm việc?
DSM

1
@DSM Tôi nghĩ rằng nó cần thiết bởi vì '=' == x[1:2]nó sẽ đúng x = 'a=bc', đây không phải là một phần của sơ đồ mã hóa
vaultah

1
Ahh, điểm tốt!
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]]

Sử dụng

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

Sự miêu tả

f tạo một bảng tra cứu.

concat[c|c<-x,[]==f[c]] trích xuất thông điệp.

map(\v->maybe v id$lookup v$f x) nước hoa tra cứu.


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

Võng mạc, 84 82 77 74 byte

Lấy danh sách được phân tách bằng dấu phẩy làm đầu vào. Lưu ý dòng mới

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

Hãy thử trực tuyến!

Giải trình:

Đầu tiên, chúng ta di chuyển tất cả các biểu thức của biểu mẫu .=.đến cuối chuỗi và tách chúng khỏi thông báo bằng dấu phẩy kép ( ,,). Điều này là để trong bước tiếp theo, chúng ta có thể tìm thấy tất cả các bảng mã bằng cách kiểm tra xem mỗi ký tự phía trước ,,có khớp với nhau không =.. Điều này đạt được bằng cách M!&`(.).*,,.*\1=.|.+,tìm tất cả các kết quả khớp như vậy và đặt chúng vào danh sách các chuỗi được phân tách theo dòng cấp. Sau đó, chúng tôi sửa đổi từng chuỗi để chỉ chứa một ký tự chưa được mã hóa hoặc phiên bản được mã hóa của ký tự. Cuối cùng, chúng tôi thay thế tất cả các nguồn cấp và dấu phẩy bằng chuỗi trống để đầu ra của chúng tôi được định dạng độc đáo.


0

Mẻ, 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

Giải thích: Vòng lặp thông qua danh sách các chuỗi hai lần (thuận tiện forthích một chuỗi ở định dạng CSV). Lần đầu tiên, tìm kiếm các chuỗi không chứa =ký tự thứ hai và nối chúng với kết quả. Lần thứ hai, tìm kiếm các chuỗi có chứa một =ký tự thứ hai và thực hiện thay thế. (thậm chí thuận tiện hơn, sự thay thế đã ở định dạng Batch.)



0

PHP, 89 87 byte

hai phiên bản:

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

lấy đầu vào từ các đối số dòng lệnh; chạy với -nr.

  • lặp qua các đối số tạo tham số cho strtr
    (dịch nếu chứa đối số =, thông báo khác).
  • thực hiện strtr.

0

05AB1E , 31 byte

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

Hãy thử trực tuyến!

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.