Separação Pares - Ímpares
Este parece ser um caso trivial. Divididos o texto ao meio e depois tiramos alternadamente os caracteres de cada uma das componentes.
def desencripta_1(texto): # divide ao meio e separa meio = len(texto)//2 pares = texto[:meio] impares = texto[meio:] # constrói texto novo_texto = '' for i in range(meio): novo_texto = novo_texto + pares[i] + impares[i] return novo_textoAcontece que se testarmos com vários exemplos verificamos que nalguns casos o resultado não é o esperado. Não precisamos de reflectir muito para verificar que o problema acontece quando o texto tem um número ímpar da caracteres. Neste caso, o número de elementos na posição par é superior em uma unidade do número de elementos nas posições ímpares. Temos pois que ter cuidado quando fazemos a divisão ao meio, diferente em cada um dos casos. Resolvida esta questão uma solução será:
def desencripta_12(texto): # divide ao meio e separa comp = len(texto) meio, imp = divmod(comp,2) pares = texto[:meio] impares = texto[meio+imp:] # constrói texto novo_texto = '' for i in range(meio): novo_texto = novo_texto + pares[i] + impares[i] if imp: novo_texto = novo_texto + texto[meio] return novo_textoComo se pode ver usamos a operação divido que nos permite obter as duas componentes através do mecanismo de desempacotamento:
meio,imp = divmod(com,2)O nome imp estará associado ao objecto 1 (se texto tiver comprimento ímpar) ou ao objecto 0 (caso tenha comprimento par).
Distância Fixa
Neste método, se um caractere é deslocado n posições para a frente na codificação, então na descodificação cada caractere deve ser deslocado n posições para … trás!
def desencripta_2(texto_encriptado,chave): alfabeto = 'abcdefghijklmnopqrstuvwxyz ' texto_normal = '' for car in texto_encriptado: indice = alfabeto.find(car) texto_normal = texto_normal + alfabeto[(indice - chave)%len(alfabeto)] return texto_normalAssumimos um alfabeto co mas 26 letras minúsculas mais o espaço em branco, mas a solução pode ser adaptada a qualquer alfabeto sem problemas.
Chave Aleatória
Este caso aparenta ser o mais complexo. Vejamos se é verdade. Comecemos por mostrar o código que permite definir uma chave e encriptar um texto:
def encripta_3(texto, alfabeto,chave): #chave = define_chave(alfabeto) novo_texto = '' for car in texto: ind = alfabeto.index(car) novo_texto = novo_texto + chave[ind] return novo_texto import random def define_chave(alfabeto): simbolos = alfabeto chave = '' for car in alfabeto: novo_simb = random.choice(simbolos) ind = simbolos.index(novo_simb) simbolos = simbolos[:ind] + simbolos[ind+1:] chave = chave + novo_simb return chaveComo a correspondência é um para um, se, por exemplo, a “b” no texto original corresponde “h” na chave então quando encontramos no texto codificado um “h” devemos ter um “b” no texto original. Afinal a solução não é assim tão complexa:
def desencripta_3(texto_encriptado,alfabeto,chave): texto_normal = '' for car in texto_encriptado: indice = chave.find(car) texto_normal = texto_normal + alfabeto[indice] return texto_normalMas se pensarmos um pouco mais no que dissemos sobre a correspondência um a um, chegamos à conclusão que codificar e descodificar são o mesmo processo pelo que apenas precisamos de um programa. Dito de outro modo:
def desencripta_31(texto,alfabeto,chave): return encripta_3(texto,chave,alfabeto)E pronto. Divirta-se a escrever variantes das soluções propostas. Por exemplo, usando sempre o alfabeto como parâmetro.
Sem comentários:
Enviar um comentário