単純にひねったら複雑になってしまった話

 ――ひねりが足りんな。

 すると、店主がこちらを向いてこう言った。
 「ひねりだって…? そうそう、キューブの向きのことをまだ考えてなかったな」

 ――ここに書いたことがそのまま聞こえているのか? 一体どうなっているんだ?

 「今さら何を言ってるんだ。そんなところに突っ立ってないで、あんたも少し手伝ってくれよ」

 ――それじゃ仕方がないな。

 「この“ひねり”をどうするかが問題なんだよな…」

 ――それは小キューブのデータの中に入れてしまえばいいんじゃないか?

 「ははあ、小キューブをカプセル化して、あとはオブジェクトに任せるというわけか」

 ――何もそこまでやらなくても、perl4で十分だよ。適当な連想配列に位置と一緒に入れるだけだよ。これを仮に%cubesとして、例えば、最初に図7の(1, 1, 1)の位置にあった小キューブに関する位置と向きのデータが欲しければ、$cubes{'1,1,1'}を見るって感じで…。ここに、現在位置(x, y, z)と回転状態(i, j, k)を一緒に入れておけばいいだろう。

 「コーナーキューブの向きは3通りだから(i, j, k)でいいと思うけど、エッジキューブの向きは2通りだけだよね。それに、いつ、どの段階で小キューブの向きがズレたり反転したりするのかと考えると、よく分からなくなるんだけど…」

 ――それは、キューブの色が揃っていると、ズレたり反転したりしてるようには見えにくいけど、操作する毎にX・Y・Zのどれか一つを軸にして回ってるんだから、その段階で向きが変化してると考えた方がいい。その回転状態を(i, j, k)で表わすと、X軸を中心に90度右に回転すると(1, 0, 0)になり、続けてY軸を中心に左に90度回転すると(1, 3, 0)となる。これは、コーナーもエッジもセンターも区別せず、全部同じでいい。

 「ちょっと待ってくれよ。なぜ同じなんだ?」

 ――9個の小キューブが一緒に回転してるんだから同じでなきゃ変じゃないか?

 「そう言われると、そんな気もしてくるけど、何だかどうもうまく騙されてるような気がするな…」

 ――じゃあ、こう考えてみたらどうかな。例えば、一連の操作をした結果、(1, 3, 1)にあった小キューブが(1, 1, 3)に移動したとしようか。その小キューブの向きの情報(i, j. k)を見れば、どの軸の回転で移動したのかが分かる。(2, 0, 0)だったらX軸で180度、(1, 3, 0)だったらX軸で90度とY軸で-90度の組み合わせ、(0, 3, 3)だったらY軸で-90度とZ軸で-90度の組み合わせだということが分かる。

 「コーナーキューブはそれでいいだろうけど、エッジキューブの場合はどうなるんだ?」

 ――同じように何回か操作をしたら、(1, 2, 1)にあった小キューブが(1, 1, 2)に移動した場合について考えてみようか。向きが(1, 0, 0)だったらX軸で90度、(0, 3, 3)だったらY軸で-90度とZ軸で-90度の組み合わせ、(3, 2, 2)だったらX軸で-90度とY軸で180度とZ軸で180度の組み合わせだということになる。

 もちろん、もっと複雑な操作をした場合は、そう単純には言えないだろうけれども…。

 「いや、僕は解法をプログラムで探索したいわけじゃなくて、シミュレーションできればそれでいいんだ」

 ――そうか、それは残念だな。まあ、位置と向きの情報さえあれば、一連の操作の結果、どこが何色になるかぐらいは簡単に表示できると思うよ。出力の書式はリストよりも、やっぱり展開図みたいなやつの方がいいのかな?

 「そりゃあ、もちろん、現物の形に近い方がありがたいよ」

 ――展開図を見て、“こう操作したら、こうなった”というのを見るわけだよね? 現物を使ってやるのと同じように?

 「そうだよ。現物は元に戻すのに時間がかかるし、結果を記録するのも面倒だから」

 ――じゃあ、最後の展開図の前に、途中経過のデータも出力するようにしておこうか?

 「そうだなあ…。途中は省いて、最後のデータだけ出してくれればいいや」

 ――ここで、僕はperlスクリプトを書いてみた。展開図の表示は面倒なので後回しにして、とりあえず操作前後で変化した各キューブのデータだけを出力するようにした。ちょっと試してみたところ、位置に関しては期待した通りの結果が出た。しかしどうも向きのデータが怪しい。

 そこで、二つのコーナーキューブの向きだけが変化する例の84手の操作パターンを入れてみた。すると、どういうわけか、二つのキューブの向きを表わす(i, j, k)の値が両方とも(2, 2, 0)になってしまう。向きが逆向きにずれるのだから、二つの向きは違っていなければならない筈だ。

 それで初めて気付いたのだが、X軸で90度回転した小キューブをY軸で-90度回転するのだから、元の向きで考えるとZ軸で-90度回転することになるのだった。つまり、(1, 3, 0)ではなくて(1, 0, 3)にしなくてはならなかったのだ。これはややこしいことになってしまった。

 結局、向きの情報を(i, j, k)で表わすのはあきらめて、小キューブの6面の色を6個の記号で表わすことにした。そして、回転操作をする度に小キューブの各面の移動を6個の記号の移動に対応させるようにした。これでたぶん大丈夫だろう。その結果は以下の通りだ。

operators='1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y'
(111,RYW---)->(313,-Y-R-W)
(113,RY---B)->(133,B---YR)
(131,R-W-G-)->(113,RG---W)
(133,R---GB)->(131,G-B-R-)
(311,-YWO--)->(111,OWY---)
(313,-Y-O-B)->(311,-OBY--)
operators='1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y'
(313,-Y-R-W)->(311,-RWY--)
(133,B---YR)->(131,Y-R-B-)
(113,RG---W)->(133,W---GR)
(131,G-B-R-)->(113,GR---B)
(111,OWY---)->(313,-W-O-Y)
(311,-OBY--)->(111,YBO---)
operators='1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y,1R,3Y'
(311,-RWY--)->(111,YWR---)
(131,Y-R-B-)->(113,YB---R)
(133,W---GR)->(131,G-R-W-)
(113,GR---B)->(133,B---RG)
(313,-W-O-Y)->(311,-OYW--)
(111,YBO---)->(313,-B-Y-O)
operators='3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y'
(111,YWR---)->(131,R-Y-W-)
(113,YB---R)->(311,-BRY--)
(131,G-R-W-)->(133,W---GR)
(133,B---RG)->(111,BRG---)
(311,-OYW--)->(313,-W-O-Y)
(313,-B-Y-O)->(113,YO---B)
operators='3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y'
(131,R-Y-W-)->(133,W---RY)
(311,-BRY--)->(313,-Y-B-R)
(133,W---GR)->(111,WGR---)
(111,BRG---)->(131,G-B-R-)
(313,-W-O-Y)->(113,OY---W)
(113,YO---B)->(311,-OBY--)
operators='3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y,3R,1Y'
(133,W---RY)->(111,WRY---)
(313,-Y-B-R)->(113,BR---Y)
(111,WGR---)->(131,R-W-G-)
(131,G-B-R-)->(133,R---GB)
(113,OY---W)->(311,-YWO--)
(311,-OBY--)->(313,-Y-O-B)

 エッジキューブの位置と向きが正しくなる7周期ずつに区切って操作記号を与えたので、変化を受けるコーナーキューブだけが表示されている。最終的な結果は(1,1,1)と(1,1,3)のキューブ以外は最初の状態に戻っているので、今度は間違いないだろう。

 これを見て、店主が言った。
 「位置はこれでも分かるけど、色のところがさっぱり分からんな…。やっぱり展開図の方がいいや。まだできてないの?」

 ――それは、もう少し待ってくれよ…。

| コメント(2) | トラックバック(0)
WebMoney ぷちカンパ

トラックバック(0)

トラックバックURL: http://homeposition.net/mt/mt-tb.cgi/174

コメント(2)

Perlの正規表現もわかっていないので、ちょっと難しいです、、、が、時間かけて理解しますね。

あまりの大作かつ労作に、脱帽です。

 Perlのスクリプトはお見せできるような代物ではありませんけど、ある程度まとまったらCGIにして、Web上に置こうかと思っています。

 とはいうものの、それも少々行き詰まってきたので、ここいらで本編にからめてみようかと妄想中です。六つの面を六つの玉に置き換えて…とか。これはさすがに無理っぽいですけど。(笑)

コメントする

カレンダー

<   2009年10月   >
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Twitter

Powered by Movable Type 4.261

このページについて

このページは、かみ かずしげが2009年10月11日 16:34に書いたブログ記事です。

ひとつ前のブログ記事は「もう少し単純化する話」です。

次のブログ記事は「それ以来ずっとひねりっ話」です。

最近の記事はメインページで、過去の記事はアーカイブで閲覧できます。

最近のコメント