Thứ Hai, 15 tháng 7, 2019

Giải mã tin nhắn TINNHAN

Có một tin nhắn được mã hóa và giấu trong một xâu văn bản trước khi gửi đi. Quy tắc mã hóa tin nhắn là thay mỗi chữ cái trong tin nhắn thành một chữ cái đứng cách nó k vị  trí trong bảng chữ cái tiếng Anh theo quy tắc xoay vòng, các ký tự không phải chữ cái thì không thay đổi. Trong xâu có thể có nhiều tin nhắn, giữa các tin nhắn được ngăn cách nhau bởi dấu #. Biết rằng tin nhắn có độ dài lớn nhất là tin nhắn cần tìm. Nếu có nhiều tin nhắn có cùng chiều dài thì tin nhắn đầu tiên tìm thấy là tin nhắn cần giải mã.
Yêu cầu: Cho trước một xâu S dài không quá 255 ký tự và một số nguyên dương k. Hãy tìm và giải mã tin nhắn được giấu trong xâu S.
Input: Cho trong tệp văn bản có tên TINNHAN.INP gồm hai dòng:
−  Dòng đầu: xâu S;
−  Dòng thứ hai: số nguyên dương k.
Ouput: Xuất ra tệp văn bản có tên TINNHAN.OUT gồm hai dòng:
−  Dòng đầu: số lượng tin nhắn tìm được;
−  Dòng thứ hai: nội dung tin nhắn cần tìm đã được giải mã.
Ví dụ
Input   
ABC#QBTDBM#123HGF
1   
Output
2
PASCAL

2 nhận xét:

  1. Uses crt;
    Var s,tam:string;
    i,j,dem,n,o:longint;
    f:array[1..100] of string;
    function test(a:string):string;
    Var b:string;
    x,y:longint;
    Begin
    b:='';
    For x:=1 to length(a) do
    Begin
    For y:=65 to 91 do
    If a[x]=chr(y) then Begin
    If (y-n)>=65 then b:=b+chr(y-n) else b:=b+chr(26+y-n);
    break; end;
    If y=91 then exit('');
    end;
    exit(b);
    end;
    Begin
    o:=1;
    readln(s);
    s:='#'+s+'#';
    readln(n);
    For i:=1 to length(s) do
    If s[i]='#' then
    For j:=i+1 to length(s) do
    If s[j]='#' then
    Begin
    f[o]:=copy(s,i+1,j-i-1);
    o:=o+1;
    break;
    end;
    For i:=1 to o-1 do
    Begin
    f[i]:=test(f[i]);
    If f[i]<>'' then dem:=dem+1;
    end;
    Writeln(dem);
    For i:=1 to o-1 do
    For j:=i+1 to o-2 do
    If length(f[i])<length(f[j]) then
    Begin
    tam:=f[i];
    f[i]:=f[j];
    f[j]:=tam;
    end;
    Write(f[1]);
    readln;
    end.

    Trả lờiXóa
  2. uses crt;
    var s,st,st2:string;
    i,max,vt,d,k,j:integer;
    a:array[1..10000] of string;
    begin
    clrscr;
    readln(s); readln(k);
    s:=s+'#';
    max:=0;
    while length(s)<>0 do
    begin
    vt:=pos('#',s);
    st:=copy(s,1,vt-1);
    d:=d+1;
    a[d]:=st;
    delete(s,1,vt);
    end;
    for i:=1 to d do
    if length(a[i])>max then max:=length(a[i]);
    for i:=1 to d do
    for j:=i+1 to d do
    if length(a[i])=length(a[j]) then st2:=a[i];
    for i:=1 to length(st2) do
    write(chr(((ord(st2[i])-65-k+26)mod 26)+65));
    readln;
    end.

    Trả lờiXóa

Dùng nick gmail để bình luận. Nếu lần đầu tiên bạn làm điều này thì hệ thống sẽ chuyển bạn sang trang blogger và hỏi bạn chọn tên hiển thị là gì. Bạn hãy nhập tên hiển thị rồi ok là được. Những lần bình luận sau hệ thống sẽ không hỏi nữa. Cảm ơn!

Bài được xem nhiều nhất