A Caesar Cipher Encryptor a következő az algoritmus feladatokat bemutató sorozatunkban. A Leetcode-hoz hasonló weboldalakon “könnyű” algoritmusnak minősített probléma egy másik klasszikus probléma, amely gyakran felmerül a technikai interjúkon, és jó gyakorlat minden szoftvermérnök számára, aki szeretné felfrissíteni problémamegoldó készségét.
Háttérinformációk
Először néhány háttérinformáció a Caesar-kódról, hogy tudjuk, mivel van dolgunk.A Caesar Cipher egy egyszerű példája a kriptográfiának, amelyet a Merriam-Webster a következőképpen határoz meg: üzenetek titkos kóddal vagy rejtjelezéssel történő kódolása és megfejtése.
Akár: az információ számítógépes kódolása és dekódolása.
A Caesar Cipher alapja, hogy egy karakterlánc minden egyes betűjét egy meghatározott számú helyen (a klasszikus három) áthelyezzük az ábécében. A Caesar-kódot eltolásos kódolásnak is nevezik, mivel az üzenet jelentésének elrejtése érdekében a betűk eltolását jelenti. A Caesar Cipher nevét onnan kapta, hogy állítólag Julius Caesar és szövetségesei ezt a titkosítási módszert használták katonai titkokat tartalmazó titkos üzenetek küldésére (IBM Z Security).
Caesar Cipher Encryptor
Most, hogy van némi háttérismeretünk a Caesar Cipherről és működéséről, áttérhetünk a tényleges algoritmusprobléma vizsgálatára. Adott egy nem üres, kisbetűkből álló karakterlánc és egy kulcs (egy nem negatív egész szám), amely megadja, hogy az ábécében hány helyet kell eltolni minden egyes betűt a karakterláncban, a feladatunk az, hogy írjunk egy függvényt, amely visszaadja a kódolt karakterláncot. Azt akarjuk, hogy a betűk az ábécét körbetekerjék; az egy hellyel eltolt z
-nak a a
betűt kell visszaadnia.
Most gondoljuk végig a problémát fogalmi szempontból, mielőtt belevágnánk a kódba. Tudjuk, hogy a bemeneti karakterlánc minden egyes betűjét szisztematikusan egy bizonyos számú hellyel arrébb kell tolnunk. Hogyan találhatunk módot arra, hogy minden betűt egy számhoz rendeljünk, hogy következetesen ábrázolhassuk az egyes betűket, és egyben könnyen eltolhassuk az egyes betűket az adott billentyűvel? Megtehetnénk a betűk számokhoz való saját leképezését, a leképezési rendszerünket egy olyan objektumban tárolva, ahol a kulcs egy egész szám, az érték pedig a hozzá tartozó betű, de van ennél egyszerűbb módszer? Szerencsénkre van.
A JavaScript, mint sok más programozási nyelv, rendelkezik egy olyan függvénnyel, amely lehetővé teszi számunkra, hogy megkapjuk egy betű Unicode-értékét: charCodeAt()
. Ez a praktikus kis beépített függvény lehetővé teszi számunkra, hogy hatékonyan hozzunk létre egy leképezési rendszert az ábécéhez.
Oké, tökéletes. Most, hogy a leképezési rendszerünket rendeztük, át kell gondolnunk a logisztikát.
Inicializáljunk egy üres tömböt, amelyben az eredményeinket tárolhatjuk – ezt a tömböt newLetters
-nek fogjuk hívni. Végig tudunk iterálni az átadott karakterláncon, és a karakterlánc minden egyes betűje esetében az ábécé betűjét átalakítjuk az unicode értékére. Ezután hozzáadhatjuk a kulcsot (azt a számot, amely reprezentálja, hogy hány helyen transzponáljuk a betűnket) az unicode értékhez, hogy megkapjuk az új betű unicode értékét. Ezután a JavaScript beépített String.fromCharCode()
függvényét akarjuk majd használni az unicode értékek visszafordításához karakterláncokká. Utolsó lépésként az eredményeinket betolhatjuk a newLetters tömbbe, majd a tömb elemeit egyetlen karakterlánccá egyesíthetjük, hogy megkapjuk a végső válaszunkat.
Az észben tartandó dolgok
Nem túl bonyolult, de néhány fontos dolgot szem előtt kell tartanunk. Először is hasznos tudni, hogy a a
unicode értéke 97, a z
unicode értéke pedig 122. Az unicode-értékeinknek 97 és 122 között kell lenniük, hogy az ábécén belül maradjanak.
Azért, hogy a betűink körbetekerjék az ábécét (vagyis az 1 pozícióval arrébb tolódott z az a), ha egy unicode-érték 122 fölött van, a modulo operátorral 122 alatti értékre kényszerítjük. Mivel a
egyenlő 97-tel, az előző lépésben a modulo operátor használatával kapott számot hozzáadjuk a 96-hoz, hogy olyan értéket kapjunk, amely megfelel az ábécé egy betűjének.
A másik biztosítékként, hogy ne kapjunk nagy számot, a kulcsot egy kezelhető számra is kényszeríthetjük. Mivel az angol ábécé 26 betűből áll, tudjuk, hogy a betűket 26 hellyel eltolva pontosan ugyanoda kerülünk, ahonnan indultunk, ami meghiúsítja a rejtjelezés célját. Ezért használhatjuk a modulo operátort, hogy a kulcs 26-nál kisebb legyen.
Eredménykód
Most, hogy átfutottuk a megoldás koncepcióját, szánjunk egy percet arra, hogy átgondoljuk, hogyan is kell ezt ténylegesen kódolni. Először próbáld ki magadon. Nem baj, ha a kódod rendetlen és nem olyan száraz, mint szeretnéd – először szerezz egy működő megoldást, és utána refaktorálhatod és megtisztíthatod a kódodat.
Íme, így néz ki a kódom: