シーザ暗号
30分プログラム、その683。シーザ暗号化をやってみました。
シーザ暗号がなんぞやかは、シーザー暗号 - Wikipediaを参考にしてください。
使い方
(* 3文字ずらす * - val (f,g) = make 3; val f = fn : string -> string val g = fn : string -> string (* 暗号化 *) - f "HELLO";; val it = "KHOOR" : string (* 復号 *) - g "KHOOR";; val it = "HELLO" : string
ソースコード
fun range x y = if x = y then [y] else x :: range (x+1) y; fun range_char x y = map chr (range (ord x) (ord y)); fun rot n xs = List.drop (xs,n) @ List.take (xs,n); fun assoc x [] = NONE | assoc x ((key,value)::xs) = if x = key then SOME value else assoc x xs; fun make n = let val alpha = range_char #"A" #"Z" val alpha' = rot n alpha val enc = ListPair.zip (alpha,alpha') val dec = ListPair.zip (alpha',alpha) in (fn s => String.map (fn c => valOf (assoc c enc)) s, fn s => String.map (fn c => valOf (assoc c dec)) s) end;