2022年4月16日土曜日

トレイン・ハック

昨晩,たまたま乗った電車のドアに貼られていた広告が,ちょいと私の目を惹いたので,写真を撮った.ブレイン・ハック(brain hacked)ならぬ,トレイン・ハック(train hacked)である.


数独,解けますか?

この問題,数独(ナンバープレイス)の問題としては,中級程度といったところだろうか.それほど難しいものではない.一見,埋めねばならない空欄は多いものの,ルールの制約に基づいて順番に数字を書き込んでいけば,順を追って素直に全部埋められる.自宅に帰って,エクセル方眼紙を使って解いてみたところ,悩まず楽しめるレベルだった.

しかし,さすがに頭の中だけで解くのは辛い.「降りるまでに解けますか?」という挑戦的なコピーに対しては,「書き込んで良いなら……」と答えざるをえない.しかし,公共広告だもの,マジックペンでもって書き込んじゃ,ダメよねえ.

空欄を数えてみると,56個ある.さすがに56ヶ所の数字を暗記して解答せよというのは,人間業を超えている(少なくとも私には無理).

プログラミング課題としての数独ソルバー

数独は,プログラミングのテーマとして面白いテーマの一つである.昔,ブルートフォース的に探索して数独を解くプログラムを紹介したことがある(こちらの記事.飯尾淳「数独を解く」Take IT Easy, 2012年7月17日).アルゴリズムは単純で,右上から順次,深さ優先探索を進めていき,ルールに合致しなくなったらバックトラックして最後まで探索するというものだ.適正な問題であれば必ず解があるはずなので,この方法で確実に解けるし,この程度の問題サイズであれば,探索は瞬時に終わる.

まあ,そうやって解いて面白いか?と問われると,それはパズルじゃない,という答えになろう.GoogleがアルファGoの開発をやめたとき,「以後,囲碁将棋などは,人間の頭で楽しむゲームとする」と潔く宣言したことと近いかも.

それはともかくとして,数独ソルバーをどうやって書くかには,プログラミングの面白さがある.先の記事で紹介したように,データ構造をうまく定義してやれば,再帰呼び出しによる探索関数を簡潔に書くことができて,美しいプログラムになる.

宣言型プログラミング言語を使用して,きれいなプログラムを書くことも難しくないだろう.世の中にはSQLで数独を解くプログラムを書くという,変態凄いひともいるらしい.

エンジニア募集?

「また,このような難問を生成するプログラムをつくることはできますか?」という問いかけも素晴らしい.数独とプログラミングといえばどうしても解くほうに注目がいくが,レベル感を設定して,解が一意に定まるような数独の問題を作るにはどうすればよいか?も,プログラミングの課題としてはそこそこ面白く,かつ,実践的な課題でもあろう.

ところで,この広告には,ひとつ,大きな瑕疵があることにお気付きだろうか?

「エンジニア・デザイナー募集」と書かれており,数独を題材にして「面白そうだな」と興味を惹く点で,広告としてはそれなりに機能していることはよい.問題は,誰がどう募集しているか,よくわからない点である.

右下にTOKYU CORPORATIONと書いてあり,この電車は東急電鉄の車両(私が乗っていたのは東京メトロの半蔵門線だけど)なので,東急がエンジニアやデザイナーを募集していることはわかる.では,その募集,乗った!という応募者は,どこに応募すればよいだろうか.車掌さんに聞く?まさかね.

まあ,積極性を求むということでWebなりなんなりで自分で調べよ,ということだろうが,ちょいと不親切なんじゃないかなーと思った次第.

0 件のコメント:

コメントを投稿