isundil 9 years ago
parent
commit
0b6f402d90
1 changed files with 106 additions and 0 deletions
  1. 106 0
      src/d01/d01.go

+ 106 - 0
src/d01/d01.go

@@ -0,0 +1,106 @@
+package main
+
+import "container/list"
+import "strings"
+import "strconv"
+import "bufio"
+import "math"
+import "fmt"
+import "os"
+
+type Vect struct {
+    posX int
+    posY int
+    head int
+}
+
+func (this *Vect) addStepCount() {
+    switch this.head {
+    case 0:
+        this.posY++
+        break
+    case 1:
+        this.posX++
+        break
+    case 2:
+        this.posY--
+        break;
+    case 3:
+        this.posX--
+        break
+    }
+}
+
+func (this *Vect) addStep(dir string) bool {
+    if dir == "R" {
+        this.head++;
+        for this.head >= 4 { this.head -= 4 }
+    } else if dir == "L" {
+        this.head--;
+        for this.head < 0 { this.head += 4 }
+    } else {
+        return false
+    }
+    return true
+}
+
+func (this Vect) toTaxiCab() int {
+    return int(math.Abs(float64(this.posX)) +
+        math.Abs(float64(this.posY)))
+}
+
+func (this Vect) inList(list list.List) bool {
+    for e := list.Front(); e != nil; e = e.Next() {
+        if e.Value.(Vect).posX == this.posX &&
+            e.Value.(Vect).posY == this.posY {
+            return true
+        }
+    }
+    return false
+}
+
+func (this *Vect) relative(other Vect) {
+    this.posX -= other.posX
+    this.posY -= other.posY
+}
+
+func dumpList(l list.List) {
+    for e := l.Front(); e != nil; e = e.Next() {
+        fmt.Println(e.Value.(Vect))
+    }
+}
+
+func main() {
+    coords := Vect{}
+    reader := bufio.NewReader(os.Stdin)
+    var visited list.List
+    var visitedTwice Vect
+    var hasVisitedTwice bool = false
+
+    for {
+        read, err := reader.ReadString(',')
+        read = strings.Trim(read, ", \n")
+        stepCount, _ := strconv.Atoi(read[1:])
+        coords.addStep(read[:1])
+        for i := 0; i < stepCount; i++ {
+            if !hasVisitedTwice {
+                if coords.inList(visited) {
+                    visitedTwice = coords
+                    hasVisitedTwice = true
+                } else {
+                    visited.PushBack(Vect(coords))
+                }
+            }
+            coords.addStepCount()
+        }
+        if err != nil {
+            break
+        }
+    }
+
+    fmt.Println(coords.toTaxiCab())
+    if (hasVisitedTwice) {
+        fmt.Println(visitedTwice.toTaxiCab())
+    }
+}
+