use*_*399 4 language-agnostic wolfram-mathematica rubiks-cube data-structures
我想知道我们如何在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}
}
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 /@ {...}
| 归档时间: |
|
| 查看次数: |
850 次 |
| 最近记录: |