我想知道我们如何在mathematica中设计一个rubics立方体。是否可能,我们如何才能使用它。我们怎样才能决定立方体6面上较小立方体的不同分离。
答案 0 :(得分:6)
您正在询问如何定义数据结构。只要您定义的操作正常工作,您的选择就是任意的。例如,您可以表示像:
这样的多维数据集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}
}
然后你可以定义一个扭转(和任选的反扭转)操作,每个移动一个(3个轴,每个轴扭转3个层,扭转2个方向;或者6个轴,每个轴扭转3个层) ,或两个旋转操作和扭曲,并假设您可以组合这些以生成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 /@ {...}