JasonHickeyのObjectiveCaml入門を学んでいます。
このような演習があります:
演習4.3次の換字式暗号に基づく暗号システムがあり、各プレーンレターは次の表に従って暗号化されているとします。
Plain | A B C D -------------------- Encrypted | C A D B
たとえば、文字列
BAD
はとして暗号化されACB
ます。
check
平文文字列s1と暗号文文字列s2が与えられた場合に、s2がs1の暗号文である場合にのみ返される関数を記述します。s 1がプレーンテキスト文字列でない場合、関数は例外を発生させる必要があります。8ページの文字列操作を参照することをお勧めします。アルファベットが大きくなるにつれて、コードはどのようにスケーリングされますか?[強調追加]true
基本的に、私はmight-be-stupid-naive
この演習の方法で2つの関数を作成しました。
まず、自分の解決策についてアドバイスを求めたいと思います。
次に、演習で強調したように、スケーリングされたソリューションのヒントを求めたいと思います。
ifelseを使用する
let check_cipher_1 s1 s2 =
let len1 = String.length s1 in
let len2 = String.length s2 in
if len1 = len2 then
let rec check pos =
if pos = -1 then
true
else
let sub1 = s1.[pos] in
let sub2 = s2.[pos] in
match sub1 with
| 'A' -> (match sub2 with
|'C' -> check (pos-1)
| _ -> false)
| 'B' -> (match sub2 with
|'A' -> check (pos-1)
| _ -> false)
| 'C' -> (match sub2 with
|'D' -> check (pos-1)
| _ -> false)
| 'D' -> (match sub2 with
|'B' -> check (pos-1)
| _ -> false)
| _ -> false;
in
check (len1-1)
else
false
どこでも純粋な一致を使用する
let check_cipher_2 s1 s2 =
let len1 = String.length s1 in
let len2 = String.length s2 in
match () with
| () when len1 = len2 ->
let rec check pos =
match pos with
| -1 -> true
| _ ->
let sub1 = s1.[pos] in
let sub2 = s2.[pos] in
(*http://stackoverflow.com/questions/257605/ocaml-match-expression-inside-another-one*)
match sub1 with
| 'A' -> (match sub2 with
|'C' -> check (pos-1)
| _ -> false)
| 'B' -> (match sub2 with
|'A' -> check (pos-1)
| _ -> false)
| 'C' -> (match sub2 with
|'D' -> check (pos-1)
| _ -> false)
| 'D' -> (match sub2 with
|'B' -> check (pos-1)
| _ -> false)
| _ -> false
in
check (len1-1)
| () -> false
Ok。上記の2つのソリューションは似ています。
ここhttp://www.quora.com/OCaml/What-is-the-syntax-for-nested-IF-statements-in-OCamlで、これは好ましくないと言う人もいるので、私はこれら2つを作成しましたif else
。
not-that-simple
これは、私が人生で関数を書いたのは本質的に初めてです。だから私はここでの提案に本当に飢えています。
たとえば、
- これらのソリューションをどのように改善できますか?
- 私はよりも好むべきです
match
かif else
? - 私はまたは正しく設計してい
rec
ますuse the rec
か? - それが
in check (len1-1)
正しければ?
スケーリングする
演習では尋ねHow does your code scale as the alphabet gets larger?
ます。今のところ、私には本当に手がかりがありません。Javaでは、を持っていると言いますmap
。次に、の各文字について、対応する文字s1
を探しs2
、それがマップ内の値であるかどうかを確認します。
これに関する提案はありますか?