Как изобразить кубик Рубика - PullRequest
4 голосов
/ 19 марта 2012

Я хочу знать, как мы можем спроектировать кубик рубрики в mathematica. Возможно ли это и как мы можем это сделать? как мы можем решить различное разделение меньших кубов на 6 гранях куба.

1 Ответ

6 голосов
/ 19 марта 2012

Вы спрашиваете, как определить структуру данных.Ваш выбор является произвольным, если определенные вами операции работают правильно.Например, вы можете представить куб как:

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 /@ {...}

...