――店の奥で仮眠していた店主が、突然飛び起きて叫んだ。
「そうか、キューブの中に入って考えればよかったんだ!」
――いったい、どうしたんだ?
「どうもこうも、キューブの中に鼠が入ってマッピングしてるんだよ!」
――何を言ってるんだ、夢でも見たのか?
「夢? そうか、今のは夢だったのか…。夢中で考えていたから夢の中でも考え続けてたんだな。うん、これは論理的だ。ちゃんと筋が通っているぞ」
――店主は、普通よりも一回り小さなルービックキューブの紛い物をいじっている。これは、著作権にうるさいことで有名な黒鼠の絵が入っている子供騙しのキャラクター商品で、キューブを回そうとするとバリがひっかかるという粗悪品なのだが、税込みで百五円という安値につられて、つい買ってしまったらしい。
「そんな話はどうでもいいから、早くスクリプトを出してくれ!」
――店主は、エディタでスクリプトを開くと、脳内のジャンクを打ち込み始めた。
――しばらくすると、DOSプロンプトを開いた。島内本を見ながらコマンドを打ち込んでは、スクリプトを修正していった。
「よーし。こんな感じで大体いいだろう…」
――店主は、DOSプロンプトでコマンドを打ち込み、パソコンのディスプレイをこちらに向けた。
E:\PUZZLE\R_CUBE>jperl r_cube.pl -c=setnwb s06a | jperl rc_fig.pl
applied option: -c=setnwb
read from: 'macro\s06a.txt'
operators='+e+n+w+s+2t-s-w-n-e+2t'
(xyz,ijk,setnwb)->(xyz,ijk,setnwb)
(112,000,se----)->(121,120,s-e---)
(121,000,s-t---)->(321,002,--ts--)
(321,000,--tn--)->(112,000,nt----)
(old dir:000000)->(new dir:000000)
+---+
| t |
| |
| e |
+---+---+---+---+
| | s | | s |
| | n|t | |
| | | | |
+---+---+---+---+
| |
| |
| |
+---+
「出来たぞ」
――もしかすると、これは島内本に出ている「むすび」という手順かな?
「その通り。何度も打ち込むのが面倒だったんで、"macro\s06a.txt"というファイルに、
+Y+O+G+R-W-R-G-O-Y+W
と書いておいて、"-c=setnwb"で記号の置換、"-m=macro"でマクロのディレクトリ、"s06a"でマクロ名を指定してるんだ」
――それで、肝心の小キューブの向きの問題はどう処理したんだ?
「小キューブの中の鼠にどの向きに回転したかを聞いたんだ」
――まだ、よく飲み込めんのだけど…。
「そうか。そうだよな…。この"(xyz,ijk,setnwb)"の次の行が"se"の二面体のデータだ。これが(x, y, z)=(1, 1, 2)から(x, y, z)=(1, 2, 1)に移動して、向きは(i, j, k)=(0, 0, 0)から(i, j, k)=(1, 2, 0)に変化してるだろ?」
――それは分かるよ。その(i, j, k)=(1, 2, 0)が、どこから出てきたのかを知りたいんだ。
「それは、色配置("se----"の部分)を1手ずつ更新するときに、自分がどの面を軸にして回転したかを判定して、その面が最初に属していた面(つまりその面と同じ色のセンターキューブ)を軸にして回転したと見なして(i, j, k)のどれか一つを更新したんだ」
――なるほど、小キューブの中の鼠の視点で考えたわけだね。だけど、(x, y, z)=(1, 1, 2)の位置にある小キューブをX軸で1回、Y軸で2回、右に90度回しても、(x, y, z)=(1, 2, 1)の位置には来ないんだけど、これはどういうことなのかな…?
「さあ…。たぶんZ軸で180度回転を2回やってるせいだろうね」
――じゃ、この(i, j, k)っていうのは何の役に立つんだ?
「よく分からんけど、ある軸で一周した場合や、完全に逆の手順で元の位置に戻った場合には当然(0, 0, 0)になるんだから、位置が正しくても向きが(0, 0, 0)にならなかったら、その小キューブの向きが違っているってことじゃないかな…」
――それは怪しいな。この後、"+s"という操作をすると、(1, 2, 1)の小キューブは元の(1, 1, 2)の位置に戻って向きも正しくなるけれども、(i, j, k)=(2, 2, 0)になるじゃないか」
operators='+s'
(xyz,ijk,setnwb)->(xyz,ijk,setnwb)
(111,222,set---)->(113,322,st---e)
(121,120,s-e---)->(112,220,se----)
(113,000,se---b)->(133,100,s---be)
(123,000,s----b)->(132,100,s---b-)
(131,002,s-t-w-)->(111,102,stw---)
(132,000,s---w-)->(121,100,s-w---)
(133,000,s---wb)->(131,100,s-w-b-)
(112,000,nt----)->(123,000,n----t)
(old dir:000000)->(new dir:100000)
「あ、ほんとだ」
【訂正】
バグのため小キューブの向き(i, j, k)のデータの一部が間違っていたので、訂正しました。また、マクロファイルのディレクトリ指定は煩雑になるので初期値に変更しました。(2008/10/20)


コメントする