2005年03月13日

ここ数日

 帰省してからここ数日、何をしていたかというとレポートを作っていました。

昨年落としたコンピュータプログラミングのレポートなのですが、昨年何故この講義の単位を落としたかというと、マリ見ての同人誌の原稿を書いていたからという非常に馬鹿馬鹿しい理由でです。
 いやいや、同人活動は、その、なんというか、とてもクリエイティブで高等な趣味です。
ところでうちの大学の工学部は再履修の場合一こまに二重にとることができるので(というより1こま1.5単位なのでそれを認めないと学生が大変。いや単位を落とさなければいいという話しもありますが……ねえ?)、単位の余裕もないし、去年よりc言語の知識は格段に増えているし、試験ないしというわけで、再履修したのですが思ったよりレポートが大変で、かなり時間がかかってしまいました。
 どんな課題だったかというと、面白いと思うプログラムを作れ、というものです。
こういう、学生の自主性に任せる課題というのは、学生にとってはなかなか面倒くさいものです。あまり簡単なものにすれば良い評価はこないだろうし、だからといってあまり難しいのは避けたいし、ちょうどいい難易度の課題を設定するのは難しいものがあります。
 ただ先生としては楽なのでしょう。難しい課題をだせば、レポート出せない生徒が増えるのでしょうし、あまり簡単だと差がつかないし、とプログラミングに限らないのかもしれないですが、課題を作るのは大変だと思います。
 どうも去年の課題は難しすぎたようで、今年は再履修が多いようです。名前は忘れたのですがなにかのパズルを解くプログラムを作れという課題でした。僕はぱっと見た限り原稿の片手間に作れるような感じもしなかったので無駄な努力をする前に、あきらめたのですが。ちなみにどうも完成していないプログラムでも単位は来たようです。
 というわけで今年は去年の雪辱戦なので、パズルを解くプログラムを作ろうと思い、課題をイラストロジックを解くプログラムをつくる、にしました。
 
 最初はグーグル尊師(グル)経由でたどり着いたサイトに乗っていたイラストロジックの解法を使って、つまり人間の解くやり方をそのまま使って発見的に解くプログラムを作ろうと思ったのですが、うまくプログラムする方法が全然思いつきませんでした。いやあ、人間ってすごいなあと思い知らされただけでした。一応変な方法でやれるかなあと考えてはみましたが、そんなあほなことをしなくてもコンピュータの計算力を活用するやり方のほうが簡単なプログラムになるということに気がつき、人間のやり方をまねするのをあきらめました。
 人工知能って大変なんだろうなとちこっと思いました。
 実際のやりかたとしては、特定の行、列について問題の条件を満たす全てのパターンをつくり、その全パターンで■になるマスを■と確定、×になるマスを×と確定、黒の場合も白の場合もあるマスは未定のまま、という操作を全ての行列で未定のマスが無くなるまで繰り返す、というやり方です。
 具体的な例を出すと、
 3□□□□□という問題の場合
  ■■■××
  ×■■■×
  ××■■■という三パターンが考えられるので、真ん中の■が確定となり、
  □□■□□となります。
 この操作を問題が解けるまで延々と繰り返します。
 この全パターンを作るという操作はおそらく基本的な組み合わせのアルゴリズムだと思うのですが、僕はアルゴリズムに詳しくない上にアルゴリズム辞典を東京に忘れてしまったので必要以上に苦労してしまいました。×マスの数−(■ブロックの数−1)を■ブロックの数+1の領域に割り振ればいいだけの話なんですが。誰か適切なアルゴリズムを知っていたら教えてください。一応かなりばっちいソースで実装したのですがどうも気持ち悪くて。
 このようにそれなりに苦労してプログラムしたのですが、残念ながらこのやり方では全ての問題が解けるわけではありません。全ての行、列で確定となる■も×もない場合、当たり前ですがこのプログラムでは解けません。実際、一意に決まるけどそうなる問題はあります。このような問題を解くには、まず解けるところまでといてから、未定マスのある列あるいは行で問題の条件を満たすパターンを仮定して解き、途中でうまくいかなかったならバックトラックして次のパターンをためす、という機能を入れればできるのですが、時間の都合上とめんどくさいのとで結局実装しませんでした。本当は時間があったはずなのですが、新歓用パンフに漫画を書いていたせいで時間がなくなっていたんだ! そうだった。僕は悪くない。よ。
 しかしいつもプログラムをしていると思うのですが、どうも僕はプログラムが下手というかなんというか、やり方がまずいというか効率的ではないような気がします。
 最初に具体的な形まで設計してからプログラムするほうが絶対効率的なのですが、できないのです。プログラムしながらどういうプログラムにするか考えているので非常に効率が悪い。無駄なコード結構書いちゃうし。コメントはなるべく書くようにしましたが、一ヶ月前に作った部分のデータ構造を勘違いして真っ青になったりしています。実に効率が悪い。
 なんでこうなるかというと、プログラムしながらじゃないといまいち見通しが立たない、というよりとりあえずできる部分から始めないとと時間が間に合わないというのもありますが、結局はプログラムの経験値が絶対的に足りないという気もします。趣味でc言語のプログラミングなんてまずしないですし。プログラムという作業は嫌いではないのですが、自分から積極的に作りたいと思うものは無いということです。
 なんかこれはプログラムに限らないことのような気がして非常にいやな気分になります。実際絵を描くことだって似たようなもので、うまくなりたいとは思うけど、こういうものが描きたいということはあまりなかったりします。じゃあなんで描いているんだよというとこれまで落書きした時間を考えると、なんとなくもったいないとかそんなものなのかもしれません。いや、比較したときのプロセスの楽しさでしょうか。単なるポテンシャルの低さかもしれません。まあ趣味はそれが一番という気もするので問題ないのかもしれませんが、勉学にももう少し比重を置くべきなのだろうとも思います。
 実にどうでもいいですね。
 ええと、プログラミングの話でしたね。いやもう書く事もないんですが。現状はC++の勉強しようかと思ったけど面倒くさいし、WindowsのAPIの勉強しようかと思ったけど面倒くさいし、PHPもちょっと触ったけど放置気味だし、そんな状態です。上にも書きましたが、作りたい物がないのに勉強する気にならんということです。
 実に愚かですね。
 
 そういえば全然関係ないのですが、ネット上でソフトを公開しているある企業がライセンス合意書の最後に、合意書を全部読んだ人は、当社にメールをくれれば1000ドルあげるよというメッセージを入れておいたら、ダウンロードが何千にもなってからようやく最初に連絡した人があらわれたとか言うエピソードをふと思い出しました。