Polybius
Cifrul Polybius este un cifru folosit de Grecii Antici care are la bază un tabel de 5
linii și 5
coloane pentru a cripta sau decripta un șir de caractere. Pentru criptare, luăm fiecare caracter din șir și afișăm linia și coloana din tabel unde se află caracterul. Pentru decriptare afișăm caracterul care se află în tabel la linia și coloana dată.
De exemplu, folosind tabelul:
# | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | A | B | C | D | E |
2 | F | G | H | I | K |
3 | L | M | N | O | P |
4 | Q | R | S | T | U |
5 | V | W | X | Y | Z |
Împreună cu șirul INF
, afișăm 243321
deoarece litera I
se află pe poziția (2, 4)
, litera N
se află pe poziția (3, 3)
iar litera F
se află pe poziția (2, 1)
.
Cerința
Se dă un număr p
, un șir de caractere t
de 25
de caractere corespunzător tabelului și un șir de caractere s
. Să se determine:
1. Pentru p = 1
, să se cripteze șirul s
, format doar din litere mari, folosind tabelul t
.
2. Pentru p = 2
, să se decripteze șirul s
, format doar din cifre, folosind tabelul t
.
Date de intrare
Fișierul de intrare polybius.in
conține pe prima linie numărul p
, pe a doua linie șirul t
format din 25
de caractere, reprezentând toate elementele tabelului, de la stânga la dreapta și de sus în jos. A treia linie șirul de litere s
care trebuie criptat, dacă p=1
, respectiv șirul de cifre care trebuie decriptat, dacă p=2
.
Date de ieșire
Pentru p = 1
, fișierul de ieșire polybius.out
va conține pe prima linie rezultatul criptării. Cifrele se afișează fără spațiu între ele.
Pentru p = 2
, fișierul de ieșire polybius.out
va conține pe prima linie rezultatul decriptării.
Restricții și precizări
1 ≤ p ≤ 2
- lungimea șirului
t
este de25
de caractere 1 ≤
lungimea șirului de literes ≤ 500.000
- Se garantează că toate caracterele din
s
sunt incluse în șirult
și caracterele dint
sunt distincte două câte două. - O literă din alfabet va lipsi întotdeauna din tabel, fiind un tabel
5x5
iar alfabetul are26
de caractere.
Exemplul 1:
polybius.in
1 ABCDEFGHIKLMNOPQRSTUVWXYZ ANAAREMERE
polybius.out
11331111421532154215
Exemplul 2:
polybius.in
2 ABCDEFGHIKLMNOPQRSTUVWXYZ 11331111421532154215
polybius.out
ANAAREMERE
Explicație
Tabelul din exemple corespunzător șirului este acesta:
# | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | A | B | C | D | E |
2 | F | G | H | I | K |
3 | L | M | N | O | P |
4 | Q | R | S | T | U |
5 | V | W | X | Y | Z |
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 polybius:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("polybius.in");
ofstream g("polybius.out");
char c, d, w[8][8];
int v[128], i, j, p;
int main()
{
f >> p;
if(p == 1)
{
for(i = 1; i <= 5; i++)
for(j = 1; j <= 5; j++)
{
f >> c;
v[int(c)] = i * 10 + j;
}
while(f >> c)
g << v[int(c)];
} else
{
for(i = 1; i <= 5; i++)
for(j = 1; j <= 5; j++)
f >> w[i][j];
while(f >> c >> d)
g << w[int(c - '0')][int(d - '0')];
}
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 .
Rezolvarea problemei #3142 polybius
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3142 polybius 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!