Rezolvare completă PbInfo #2417 criptare1

Mircea şi Vasilică vor să-şi trimită mesaje pe care alţii să nu le înţeleagă. Au citit ei despre spioni şi modalităţi de a scrie mesaje şi, în final, au imaginat un mod de criptare a unui mesaj care foloseşte “cuvânt cheie” (le-a plăcut lor denumirea asta :-) ).

Alegându-şi un cuvânt cheie format numai din litere distincte, ei numără literele acestuia şi împart mesajul în grupe de lungime egală cu numărul de litere ale cuvântului cheie, şi le aşează una sub alta. Desigur, se poate întâmpla ca ultima grupă să fie incompletă, aşa că o completează cu spaţii. Apoi numerotează literele cuvântului cheie în ordinea apariţiei lor în alfabetul englez. În final, rescriu mesajul astfel: coloana de sub litera numerotată cu 1, urmată de coloana de sub litera numerotată cu 2, etc. înlocuind totodată şi spaţiile cu caracterul *.

Exemplu:

  • cuvântul cheie: criptam
  • mesaj de criptat: Incercam sa lucram cu coduri si criptari.
  • cuvântul cheie criptam are 7 litere
  • numerotare: 2635714
  • deoarece, avem, în ordine:
    abcdefghijklmnopqrstuvwxzy
    1 2 3 4 5 6 7
  • împărţire în grupe: Incerca|m sa lu|cram cu| coduri| si cri|ptari.
  • codificare:
    2635714
    Incerca
    m*sa*lu
    cram*cu
    *coduri
    *si*cri
    ptari.*
  • mesaj criptat:
    clcrr.Imc**pcsaoiaauuii*eamd*rn*rcstr**uci
    col1 col2 col3 col4 col5 col6 col7

Cerința

Fiind date un cuvânt cheie şi un mesaj criptat, decodificaţi mesajul trimis de Mircea pentru Vasilică.

Date de intrare

Fișierul de intrare criptare1.in conţine pe prima linie mesajul criptat iar pe linia a doua cuvântul cheie.

Date de ieșire

Fișierul de ieșire criptare1.out va conţine pe prima linie mesajul decriptat.

Restricții și precizări

  • lungimea mesajului este de minim 20 si maximum 1000 caractere
  • cuvântul cheie are minimum 5 şi maximum 20 de caractere
  • cuvântul cheie conţine numai litere mici ale alfabetului

Exemplu

criptare1.in

clcrr.Imc**pcsaoiaauuii*eamd*rn*rcstr**uci
criptam

criptare1.out

Incercam sa lucram cu coduri si criptari.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema criptare1:

#include <fstream>
#include <cstring>
using namespace std;

char mesaj[1001], cheie[21], c;
int lgm, lgc, l, i, j, apare, cate, col, gasit, k;
int cod[201][21], alfabet[27];

ifstream f("criptare1.in");
ofstream g("criptare1.out");

void citire()
{
  f.getline(mesaj, 1001);
  f.getline(cheie, 21);
  f.close();
}

void decriptare()
{
  lgm=strlen(mesaj);
  lgc=strlen(cheie);
  cate=lgm/lgc;
  apare=0;
  for (c='a'; c<='z'; c++)
    {
      for (i=0; i<lgc; i++)
      if (cheie[i]==c)
    {
      apare++;
      alfabet[c-'a'+1]=apare;
    }
    }
  l=0;
  for (i=0; i<lgc; i++)
    for (j=1; j<=26; j++)
      if (alfabet[j]==i+1) ///am gasit litera a i-a (ca numerotare in cheie)
    {
      ///caut pe ce pozitie in cheie este ca sa determin coloana
      col=0; gasit=0;
      while (!gasit)
        {
          if (cheie[col]==(char)(j+'a'-1))
        gasit=1;
          col++;
        }
      for (k=1; k<=cate; k++)    //pun in coloana col
        cod[k][col]=mesaj[l++];
    }
  for (i=1; i<=cate; i++)
    for (j=1; j<=lgc; j++)
      if ((char)cod[i][j]!='*')
    g<<(char)cod[i][j];
      else
    g<<' ';
  g<<endl;
  g.close();
}

int main()
{
  citire();
  decriptare();
  return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2417 criptare1

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2417 criptare1 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!