1

我很难弄清楚如何将每个已处理的字符恢复为 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;
4

1 回答 1

2

while 循环不是这里最好的工具。相反,您可以使用mapwhich 为给定列表中的每个项目执行给定函数,并返回一个包含每次调用该函数的结果的新列表。

换句话说: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
于 2010-09-15T13:21:37.240 回答