Language agnostic 如何表现一个魔方';s立方体

Language agnostic 如何表现一个魔方';s立方体,language-agnostic,data-structures,wolfram-mathematica,rubiks-cube,Language Agnostic,Data Structures,Wolfram Mathematica,Rubiks Cube,我想知道我们如何在mathematica中设计一个rubics立方体。这有可能吗?我们如何去做。我们如何确定小立方体在立方体的6个面上的不同间隔。您正在询问如何定义数据结构。只要定义的操作正确,您的选择是任意的。例如,您可以表示一个立方体,如: newCube[] := { {red, red, red, red, red, red, red, red, red}, {orange, orange, orange, orange, orange, orange, orange,

我想知道我们如何在mathematica中设计一个rubics立方体。这有可能吗?我们如何去做。我们如何确定小立方体在立方体的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[SimpleWist[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/@{…}