Mathematica でルービック キューブを設計する方法を知りたいのですが、それは可能ですか。立方体の 6 つの面にある小さい方の立方体の異なる分離をどのように決定できますか。
1 に答える
データ構造を定義する方法を尋ねています。定義した操作が正しく機能する限り、選択は任意です。たとえば、次のような立方体を表すことができます。
newCube[] := {
{red, red, red, red, red, red, red, red, red},
{orange, orange, orange, orange, orange, orange, orange, orange, orange},
{yellow, yellow, yellow, yellow, yellow, yellow, yellow, yellow, yellow},
{green, green, green, green, green, green, green, green, green},
{indigo, indigo, indigo, indigo, indigo, indigo, indigo, indigo, indigo},
{purple, purple, purple, purple, purple, purple, purple, purple, purple}
}
次に、ツイスト(およびオプションでアンチツイスト)操作を定義できます。各移動に1つ(3軸、軸ごとにツイストする3層、ツイストする2方向、または6軸、軸ごとにツイストする3層)、または2つです。回転操作とひねりを加え、これらを作成してのような効果を生成できると仮定しますinverseRotate[simpleTwist[rotate[cube], ...], ...]
。
必要なコードを理解するには、表現から実際のオブジェクトへのマップが必要です。おそらく、表または裏のいずれかであるコインの例を示す方がよいでしょう。
newCoin[] := {heads}
flipCoin[coin_] := {If[coin[[0]]==heads, tails, heads]}
リストなどの基本的なデータ構造でオブジェクトを表現するのが簡単でない場合、これはより複雑になる可能性があります。次のような行列でキューブを表すこともできます。
newCube[] := {
/red, red, red\ /orange, orange, orange\
|red, red, red| |orange, orange, orange|
\red, red, red/, \orange, orange, orange/, ...
}
しかし、マトリックスをつなぎ合わせる方法を簡単に表現することはできません。したがって、リスト内でのそれらの順序は任意です。
それでも混乱している場合は、次のようにすることができます。
表現の各スロットに任意の番号を付けます(最悪の場合、0から53までのラベルを付けますが、よりエレガントにすることができます)。次に、実際のルービックキューブを使用して、各面にそれらの数字を書き込みます。次に、操作を行うときに、新しい位置を書き留めます。これは、その特定の許可された移動/ねじれが半群データ構造に誘発する順列と呼ばれます。先に述べたように、これらのかなりの数(18)があり、それらをすべて書き留める必要があります。次に、次のようなものを使用できます。
newCube[] := {0,1,2, 3,4,5, 6,7,8, ...53}
permutations = {
{12,15,0, 3,4,5, 6,7,8, ...}, (*figure these out yourself*)
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . },
{. . . }
}
twistCube[cube_, moveNumber_] := Permute[
cube,
FindPermutation[permutations[[moveNumber]]]
]
毎回FindPermutationを呼び出すのではなく、次のようなコンピュータサイエンスのトリックを使用して、これを最適化できます。permutations = FindPermutation /@ {...}