Src: Julius Caesar Study Guide Caesar Cipher Encryptor
Nu we enige achtergrond hebben over het Caesar Cipher en hoe het werkt, kunnen we overgaan tot het bekijken van het eigenlijke algoritmeprobleem. Gegeven een niet-lege tekenreeks bestaande uit kleine letters en een sleutel (een niet-negatief geheel getal) die aangeeft hoeveel plaatsen in het alfabet elke letter in de tekenreeks moet verschuiven, is onze opdracht een functie te schrijven die de gecodeerde tekenreeks teruggeeft. We willen dat de letters het alfabet omspoelen; z
één plaats verschoven zou de letter a
moeten opleveren.
Nu laten we het probleem eens vanuit een conceptueel standpunt bekijken alvorens in de code te springen. We weten dat we systematisch elke letter van de inputstring een bepaald aantal plaatsen moeten verschuiven. Hoe kunnen we een manier vinden om elke letter in een getal om te zetten, zodat we elke letter consistent kunnen weergeven en ook gemakkelijk elke letter kunnen verschuiven met de gegeven toets? We zouden zelf letters kunnen omzetten in getallen, door het systeem op te slaan in een object waarvan de sleutel een geheel getal is en de waarde de bijbehorende letter, maar is er een eenvoudiger methode? Gelukkig voor ons is die er.
JavaScript heeft, net als veel andere programmeertalen, een functie waarmee we de Unicode-waarde van een letter kunnen krijgen: charCodeAt()
. Met deze handige kleine ingebouwde functie kunnen we efficiënt een mapping systeem voor het alfabet maken.
Okay, perfect. Nu we ons mappingsysteem op orde hebben, moeten we de logistiek doordenken.
Laten we een lege array initialiseren waarin we onze resultaten kunnen bewaren – we zullen deze array newLetters
noemen. We kunnen de ingevoerde string itereren en voor elke letter van de string de letter van het alfabet omzetten in zijn unicode-waarde. We kunnen dan de sleutel (het getal dat aangeeft hoeveel plaatsen we onze letter transponeren) toevoegen aan de unicode-waarde om de unicode-waarde van de nieuwe letter te krijgen. Daarna gebruiken we de ingebouwde JavaScript-functie String.fromCharCode()
om de unicode-waarden weer om te zetten in tekenreeksen. Als laatste stap kunnen we onze resultaten in de newLetters array plaatsen en dan onze array elementen samenvoegen tot een enkele string om ons uiteindelijke antwoord te krijgen.
Dingen om in gedachten te houden
Niet verschrikkelijk ingewikkeld, maar we willen een paar belangrijke dingen in gedachten houden. Ten eerste is het handig om te weten dat de unicode waarde van a
97 is en de unicode waarde van z
122 is. Onze unicode waarden moeten tussen 97 en 122 liggen om binnen het alfabet te blijven.
Om er zeker van te zijn dat onze letters het alfabet omspoelen (dat wil zeggen, z verschoven over 1 positie is a), als een unicode waarde hoger is dan 122, zullen we de modulo operator gebruiken om het te dwingen tot een waarde onder 122. Aangezien a
gelijk is aan 97, tellen we het resultaat van de modulo-operator in de vorige stap op bij 96 om uit te komen op een waarde die overeenkomt met een letter in het alfabet.
Als een andere beveiliging tegen het krijgen van een groot getal, kunnen we de sleutel ook dwingen tot een hanteerbaar getal. Aangezien het Engelse alfabet uit 26 letters bestaat, weten we dat het verschuiven van de letters met 26 plaatsen ons op exact dezelfde plaats brengt als waar we begonnen, wat het doel van het cijfer tenietdoet. Dus kunnen we de modulo operator gebruiken om er zeker van te zijn dat de sleutel lager is dan 26.
Resultaat code
Nu we het concept van de oplossing hebben doorgenomen, neem even de tijd om na te denken over hoe we dit eigenlijk kunnen coderen. Probeer het eerst zelf uit. Het is niet erg als uw code rommelig is en niet zo droog als u zou willen – zorg eerst voor een werkende oplossing en dan kunt u refactoren en uw code opruimen.
Hier is hoe mijn code eruit ziet: