2013年1月23日水曜日

数独の問題を集める

 数独問題の“初出”を確認するプログラムを作ったが、それが実用的かどうか確認するにはもっと沢山の数独問題が必要となる。そこで、あるサイトからまとめて入手することを試みた。

 毎日定期的に新しい問題が出題されているらしいので、その各画面上からデータ部分だけを抜き出してくるのである。人手で一つ一つデータを書き写していたのでは時間が掛かり過ぎて現実的ではない。そこで、あらかじめデータの構造を調べておいて、それに対応する抜き出しプログラムを作ることにした。これを動作させすべて自動的に抜き出してしまおうという魂胆である(プログラム作りのネタはいたる所にあるものだ)。その結果、時間は掛かったが、34,125個の問題を一挙に手に入れることができた。

 “初出”を確認するプログラムにこのデータを入力してみたところ、重複した問題は一つも含まれていないことが確認できた。数独作りの立場からは「期待通りの結果」ではあったが、プログラム作りの立場からは「少し残念」な気もした。複雑な心境である。
 しかし、3万4千個余りの膨大な問題データが(文字通り)あっという間に処理されて、結果が表示されたのは痛快であった。良しとしよう。

 ところで、正式に公開さているものとはいえ、このようにデータ構造を調べて(プログラムで)データの一部だけを抜き出すという行為は倫理的に許される行為なのだろうか。いささか疑問が残る。(ブラックハットの)ハッカーになって犯罪を犯しているような気持ちになってきた。検査のために使うだけにして、終了後は破棄する方が無難であろう。こんな膨大な数独問題を持っていても、到底すべてを解くことはできないのだから。

2013年1月19日土曜日

「初出」の検出(「数独の問題について」の続き)

 先に、数独の問題で 同じ問題が重複して作られないようにするためのプログラムを作った話を紹介した。私は、それをPerlというプログラム言語で記述したのだが、もっと詳しく書くとハッシュ(hash)という記憶方式を利用したのである。これは人間の脳の記憶方法を真似たもので、実に使い勝手がよい。人間の脳は“初出”(めて現したものであるかどうか)を簡単に判別できる機能を持っている。

 受験勉強の時の経験だが、意味の分からない英単語に出会うと辞書を引いて調べる。そして辞書の中でその単語を見つけた瞬間、以前調べたことのある単語であることを思い出し悔しい思いをすることが多い。それが何度も繰り返されると、かなり落ち込むことになる。そして自分の記憶力に自信がなくなってきたりする。

 しかしよく考えてみると、以前一度調べたことがあるという“事実”の方は、しっかりと記憶されるていることに気が付く。忘れているのは、その“意味”の方なのだ。人間の脳は“初出”だけはしっかりと記憶していて、脳は素早く反応してその事実を教えてくれる。我々はこの機能を自信を持って活用した方がよい。

 年寄りが同じ話を繰り返すと、それを聞いた若者の脳は素早く「初出ではない」ことを感知できるから「その話は聞いたよ!」と返すことになる。中には「3回目だよ!」などと回数まで記憶している人もいる。
 人間は齢を取るとこの機能が衰えるから、同じ話を繰り返すようになるのかと了解したとすれば、それは少し違うのではないかと思う。年寄りでも初出はしっかりと覚えている。何度も同じ話をしていると、段々と話し方がうまくなってきて、話の展開も華々しくなり場合によっては誇張されていくものである。だから初出でない(その話をしたことがある)という事実は十分に理解しているのである。年寄りが忘れてしまうのは「誰に対してその話をしたか」ということの方である。

 これからは、年寄りはブログ上などでその話を一度だけ公開すればよい。そして“初出”のマークをしっかりと付ける。そしてすべての人に話したと理解し、もう誰にも話したりしないようにする。そうすれば、誰に話したかのデータを保存したりする必要もなくなるわけだ(どうせ忘れるのだし)。
 こうすれば、若者達も、年寄りの同じ話に悩まされることはなくなるだろう。

 ねっ! この話、いい話でしょ。
 今度、誰かに話してみようかな。

2013年1月16日水曜日

数独の問題の問題点

 今まで新聞や雑誌に紹介される数独パズルの問題を解いては、それを個人的に保存してきた。その問題の数が400件近くになった。そこで、かねてから気になっていたことに挑戦してみようと考えた。

 数独の問題の組み合わせは無限にある(約54億パターン以上あると言われている)が、実際に自分で問題を作るとなるとこれが結構難しい。“難しい”という意味は、既存の問題とは異なることを確認するのが大変だからである。したがって、誰も確認などしないでそのまま発表しているのが現実なのであろう。

 そうなると、偶然に一致した問題が作られて、誰もそれに気が付かないで新しい問題だと思い込んでいる可能性も十分にあり得るのではないか。沢山の問題を集めて“問題集”を持っているなどと威張っていても、かなり重複した問題が含まれているのかもしれない。

 そこで、この約400個の問題に対して同じものが含まれていないかどうか確認するプログラムを作ってみた。以前から Perl言語を使えば簡単にできるのではないかと考えていたからである。大学の授業も区切りがついたこの時期に、挑戦してみることにした。

 その結果は、自分でも驚くほどのものであった。
 ・同じ問題が3個見つかったケース(2回)
 ・同じ問題が2個見つかったケース(3回)
つまり、12個の問題が実際は5個になってしまったのである。

 しかし私の問題集に重複登録されてしまったのは、どうやら大半は私の方に原因があるように思われる。最初の頃は個々の問題に適当に命名していたので、データベース化する時点で別のものと判断されたのかもしれない。現在は統一した命名法で出典を辿れるようにしてある。
 もう一つの原因は、「例題-1」という名称の問題だったから、以前に発表した問題を「例」として取り上げたのであろう。偶然の一致と確認できたものは、今までのところ存在していない。

 数独の問題は、異なるものをほぼ無限に作れるから重複することは滅多にないが、新たに作って公表する際は、少なくとも自分が過去に作ったものの中に同じものが含まれていないことを確認してからにすべきではないかと思う。