Vigenère cipher: Difference between revisions
Content added Content deleted
No edit summary |
(added ocaml) |
||
Line 1,144: | Line 1,144: | ||
decrypt: BEWARETHEJABBERWOCKMYSONTHEJAWSTHATBITETHECLAWSTHATCATCH |
decrypt: BEWARETHEJABBERWOCKMYSONTHEJAWSTHATBITETHECLAWSTHATCATCH |
||
</pre> |
</pre> |
||
=={{header|OCaml}}== |
|||
<lang ocaml>let cipher src key crypt = |
|||
let str = String.uppercase src in |
|||
let key = String.uppercase key in |
|||
(* strip out non-letters *) |
|||
let len = String.length str in |
|||
let rec aux i j = |
|||
if j >= len then String.sub str 0 i else |
|||
if str.[j] >= 'A' && str.[j] <= 'Z' |
|||
then (str.[i] <- str.[j]; aux (succ i) (succ j)) |
|||
else aux i (succ j) |
|||
in |
|||
let res = aux 0 0 in |
|||
let slen = String.length res in |
|||
let klen = String.length key in |
|||
let d = int_of_char in |
|||
let f = |
|||
if crypt |
|||
then fun i -> d res.[i] - d 'A' + d key.[i mod klen] - d 'A' |
|||
else fun i -> d res.[i] - d key.[i mod klen] + 26 |
|||
in |
|||
for i = 0 to pred slen do |
|||
res.[i] <- char_of_int (d 'A' + (f i) mod 26) |
|||
done; |
|||
(res) |
|||
let () = |
|||
let str = "Beware the Jabberwock, my son! The jaws that bite, \ |
|||
the claws that catch!" in |
|||
let key = "VIGENERECIPHER" in |
|||
let cod = cipher str key true in |
|||
let dec = cipher cod key false in |
|||
Printf.printf "Text: %s\n" str; |
|||
Printf.printf "key: %s\n" key; |
|||
Printf.printf "Code: %s\n" cod; |
|||
Printf.printf "Back: %s\n" dec; |
|||
;;</lang> |
|||
Run: |
|||
<pre>$ ocaml vigenere_cipher.ml |
|||
Text: Beware the Jabberwock, my son! The jaws that bite, the claws that catch! |
|||
key: VIGENERECIPHER |
|||
Code: WMCEEIKLGRPIFVMEUGXQPWQVIOIAVEYXUEKFKBTALVXTGAFXYEVKPAGY |
|||
Back: BEWARETHEJABBERWOCKMYSONTHEJAWSTHATBITETHECLAWSTHATCATCH</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |