diff options
Diffstat (limited to 'cube/turns.go')
-rw-r--r-- | cube/turns.go | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/cube/turns.go b/cube/turns.go new file mode 100644 index 0000000..2129f26 --- /dev/null +++ b/cube/turns.go @@ -0,0 +1,190 @@ +package cube + +func (a *row) flip() { + for left, right := 0, len(*a)-1; left < right; left, right = left+1, right-1 { + (*a)[left], (*a)[right] = (*a)[right], (*a)[left] + } +} + +func (f *face) transpose() { + l := len(*f) + nf := make(face, l) + + for i := 0; i < l; i++ { + nf[i] = make(row, l) + for j := 0; j < l; j++ { + nf[i][j] = (*f)[j][i] + } + } + + for i := 0; i < l; i++ { + for j := 0; j < l; j++ { + (*f)[i][j] = nf[i][j] + } + } +} + +func (f *face) clockwise() { + f.transpose() + + for i := 0; i < len(*f); i++ { + (*f)[i].flip() + } +} + +func (f *face) _clockwise() { + for i := 0; i < len(*f); i++ { + (*f)[i].flip() + } + + f.transpose() +} + +func (c *Cube) Y(layer int) { + _layer := c.Size() - layer - 1 + + if layer == 0 { + c.top.clockwise() + } else if _layer == 0 { + c.bottom._clockwise() + } + + temp := c.front[layer] + c.front[layer] = c.right[layer] + c.right[layer] = c.back[layer] + c.back[layer] = c.left[layer] + c.left[layer] = temp +} + +func (c *Cube) Y_(layer int) { + _layer := c.Size() - layer - 1 + + if layer == 0 { + c.top._clockwise() + } else if _layer == 0 { + c.bottom.clockwise() + } + + temp := c.front[layer] + c.front[layer] = c.left[layer] + c.left[layer] = c.back[layer] + c.back[layer] = c.right[layer] + c.right[layer] = temp +} + +func (c *Cube) U() { + c.Y(0) +} +func (c *Cube) U_() { + c.Y_(0) +} + +func (c *Cube) D() { + c.Y_(c.Size() - 1) +} +func (c *Cube) D_() { + c.Y(c.Size() - 1) +} + +func (c *Cube) Z(layer int) { + _layer := c.Size() - layer - 1 + + if layer == 0 { + c.front.clockwise() + } else if _layer == 0 { + c.back._clockwise() + } + + temp := c.top[_layer] + c.top[_layer] = c.left.colGet(_layer) + c.top[_layer].flip() + c.left.colSet(_layer, c.bottom[layer]) + c.bottom[layer] = c.right.colGet(layer) + c.bottom[layer].flip() + c.right.colSet(layer, temp) +} + +func (c *Cube) Z_(layer int) { + _layer := c.Size() - layer - 1 + + if layer == 0 { + c.front._clockwise() + } else if _layer == 0 { + c.back.clockwise() + } + + temp := c.top[_layer] + c.top[_layer] = c.right.colGet(layer) + c.bottom[layer].flip() + c.right.colSet(layer, c.bottom[layer]) + c.bottom[layer] = c.left.colGet(layer) + temp.flip() + c.left.colSet(_layer, temp) +} + +func (c *Cube) F() { + c.Z(0) +} +func (c *Cube) F_() { + c.Z_(0) +} + +func (c *Cube) B() { + c.Z_(c.Size() - 1) +} +func (c *Cube) B_() { + c.Z(c.Size() - 1) +} + +func (c *Cube) X(layer int) { + _layer := c.Size() - layer - 1 + + if layer == 0 { + c.right.clockwise() + } else if _layer == 0 { + c.left._clockwise() + } + + temp := c.top.colGet(_layer) + temp.flip() + c.top.colSet(_layer, c.front.colGet(_layer)) + c.front.colSet(_layer, c.bottom.colGet(_layer)) + t := c.back.colGet(layer) + t.flip() + c.bottom.colSet(_layer, t) + c.back.colSet(layer, temp) +} + +func (c *Cube) X_(layer int) { + _layer := c.Size() - layer - 1 + + if layer == 0 { + c.right._clockwise() + } else if _layer == 0 { + c.left.clockwise() + } + + temp := c.top.colGet(_layer) + t := c.back.colGet(layer) + t.flip() + c.top.colSet(_layer, t) + t = c.bottom.colGet(_layer) + t.flip() + c.back.colSet(layer, t) + c.bottom.colSet(_layer, c.front.colGet(_layer)) + c.front.colSet(_layer, temp) +} + +func (c *Cube) R() { + c.X(0) +} +func (c *Cube) R_() { + c.X_(0) +} + +func (c *Cube) L() { + c.X_(c.Size() - 1) +} +func (c *Cube) L_() { + c.X(c.Size() - 1) +} |