Cindy Kei
Dic 24, 2020 – 4 min read

El Cifrado César es el siguiente en nuestra serie de problemas de algoritmos. Clasificado como un algoritmo «fácil» en sitios web como Leetcode, este es otro problema clásico que surge a menudo en las entrevistas técnicas y es una buena práctica para cualquier ingeniero de software que busque repasar sus habilidades de resolución de problemas.

Fuente: IBM Community

Información de fondo

Primero, algo de información de fondo sobre el Cifrado César para que sepamos a qué nos enfrentamos.El cifrado César es un ejemplo sencillo de criptografía, que Merriam-Webster define como: el cifrado y descifrado de mensajes en código secreto o cifrado.

También: la codificación y decodificación computarizada de la información.

El cifrado César se basa en la transposición de cada letra de una cadena un número determinado de lugares (el clásico es tres) en el alfabeto. El cifrado César también se conoce como cifrado por desplazamiento, ya que implica el cambio de letras para ocultar el significado del mensaje. El Cifrado César se llama así porque se dice que Julio César y sus aliados utilizaban este método de cifrado para enviar mensajes secretos que implicaban secretos militares (IBM Z Security).

Src: Julio César Guía de Estudio

Cifrado César

Ahora que tenemos algunos antecedentes sobre el Cifrado César y su funcionamiento, podemos pasar a ver el problema del algoritmo real. Dada una cadena no vacía consistente en letras minúsculas y una clave (un entero no negativo) que especifica cuántos lugares en el alfabeto debe desplazar cada letra de la cadena, nuestra misión es escribir una función que devuelva la cadena codificada. Queremos que las letras envuelvan el alfabeto; z desplazada un lugar debería devolver la letra a.

Ahora pensemos en el problema desde un punto de vista conceptual antes de saltar al código. Sabemos que tenemos que desplazar sistemáticamente cada letra de la cadena de entrada un cierto número de lugares. ¿Cómo podemos encontrar una manera de asignar cada letra a un número de manera que podamos representar cada letra de manera consistente y también desplazar fácilmente cada letra por la tecla dada? Podríamos hacer nuestro propio mapeo de letras a números, almacenando nuestro sistema de mapeo en un objeto donde la clave es un entero y el valor es su correspondiente letra, pero ¿hay algún método más fácil? Por suerte para nosotros, lo hay.

JavaScript, como muchos otros lenguajes de programación, tiene una función que nos permite obtener el valor Unicode de una letra: charCodeAt(). Esta pequeña y práctica función incorporada nos permitirá crear eficientemente un sistema de mapeo para el alfabeto.

Bien, perfecto. Ahora que tenemos nuestro sistema de mapeo ordenado, tenemos que pensar en la logística.

Inicialicemos un array vacío en el que podamos guardar nuestros resultados – lo llamaremos array newLetters. Podemos iterar a través de la cadena pasada y para cada letra de la cadena, convertir la letra del alfabeto a su valor unicode. Luego podemos añadir la clave (el número representativo de cuántos lugares estamos transponiendo nuestra letra) al valor unicode para obtener el valor unicode de la nueva letra. A continuación, querremos utilizar la función incorporada de JavaScript String.fromCharCode() para convertir los valores unicode de nuevo en cadenas. Como paso final, podemos empujar nuestros resultados en la matriz newLetters y luego unir nuestros elementos de la matriz en una sola cadena para obtener nuestra respuesta final.

Cosas a tener en cuenta

No es terriblemente complicado, pero vamos a querer tener algunas cosas importantes en mente. En primer lugar, es útil saber que el valor unicode de a es 97 y el valor unicode de z es 122. Nuestros valores unicode tienen que estar entre 97 y 122 para mantenerse dentro del alfabeto.

Para asegurarnos de que nuestras letras envuelven el alfabeto (es decir, la z desplazada más de una posición es la a), si un valor unicode es superior a 122, utilizaremos el operador módulo para forzarlo a un valor inferior a 122. Como a es igual a 97, entonces sumamos el número resultante de usar el operador de módulo en el paso anterior a 96 para terminar con un valor que corresponde a una letra del alfabeto.

Como otra salvaguarda para no obtener un número grande, también podemos forzar la clave a un número manejable. Dado que el alfabeto inglés está formado por 26 letras, sabemos que desplazar las letras en 26 lugares nos sitúa en el mismo lugar exacto en el que empezamos, lo que anula el propósito del cifrado. Así que podemos usar el operador módulo para asegurarnos de que la clave es menor que 26.

Código resultante

Ahora que hemos repasado el concepto de la solución, tómate un segundo para pensar en cómo codificar esto realmente. Pruebe primero por su cuenta. Está bien si su código es desordenado y no tan seco como le gustaría – obtener una solución de trabajo en primer lugar y entonces usted puede refactorizar y limpiar su código.

Aquí es cómo mi código se ve:

Deja una respuesta

Tu dirección de correo electrónico no será publicada.