Вы спрашиваете, как определить структуру данных.Ваш выбор является произвольным, если определенные вами операции работают правильно.Например, вы можете представить куб как:
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 /@ {...}