やさしいパズルを作るときに意識するとよいかもしれないこと5選

おつかれさまです。まいなすよんです。

畏友・半袖愛好会の男さんのブログの更新が、今年に入って7回を数えています(http://hansodehansode.sblo.jp/s/article/190825876.html)。当ブログはこの記事でやっと3回目の更新なので、ずいぶんと水をあけられてしまっております。

こういう時は、量より質の話に持ち込むのが常道です。今回は特に、圧倒的なオリジナリティで勝負したいと思い、この題材を選びました。だいたいこういうのは、5項目くらいに絞るのがスタイリッシュというものですよね。まあ例えば、19項目くらいに増やせば、それはそれで別の魅力が出てくると思いますが。

 

ペンシルパズル・オブ・ザ・イヤーに投票する

そういう名前のイベントがあります。

この記事を書いている時点では〆切(2024/03/26)目前なのですが、〆切目前ということは、急げばまだ間に合うということ。

2023年にニコリが発行した本に載っている、あるいは新聞等にニコリが発表したパズルたちについて、読者で推薦し感動をわかちあおう! という企画ですね。詳しくは日本が世界に誇るパズルメディア「次ニコ」の該当ページをご参照ください。(https://tsuginiko.com/20240306/9550/

「ふむふむ、興味深い企画が開催されるのは判った。で、それが、やさしいパズルとどう関係するの?」という質問もございましょう。まあまあ慌てなさんな。

パズルに限った話ではありませんが、対象が比較的明確な娯楽作品に関して重要なのは、その作意を十全に制御することです。制御するには、それの評価を使用しなければどうしようもありません。評価軸を外部に委託するというのも一つの手ではありますが、それは高等技術というやつ。やはり評価軸は自分の内部に持っていた方がいろいろと融通が利きますね。

その、自分の中に評価軸を形成する有力な情報のひとつが、自分が良いと思った、素敵だと思ったことを、言語で記述して、他の人と共有できるようにすることなのです。ほら結びついた。

なるほど良い訓練法だ、と思っても、人間とは弱いもの、「わたしの『好き』の言語化なんか、誰にも求められていないんじゃないか」「言語化が下手すぎて、作者さんの気を害してしまったらどうしよう」なんて思ってしまいますよね。そんなあなたにペンシルパズル・オブ・ザ・イヤー! あなたの『好き』の言語化は次ニコの中の人々に求められていますし、意図を汲み取ってくれるのは、パズルについて四六時中考えている専門家中の専門家ですよ!

 

②推理パズルを作ってみる

凡百のパズルブロガーなら抽象的にぼかすところですが、当ブログはぐいぐい指名していきますよ! すでに①で次ニコにゴマをする目的は達成していますし、先に19項目も挙がってるのにあと3項目どうすんのよというのを、どうにかテンションで乗り切ろうという目論見でもあります。

さて。 そもそも推理パズルはパズルそのものの魅力に加えて、題材の選択やその処理についても面白さを発揮できます。突飛な発想や語り口による「面白さ」ももちろんありますが、ごく普通の題材、処理であったとしても、そこにそこはかとない個性がにじんでくる、にじんでしまうのがまた興味深いところ。

「おうちで数独・推理パズル」誌の発刊もあり、掲載数そのものが増えているのも、チャンスの増大に寄与していると思われます。

それにさあ、考えてみてよ。

他のパズルが方眼上の表現でシンプルに作ることができるのに比べ、やや複雑なマトリックスを組むことができちゃうんだオレ、って、見当違いのプライドを鼻にかけている作家も、正直、一定数混ざっていると思うんだよね。2023年冬号の14番とか、2023年夏号の13番14番とか、2023年冬号の14番の作者とかさ。

彼らにはできない、あなたの真摯さで勝負してみませんか。

 

③他の人の作品の気になるところを見つけながら解いてみる

「パズルって面白い! どんなパズルも面白い! ちょっと面白くないところがあっても、そこが却って面白い!」 なんて考えてしまうあなた! そしてわたくし! 

パズルを楽しむ姿勢としては、とても有効なことではあります。が、ここはひとつ、自分の中に別の自分を作ってみましょう。「ここはオレだから楽しむことができるけど、あいつはどうかな?」などという点が見つかったらしめたものです。「オレは気にしないけど、ヤザワはなんて言うかな?」の精神ですね。

見つかったらしめたもの、ではあるのですが、では、それを消去したら解きやすくなるのか、面白くなるのか、を考えるのが次のステップになります。例としてニコリに掲載されている問題を考えますが、全国の猛者が投稿してきた作品をパズルの鬼たちが厳選した結果の作品たちです。簡単なキズに見えても修正は意外に難しかったり、そもそもキズではなかったりもします。正解当てではないので明確な答えに辿り着くとは限りませんが、目的をもって取り組んで、目的をもって改良することで見えてくることもありますよね。

もちろん、猛者やら鬼やらがうっかりキズを見逃すなんてことも、まま、あるというのは、ゴメンペコンコーナーの愛読者なら知っておりましょう。そんな正真正銘のキズを乗り越えたらそれはそれで収穫です。

 

④難問やジャイアントを作る余裕をみてから取り組み始める

思いついた解き筋や展開、入れたくなりますよね。ですが、やさしい問題はとてもフラジャイル。繊細なバランスの上に成立します。ここはグッと我慢して、品質の向上を優先させましょう。

腕を振るうのは、次に控えている難問やジャイアントまで待つのです。

ただ、我慢ばかりするのも精神衛生上よろしくない。「なんだよ、この問題、カンタンすぎるよ。まいなすよんももう終わったな。あ、既に10年前に終わった作家か。あっはっは」なんて心無い言葉を吐く顔が脳裏によぎったりもします。あのヤロウめ。

繊細な風味の易問と豪快な難問、どちらも最高なのに半分しか楽しめないなんて、なんておかわいそう、の心持ちで参りましょう。

 

⑤普段の生活からやさしさを心がける

つまりこういうことになりますね。。。 どこかで見たような気もしますが、「機を逃したなんて思わないで、宣伝はいつしてもいい」という格言と同様、大事なことは何度言ってもいい。

と、言葉にするのは簡単ですが、人間は弱い、これは仕方ない。いつもやさしくいられるかというと、さまざまな外部要因により、そうもいかないのが生活というものです。

自分ではどうしようもないことでやさしくなれない時でも、せめてパズルだけでも素敵なものを生み出せれば救いになるのに。と願ったとて、それは叶わぬ虚しい願いなのです。なぜなら、もてなされるべきは解き手であって、決して作者ではないからなのです。

なんてことを言っていた人もいたような気がします。さすが斯界のインフルエンサーの言葉は力強いですね。まあ、ぼくはそういう立場、とりませんけどー。

ニコリ186号が好きだ

ニコリ186号に掲載いただいた自作へのコメントです。
ネタバレ配慮とかは頑張りませんので、気になる向きは解いてからどうぞ。

 

クロスワード
 ラインラインクロスです。2023年分の本誌には絵ヒントクロス、タイポグラフィッククロスの掲載がなかった、という情報もありますが、実は「スタンダードでない」クロスワードの掲載もありませんでしたね。先号の2024年冬号にはケイだけクロス、今号にはこのラインラインクロスと、今年は変わり種クロス復権の年なのかもしれません。まあ推理クロスやジグソークロスは載り続けているので、どこで線を引くのかって話ではありますが。
 今回のテーマ単語の総数と、いつもの紙面のクロスワードの盤面サイズを考慮すると、1辺のサイズが1マス足りなくなります。まあ、しれっと増やすという対応でもいいんですけど、タテHのカギが思いついたのでこの形で処理しました。ちょっとした引っ掛かりになって、より印象的になったのではないかなと。

 

ふくめん算2
 サクサク絞り込める、我ながらよくできたふくめん算ですね。それ以上は必要ないと言えばないですが、少し余計なことを。
 この問題に関しては、特別、議論になることはないと考えますが、「む」の絞り込みの過程で、ちょっとニコリ刊「京子のパズル」内のコラムを思い出すなどしていました。現在のルール文にたどり着く前の、定式化の過程に思いを馳せたりするのも、また一興かもしれません。
 とか書きましたけど、「京子のパズル」は巻末の現役出版物一覧にもないようですし、興味が湧いても読む方法がないかもですね。わたくしは故郷の市立図書館に所蔵があったのですけども。

 

へやわけ
 気持ちよく鉛筆が動かせることを目指した普通の中サイズ。少なくとも入口においては、手筋ベースというよりは、ルール直結で決まるようにしてみましょうかと試みた形跡が見て取れますね。大部屋の分割(専門用語。ここでは説明しない)に関しても、白確定マスで陽に分割する方法を採用しています。ま、これに関しては、わたくしが好きな展開だから、という要素が大きいですが。

 

ヘルゴルフ3
 自分の中に突然ヘルゴルフの流行が来て、5問ほどまとめて送った中の1問です。紛れを多く入れてみたりとか、このボールが進むには、と、このホールに入れるには、の進め方のバランスに凝ってみたりとか、試行錯誤した記憶があります。が、たしかこれは、「いろいろ試してみたけど、いったんリセットして好きなように作ってみるか」と仕上げたものだったような。

 

カックロ10
 186号の「今号の大盛り」はカックロでしたね。その掉尾を飾る堂々たるジャイアント。堂々たるとまで言えるかどうかはわかりませんけど。
 点対称配置は基本として、さらに左右対称、上下対称……から、ちょっとだけずれる配置の綺麗さというか心地よさについて、ずっと検討しておりますが、なかなか結論にはたどりつきませぬ。

 

点プレート5
 (将)さんも言ってますが、わたくしも、やや先読み許容気味なパズルではないかという印象がありまして、そちらに走ってみた問題です。とはいえ限度はあるなとも感じていて、その限度の中で、遊び方2の後半を自然に使って解いてもらうにはどうしたらいいかな、なんて構想があったようななかったような。

 

オモパが好きだ

ニコリ185号オモパの感想です。

シンカミノ
昇格おめでとうぱちぱちぱち。さらなる発展を期待しちゃいますね。
要望というか、いい言い回しはないですかねーレベルの話なのですが、「これが解き終わり」がすっきり表せるとプレゼンしやすいかもな、なんて思っています。現状と違いますけど、例えば、「盤面に散っている□を以下のルールに従って矢印に載せきったら完了」みたいなこと。まあ必要ないといえばないですけど。

おれだんご
やることのシンプルさと、鉛筆の動きの複雑さにギャップがあってとても良いですね。奥の深さは感じられますが、提示が難しいんじゃないかなーと勝手に危惧してますがどんなもんなんでしょう。あと紙面にはあんまり関係ないですが、串は自由線でいいっちゃいいので、エディタを作る人は意欲的であればあるほど大変そうですね。(45度でいいと思いますけども)

ダンベ
固さを感じさせるモノを詰め込む面白さを堪能できますね。作っていると、遠くから引っ張り出すルールがあればもっといろいろできるのにな、と思ったりしますが、現状でもルール文が相当長いので、ユーザーの把握力の面で難しいかも。

見つめあう矢印2
無印の「見つめあう矢印」とはガラっと印象が変わりましたね。たしか無印バージョンとは初期配置方法が変わっているので、印象が違うはそりゃそうだろうという話もありますけど。矢印が障害物になるイメージがつかめずにしばらく戸惑いましたが、みんなスムーズに認識できてたのかな。

点プレート
やることの把握量がスリムなので、多少の先読みが許される感じが独特ですね。このままグイグイいってほしいなと思いますが、それぞれの問題の特徴づけがなかなか難しいかもと思ってしまいます。少なくとも、ルール2後半がバリバリ利く問題を解きたい。

フェイクアロー
ウソ要素って、決まったときに意外と影響力が小さくて地味な印象になったりするんですけど、これはルールの決まり方から範囲が広くて華やかでよろしいですね。箱の役割がグループ判別しかないので、矢印にABCなどを添える方法もあるかなーなんて思いましたが、視認性は箱のほうが優れているかなー。

サンサロード
ルールのゴツさに比して、サクサク解けて楽しいですね。地のしばりが強いので意図したより手がガシガシと決まってしまう面もあるかも。すべて自力で制御しようとしないで、リアルタイムソルバーで決まるところを認識しながら進めるくらいがちょうどいいのかも。あんまり関係ないですが、白マス連結ルールの割に大きめの黒マスがごろっと転がる展開があって印象的です。

 

波及効果が好きだ

http://pzv.jp/p.html?ripple/6/6/kpvnqi72v1cf2l1l1l5l4l1

自分の名前を伝えて、「ああ、あの、解きやすい波及効果を作る人ですね!」なんてことを言われたいものだと日々考えながら生きております。
たとえば、ということで、最初に提示した波及効果はそのサンプル。趣向としては、「(うまく選んでいけば)どの数字を決めるにも、ひとつの数字の影響だけから決めることができる」というもの。
言葉ではわかりにくいので、途中経過で示しましょう。
まずは単純な例。赤で示した「2」がひとつの数字から確定しています。

少し進めて、こんなのも許容します、の例。


一方、(いまのところ)こんなのはダメ、の例。赤で示した「3」を確定するために、2つの数字の影響が必要です。


とはいえ上に示したように、先に「2」を決めてしまえば、それによって最後の3の影響の片方は必要なくなり、めでたくひとつの数字から確定することができます。これが(うまく選んでいけば)の意味ですね。

このような趣向で一問押し切れば、解きやすい波及効果が仕上がるのではないでしょうか、というサンプルだったわけですが、いかがでしたでしょうね。

「でも、6x6の例題サイズだと、正直よくわからんね。いわゆる小サイズというか、10x10くらいでみてみたいな」
と、感じたそんなあなたに耳寄りのお知らせ! 2023年7月ニコリ刊「パズルBOX15」の波及効果1番が、ちょうどこの趣向を採用した問題になっております。これはさっそく試してみないと!
個人的には、趣向に気づくかどうかはさておき、易しいわりに妙な感じで決まっていくので楽しい、というパズルに仕上がっているんじゃないでしょうか。ただまあ、さすがに手段が少ないので、10x10より大きくなるとさすがに単調さが先に立つんじゃないかなと思いますね。

「『ひとつの数字の影響だけから決まる』が単調になりがちなら、『最大2つの数字の数字の影響を見れば決まる』みたいにしてみると、ちょうどいいところが見つかったりしない?」
と、感じたそんなあなた、いい疑問ですね! 適性があるかもしれないので、波及効果作成に手を染めてみるのはいかがですか?
とはいうものの、実際に仕上げるのはなかなか大変でもありましょう。そこはホスピタリティが身上のわたくし、あらかじめご用意してございます。2023年6月ニコリ刊「パズル通信ニコリvol.183」の波及効果3番がまさにそれ。レッツチャレンジ!
でまあ、まさにそれ、ではありますが、面白さではなく解きやすさの観点だと、『最大2つの数字の数字の影響を見れば決まる』は、あんまり効果的ではないかなあ。ふつうの波及効果の解きやすさとそれほど変わらないかな、という印象ですな。ともあれご確認よろしくです。「そんなことないよ! いいよこれ!」という声がありましたら考えも変わるかもしれません。

 

ということで、久々な場所で相変わらずの話でした。

 

https://www.nikoli.co.jp/ja/publication/various/pbox/

https://www.nikoli.co.jp/ja/publication/various/nikoli/

カタカナ抜け文が好きだ

ということでカタカナ抜け文を作りたくなったのです。

なのですが、自分のポンコツ具合は把握しているので、webに自主的に発表したものを、たとえばニコリさんなんかに投稿してしまう恐れは認識しておるのです。
じゃあどうすればいいか。アニメキャラとか店名などの固有名詞をガンガン入れて組めばいいんじゃないのかな、と思ってやってみました。


カタカナ抜け文の遊び方は以下参照
カタカナ抜け文の遊び方、ルール、解き方 | nikoli



固有名詞をガンガン入れるとなんで対策になるかっていうと、ニコリ編集部の基準は知りませんけど、ぼくの姿勢として、固有名詞は解く立場での知識の偏りが大きくなってよろしくない、という感覚があるのです。なので、万一、公開したことを忘れてしまうことがあっても思い出せるかなと。
ただ、この固有名詞の知識分布の偏りには功罪あって、「知らない人はまったく解けない」一方、「届く人にはガッツリ効果的に届く」という強力な利点もあります。カタカナ抜け文という、解くにも発想が重要になるパズルには重要なポイントともとらえられますね。

などなど、をはじめとして、言及したいこともたくさんありますが、まずはtwitterで制作実況めいたことをしていたので引用しましょう。中身に触れているので、解いていただくつもりがある方は先に問題の方をどうぞ。


実況として信じるとすると、完成まで1時間半ほどですか。まあこの場合、
・事前にそれなりの構想があった。
・具体的な駅の想定があり進めやすかった。
・別の投稿原稿作成のために、自作ツールを用意してあった。
・婚后さんのことを早く書きたかった。
などの条件も重なっており、かなり短い時間で仕上がっていると思います。必要なら参考程度でどうぞ。


てなことも考えていたんですが、結局、画像発表になってしまいました。
ということで今日はこのへんで。

ひとりにしてくれが好きだ


z3pyを導入しましたよ、というだけの日記です。
相も変わらず、「ひとりにしてくれ」の数字埋めを扱います。

処置前サンプル。これを、

f:id:mainasuyon:20210218170522p:plain

こんなふうにしたい。

f:id:mainasuyon:20210218170602p:plain

pythonを触ったこともほぼないので、配列すら使わずにベタ書きしてしまいます。

# モジュールをインポートする
from z3 import *

# 変数を用意する
aaa_00_00 = Int('aaa_00_00')
aaa_01_00 = Int('aaa_01_00')
aaa_02_00 = Int('aaa_02_00')
aaa_03_00 = Int('aaa_03_00')
aaa_04_00 = Int('aaa_04_00')
aaa_05_00 = Int('aaa_05_00')
aaa_06_00 = Int('aaa_06_00')
aaa_07_00 = Int('aaa_07_00')
aaa_00_01 = Int('aaa_00_01')
aaa_01_01 = Int('aaa_01_01')
...(中略)...
aaa_07_07 = Int('aaa_07_07')

solver = Solver()

# 変数は1以上8以下
solver.add( aaa_00_00 > 0, aaa_00_00 < 9)
solver.add( aaa_01_00 > 0, aaa_01_00 < 9)
...(中略)...
solver.add( aaa_07_07 > 0, aaa_07_07 < 9)

# 各マスの関係の制約を記述
solver.add( aaa_00_00 == aaa_01_00 )
solver.add( aaa_00_00 == aaa_02_00 )
solver.add( aaa_00_00 != aaa_03_00 )
solver.add( aaa_00_00 != aaa_04_00 )
...(中略)...
solver.add( aaa_07_03 != aaa_07_07 )
solver.add( aaa_07_04 == aaa_07_05 )
solver.add( aaa_07_04 != aaa_07_06 )
solver.add( aaa_07_04 != aaa_07_07 )
solver.add( aaa_07_05 != aaa_07_06 )
solver.add( aaa_07_05 != aaa_07_07 )
solver.add( aaa_07_06 != aaa_07_07 )

# 解いておくれ
print(solver.check())
print(solver.model())

パッと見で把握しやすいように、雑に略しましたけどわかりますよね。
各マスの関係ですが、縦横に見て、2つのマスの組み合わせに関して、両方数字が入っていて等しいならイコール、そうでなければノットイコールで結ぶだけです。

結果はこんな感じ。

sat
[aaa_07_03 = 2,
aaa_01_01 = 2,
aaa_01_05 = 4,
aaa_01_02 = 5,
aaa_00_06 = 3,

... (中略) ...
aaa_01_00 = 7,
aaa_02_00 = 7]

結果を得てしまえば、あとは適切なスクリプトを書いてパズル盤面として成形するだけです。今回の場合はawkを使用してpenilboxの形式に変換しました。

重い腰を上げて使ってみたけど、導入は簡単だし、そりゃ使われるよねpythonってところ。
やりたいことは伝えられてるんじゃないかと思うので、どなたかもっと便利に洗練された形に仕上げてくれると幸いです。
ということでレッツエンジョイひとくれライフ!

以下ソースコードとかいろいろ。

続きを読む

ひとりにしてくれが好きだ

以前、こんな↓記事を書きました。

https://mainasuyon.hatenadiary.org/entries/2010/02/07


簡単に言うと、「ひとりにしてくれを作る時の数字を埋める作業が面倒なので、パソコンさんに任せるのはどうでしょう。Sugar制約ソルバーを利用すると簡単ですよ。数字は入れ替わっちゃいますけど」という話です。

PencilBox形式からSugar入力形式に変換するawkスクリプトも公開してたんですが、ジオシティーズのサービス終了に伴い見られなくなっています。

じゃあブログに直接書いちゃうか、というのが今回の記事。

Sugarが導入されている仮定なんで、Perlで書くのが筋かなと思い、そうしてみました。

#!/usr/bin/env perl
use strict;
use warnings;



my $file = shift; 

open(my $fh, "<", $file) or die("Error");

my @lines = <$fh>;

### 盤面の格納 ###
my $ymax = $lines[0];
my $xmax = $lines[1];

my @parr = ();

for(my $j=0;$j<$ymax;$j++){
 my @tmparr = split(" " , $lines[2+$j] );
 for(my $i=0;$i<$xmax;$i++){
  $parr[$j*$xmax+$i] = $tmparr[$i];
 }
}


### Sugar変数定義 ###
for(my $j=0;$j<$ymax;$j++){
 for(my $i=0;$i<$xmax;$i++){
  printf("( int a_%02d_%02d 1 %d )\n",$i,$j,$xmax);
 }
}


### ヨコ方向 ###

#  左からn番目の数字が、
#   他に重複したものがあり、しかもそのグループの中で左端ではない → tmparr[n]が1
#   それ以外                                                     → tmparr[n]が0

for(my $j=0;$j<$ymax;$j++){
 my @tmparr = (0) x $xmax;
 for(my $i=0;$i<$xmax;$i++){
  for(my $u=$i+1;$u<$xmax;$u++){
   if(($parr[$j*$xmax+$i]!=0)&&($parr[$j*$xmax+$i]==$parr[$j*$xmax+$u])){
    printf("( = a_%02d_%02d a_%02d_%02d )\n",$i,$j,$u,$j);
    $tmparr[$u] = 1;
   }
  }
 }

 printf("( alldifferent ");
 for(my $i=0;$i<$xmax;$i++){
  if($tmparr[$i] != 1){
   printf("a_%02d_%02d ",$i,$j);
  }
 }
 printf(")\n");
}


### タテ方向 ###

#  上からn番目の数字が、
#   他に重複したものがあり、しかもそのグループの中で上端ではない → tmparr[n]が1
#   それ以外                                                     → tmparr[n]が0

for(my $i=0;$i<$xmax;$i++){
 my @tmparr = (0) x $xmax;
 for(my $j=0;$j<$ymax;$j++){
  for(my $u=$j+1;$u<$ymax;$u++){
   if(($parr[$j*$xmax+$i]!=0)&&($parr[$j*$xmax+$i]==$parr[$u*$xmax+$i])){
    printf("( = a_%02d_%02d a_%02d_%02d )\n",$i,$j,$i,$u);
    $tmparr[$u] = 1;
   }
  }
 }

 printf("( alldifferent ");
 for(my $j=0;$j<$ymax;$j++){
  if($tmparr[$j] != 1){
   printf("a_%02d_%02d ",$i,$j);
  }
 }
 printf(")\n");
}

close($fh);

もうひとつ、めでたくSugarが成功の出力を返してくれた場合、それをPencilBox形式に変換するスクリプト
盤面サイズは自動検出に対応していないので、個別に my $size = 8; のところを適宜変更してください。

#!/usr/bin/env perl
use strict;
use warnings;

### 盤面サイズの指定 ###
my $size = 8;


my %parr = ();

while(<>){
 my @tarr = split(/\s+/,$_);
 if($#tarr+1==3){
  $parr{$tarr[1]} = $tarr[2];
 }
}

print $size . "\n";
print $size . "\n";
for(my $j=0;$j<$size;$j++){
 for(my $i=0;$i<$size;$i++){
  my $pos = sprintf("a_%02d_%02d",$i,$j);
  printf $parr{$pos} . " ";
 }
 printf "\n";
}


スクリプトに責任などもちろん持ちませんけど、普段この程度のスクリプトを書くならawkで書くので、perlのお作法的に変なことをしてるかもです。
適宜修正して使っていただければ。

Sugarの導入は大変なので、minisatさえ導入できれば使えるように、なんてことも考えるんですけれども。
希望がありましたら、まいなすよんの生活に余裕ができるように星に祈っておいてください。よろしくお願いします。