如何表示魔方

use*_*399 4 language-agnostic wolfram-mathematica rubiks-cube data-structures

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

nin*_*cko 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}
}
Run Code Online (Sandbox Code Playgroud)

然后你可以定义一个扭转(和任选的反扭转)操作,每个移动一个(3个轴,每个轴扭转3个层,扭转2个方向;或者6个轴,每个轴扭转3个层),或者两个旋转操作和扭曲,并假设你可以组合这些来生成像inverseRotate[simpleTwist[rotate[cube], ...], ...].

要找出所需的代码,您必须拥有从表示到真实对象的映射.或许最好展示一个硬币的例子,它可以是头或尾:

newCoin[] := {heads}

flipCoin[coin_] := {If[coin[[0]]==heads, tails, heads]}
Run Code Online (Sandbox Code Playgroud)

如果使用基本数据结构(如列表)表示对象并不容易,这可能会更复杂.您甚至可以使用以下矩阵表示您的多维数据集:

newCube[] := {
    /red, red, red\  /orange, orange, orange\
    |red, red, red|  |orange, orange, orange|
    \red, red, red/, \orange, orange, orange/, ...
}
Run Code Online (Sandbox Code Playgroud)

但是矩阵缝合在一起的方式不容易表现出来.所以他们在列表中的排序是任意的.

如果你仍然感到困惑,你可以这样做:

给你的表示中的每个插槽一个任意数字(最坏的情况,你将它们标记为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]]]
]
Run Code Online (Sandbox Code Playgroud)

您可以使用计算机科学技巧来优化这一点,而不是每次调用FindPermutation permutations = FindPermutation /@ {...}