The Caesar Cipher Encryptor is next up in our series of algorithm problem walkthroughs. Classificato come un algoritmo “facile” su siti web come Leetcode, questo è un altro classico problema che viene fuori spesso nei colloqui tecnici ed è un buon esercizio per qualsiasi ingegnere del software che cerca di rispolverare le proprie capacità di problem-solving.
Informazioni di base
Primo, alcune informazioni di base sul Cifrario di Cesare così sappiamo con cosa abbiamo a che fare.Il Cifrario di Cesare è un semplice esempio di crittografia, che è definita dal Merriam-Webster come: la cifratura e la decifrazione di messaggi in codice segreto o cifrario.
Anche: la codifica e la decodifica computerizzata di informazioni.
Il Cifrario di Cesare è basato sulla trasposizione di ogni lettera di una stringa in un determinato numero di posti (il classico è tre) dell’alfabeto. Il Cifrario di Cesare è anche conosciuto come un cifrario a turni, poiché comporta lo spostamento delle lettere per nascondere il significato del messaggio. Il Cifrario di Cesare è così chiamato perché si dice che Giulio Cesare e i suoi alleati usavano questo metodo di crittografia per inviare messaggi segreti che riguardavano segreti militari (IBM Z Security).
Caesar Cipher Encryptor
Ora che abbiamo un po’ di background sulla Cifra di Cesare e su come funziona, possiamo passare a guardare il problema dell’algoritmo attuale. Data una stringa non vuota composta da lettere minuscole e una chiave (un numero intero non negativo) che specifica di quanti posti nell’alfabeto spostare ogni lettera nella stringa, la nostra missione è scrivere una funzione che restituisca la stringa codificata. Vogliamo che le lettere avvolgano l’alfabeto; z
spostato di un posto dovrebbe restituire la lettera a
.
Ora pensiamo al problema da un punto di vista concettuale prima di buttarci nel codice. Sappiamo che abbiamo bisogno di spostare sistematicamente ogni lettera della stringa in ingresso di un certo numero di posti. Come possiamo trovare un modo per mappare ogni lettera ad un numero in modo da poter rappresentare coerentemente ogni lettera e anche spostare facilmente ogni lettera del tasto dato? Potremmo fare la nostra mappatura delle lettere ai numeri, memorizzando il nostro sistema di mappatura in un oggetto dove la chiave è un intero e il valore è la lettera corrispondente, ma esiste un metodo più semplice? Fortunatamente per noi, c’è.
JavaScript, come molti altri linguaggi di programmazione, ha una funzione che ci permette di ottenere il valore Unicode di una lettera: charCodeAt()
. Questa piccola funzione integrata ci permetterà di creare in modo efficiente un sistema di mappatura per l’alfabeto.
Ok, perfetto. Ora che abbiamo sistemato il nostro sistema di mappatura, dobbiamo pensare alla logistica.
Inizializziamo un array vuoto in cui possiamo tenere i nostri risultati – chiameremo questo array newLetters
. Possiamo iterare attraverso la stringa passata e per ogni lettera della stringa, convertire la lettera dell’alfabeto nel suo valore unicode. Possiamo poi aggiungere la chiave (il numero che rappresenta quanti posti stiamo trasponendo la nostra lettera) al valore unicode per ottenere il valore unicode della nuova lettera. Poi vorremo usare la funzione integrata di JavaScript String.fromCharCode()
per convertire i valori unicode in stringhe. Come passo finale, possiamo spingere i nostri risultati nell’array newLetters e poi unire gli elementi del nostro array in una singola stringa per ottenere la nostra risposta finale.
Cose da tenere a mente
Non è molto complicato, ma dobbiamo tenere a mente alcune cose importanti. Per prima cosa, è utile sapere che il valore unicode di a
è 97 e il valore unicode di z
è 122. I nostri valori unicode devono essere compresi tra 97 e 122 per rimanere all’interno dell’alfabeto.
Per assicurarci che le nostre lettere avvolgano l’alfabeto (cioè, z spostata di 1 posizione è a), se un valore unicode è superiore a 122, useremo l’operatore modulo per forzarlo ad un valore inferiore a 122. Poiché a
è uguale a 97, aggiungiamo il numero risultante dall’uso dell’operatore modulo nel passo precedente a 96 per finire con un valore che corrisponde a una lettera dell’alfabeto.
Come un’altra salvaguardia contro l’ottenimento di un numero grande, possiamo anche forzare la chiave in un numero gestibile. Poiché l’alfabeto inglese è composto da 26 lettere, sappiamo che spostando le lettere di 26 posti ci ritroviamo nello stesso identico posto da cui siamo partiti, vanificando lo scopo del cifrario. Quindi possiamo usare l’operatore modulo per assicurarci che la chiave sia più bassa di 26.
Codice risultante
Ora che abbiamo esposto il concetto della soluzione, prendetevi un secondo per pensare a come codificarla effettivamente. Provate prima da soli. Va bene se il tuo codice è disordinato e non asciutto come vorresti – ottieni prima una soluzione funzionante e poi puoi rifattorizzare e pulire il tuo codice.
Ecco come appare il mio codice: