diff --git a/README.md b/README.md index a82e7b2..8d3b042 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,11 @@ -Repo for all of my advent of code 2019 challenges in GoLang. - -https://adventofcode.com/2019 +# Advent of Code 2019 +Language: GoLang. +[https://adventofcode.com/2019](https://adventofcode.com/2019) +--- +## Summary of Days +Day | Name | Type of Algo +--- | --- | --- +1 | The Tyranny of the Rocket Equation | - Simple math problem +2 | Program Alarm | - Intro to the crazy Intcode problems that are half the AoC days...
- Array (slice...) manipulation
- I used recursion +3 | \ No newline at end of file diff --git a/day02/input.txt b/day02/input.txt new file mode 100644 index 0000000..985b0aa --- /dev/null +++ b/day02/input.txt @@ -0,0 +1 @@ +1, 12, 2, 3, 1, 1, 2, 3, 1, 3, 4, 3, 1, 5, 0, 3, 2, 1, 6, 19, 1, 19, 5, 23, 2, 13, 23, 27, 1, 10, 27, 31, 2, 6, 31, 35, 1, 9, 35, 39, 2, 10, 39, 43, 1, 43, 9, 47, 1, 47, 9, 51, 2, 10, 51, 55, 1, 55, 9, 59, 1, 59, 5, 63, 1, 63, 6, 67, 2, 6, 67, 71, 2, 10, 71, 75, 1, 75, 5, 79, 1, 9, 79, 83, 2, 83, 10, 87, 1, 87, 6, 91, 1, 13, 91, 95, 2, 10, 95, 99, 1, 99, 6, 103, 2, 13, 103, 107, 1, 107, 2, 111, 1, 111, 9, 0, 99, 2, 14, 0, 0 diff --git a/day02/main.go b/day02/main.go deleted file mode 100644 index 9933e23..0000000 --- a/day02/main.go +++ /dev/null @@ -1,67 +0,0 @@ -package main - -import "fmt" - -func calcValue(input []int, target int, noun int, verb int) bool { - // update the 1 and 2 values here - input[1] = noun - input[2] = verb - - // fmt.Println(input) - - // loop through all "instructions" - for i := 0; i < len(input); i += 4 { - // check opertor type (1 2 or 99) - operator := input[i] - // if it's not 99 (don't terminate, and run a calculation) - if operator != 99 { - // grab the two values to be added or multiplied - value1 := input[input[i+1]] - value2 := input[input[i+2]] - - // grab the index that will get the new value - indexToUpdate := input[i+3] - - // perform calcuation based on operator value - if operator == 1 { - input[indexToUpdate] = value1 + value2 - } else if operator == 2 { - input[indexToUpdate] = value1 * value2 - } - } else { - // if it is 99, break out of this loop - break - } - } - - // if the target value is found, return true - if input[0] == target { - return true - } - return false -} - -func main() { - // defualt input slice, index 1 and 2 will be replaced - input := []int{1, 12, 2, 3, 1, 1, 2, 3, 1, 3, 4, 3, 1, 5, 0, 3, 2, 1, 6, 19, 1, 19, 5, 23, 2, 13, 23, 27, 1, 10, 27, 31, 2, 6, 31, 35, 1, 9, 35, 39, 2, 10, 39, 43, 1, 43, 9, 47, 1, 47, 9, 51, 2, 10, 51, 55, 1, 55, 9, 59, 1, 59, 5, 63, 1, 63, 6, 67, 2, 6, 67, 71, 2, 10, 71, 75, 1, 75, 5, 79, 1, 9, 79, 83, 2, 83, 10, 87, 1, 87, 6, 91, 1, 13, 91, 95, 2, 10, 95, 99, 1, 99, 6, 103, 2, 13, 103, 107, 1, 107, 2, 111, 1, 111, 9, 0, 99, 2, 14, 0, 0} - - // brute force to try all options for nouns and verbs -outer: - for i := 0; i < 100; i++ { - for j := 0; j < 100; j++ { - // crete a copy of the input slice - clone := make([]int, 120) - copy(clone, input) - - // if the calcValue function returns true, break out of the loops and print the values to the console - if calcValue(clone, 19690720, i, j) == true { - // print answers to console (manually add to advent of code) - fmt.Println("noun is", i, "verb is", j) - fmt.Println("actual result value noun * 10 + verb = ", i*100+j) - - // use labeled outer loop to break out of both for loops - break outer - } - } - } -} diff --git a/day02/part1/main.go b/day02/part1/main.go new file mode 100644 index 0000000..2346e52 --- /dev/null +++ b/day02/part1/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "adventofcode/util" + "fmt" + "strconv" + "strings" +) + +func main() { + // read the input file and place into slice of strings + inputFile := util.ReadFile("../input.txt") + splitStrings := strings.Split(inputFile, ", ") + + // convert to slice of numbers + inputNumbers := make([]int, len(splitStrings)) + for i, v := range splitStrings { + inputNumbers[i], _ = strconv.Atoi(v) + } + + // start running the step function + step(inputNumbers, 0) + fmt.Println("Final value at address 0 is:", inputNumbers[0]) +} + +// step will read the next 4 values in the input `sli` and make updates according to the opcodes +func step(sli []int, index int) bool { + if sli[index] == 99 { + return false + } + opcode, two, three, four := read(sli, index) + switch opcode { + case 1: + sli[four] = sli[two] + sli[three] + case 2: + sli[four] = sli[two] * sli[three] + } + // recursively call itself & increment index value... + return step(sli, index+4) +} + +// this read function may be necessary later as the intcode thingy becomes more complex +func read(sli []int, index int) (int, int, int, int) { + return sli[index], sli[index+1], sli[index+2], sli[index+3] +} diff --git a/day02/part2/main.go b/day02/part2/main.go new file mode 100644 index 0000000..920b31a --- /dev/null +++ b/day02/part2/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "adventofcode/util" + "fmt" + "strconv" + "strings" +) + +func main() { + // read the input file, modify it to a slice of numbers + inputFile := util.ReadFile("../input.txt") + splitStrings := strings.Split(inputFile, ", ") + inputNumbers := make([]int, len(splitStrings)) + + for i, v := range splitStrings { + inputNumbers[i], _ = strconv.Atoi(v) + } + + // brute force to try all options for nouns and verbs + for i := 0; i < 100; i++ { + for j := 0; j < 100; j++ { + // crete a copy of the inputNumbers slice + clone := make([]int, 120) + copy(clone, inputNumbers) + clone[1] = i + clone[2] = j + + // run step on the cloned slice + step(clone, 0) + // check if the zero address is equal to the AoC value + if clone[0] == 19690720 { + // print answers to console (manually add to advent of code) + fmt.Println("noun is", i, "verb is", j) + fmt.Println("actual result value noun * 10 + verb = ", i*100+j) + + // return to end main function + return + } + } + } +} + +// step will read the next 4 values in the input `sli` and make updates +// according to the opcodes +func step(sli []int, index int) bool { + if sli[index] == 99 { + return false + } + opcode, two, three, four := read(sli, index) + switch opcode { + case 1: + sli[four] = sli[two] + sli[three] + case 2: + sli[four] = sli[two] * sli[three] + } + // recursively call itself & increment index value... + return step(sli, index+4) +} + +func read(sli []int, index int) (int, int, int, int) { + return sli[index], sli[index+1], sli[index+2], sli[index+3] +}