aboutsummaryrefslogtreecommitdiff
path: root/cube/cube.go
diff options
context:
space:
mode:
Diffstat (limited to 'cube/cube.go')
-rw-r--r--cube/cube.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/cube/cube.go b/cube/cube.go
new file mode 100644
index 0000000..f52cf8f
--- /dev/null
+++ b/cube/cube.go
@@ -0,0 +1,129 @@
+package cube
+
+import (
+ "errors"
+ "strings"
+)
+
+type colour uint8
+
+const (
+ White colour = iota
+ Yellow
+ Red
+ Orange
+ Blue
+ Green
+)
+
+func (c colour) String() string {
+ switch c {
+ case White:
+ return "W"
+ case Yellow:
+ return "Y"
+ case Red:
+ return "R"
+ case Orange:
+ return "O"
+ case Blue:
+ return "B"
+ case Green:
+ return "G"
+ }
+ return ""
+}
+
+type row []colour
+
+func (r row) String() (s string) {
+ for i := range r {
+ s += r[i].String()
+ }
+ return
+}
+
+type face []row
+
+func (f face) colGet(c int) (r row) {
+ r = make(row, len(f))
+ for i := 0; i < len(f); i++ {
+ r[i] = f[i][c]
+ }
+ return
+}
+
+func (f *face) colSet(c int, r row) {
+ for i := 0; i < len(*f); i++ {
+ (*f)[i][c] = r[i]
+ }
+}
+
+type Cube struct {
+ front face
+ back face
+ top face
+ bottom face
+ left face
+ right face
+}
+
+func New(size int) (*Cube, error) {
+ if size < 1 {
+ return nil, errors.New("Size must be greater than 0.")
+ }
+ var c Cube
+ c.front = make(face, size)
+ c.back = make(face, size)
+ c.top = make(face, size)
+ c.bottom = make(face, size)
+ c.left = make(face, size)
+ c.right = make(face, size)
+
+ for i := 0; i < size; i++ {
+ c.front[i] = make(row, size)
+ c.back[i] = make(row, size)
+ c.top[i] = make(row, size)
+ c.bottom[i] = make(row, size)
+ c.left[i] = make(row, size)
+ c.right[i] = make(row, size)
+
+ for j := 0; j < size; j++ {
+ c.front[i][j] = Red
+ c.back[i][j] = Orange
+ c.top[i][j] = White
+ c.bottom[i][j] = Yellow
+ c.left[i][j] = Green
+ c.right[i][j] = Blue
+ }
+ }
+
+ return &c, nil
+}
+
+func (c Cube) Size() int {
+ return len(c.front)
+}
+
+func (c Cube) String() (r string) {
+ s := strings.Repeat(" ", c.Size()+2)
+
+ for i := 0; i < c.Size(); i++ {
+ r += s + c.top[i].String() + "\n"
+ }
+ r += "\n"
+
+ for i := 0; i < c.Size(); i++ {
+ r += c.left[i].String() + " " +
+ c.front[i].String() + " " +
+ c.right[i].String() + " " +
+ c.back[i].String() + "\n"
+ }
+ r += "\n"
+
+ for i := 0; i < c.Size(); i++ {
+ r += s + c.bottom[i].String() + "\n"
+ }
+
+ return
+}