From c3bc233d82af4234d0fbbad3344f3942d929cca7 Mon Sep 17 00:00:00 2001 From: Ben Charlton Date: Wed, 6 Dec 2017 17:28:33 +0000 Subject: [PATCH] fine, I'll put them on github --- 1/1.go | 37 +++++++++++++++++++++++ 2/2.2.go | 51 ++++++++++++++++++++++++++++++++ 2/2.go | 41 ++++++++++++++++++++++++++ 3/3.2.go | 72 +++++++++++++++++++++++++++++++++++++++++++++ 3/3.go | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4/4.2.go | 43 +++++++++++++++++++++++++++ 4/4.go | 35 ++++++++++++++++++++++ 5/5.go | 41 ++++++++++++++++++++++++++ 6/6.go | 62 ++++++++++++++++++++++++++++++++++++++ 9 files changed, 472 insertions(+) create mode 100644 1/1.go create mode 100644 2/2.2.go create mode 100644 2/2.go create mode 100644 3/3.2.go create mode 100644 3/3.go create mode 100644 4/4.2.go create mode 100644 4/4.go create mode 100644 5/5.go create mode 100644 6/6.go diff --git a/1/1.go b/1/1.go new file mode 100644 index 0000000..0e89664 --- /dev/null +++ b/1/1.go @@ -0,0 +1,37 @@ +package main + +import "os" +import "fmt" +import "strings" +import "strconv" + +// go run 1.go + +func main() { + + s := strings.Split(os.Args[1], "") + checksum := 0 + checksum2 := 0 + + for index, element := range s { + pre := index - 1 + pre2 := (index + (len(s) / 2)) % len(s) + if pre == -1 { + pre = len(s) - 1 + } + + fmt.Println(index, element, pre, s[pre]) + + if element == s[pre] { + i, _ := strconv.Atoi(element) + checksum += i + } + if element == s[pre2] { + i, _ := strconv.Atoi(element) + checksum2 += i + } + + } + + fmt.Println(checksum, checksum2) +} diff --git a/2/2.2.go b/2/2.2.go new file mode 100644 index 0000000..3f212ad --- /dev/null +++ b/2/2.2.go @@ -0,0 +1,51 @@ +package main + +import "os" +import "fmt" +import "strings" +import "strconv" +import "bufio" + +// cat input | go run 2.2.go + +func main() { + + scanner := bufio.NewScanner(os.Stdin) + checksum := 0 + for scanner.Scan() { + + s := strings.Split(scanner.Text(), "\t") + fmt.Println(s) + + for index, element := range s { + fmt.Println(index, element) + i, _ := strconv.Atoi(element) + + for index2, e2 := range s { + + i2, _ := strconv.Atoi(e2) + + if index == index2 { + continue + } + if i2 > i { + continue + } + + result := float64(i) / float64(i2) + ir := float64(int(result)) + + if result == ir { + fmt.Println("yes!", i, i2, result) + checksum += int(result) + } + + } + } + + fmt.Println("---") + + } + + fmt.Println(checksum) +} diff --git a/2/2.go b/2/2.go new file mode 100644 index 0000000..d303f3e --- /dev/null +++ b/2/2.go @@ -0,0 +1,41 @@ +package main + +import "os" +import "fmt" +import "strings" +import "strconv" +import "bufio" + +// cat input | go run 2.go + +func main() { + + scanner := bufio.NewScanner(os.Stdin) + checksum := 0 + for scanner.Scan() { + + min := 9999999999999 // messy, but whatever. + max := 0 + s := strings.Split(scanner.Text(), "\t") + + for index, element := range s { + fmt.Println(index, element) + i, _ := strconv.Atoi(element) + if i < min { + min = i + } + if i > max { + max = i + } + } + + diff := max - min + checksum += diff + fmt.Println("min", min, "max", max, "diff", diff) + fmt.Println("---") + + } + + fmt.Println(checksum) + +} diff --git a/3/3.2.go b/3/3.2.go new file mode 100644 index 0000000..fe88d10 --- /dev/null +++ b/3/3.2.go @@ -0,0 +1,72 @@ +package main + +import "os" +import "fmt" +import "math" +import "strconv" + +// go run 3.2.go + +// Need to brute force part two anyway, should have done that for part one... + +func main() { + + target, _ := strconv.Atoi(os.Args[1]) + + // This is way overkill for the real solution, but needed it for testing initial grid size with value = i + squareSize := int(math.Ceil(math.Sqrt(float64(target)))) + 2 + grid := make([][]int, squareSize) + + for i := 0; i < squareSize; i++ { + y := make([]int, squareSize) + grid[i] = y + } + + dirX := 1 + dirY := 0 + startVal := 1 + posX := (squareSize - 1) / 2 + posY := (squareSize - 1) / 2 + grid[posX][posY] = 1 + + fmt.Println("sq", squareSize, "xy", posX, posY, "dir", dirX, dirY) + + for i := startVal + 1; i <= target; i++ { + + posX += dirX + posY += dirY + + adj := grid[posX-1][posY-1] + grid[posX-1][posY] + grid[posX-1][posY+1] + + grid[posX][posY-1] + grid[posX][posY+1] + + grid[posX+1][posY-1] + grid[posX+1][posY] + grid[posX+1][posY+1] + + //adj = i + + grid[posX][posY] = adj + if adj > target { + fmt.Println("Result:", adj) + os.Exit(0) + } + + if dirY == -1 && grid[posX+1][posY] == 0 { + dirY = 0 + dirX = 1 + } + if dirY == 1 && grid[posX-1][posY] == 0 { + dirY = 0 + dirX = -1 + } + if dirX == -1 && grid[posX][posY-1] == 0 { + dirY = -1 + dirX = 0 + } + if dirX == 1 && grid[posX][posY+1] == 0 { + dirY = 1 + dirX = 0 + } + + } + + //fmt.Println(grid) + +} diff --git a/3/3.go b/3/3.go new file mode 100644 index 0000000..e7b7ba9 --- /dev/null +++ b/3/3.go @@ -0,0 +1,90 @@ +package main + +import "fmt" +import "math" +import "time" +import "os" +import "strconv" + +// go run 3.go + +/* + +"Debugging is twice as hard as writing the code in the first place. + Therefore, if you write the code as cleverly as possible, you are, + by definition, not smart enough to debug it." -- Brian W. Kernighan + +I probably should have just brute forced this, it took me ages to track +down the off-by-one error I had for even squares *some* of the time... + +*/ + +func main() { + + start := time.Now() + + target, _ := strconv.Atoi(os.Args[1]) + squareSize := int(math.Ceil(math.Sqrt(float64(target)))) + startVal := (squareSize-1)*(squareSize-1) + 1 + + dirX := 0 + dirY := 0 + min := 0 + max := 0 + posX := 0 + posY := 0 + + if (squareSize % 2) == 1 { + min = -1 * (squareSize - 1) / 2 + max = (squareSize - 1) / 2 + dirX = 0 + dirY = -1 + posX = min + posY = max + + fmt.Println("odd", squareSize) + fmt.Println("start:", startVal, "min:", min, "max:", max) + + } else { + min = (-1 * (squareSize) / 2) + 1 + max = (squareSize) / 2 + dirX = 0 + dirY = 1 + posX = max + posY = min + + fmt.Println("even", squareSize) + fmt.Println("start:", startVal, "min:", min, "max:", max) + + } + + for i := startVal; i < target; i++ { + fmt.Println(i, posX, posY) + + if dirY == -1 && posY == min { + dirY = 0 + dirX = 1 + } + if dirY == 1 && posY == max { + dirY = 0 + dirX = -1 + } + if dirX == -1 && posX == min { + dirY = -1 + dirX = 0 + } + if dirX == 1 && posX == max { + dirY = 1 + dirX = 0 + } + + posX += dirX + posY += dirY + } + + fmt.Println("result:", posX, posY, (math.Abs(float64(posX)) + math.Abs(float64(posY)))) + + t := time.Now() + elapsed := t.Sub(start) + fmt.Println(elapsed, "ms") +} diff --git a/4/4.2.go b/4/4.2.go new file mode 100644 index 0000000..db3cc2c --- /dev/null +++ b/4/4.2.go @@ -0,0 +1,43 @@ +package main + +import "os" +import "fmt" +import "strings" +import "bufio" +import "sort" + +// cat input | go run 4.2.go + +func main() { + + failed := 0 + count := 0 + + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + count++ + s := strings.Split(scanner.Text(), " ") + fmt.Println(s) + + for i := 0; i < len(s); i++ { + an := strings.Split(s[i], "") + sort.Strings(an) + san := strings.Join(an, "") + s[i] = san + } + + sort.Strings(s) + + for i := 1; i < len(s); i++ { + fmt.Println(i, s[i]) + if s[i] == s[i-1] { + failed++ + fmt.Println("Failed!", s[i], s[i-1]) + break + } + } + + fmt.Println("---") + } + fmt.Println(failed, count, count-failed) +} diff --git a/4/4.go b/4/4.go new file mode 100644 index 0000000..3ab3c55 --- /dev/null +++ b/4/4.go @@ -0,0 +1,35 @@ +package main + +import "os" +import "fmt" +import "strings" +import "bufio" +import "sort" + +// cat input | go run 4.go + +func main() { + + failed := 0 + count := 0 + + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + count++ + s := strings.Split(scanner.Text(), " ") + fmt.Println(s) + + sort.Strings(s) + for i := 1; i < len(s); i++ { + fmt.Println(i, s[i]) + if s[i] == s[i-1] { + failed++ + fmt.Println("Failed!") + break + } + } + + fmt.Println("---") + } + fmt.Println(failed, count, count-failed) +} diff --git a/5/5.go b/5/5.go new file mode 100644 index 0000000..c277fc1 --- /dev/null +++ b/5/5.go @@ -0,0 +1,41 @@ +package main + +import "fmt" +import "bufio" +import "os" +import "strconv" + +// cat input | go run 5.go + +func main() { + + var instructions []int + i := 0 + count := 0 + + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + i, _ := strconv.Atoi(scanner.Text()) + instructions = append(instructions, i) + } + + for { + + if i >= len(instructions) { + fmt.Println(count) + os.Exit(0) + } + + count++ + current := instructions[i] + + if instructions[i] < 3 { + instructions[i]++ // Just this one for the first solution + } else { + instructions[i]-- + } + i += current + + } + +} diff --git a/6/6.go b/6/6.go new file mode 100644 index 0000000..ac56a62 --- /dev/null +++ b/6/6.go @@ -0,0 +1,62 @@ +package main + +import "os" +import "fmt" +import "strconv" + +// go run 6.go N N N N + +func main() { + + var banks []int + seen := make(map[string]int) + + s := os.Args[1:] + for _, element := range s { + i, _ := strconv.Atoi(element) + banks = append(banks, i) + } + + fmt.Println(banks) + + count := 0 + first := 0 + for { + count++ + + // find largest (lowest indexed wins) + largest := 0 + largestSize := -1 + for pos, size := range banks { + if largestSize < size { + largestSize = size + largest = pos + } + } + + fmt.Println(largest, largestSize) + + // redistribute + banks[largest] = 0 + for i := 0; i < largestSize; i++ { + largest = (largest + 1) % len(banks) + banks[largest]++ + } + + // laziness.. + keep := fmt.Sprint(banks) + + fmt.Println(count, keep) + + if seen[keep] == 1 && first == 0 { + first = count + } + if seen[keep] == 2 { + fmt.Println("total:", count, "first:", first, "second:", (count - first)) + os.Exit(0) + } + + seen[keep]++ + + } +}