4

mathematica에서 rubics 큐브를 어떻게 디자인 할 수 있는지 알고 싶습니다. 가능한 것이고 어떻게 진행할 수 있습니까? 우리는 큐브의 6면에있는 작은 큐브의 서로 다른 분리를 어떻게 결정할 수 있습니까?Rubik의 입방체 표현 방법

+3

http://demonstrations.wolfram.com/RubiksCube/ –

답변

6

데이터 구조를 정의하는 방법을 묻습니다. 정의한 작업이 올바르게 작동하는 한 선택은 임의적입니다. 는, (각각의 이동에 대해 3 개 개의 층을 3 축 비틀림 (임의로 비틀림 방지) 동작을 정의 할 수 있습니다이어서

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} 
} 

축마다 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/, ... 
} 

그러나 행렬이 함께 바느질하는 방법을 쉽게 표현할 수없는 : 당신은 같은 행렬로 큐브를 나타낼 수 있습니다. 따라서 목록에서의 순서는 임의적입니다.

(최악의 경우 귀하의 표현에서 각 슬롯을 임의의 번호를 부여, 당신은 그 공 (53)을 통해 레이블,하지만 당신은 그것에 대해 더 우아 할 수 있습니다 : 당신은 여전히 ​​혼동하는 경우

, 당신은이 작업을 수행 할 수 있습니다). 그런 다음 진정한 루빅 큐브로 각면에 그 숫자를 씁니다. 그런 다음 작업을 수행 할 때 새 위치를 적어 두십시오. 이것은 순열이라고 불리며, 그 특수한 이동/비틀림이 당신의 세미 그룹 데이터 구조에 유도되도록했습니다. 앞서 언급했듯이, 이들 중 상당수가 18 가지이며, 모두 다 써야합니다. 그럼 당신은 같은 것을 할 수 있습니다 : 당신은 FindPermutation 때마다 호출보다는 같은 컴퓨터 과학 트릭이를 최적화 할 수 있습니다

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]]] 
] 

만들기를 permutations = FindPermutation /@ {...}