我有点难以弄清楚如何将每个已处理的字符恢复为int值。
该函数应该像:val caesar = fn:int * int - > INT
因此,如果k = 2466且n = 2,则输出应为4688
希望代码不是太奇怪(我是一个SML新手)。
(* Load Libs *)
load "Int";
load "Real";
load "String";
load "Char";
load "List";
fun caesar (k, n) =
let
fun k_string (i) = Int.toString(i)
fun item_k_char (x, y) = Char.ord (List.nth (x, y))
val val_k_string = k_string(k)
val k_explode = String.explode(val_k_string)
val counter = ref 0
val counter_end = (String.size(val_k_string) - 1)
in
while (!counter >= counter_end) do (
item_k_char(k_explode, !counter) + n;
counter := !counter + 1
)
end;
答案 0 :(得分:2)
while循环不是这里最好的工具。相反,您可以使用map
为给定列表中的每个项执行给定函数,并返回一个新列表,其中包含对函数的每次调用的结果。
换句话说:map (fn c => (Char.ord c) + 2) [#"2", #"4", #"6", #"6"]
将返回[52,54,56,56]
。您可以将其转换回char并使用String.implode
来获取字符串“4688”。
您可能还想添加一些逻辑,以便数字“环绕”,即caesar (7,7)
变为4
。
所以你的所有代码都变成了:
fun caesar (k, n) =
let
val val_k_string = Int.toString k
val k_explode = String.explode val_k_string
val ints = map (fn c => (Char.ord c) + n) k_explode
val wrappedAroundInts = map (fn i => (i - 48) mod 10 + 48) ints
val chars = map Char.chr wrappedAroundInts
val string = String.implode chars
in
Option.valOf (Int.fromString string)
end