Hatena::Groupcadr

kozima の日記

2009-06-09

ケンブリッジ関数

| 22:57

どう書く?org でちょっと前にお題になっていた ケブンッリジ関数、日本語なら読めますが英語だとどうだろうかと試してみたくなったので書きました。

コード

向こうにも投稿しましたが貼り付けてみます。

(defun shuffle (text from to)
  (let ((d (- to from)))
    (when (> d 1)
      (dotimes (i d)
        (rotatef (char text (+ from i))
                 (char text (+ from (random d))))))))

(defun cambridge (text)
  (loop for from = (or (position-if #'alphanumericp text) (return))
                 then (or (position-if #'alphanumericp text :start to)
                          (length text))
    for to = (or (position-if-not #'alphanumericp text :start from)
                 (length text))
    while (< from (length text))
    do (shuffle text (1+ from) (1- to)))
  (write-line text))

shuffle で text の from (inclusive) から to (exclusive) までをランダムに入れ替えます。「i 番目をランダムに選んだ位置と入れ替える」をすべての index i についてやってます。これを破壊的にやる補助関数を作っておくことで、変換処理の部分は思ったほど汚くならずに済みました。単語の境界を求める部分が酷いことになってますが。

ちなみに、上に定義したような shuffle のアルゴリズムでどの程度のばらつきが出るのかは真面目に評価していません。が、よいシャッフルアルゴリズムが求められるお題ではなさそうなのでいいことにしました。理論的にどうなるのか、考えてみるのも面白いかもしれません。

変換結果

PCL の chapter 1. Introduction の冒頭部分を変換してみた結果です。

If you tihnk the gstearet prseulae in pmaroirnmgg cemos form gnetitg a
lot done wtih code taht splmiy and craelly epsxrsees your itteninon,
then prmniogmrag in Common Lsip is lkiely to be abuot the most fun you
can have with a ctmuoepr. You'll get mroe done, faestr, uinsg it than
you wluod unisg ptrety mcuh any other lagagnue.

ときどき元が何だったのか考えてしまうような部分もありますが、一応読めます。ネイティブが見たら、我々が変換後の日本語を読むのと同じようにあまり違和感もなく読めてしまうのでしょうか?