Daily Hexagonal Puzzle

ポイント

コンセプト

おもしろそうなパズルを見つけた。それは A-Puzzle-A-Day、つまり「1日1パズル」というもので、盤面に書かれた月・日のうち、その日の月日を空欄にするようにピースを埋めるものだ。要するに毎日日替わりでお題が出るわけで、1回完成させたら飽きてしまうという従来のパズルの問題を見事に解決している。なかなかに面白いので、これを参考に新しいパズルを作ってみることにした。

新しく作る理由の1つが知財の問題である。そもそも A-Puzzle-A-Day は商品だし、そのデザインは国際的な知的財産事務所(日本でいうと特許庁)に意匠登録されている。よって、ほとんど同じものの3Dデータを作って公開することは出来ない。そこで試行錯誤しているうち結果的に、今回デザインしたような6角格子のデザインに行き着いた。

ソルバーの実装

A-Puzzle-A-Day で驚くべきことは(パズルは当然そうでなくてはならないが)、すべての日付についてちゃんと解が少なくとも1個あることである。これを確認しないとパズルにならない。なので3Dデータ設計の前にまず、パズルを解くプログラム(ソルバー)を作成することから始めた。ネット検索すると、 A-Puzzle-A-Day のソルバーを作っている人は複数いるようだが、最終的にはオリジナリティのある設計にしたいので、全部いちから作ることにした。まあこの手のプログラミングは得意なので小一時間で完成し、解の個数が既に計算されているものと完全に一致することを確認。そこから新しいデザイン案で計算できるようにプログラムを変更しつつ、実用的な時間内に検証できるようにちょこちょこと最適化(プログラムの実行速度の改善)を行った。

今回のパズルはヘクスマップ(6角形を敷き詰めたマップ)にしたいので、ソルバーを小変更してヘクスマップに対応させる。ヘクスマップを2次元の表で表現するにはいくつかの方法があるが、今回の場合は図形の回転が関係するので互い違いにずらす方法ではなく、上の図のように表を斜めに歪ませる方法で表現する。こうすることで図形の回転が一次変換で簡単に計算でき、従来のソルバーの他の部分にはほとんど手を入れずにそのまま利用できる。

デザイン

まずは全てのマス目を使うパズルを設計した。上の図のマップにはマス目が61個ある。それに対して月が12個、日付が31個だと少なすぎるので、さらに曜日の7マスを足して、月・日・曜日の3マスを空欄にするようなパズルにした。それでもまだ11個の空欄ができるので、見た目に美しくなるように、また解けないパターンが生じないように月・日・曜日を配置した。ピースはできるだけ減らしたいので、六角形を6個ないし5個接続した図形を11個作り、全ての日付の組み合わせで解けるのを確認した。

作成して遊んでみると、これがかなり難しい。もとのA-Puzzle-A-Day に比べてピースが多いこともあるが、なにより6角形の回転は正方格子の回転に比べて直感が働きにくいようだ。かなりパズルマニア向けの難易度になってしまったので、少し難易度を下げたバージョンも作ることにした。

適度な難易度にするには、元のA-Puzzle-A-Dayと同様に月が12個、日付が31個の合計43マスにしたいところ。43は素数なので正方格子には美しく配置することが出来ない。しかしこのヘクスマップの場合、いろいろ検討しているうちに、上の図のように雪の結晶のような切り出し方をすると、対称型の6角形にちょうど43マスが収まることを発見した。これは良い!ということでデザイン開始。月と日付の配置については、ちょうど時計の1時〜12時の位置に1月〜12月を配置するのが美しくわかりやすいと考えた。また、1つ1つのピースが大きくなると難易度が上がる傾向があるため、このパズルではできるだけ4マスのピース(テトラヘクス)で構成することにした(41マスを塞ぐ必要があるのでやむなく1つだけは5マスのペンタヘクスになる)。

ただ、上の設計にも欠点があった。それは配置パターン(ゴール)の個数が実質的に減ってしまうことである。配置が対称型にすぎるので、例えば12月1日の配置は、2月7日の配置と同じになってしまう(ピース全体を時計回りに60度回転させれば良い)。また左右対称でもあるので、12月1日の配置を裏返せば12月2日の配置になる。結果的に(ピースの裏返しを許すと)たった35パターンしかないことになり、これはちょっと看板に偽りありだ。そこでパズル全体を30度回転させ、上の図のように月日を配置したものも作成した(細かい話になるが、もとの姿勢のまま上から順に月と日を並べると、解けないパズルになってしまう。最も出っ張ったマス目の隣に月と日のセルが並ぶと、その月日のときに端のマス目が孤立してしまうためである)。この配置に2番目のデザインのピースを当てはめると解けない日付が現れるのでピースの構成も変更した(長い棒を1つに減らした。これにより難易度的にもこのパズルが最も簡単になった)。

制作

ホビー用の3Dプリンタは素材が1種類しか使えない。しかしプリントの途中で素材(フィラメント)を交換することで多色の物体を出力することができる。今回のパズルでは文字やグリッド線が浮き出しているので、その浮き出しの高さの途中で素材を交換すると文字に色をつけることができる。

各ピースのプリント中に素材を変更すると、ピースの表裏の色を変えることもできる。表裏どちらでも使用して良い条件に比べ、すべてを表向き(または裏向き)に限定して解くと難易度が上がり、また、毎日3回(混合・表限定・裏限定)遊ぶことができるようになる。さらに持ち運び・保管用の蓋も設計した。

パズルの答を手軽に知りたい、ちょっと難しすぎるのでヒントがあると助かる・・という意見があり、解を求めるプログラムをC言語から JavaScript に移植して、ウェブブラウザ上で手軽にヒントが得られるサービスを作った。スライドバーで表示するピースの数を変えられるので、多く表示すると簡単に、少なくすると難しくなる。解くのに使うピースの優先順位をシャッフルすることで、のボタンを押すごとに解が変わるようにもしたので、1日に何度も遊ぶこともできる。ピース表裏の限定(混合・表限定・裏限定)もできるようにした。パソコンでもスマホでも、以下から利用できる。

例によって3DデータはinstructablesThingiverseで公開している。また、パズルの検証(すべての日付で解けるかどうかの確認)のためのソルバープログラムや解の例はgithubで公開している。