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ループは最適なツールではありません。代わりに、whichを使用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
于 2010-09-15T13:21:37.240 に答える