とはいうものの看板に偽りありで、ビルディングパズルをSugar制約ソルバーで解く話自体は前回で完結してます。
今回は、「入力がさすがに面倒なので、Sugarスクリプトを生成するawkスクリプトでも書くか」という話です。
ニコリのパズルの主要なものはPencilBoxという素敵なソフトがあるので、ファイル形式が流用できるのですが、ビルディングパズルにはテキストでいい具合に保存してくれるものが見つからなかったので、まずはそこから。
といっても決定版を目指すわけでもないんで、私はこういうふうにしてみましたって受け取り方でひとつよろしく。
例題は前回のものを流用します。ただし、右側に数字がないと都合が悪いので、あまり意味はないですが数値を加えています。
普通のビルディングパズルは、外側の数字だけ記述すれば良いです。ということで上辺にtopのt、下辺にbottomのb、左辺にleftのl、右辺にrightのrを識別として用い、左から右へ、あるいは上から下へ増加していく座標を設定します。
一行目に盤面の大きさを記述することにして、例題をこの方法で記述すると、以下のようになります。
4 4 t 2 4 t 3 2 l 2 2 b 0 2 r 1 1
この形式から、前の記事で説明したSugarスクリプトを出力するawkスクリプトを以下に示します。
長いので「続きを読む」以下にします。
「続きを読む」以下はスクリプトだけにしたいのでここで書きますが、前回の記事と変数名が変わっています。
カナオレのスクリプトから流用したとこがあったので、上下をupとdownのuとdで作ってたのですが、あーこれなんか違うかと思ってtとbにしたら、board(or building)のbが使えなくなってしょぼん、とかいう事情もあったりなかったりしますが、まー細かいことを気にしてたら素敵な大人になれませんよってことで。
ということで今回はここまで。
{ if(NR==1){ ymax = $1; xmax = $2; # 盤面の定義 for(j=0;jx_%02d_%02d x_%02d_%02d) ", $2 , k , $2 , j ); } printf(") 0 1 ) )\n"); } printf("( = %d ( + ",$3-1); for(j=1;j x_%02d_%02d x_%02d_%02d) ", k , $2 , j , $2 ); } printf(") 0 1 ) )\n"); } printf("( = %d ( + ",$3-1); for(j=1;j x_%02d_%02d x_%02d_%02d) ", $2 , ymax-1- k , $2 , ymax-1-j ); } printf(") 0 1 ) )\n"); } printf("( = %d ( + ",$3-1); for(j=1;j x_%02d_%02d x_%02d_%02d) ", ymax-1- k , $2 , ymax-1-j , $2 ); } printf(") 0 1 ) )\n"); } printf("( = %d ( + ",$3-1); for(j=1;j