如何表示魔方

时间:2012-03-18 20:49:24

标签: language-agnostic data-structures wolfram-mathematica rubiks-cube

我想知道我们如何在mathematica中设计一个rubics立方体。是否可能,我们如何才能使用它。我们怎样才能决定立方体6面上较小立方体的不同分离。

1 个答案:

答案 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 /@ {...}