問題はぜんぶ自分たちで作っています

パズルの種類ごとに問題を作るプログラムを書いていて、いま9種類動いています。 ナンプレ、お絵かきロジック、間違い探し、点つなぎ、迷路、ナンクロ、シークワーズ、 カックロ、学習プリントです。言葉のパズルが使う辞書だけは別に用意しています。

他所の問題集・雑誌・アプリから持ってきた問題は1問もありません。 図形も同じで、間違い探しの絵も点つなぎの輪郭も、こちらで作った座標データです。

作った人とは別の仕組みで、もう一度解き直す

これが ぷりんと工房 でいちばん手をかけているところです。

問題を作ったプログラムに「この問題、解ける?」と聞いても意味がありません。 作る側と確かめる側が同じ考え方だと、同じ勘違いを両方がしてしまって気づけないからです。 だから種類ごとに、作る仕組みとはまったく別の方法で書いた検算用の仕組みを用意して、 出来上がった問題を1問ずつ解き直しています。

種類作るときのやり方確かめるときのやり方
ナンプレ候補を絞り込みながら探索して盤面を作るDancing Links という別方式で解き直す
迷路Recursive Backtracker で全域をつなぐUnion-Find と幅優先探索で、通り道が1本だけか数える
お絵かきロジック図形からヒントの数列を作る全部の並べ方を数え上げて、答えが1つだけか確かめる
間違い探し元の絵に変更を加えて2枚目を作る2枚を実際に画像にして、画素で突き合わせる
カックロ数の組み合わせを探索して盤面を作る全解探索で、答えが1つだけか確かめる
ナンクロ・シークワーズ辞書から語を選んで盤面に詰める紙に刷るものだけを入力にして、答えを復元し直す

いちばん下の2つは特に大事にしています。作った側が持っている情報を渡してしまうと、 「紙だけを見た人が本当に解けるか」の答え合わせになりません。 だから検算用の仕組みには、読者が受け取るのと同じものしか渡していません。

答えがある・答えが1つしかない・作ったときの答えと一致する。 この3つがそろった問題だけを紙にします。1つでも合わない問題は捨てて、作り直します。

同じ問題が2枚出ないようにしている

同じ問題が同じ束に2枚入っていたら、10枚あっても9枚です。

盤面には向きや数字の付け替えで「見た目は違うけれど中身は同じ」というものがあります。 ナンプレなら回転・反転・数字の入れ替えがそれにあたります。 そこでそれらをすべて同じ形に直してから照合するようにしていて、 1ページの中に中身の同じ問題が入らないようにしています。

ページをまたいだ照合は、まだ機械では行っていません。 ページごとに違う種から作っているので重なる見込みは低いのですが、 確かめていないことを「やっています」とは書きません。

難易度は「手がかりの数」では決めない

「上級」「かんたん」といった表示は、最初に置かれている数字の数では決めていません。

決め方はこうです。人が実際に使う解き方を易しい順に当てていって、 最後まで解くのにどこまで必要だったかで段を決めます。 ナンプレなら「ここには1つしか入らない」から始めて、ロックされた候補、 隠れたペアや三つ組、と順に上げていきます。

手がかりが多くても難しい問題はありますし、少なくても素直に解ける問題もあります。 数だけで並べると、束の中で難しさがばらつきます。

「使った」と「無いと解けない」は分けて出します

表には2つの数を並べています。その手筋を使った問題数と、 その手筋が無いと解けない問題数です。同じではありません。

易しい順に手筋を当てていく解き方なので、記録に残るのは 「そのとき他に動かせる手が無かった」手筋です。あとから別の道が見つかることがあります。

実際、上級の10枚は「ロックされた候補」を10問すべてで使いますが、 その手筋を外して解き直すと8問は別の手で解けます。無いと解けないのは2問です。 難問の X-Wing にいたっては、5問で使うのに、外しても10問とも解けます

「使った」を「要る」と書くと、読者にとっては嘘になります。だから両方出します。 無いと解けない問題数は、その手筋だけを階梯から外して解き直して数えています。

パズルのページには、その10枚を実際に調べた結果を表にして載せています。 紙のほうにも、1問ずつ盤面の下に「ヒントの数」「難易度」「必要な解き方」を刷ってあります。 束から1枚選ぶとき、解く前に手ごたえが分かるようにするためです。

絵はAIで作っていません

間違い探しの絵も、点つなぎの輪郭も、画像生成AIは使っていません。 これから出すぬりえの線画も同じ方針です。

理由は2つあります。1つは、ここでの線画は記事に添える挿絵ではなく 配布物そのものだからです。使ってよい範囲がはっきりしないものを、 「自由に印刷して配ってください」と言って渡すわけにはいきません。

もう1つは、間違い探しにはそもそも向いていないからです。 間違い探しは「2枚の絵が、指定した数か所だけ違う」ことが成立の条件です。 似た絵を2枚生成する方法では、意図しない差が無数に入ります。 こちらでは1枚目を図形の集まりとして作り、そこに 削除・色替え・位置ずらし・大きさ変更・左右反転のうち指定した数だけを加えて2枚目にします。 だから違いの数がぴったり合うことを、画素の比較で確かめられます。

言葉のパズルに使っている辞書

ナンクロとシークワーズは日本語の語彙が要ります。

使っているのは SudachiDict の小さいほうの語彙表です。 配布条件は Apache License 2.0 で、その元になっているのは UniDic(BSD-3-Clause)だけです。 どちらも、使った先に同じ条件を引き継がせる決まりを持ちません。

そこから人名・地名・作品名などの固有名詞を機械的に落として使っています。 知らないと解けない語で埋まったパズルにしないためです。

なお、この2種類は言葉の意味の説明(カギ文)を使いません。 盤面と語の一覧だけで成立するので、辞書の語釈は一切参照していません。

紙にするときに守っていること

  • A4縦が基本です。ナンプレなら1マス17mm角、罫線は細線0.25mm・太線0.9mmで引いています (数字はいずれも配るPDFから測った実寸です)
  • 文字も線も、紙の端から20mm内側に収めています。 家庭用プリンターは端まで刷れない機種が多く、余白が足りないと切れるためです。 座標がそこを外れたら組版の途中で止まる仕組みにしていて、気づかず出すことがありません
  • フォントは Noto(SIL Open Font License)を実ファイルごと埋め込んでいます。 相手の環境にフォントが無くても、同じ形で刷れます
  • 解答は別紙です。表面に答えが透けないよう、問題と解答は別のページにしています

配ってよい範囲は 利用規約 に書いています。