08.02.2015 Views

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

notas de aula -<br />

Jerônimo C. Pellegrini<br />

1.10.1 Exemplo: cifra de César<br />

Há um antigo método de criptografia conhecido <strong>com</strong>o cifra de César, que se acredita<br />

ter sido usado por Júlio César para transmitir mensagens secretas. A cifra de César<br />

consiste em trocar as letras do alfabeto por deslocamento, de maneira a tornar as palavras<br />

irreconhecíveis. Se dermos às letras índices iniciando <strong>com</strong> a → 0; b → 1; · · · ; z → 25, uma<br />

cifra de César faria a substituição de cada letra <strong>com</strong> índice i por outra de índice i + k<br />

mod 26.<br />

A cifra de César pode ser trivialmente quebrada por força bruta quando se conhece<br />

o método usado (há apenas 25 tentativas possíveis). Mesmo quando o método não é<br />

conhecido, é possível detectá-lo e decifrar a mensagem através de análise de frequência<br />

de letras. Ainda assim cifras de César ainda são usadas em algumas situações.<br />

Implementaremos uma cifra de César <strong>com</strong>o exemplo de uso dos procedimentos<br />

<strong>Scheme</strong> para tratamento de strings.<br />

O procedimento string-map recebe um procedimento proc que transforma caracteres,<br />

uma string, e retorna uma nova string onde os caracteres são o resultado da aplicação de<br />

proc.<br />

( define string-map<br />

( lambda ( proc s)<br />

( let ((l ( string- > list s )))<br />

( let (( new-list ( map proc l )))<br />

( list- > string new-list )))))<br />

As mensagens que cifraremos serão todas convertidas para caixa alta. Definimos<br />

então um procedimento string-upcase.<br />

( define string-upcase<br />

( lambda (s)<br />

( string-map char-upcase s )))<br />

Versão Preliminar<br />

Caracteres podem ser transformados em números inteiros usando o procedimento<br />

char->integer. Para cifrar (ou “traduzir”) um caracter, obtemos o índice do caracter A,<br />

subtraímos do caracter a ser cifrado e somamos um número (módulo 26, para que o<br />

resultado seja ainda um caracter alfabético).<br />

Os procedimentos char->ceasar-idx e ceasar-idx->char traduzem caracteres para<br />

índices entre zero e 25.<br />

42<br />

[ 27 de outubro de 2010 at 15:47 ]

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!