シーザ暗号

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;