如何表示魔方



我想知道如何在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[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 /@ {...}

相关内容

  • 没有找到相关文章

最新更新