Cindy Kei
24 de dezembro de 2020 – 4 min. Classificado como um algoritmo “fácil” em sites como Leetcode, este é outro problema clássico que surge frequentemente em entrevistas técnicas e é uma boa prática para qualquer Engenheiro de Software que procure aperfeiçoar as suas capacidades de resolução de problemas.

>

>

Src: Comunidade IBM

Informação de fundo

Primeiro, alguma informação de fundo sobre o Cifrador César para que saibamos com o que estamos lidando.O Cifre César é um exemplo simples de criptografia, que é definido por Merriam-Webster como: a cifra e decifração de mensagens em código secreto ou cifra.

Também: a codificação e decodificação computadorizada de informação.

O Cifre César é baseado na transposição de cada letra de uma string um número especificado de lugares (o clássico é três) no alfabeto. O Cifre César também é conhecido como cifra de deslocamento, uma vez que envolve o deslocamento de letras a fim de ocultar o significado da mensagem. O Cifre César é assim chamado porque se diz que Júlio César e seus aliados usaram este método de criptografia para enviar mensagens secretas envolvendo segredos militares (IBM Z Security).

Src: Guia de Estudo Júlio César

Caesar Cipher Encryptor

>

Agora temos algum conhecimento sobre o Cipher César e como ele funciona, podemos passar a olhar para o problema do algoritmo real. Dada uma string não vazia composta por letras minúsculas e uma chave (um inteiro não negativo) que especifica quantos lugares no alfabeto para deslocar cada letra da string, nossa missão é escrever uma função que retorna a string codificada. Queremos que as letras envolvam o alfabeto; z deslocado um lugar deve retornar a letra a.

Agora vamos pensar no problema de um ponto de vista conceptual antes de saltar para o código. Sabemos que precisamos sistematicamente deslocar cada letra da string de entrada para um certo número de lugares. Como podemos encontrar uma maneira de mapear cada letra para um número, para que possamos representar cada letra de forma consistente e também deslocar facilmente cada letra pela chave dada? Podemos fazer nosso próprio mapeamento de letras para números, armazenando nosso sistema de mapeamento em um objeto onde a chave é um número inteiro e o valor é sua letra correspondente, mas existe um método mais fácil? Felizmente para nós, existe.

JavaScript, como muitas outras linguagens de programação, tem uma função que nos permite obter o valor Unicode de uma letra: charCodeAt(). Esta pequena e útil função integrada permitir-nos-á criar eficientemente um sistema de mapeamento para o alfabeto.

Okay, perfeito. Agora que temos nosso sistema de mapeamento ordenado, precisamos pensar através da logística.

Letalizemos um array vazio no qual podemos manter nossos resultados – vamos chamar esse array de newLetters. Podemos iterar através da string passada e para cada letra da string, converter a letra do alfabeto para o seu valor unicode. Podemos então adicionar a chave (o número representativo de quantos lugares estamos transpondo nossa letra) ao valor unicode para obter o valor unicode da nova letra. Então vamos querer usar a função JavaScript incorporada String.fromCharCode() para converter os valores unicode de volta para strings. Como passo final, podemos empurrar nossos resultados para o novo array de Letters e então unir nossos elementos do array em uma única string para obter nossa resposta final.

Coisas a ter em mente

Não é terrivelmente complicado, mas vamos querer manter algumas coisas importantes em mente. Primeiro, é útil saber que o valor unicode de a é 97 e o valor unicode de z é 122. Nossos valores unicode têm que estar entre 97 e 122 para ficar dentro do alfabeto.

Para ter certeza que nossas letras envolvam o alfabeto (ou seja, z deslocado sobre 1 posição é a), se um valor unicode for superior a 122, usaremos o operador modulo para forçá-lo a um valor abaixo de 122. Como a é igual a 97, então adicionamos o número resultante da utilização do operador modulo no passo anterior a 96 para terminar com um valor que corresponde a uma letra do alfabeto.

Como outra salvaguarda contra a obtenção de um número grande, também podemos forçar a chave para um número manejável. Como o alfabeto inglês é composto por 26 letras, sabemos que deslocar as letras por 26 lugares nos coloca no mesmo lugar exato em que começamos, derrotando o propósito da cifra. Por isso podemos usar o operador modulo para nos certificarmos que a chave é inferior a 26.

Código do resultado

Agora que corremos através do conceito da solução, pense um segundo aqui para pensar em como codificar isto de facto. Experimente-o primeiro por conta própria. Tudo bem se o seu código estiver confuso e não tão seco quanto você gostaria – obtenha uma solução funcional primeiro e depois você pode refactor e limpar o seu código.

Aqui está como meu código está:

Deixe uma resposta

O seu endereço de email não será publicado.