どっさりはどうなるの

]

■ LITS[No.11] 18×10 たいへん ぱずぷれ - LITSplayer
連続発破保管庫 LITS編
 
今日はLITSです。
実は、ここ二日でLITSエディタ/playerの表示などを大幅に変えてみました。。
こないだ修学旅行の夜で、チェックで正解でない時に赤色などで表示するようにしたのですが、
LITSでも同形テトロミノが接している場合に青、それ以外に赤色で表示するようにしました。
また、正解の判定基準も 2×2の黒マス→同形テトロミノ→黒マス分断→その他 と、
おそらく致命的な順番で表示するようにしてみた。。最初に作ったときは作るだけで精一杯だったから
あまり確認のしやすさとかまで手が回らなかったんですよね。。
 
もう一つ、いままでのLITSの問題のURLと、今回のURLを比較してもらうと分かると思うのですが、
問題の出題時点で部屋で分けているパズルは、
LITS以外はURLエンコードしていたのですが、そちらにあわせました。
これで18×10の問題だと、180文字→67文字まで削減できているのです。
、、とはいっても、せっかくmerrilinさんがうちの形式に対応してくださったのに
ちょっとひどい気がするので、以下の続きでどうやってURLデコードするか書こうと思います。
# んー、、それにしても修学旅行の夜[No.02]はちょっと難しくしすぎたかな。。
 
最初に書き忘れていたのですが、いままでのURL形式と今回のURL形式の違いは、
「q.html?c/10/10」とq.htmlと/の間にcという文字を入れることで区別しています。
 
まず、各々のマス目に番号が、0からcols(横幅)*rows(縦幅)-1まで1次元の変数でふってあります。

←こんな感じです。
部屋の分け方をどうやって記録しているかというと、
あるマス目の"右"にあるボーダー線と、あるマス目の"下"にあるボーダー線を
あるかどうかを変数として持っています。

これを、ボーダー線があるときに1、ない時に0としてずらっと並べてみると、
010010111...というように0と1の列になります。これをURLエンコードする時に
5つずつ区切って、0〜9 = 0〜9、a〜v = 10〜31 と、5桁の2進数に変換しているのです。
ただし、実際には一番右の列の「"右"にあるボーダー線」と一番下の段の「"下"にあるボーダー線」は
外枠とかぶるのでスキップしています。
 
URLエンコードの手順を例に当てはめると次のようになります。
まずは「"右"にあるボーダー線」のエンコードです。一番右の列はスキップするので
0〜3、5〜8、10〜13、15〜18から、ボーダー線の有無を01で表すと0010 1010 1001 1100
となり、これを5つずつ区切ると00101 01010 01110 0 となります。
余りは0を付け加えて、00101 01010 01110 00000とします。("110"とあまったら、11000と考えます。)
これを2進数→10進数変換すると、5 10 14 0 、そして0-9a-vで変換して"5ae0"が得られます。
 
次に「"下"にあるボーダー線」のエンコードです。一番下の列はスキップするので
0〜4、5〜9、10〜14から01100 00010 00110。すでに5つずつ区切られているので、
10進数にすると、12 2 6。0-9a-v変換すると"c26"が得られます。
 
盤面のサイズとこれらを繋げることで、URL「q.html?c/5/4/5ae0c26」が得られます。
逆にデコードしたい場合は、「"右"にあるボーダー線」と「"下"にあるボーダー線」が
URLのどこからどこまでなのかを知らないとまずいです。
「"右"にあるボーダー線」は(横幅-1)×(縦幅)、この例では(5-1)*4=16となり、
5で割ると3あまり1、なので4文字がURLを表すとなります。
あとは2進数にしてそれぞれのマス目に当てはめて、、とさっきの逆をやるとOKです。
一番右の列だけスキップされていること、足りない分は0が挿入されていることに注意してください。
また、「"下"にあるボーダー線」は(横幅)×(縦幅-1)、この例では5*(4-1)=15となり、
5で割ると3、なのでさっきの文字のうしろの c26が得られます。
このボーダー線情報から、各マス目に部屋番号を割り振るなり何なりやっちゃってください。
 
ちなみに、最近作ったエディタ/playerあたりだったら内部的にマス目と部屋番号をリンクさせているのですが、
LITSはやっていませんでした。。(全部再起呼び出し関数とかで何とかしてた)
今回の変更で、正解判定時にはリンクさせてみました。
 
なお、盤面に数字があるパズルとかは、URLエンコード/デコードで
またいろいろと違うことをやっているので、それは必要になったらその時書きます。。
(基本的には数字&数字のないマス数のカウントの複合でやっています)