閃いた!
今日はソフトウェア構成論で、先週あまりにも簡単に自分達の説明が終わったので、何か問題を解いてくるということになっていたのですが、
今朝の地点でまだ何も出来ていませんでした。orz
というのも、先週問題をエレガントなアルゴリズムで解くという条件があり、ごり押しなら解けるものの、エレガントにはなぁ……と悩んで、結局今日まで過ごしてきました。
問題は、英単語の分割問題を解いてみることに。
英単語をハイフンで分ける方法のごく一部を考えましょう。次のリストはcで終わる
単語のハイフンによる分け方のルールを説明するものです。et-ic al-is-tic s-tic p-tic -lyt-ic ot-ic an-tic n-tic c-tic at-ic
h-nic n-ic m-ic l-lic b-lic -clic l-ic h-ic f-ic d-ic -bic a-ic -mac i-acルールは上の順で適用されます。たとえば、ethnicは左端からリストを見ていって、
h-nicが初めて一致するパターンなので、eth-nicとなります。clinicは、h-nicのパタ
ーンでもなく、次のn-icに一致するので、clin-icとなります。与えられた単語をハイフンで区切る関数をどのように書けばよいでしょう。
……正規表現ライブラリ使えば一発ジャン?(ぉ
と思ったのですが、あくまでも全員に分かるプログラムを書くというのが条件のため、今回は、純粋にこの問題をC言語で解く方法を模索することに。
10時を回って、データ構造について試行錯誤を繰り返したときに、分割ルールのリスト構造を行い、実際に分割する英単語を、リスト構造を使って、同じようにリスト構造式に分割していき、その過程を再帰関数を使って、再帰的に英単語を分割していくようなアルゴリズムを閃き、N田先生の複雑系解析の時間をそっちのけで、手記ノートでアルゴリズムの検証をしていました(ぉ
実際にコードを書いてみると、分割アルゴリズム部分は15行。かなりシンプルにかけた自信作なのですが、kuboboはコーディングの美学にちっともご理解を示してくれない様子。orz
コードを書ききり、バグを除去したら、ソフトウェア構成論の時間まであと15分。全員分の資料を印刷し、教室についたのが開始3分前。ギリギリでした。
プレゼンテーションは、コードの内部に触れずに概要と何故このアルゴリズムがシンプルかについて語って終了。ギリギリでしたが、結果には十分満足してます。(w