(原文: Working with generators - John Nash's Cipherer)
ジェネレータと遅延シーケンスは Gauche に比較的新しく追加されており、それらを使用して練習できる小さな演習問題を探しています。 ここに私が数ヶ月前にやったひとつがあります。
ジョン·ナッシュが 1955 年に NSA に送った手紙における、暗号器/暗号解読器の具体的な設計をともなった暗号化方法がどう設計されるべきかの議論に私は気付きました。 それは基本的にビットを読み込みんで変形されたビットを書き込むステートマシンであり、ステート·マシンの構成が暗号化の"鍵"です。 マシンの性質は、ジェネレータ変換器 (入力情報を供給するジェネレータを受け取り、暗号化/復号化された情報を生成するジェネレータを返す) として自然に実装することができます。
そのコードはこれです。
https://gist.github.com/3115076
make-permutater は、内部状態を持つビットストリーム (1ビットを受け取り、1ビットを返す) を実装する一般的な関数です。 make-encipherer と make-decipherer は入力ビットジェネレータを受け取って出力ビットジェネレータを返す手続きを返します。
この "マシン" を実行するには、テキストとビットジェネレータの間で変換するいくつかの便利な関数を必要とします。 (注:最近、私は reverse-bits->generator を fix しました。 この例を実行するには Gauche の現時点の git HEAD が必要です。)
https://gist.github.com/3118861
さて、ここにマシンの構成 (鍵) の一例です。
(define key '((1 3 6 2 4 0 5) (2 1 5 0 3 6 4) (#f #t #f #f #t #f #f) (#t #t #t #f #f #t #t))) (define E (apply make-encipherer key)) (define D (apply make-decipherer key))
それといくつかの例です。 ひとつ目は、文字列を取り E によって暗号化、直ちに D で復号化、そして表示のために文字列に逆変換されます。 もうひとつは、現在の入力ポートからテキストを読み取って暗号化、復号化してエコーバックします。
($ bools->string $ D $ E $ string->bools "hi, there!") ($ write-bools $ D $ E $ read-bools (current-input-port))
ちょうど私がマシンで行う場合と同様にパイプコンポーネントにできるのが快適です。 遅延シーケンスでやりましたが、ジェネレータ版はオーバーヘッドが少なくなる可能性があります。
Tag: gauche.generator