HiddenArt

Home

新着情報

ようこそ

自動生成エンジンとは(FAQ)

ニュース・イベント

パズル問題自動生成時代

概論

ナンプレ

はじめに

プログラムで問題を解く

プログラムで問題を自動生成

乱数の乱用だけでは限界

将来展望

  • もしミリ秒で問題生成できたら
  • 誰でも簡単に問題が作れたら
  • 自動生成も多種多様
  • 解き方を見て問題を提供
  • パズル作家風の問題生成
  • 自動生成プログラムの自動生成
  • 多種パズルに適用可能な汎用的アルゴリズム
  • いつごろ実現できるか (1)
  • オープンソースでの公開
  • パズル作家は何をすべきか

About Us

パズル問題自動生成時代 -- ナンプレ -- プログラムで問題を自動生成

隠れた工夫

未出現数字

最初にヒントの数字の一部を決めてから問題を作る方法を示したが、 他にも指定したいことがある。

まず、例を見せよう。

次のパターンで問題を作ることを考えよう。

ヒントが20個の問題で、普通に作ると次のような問題ができると 思う。

これは易しい問題だ。数字も1〜9が全部使われている。

次の問題は使われていない数字がある。

使われていない数字は9だ。

こういう指定した数字が問題に現われないようにするにはどうすればよいだろうか。

ダメな方法

プログラム的に何も考えなくても良い方法は、 問題はどんどん量産できるので、 指定した数字が現われなくなるまで延々と作り直す。 しかし、この方法はあまりにも馬鹿げている。

少しはましな方法

もうちょっと頭を使った方法は、8種類の数字しか含まない問題が できるまで延々と作り直す。 存在しない数字が、指定した数字そのものだった場合には、 そのまま問題として採用する。

存在しない数字と指定した数字が違う場合、 数字を入れ替える。

延々と頑張って、使われていない数字がある唯一解が見つかったとしよう。

この場合、1がなく、使いたくない9が存在する。 それで、9が使われていない問題にするために、1と9を交換する。

これでめでたし、めでたしと言いたいところだが、実はそうはいかない。

空色マスの数が増えれば増える程、 適当に作っていたのでは、9種類の数字が用いられてしまう。

たとえば、次の空色マスが28個の問題になると、 もう8種類のユニーク解が得られることは極めて珍しくなる。

最初に空色マスの候補から外す

実際に有効な方法を示そう。

自動生成をする前に、空色マスの候補(小さい数字)から、 使いたくない数字を削除しておく。

この処理をしておけば、もはや使いたくない数字は候補にないので、 以後の処理ではその数字が選択されることはない。 プログラムも、なんら変更は不要である。

たとえば、直前に示した28マスの問題で9を使わない場合には、 以下の状態に初期設定する。

これで自動生成すると、次のような問題が得られた。

さらに、最初に空色マスの一部にも数字を入れ、 使わない数字も指定したら、2つの制限を守った問題が作れる。

たとえば、次のように数字を並べ、9を使わないことにした。

これで問題を自動生成すると、次のような問題ができる。

こういう複合技も問題ない。

解は数字が奇麗に並んでいる

今までは、問題の数字が奇麗に並ぶように生成するための方法を説明してきた。

ここでは、問題を眺めているだけでは良く分からないのだが、 解くと仕掛けが分かるような問題を作ることを考えよう。

まずは、次の問題を解いてみよう。

非常にハッキリした数字の奇麗な並びが見えるはずだ。

実際に解くと、次のようになる。

中央に、1〜9が順に奇麗に並んでいる訳だ。 こういう風な工夫がしてあると、解く人は感激する(と勝手に思っている)。

ということで、こういう仕掛けのある問題を作る方法を考えよう。

どんどん問題を作って、偶然このような並びになるのを見つけようと思っても、 それは不可能な話だ。

どんな仕掛けをすれば、こういう風な問題が作れるのか、 どんなプログラム的な工夫が必要なのか考えてみよう。

作成手順

どういう風にして作ったか、まず手順を示そう。

まず、空色マスの位置を決め、問題を1つ自動生成する。 もちろん、ユニーク解である。

そして、その解を求める。

そうしたら、奇麗に数字を並べたい場所をどう入れ替えるかを考える。

中央の横の並び、638142975 を 123456789 に変更したいとしよう。 このとき、次のように入れ替える。もちろん、空色マスの数字を、 次の対応に従って、全部入れ替える。

 6 3 8 1 4 2 9 7 5

 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 

 1 2 3 4 5 6 7 8 9

そうしてできた問題が次の問題である。

これを解くと、

となって、中央の横が、奇麗な数字の並びになり、目的を達成できる。

なぜこれでうまく行くかの説明は省略する。 だって、何もたいしたことはしていないというより、 単なるトリックでしかないので、説明するのがはずかしい。

なお、この変更によって、問題の難易度は変らない。

もっと工夫をしてみよう

問題としても、何か面白い工夫(数字が奇麗に並んでいるとか)がされていて、さらに解くと、数字の奇麗な並びが飛び出してくると嬉しいではないか。

と思ったのだが、まだそういうのは作っていない。このあたりの工夫をすると、なかなか受けるかも知れないので、ぜひプログラムを作って欲しいものである。

先を急ぐので、この件については、読者への宿題としよう。うまいアルゴリズムやプログラムが思いついたら、ぜひ連絡して欲しいものだ。

何となく気になる問題にする

問題の数字が、何となく気になるような並びをしていると良いのではないかと思う。

と考えたのだが、どんな工夫が有効だろうか。

同じ数字が隣同志(実際には斜め)にならんだり、 値が1だけ違う数字が隣同志だったら気にならないだろうか。

という風になる可能性を高くしてみた。

そうして問題を作ってみたら、こんな感じになった。

赤が同一の数字、緑が1つ違いの数字である。 右端の方には、5-4-3 という3連続もある。

こういう情况は、何も考えずに問題を作ると、こんなに多くは発しない。 意識的にこのようにしておくと、こういう組が倍以上増える。

実現は、簡単である。 何を入れても構わないときに、もしこういう状態にできるのだったら 気になるような数字を入れるだけである。

ただし、あまりやり過ぎると、問題として成立しずらくなるので、 ほどほどにしておくことが重要である。

Copyright(C) 2007 Time Intermedia Corporation. All Rights Reserved.

株式会社タイムインターメディア | 自動生成エンジンとは | お問い合わせ | About Us