Ceaiul Caesar Cipher Encryptor este următorul din seria noastră de parcurgere a problemelor de algoritm. Clasificat ca fiind un algoritm „ușor” pe site-uri precum Leetcode, aceasta este o altă problemă clasică care apare des la interviurile tehnice și este o bună practică pentru orice inginer software care dorește să își perfecționeze abilitățile de rezolvare a problemelor.
Informații de bază
În primul rând, câteva informații de bază despre Caesar Cipher, astfel încât să știm cu ce avem de-a face.Cifrul Caesar este un exemplu simplu de criptografie, care este definit de Merriam-Webster ca fiind: cifrarea și descifrarea mesajelor în cod secret sau cifru.
De asemenea: codificarea și decodificarea computerizată a informațiilor.
Cifrul Caesar se bazează pe transpunerea fiecărei litere a unui șir de caractere un număr specificat de locuri (clasicul este trei) în alfabet. Cifrul Caesar este cunoscut și sub numele de cifru de deplasare, deoarece implică deplasarea literelor pentru a ascunde semnificația mesajului. Cifrul Caesar este numit astfel deoarece se spune că Iulius Caesar și aliații săi au folosit această metodă de criptare pentru a trimite mesaje secrete care implicau secrete militare (IBM Z Security).
Caesar Cipher Encryptor
Acum că avem câteva informații despre Caesar Cipher și despre modul în care funcționează, putem trece la analizarea problemei propriu-zise a algoritmului. Având în vedere un șir nevid format din litere minuscule și o cheie (un număr întreg nenegativ) care specifică câte locuri din alfabet trebuie deplasată fiecare literă din șir, misiunea noastră este să scriem o funcție care să returneze șirul codificat. Dorim ca literele să se înfășoare în jurul alfabetului; z
decalată cu un loc ar trebui să returneze litera a
.
Acum să ne gândim la problemă din punct de vedere conceptual înainte de a trece la cod. Știm că trebuie să decalăm sistematic fiecare literă din șirul de intrare cu un anumit număr de locuri peste. Cum putem găsi o modalitate de a cartografia fiecare literă cu un număr, astfel încât să putem reprezenta în mod consecvent fiecare literă și, de asemenea, să deplasăm cu ușurință fiecare literă cu tasta dată? Am putea realiza propria noastră cartografiere a literelor în numere, stocându-ne sistemul de cartografiere într-un obiect în care cheia este un număr întreg, iar valoarea este litera corespunzătoare, dar există o metodă mai ușoară? Din fericire pentru noi, există.
JavaScript, ca multe alte limbaje de programare, are o funcție care ne permite să obținem valoarea Unicode a unei litere: charCodeAt()
. Această mică funcție încorporată la îndemână ne va permite să creăm în mod eficient un sistem de cartografiere pentru alfabet.
Ok, perfect. Acum că ne-am aranjat sistemul de cartografiere, trebuie să ne gândim la logistică.
Să inițializăm o matrice goală în care să păstrăm rezultatele noastre – vom numi această matrice newLetters
. Putem itera prin șirul transmis și, pentru fiecare literă a șirului, să convertim litera din alfabet în valoarea sa unicode. Apoi putem adăuga cheia (numărul reprezentativ pentru numărul de locuri în care transpunem litera noastră) la valoarea unicode pentru a obține valoarea unicode a noii litere. Apoi, vom dori să folosim funcția încorporată JavaScript String.fromCharCode()
pentru a converti valorile unicode înapoi în șiruri de caractere. Ca un pas final, putem împinge rezultatele noastre în array-ul newLetters și apoi să unim elementele array-ului nostru într-un singur șir de caractere pentru a obține răspunsul nostru final.
Ceasuri de reținut
Nu este teribil de complicat, dar vom dori să ținem cont de câteva lucruri importante. În primul rând, este util să știm că valoarea unicode a lui a
este 97 și valoarea unicode a lui z
este 122. Valorile noastre unicode trebuie să fie între 97 și 122 pentru a rămâne în interiorul alfabetului.
Pentru a ne asigura că literele noastre se înfășoară în jurul alfabetului (adică z decalat cu 1 poziție este a), dacă o valoare unicode este mai mare de 122, vom folosi operatorul modulo pentru a o forța la o valoare sub 122. Deoarece a
este egal cu 97, adăugăm apoi numărul rezultat în urma utilizării operatorului modulo în pasul anterior la 96 pentru a obține o valoare care corespunde unei litere din alfabet.
Ca o altă măsură de protecție împotriva obținerii unui număr mare, putem, de asemenea, să forțăm cheia la un număr ușor de gestionat. Deoarece alfabetul englez este alcătuit din 26 de litere, știm că deplasarea literelor cu 26 de locuri ne pune exact în același loc în care am început, înfrângând scopul cifrării. Așa că putem folosi operatorul modulo pentru a ne asigura că cheia este mai mică de 26.
Cod rezultat
Acum că am parcurs conceptul soluției, luați o secundă aici pentru a vă gândi cum să codificați efectiv acest lucru. Încercați mai întâi pe cont propriu. Este în regulă dacă codul dvs. este dezordonat și nu este atât de uscat pe cât v-ați dori – obțineți mai întâi o soluție funcțională și apoi vă puteți refactoriza și curăța codul.
Iată cum arată codul meu: