From 6111f86a04e357f274d87ac195e214fa80e3d022 Mon Sep 17 00:00:00 2001 From: Luke Else Date: Thu, 16 Dec 2021 21:11:39 +0000 Subject: [PATCH] New Shared Library --- day04/4a/Board.go | 16 ----- day04/4a/main.go | 29 ++++---- day04/4b/Board.go | 16 ----- day04/4b/main.go | 31 ++++---- day07/7a/main.go | 43 +---------- day07/7b/main.go | 43 +---------- day10/10a/main.go | 31 ++++---- day10/10a/stack.go | 39 ---------- day10/10b/main.go | 55 ++++++-------- day10/10b/stack.go | 39 ---------- day11/11a/main.go | 50 ++----------- day11/11b/main.go | 52 ++------------ day13/13a/main.go | 22 +++--- day13/13b/main.go | 24 +++---- day16/16a/main.go | 107 ++++++++++++++++++++++++++++ day16/16b/main.go | 107 ++++++++++++++++++++++++++++ day16/input | 102 ++++++++++++++++++++++++++ day16/testInput | 18 +++++ shared/Board.go | 16 +++++ shared/Coordinate.go | 43 +++++++++++ shared/LinkedList.go | 21 ++++++ shared/Node.go | 6 ++ day10/10b/sort.go => shared/Sort.go | 8 +-- shared/Stack.go | 33 +++++++++ 24 files changed, 559 insertions(+), 392 deletions(-) delete mode 100644 day04/4a/Board.go delete mode 100644 day04/4b/Board.go delete mode 100644 day10/10a/stack.go delete mode 100644 day10/10b/stack.go create mode 100644 day16/16a/main.go create mode 100644 day16/16b/main.go create mode 100644 day16/input create mode 100644 day16/testInput create mode 100644 shared/Board.go create mode 100644 shared/Coordinate.go create mode 100644 shared/LinkedList.go create mode 100644 shared/Node.go rename day10/10b/sort.go => shared/Sort.go (84%) create mode 100644 shared/Stack.go diff --git a/day04/4a/Board.go b/day04/4a/Board.go deleted file mode 100644 index 4210456..0000000 --- a/day04/4a/Board.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -type Board struct { - Values [5][5]boardValue - Hash map[int]location -} - -type boardValue struct { - Value int - Visited bool -} - -type location struct { - x int - y int -} diff --git a/day04/4a/main.go b/day04/4a/main.go index a7873ef..4b81f85 100644 --- a/day04/4a/main.go +++ b/day04/4a/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -16,7 +17,7 @@ func main() { fmt.Println(run(boards, nums)) } -func run(boards *[]Board, nums []int) int { +func run(boards *[]shared.Board, nums []int) int { var bingo int var n int for i := 0; i < len(nums); i++ { @@ -32,10 +33,10 @@ func run(boards *[]Board, nums []int) int { return returnAnswer(&(*boards)[bingo], n) } -func loadBoards(content *[]string) (boards *[]Board, nums []int) { - boards = new([]Board) - newBoard := Board{ - Hash: make(map[int]location, 25), +func loadBoards(content *[]string) (boards *[]shared.Board, nums []int) { + boards = new([]shared.Board) + newBoard := shared.Board{ + Hash: make(map[int]shared.Location, 25), } boardNum := 0 row := 0 @@ -61,8 +62,8 @@ func loadBoards(content *[]string) (boards *[]Board, nums []int) { for j := 0; j < len(values); j++ { value, _ := strconv.Atoi(values[j]) - newBoard.Values[row][j] = boardValue{Value: value, Visited: false} - newBoard.Hash[value] = location{x: row, y: j} + newBoard.Values[row][j] = shared.BoardValue{Value: value, Visited: false} + newBoard.Hash[value] = shared.Location{X: row, Y: j} } row++ @@ -70,8 +71,8 @@ func loadBoards(content *[]string) (boards *[]Board, nums []int) { boardNum++ i++ *boards = append(*boards, newBoard) - newBoard = Board{ - Hash: make(map[int]location, 25), + newBoard = shared.Board{ + Hash: make(map[int]shared.Location, 25), } row = 0 } @@ -84,13 +85,13 @@ func loadBoards(content *[]string) (boards *[]Board, nums []int) { return } -func callNumber(n int, boards *[]Board) int { +func callNumber(n int, boards *[]shared.Board) int { for i := 0; i < len(*boards); i++ { location, present := (*boards)[i].Hash[n] if present { //Change the value to visited - (*boards)[i].Values[location.x][location.y].Visited = true - if checkBingo(&(*boards)[i], location.x, location.y) { + (*boards)[i].Values[location.X][location.Y].Visited = true + if checkBingo(&(*boards)[i], location.X, location.Y) { return i } } @@ -98,7 +99,7 @@ func callNumber(n int, boards *[]Board) int { return -1 } -func checkBingo(board *Board, x int, y int) bool { +func checkBingo(board *shared.Board, x int, y int) bool { checkVertical := true //check if bingo for a given row and column @@ -122,7 +123,7 @@ func checkBingo(board *Board, x int, y int) bool { return checkVertical || checkHorizontal } -func returnAnswer(board *Board, n int) (answer int) { +func returnAnswer(board *shared.Board, n int) (answer int) { for i := 0; i < 5; i++ { for j := 0; j < 5; j++ { if !(*board).Values[i][j].Visited { diff --git a/day04/4b/Board.go b/day04/4b/Board.go deleted file mode 100644 index 4210456..0000000 --- a/day04/4b/Board.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -type Board struct { - Values [5][5]boardValue - Hash map[int]location -} - -type boardValue struct { - Value int - Visited bool -} - -type location struct { - x int - y int -} diff --git a/day04/4b/main.go b/day04/4b/main.go index eaa6079..c61231a 100644 --- a/day04/4b/main.go +++ b/day04/4b/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -16,8 +17,8 @@ func main() { fmt.Println(run(boards, nums)) } -func run(boards *[]Board, nums []int) int { - var completedBoards map[*Board]bool = make(map[*Board]bool) +func run(boards *[]shared.Board, nums []int) int { + var completedBoards map[*shared.Board]bool = make(map[*shared.Board]bool) var bingo []int var n int for i := 0; i < len(nums); i++ { @@ -38,10 +39,10 @@ func run(boards *[]Board, nums []int) int { return returnAnswer(&(*boards)[bingo[0]], n) } -func loadBoards(content *[]string) (boards *[]Board, nums []int) { - boards = new([]Board) - newBoard := Board{ - Hash: make(map[int]location, 25), +func loadBoards(content *[]string) (boards *[]shared.Board, nums []int) { + boards = new([]shared.Board) + newBoard := shared.Board{ + Hash: make(map[int]shared.Location, 25), } boardNum := 0 row := 0 @@ -67,8 +68,8 @@ func loadBoards(content *[]string) (boards *[]Board, nums []int) { for j := 0; j < len(values); j++ { value, _ := strconv.Atoi(values[j]) - newBoard.Values[row][j] = boardValue{Value: value, Visited: false} - newBoard.Hash[value] = location{x: row, y: j} + newBoard.Values[row][j] = shared.BoardValue{Value: value, Visited: false} + newBoard.Hash[value] = shared.Location{X: row, Y: j} } row++ @@ -76,8 +77,8 @@ func loadBoards(content *[]string) (boards *[]Board, nums []int) { boardNum++ i++ *boards = append(*boards, newBoard) - newBoard = Board{ - Hash: make(map[int]location, 25), + newBoard = shared.Board{ + Hash: make(map[int]shared.Location, 25), } row = 0 } @@ -90,13 +91,13 @@ func loadBoards(content *[]string) (boards *[]Board, nums []int) { return } -func callNumber(n int, boards *[]Board) (cards []int) { +func callNumber(n int, boards *[]shared.Board) (cards []int) { for i := 0; i < len(*boards); i++ { location, present := (*boards)[i].Hash[n] if present { //Change the value to visited - (*boards)[i].Values[location.x][location.y].Visited = true - if checkBingo(&(*boards)[i], location.x, location.y) { + (*boards)[i].Values[location.X][location.Y].Visited = true + if checkBingo(&(*boards)[i], location.X, location.Y) { cards = append(cards, i) } } @@ -104,7 +105,7 @@ func callNumber(n int, boards *[]Board) (cards []int) { return } -func checkBingo(board *Board, x int, y int) bool { +func checkBingo(board *shared.Board, x int, y int) bool { checkVertical := true //check if bingo for a given row and column @@ -128,7 +129,7 @@ func checkBingo(board *Board, x int, y int) bool { return (checkVertical || checkHorizontal) } -func returnAnswer(board *Board, n int) (answer int) { +func returnAnswer(board *shared.Board, n int) (answer int) { for i := 0; i < 5; i++ { for j := 0; j < 5; j++ { if !(*board).Values[i][j].Visited { diff --git a/day07/7a/main.go b/day07/7a/main.go index 3d117a0..db5c622 100644 --- a/day07/7a/main.go +++ b/day07/7a/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "math" @@ -13,7 +14,7 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - list := mergeSort((*content), 0, len(*content)-1) + list := shared.MergeSort((*content), 0, len(*content)-1) position := list[len(list)/2] var cost float64 @@ -48,43 +49,3 @@ func returnContent(path string) *[]int { return &content } - -//sorting algorithm - -func mergeSort(nums []int, start int, end int) []int { - if start == end { - return []int{nums[start]} - } - - var mid int = ((end - start) / 2) + start - - //Assign values back into Left and right - left := mergeSort(nums, start, mid) - right := mergeSort(nums, mid+1, end) - - var combined []int - - //Pointers for new array - leftPointer, rightPointer := 0, 0 - - for leftPointer <= len(left)-1 || rightPointer <= len(right)-1 { - - if leftPointer == len(left) { - addValue(&combined, right[rightPointer], &rightPointer) - } else if rightPointer == len(right) { - addValue(&combined, left[leftPointer], &leftPointer) - } else { - if left[leftPointer] <= right[rightPointer] { - addValue(&combined, left[leftPointer], &leftPointer) - } else { - addValue(&combined, right[rightPointer], &rightPointer) - } - } - } - return combined -} - -func addValue(nums *[]int, value int, pointer *int) { - *nums = append(*nums, value) - *pointer++ -} diff --git a/day07/7b/main.go b/day07/7b/main.go index 058cf7e..921ec7a 100644 --- a/day07/7b/main.go +++ b/day07/7b/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "math" @@ -13,7 +14,7 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - crabs := mergeSort(*content, 0, len(*content)-1) + crabs := shared.MergeSort(*content, 0, len(*content)-1) min, max := crabs[0], crabs[len(crabs)-1] @@ -76,43 +77,3 @@ func returnContent(path string) *[]int { return &content } - -//sorting algorithm - -func mergeSort(nums []int, start int, end int) []int { - if start == end { - return []int{nums[start]} - } - - var mid int = ((end - start) / 2) + start - - //Assign values back into Left and right - left := mergeSort(nums, start, mid) - right := mergeSort(nums, mid+1, end) - - var combined []int - - //Pointers for new array - leftPointer, rightPointer := 0, 0 - - for leftPointer <= len(left)-1 || rightPointer <= len(right)-1 { - - if leftPointer == len(left) { - addValue(&combined, right[rightPointer], &rightPointer) - } else if rightPointer == len(right) { - addValue(&combined, left[leftPointer], &leftPointer) - } else { - if left[leftPointer] <= right[rightPointer] { - addValue(&combined, left[leftPointer], &leftPointer) - } else { - addValue(&combined, right[rightPointer], &rightPointer) - } - } - } - return combined -} - -func addValue(nums *[]int, value int, pointer *int) { - *nums = append(*nums, value) - *pointer++ -} diff --git a/day10/10a/main.go b/day10/10a/main.go index 3eb19c3..39c2d35 100644 --- a/day10/10a/main.go +++ b/day10/10a/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -10,34 +11,34 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - var bracketMap map[byte]byte = make(map[byte]byte) - var bracketCost map[byte]int = make(map[byte]int) + var bracketMap map[string]string = make(map[string]string) + var bracketCost map[string]int = make(map[string]int) answer := 0 - bracketMap[')'] = '(' - bracketMap[']'] = '[' - bracketMap['}'] = '{' - bracketMap['>'] = '<' + bracketMap[")"] = "(" + bracketMap["]"] = "[" + bracketMap["}"] = "{" + bracketMap[">"] = "<" - bracketCost[')'] = 3 - bracketCost[']'] = 57 - bracketCost['}'] = 1197 - bracketCost['>'] = 25137 + bracketCost[")"] = 3 + bracketCost["]"] = 57 + bracketCost["}"] = 1197 + bracketCost[">"] = 25137 for _, row := range *content { - var stack Stack = Stack{} + var stack shared.Stack = shared.Stack{} for _, char := range row { - brack, found := bracketMap[char] + brack, found := bracketMap[string(char)] if !found { //If it is an opening bracket - stack.Push(char) + stack.Push(string(char)) } else { - if brack == stack.Peek().char { + if brack == stack.Peek().Value { stack.Pop() } else { - answer += bracketCost[char] + answer += bracketCost[string(char)] fmt.Println("Illegal,", char, "found", answer) break } diff --git a/day10/10a/stack.go b/day10/10a/stack.go deleted file mode 100644 index 8dca597..0000000 --- a/day10/10a/stack.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -type Stack struct { - head *StackNode -} - -func (s *Stack) Push(item byte) { - if s.head == nil { - s.head = &StackNode{ - char: item, - next: nil, - } - } else { - new := StackNode{ - char: item, - next: s.head, - } - s.head = &new - } -} - -func (s *Stack) Pop() byte { - node := s.Peek() - s.head = node.next - return node.char -} - -func (s *Stack) Peek() (node *StackNode) { - node = s.head - if node == nil { - node = &StackNode{} - } - return -} - -type StackNode struct { - char byte - next *StackNode -} diff --git a/day10/10b/main.go b/day10/10b/main.go index 1a75ff3..870031e 100644 --- a/day10/10b/main.go +++ b/day10/10b/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -10,43 +11,43 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - var bracketMap map[byte]byte = make(map[byte]byte) - var reverseBracketMap map[byte]byte = make(map[byte]byte) - var bracketCost map[byte]int = make(map[byte]int) + var bracketMap map[string]string = make(map[string]string) + var reverseBracketMap map[string]string = make(map[string]string) + var bracketCost map[string]int = make(map[string]int) - bracketMap[')'] = '(' - bracketMap[']'] = '[' - bracketMap['}'] = '{' - bracketMap['>'] = '<' + bracketMap[")"] = "(" + bracketMap["]"] = "[" + bracketMap["}"] = "{" + bracketMap[">"] = "<" - reverseBracketMap['('] = ')' - reverseBracketMap['['] = ']' - reverseBracketMap['{'] = '}' - reverseBracketMap['<'] = '>' + reverseBracketMap["("] = ")" + reverseBracketMap["["] = "]" + reverseBracketMap["{"] = "}" + reverseBracketMap["<"] = ">" - bracketCost[')'] = 1 - bracketCost[']'] = 2 - bracketCost['}'] = 3 - bracketCost['>'] = 4 + bracketCost[")"] = 1 + bracketCost["]"] = 2 + bracketCost["}"] = 3 + bracketCost[">"] = 4 //reduce list to required incomplete set - stackList := []Stack{} + stackList := []shared.Stack{} autoCompletes := []int{} for _, row := range *content { - stack := Stack{} + stack := shared.Stack{} keep := true for _, char := range row { - brack, found := bracketMap[char] + brack, found := bracketMap[string(char)] if !found { //If it is an opening bracket - stack.Push(char) + stack.Push(string(char)) } else { - if brack == stack.Peek().char { + if brack == stack.Peek().Value { stack.Pop() } else { keep = false @@ -62,7 +63,7 @@ func main() { } - emptyStackNode := StackNode{} + emptyStackNode := shared.Node{} for _, stack := range stackList { autocomplete := 0 @@ -73,7 +74,7 @@ func main() { autoCompletes = append(autoCompletes, autocomplete) } - autoCompletes = mergeSort(autoCompletes, 0, len(autoCompletes)-1) + autoCompletes = shared.MergeSort(autoCompletes, 0, len(autoCompletes)-1) mid := autoCompletes[len(autoCompletes)/2] @@ -81,16 +82,6 @@ func main() { } -// func removeElement(slice *[][]byte, i int) (new *[][]byte) { -// new = &[][]byte{} -// for j, row := range *slice { -// if i != j { -// *new = append(*new, row) -// } -// } -// return -// } - func returnContent(path string) *[][]byte { //read file and return it as an array of integers diff --git a/day10/10b/stack.go b/day10/10b/stack.go deleted file mode 100644 index 8dca597..0000000 --- a/day10/10b/stack.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -type Stack struct { - head *StackNode -} - -func (s *Stack) Push(item byte) { - if s.head == nil { - s.head = &StackNode{ - char: item, - next: nil, - } - } else { - new := StackNode{ - char: item, - next: s.head, - } - s.head = &new - } -} - -func (s *Stack) Pop() byte { - node := s.Peek() - s.head = node.next - return node.char -} - -func (s *Stack) Peek() (node *StackNode) { - node = s.head - if node == nil { - node = &StackNode{} - } - return -} - -type StackNode struct { - char byte - next *StackNode -} diff --git a/day11/11a/main.go b/day11/11a/main.go index 04a098d..a2a2ded 100644 --- a/day11/11a/main.go +++ b/day11/11a/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -11,7 +12,7 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - octopuses := map[Coordinate]int{} + octopuses := map[shared.Coordinate]int{} answer := 0 @@ -22,12 +23,12 @@ func main() { for y, row := range *content { width = len(row) for x, val := range row { - octopuses[Coordinate{X: x, Y: y}] = val + octopuses[shared.Coordinate{X: x, Y: y}] = val } } for i := 0; i < 100; i++ { - flashers := map[Coordinate]bool{} + flashers := map[shared.Coordinate]bool{} for coord := range octopuses { octopuses[coord]++ @@ -63,49 +64,6 @@ func main() { fmt.Println(answer) } -//Coordinate Class -type Coordinate struct { - X int - Y int -} - -func (c *Coordinate) Neighbours(gridWidth int, gridHeight int, diagonal bool) (out []Coordinate) { - spaceLeft := c.X > 0 - spaceRight := c.X < gridWidth-1 - spaceUp := c.Y > 0 - spaceDown := c.Y < gridHeight-1 - - if spaceLeft { - out = append(out, Coordinate{c.X - 1, c.Y}) - } - if spaceRight { - out = append(out, Coordinate{c.X + 1, c.Y}) - } - if spaceUp { - out = append(out, Coordinate{c.X, c.Y - 1}) - } - if spaceDown { - out = append(out, Coordinate{c.X, c.Y + 1}) - } - - if diagonal { - if spaceUp && spaceLeft { - out = append(out, Coordinate{c.X - 1, c.Y - 1}) - } - if spaceUp && spaceRight { - out = append(out, Coordinate{c.X + 1, c.Y - 1}) - } - if spaceDown && spaceLeft { - out = append(out, Coordinate{c.X - 1, c.Y + 1}) - } - if spaceDown && spaceRight { - out = append(out, Coordinate{c.X + 1, c.Y + 1}) - } - } - - return -} - func returnContent(path string) *[][]int { //read file and return it as an array of integers diff --git a/day11/11b/main.go b/day11/11b/main.go index 439db67..6e25157 100644 --- a/day11/11b/main.go +++ b/day11/11b/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -11,7 +12,7 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - octopuses := map[Coordinate]int{} + octopuses := map[shared.Coordinate]int{} answer := 0 @@ -22,14 +23,14 @@ func main() { for y, row := range *content { width = len(row) for x, val := range row { - octopuses[Coordinate{X: x, Y: y}] = val + octopuses[shared.Coordinate{X: x, Y: y}] = val } } i := 0 for { i++ - flashers := map[Coordinate]bool{} + flashers := map[shared.Coordinate]bool{} for coords, energy := range octopuses { octopuses[coords] = energy + 1 } @@ -61,7 +62,7 @@ func main() { allFlashed := true for y := 0; y < height; y++ { for x := 0; x < width; x++ { - if !flashers[Coordinate{ + if !flashers[shared.Coordinate{ X: x, Y: y, }] { @@ -79,49 +80,6 @@ func main() { fmt.Println(answer) } -//Coordinate Class -type Coordinate struct { - X int - Y int -} - -func (c *Coordinate) Neighbours(gridWidth int, gridHeight int, diagonal bool) (out []Coordinate) { - spaceLeft := c.X > 0 - spaceRight := c.X < gridWidth-1 - spaceUp := c.Y > 0 - spaceDown := c.Y < gridHeight-1 - - if spaceLeft { - out = append(out, Coordinate{c.X - 1, c.Y}) - } - if spaceRight { - out = append(out, Coordinate{c.X + 1, c.Y}) - } - if spaceUp { - out = append(out, Coordinate{c.X, c.Y - 1}) - } - if spaceDown { - out = append(out, Coordinate{c.X, c.Y + 1}) - } - - if diagonal { - if spaceUp && spaceLeft { - out = append(out, Coordinate{c.X - 1, c.Y - 1}) - } - if spaceUp && spaceRight { - out = append(out, Coordinate{c.X + 1, c.Y - 1}) - } - if spaceDown && spaceLeft { - out = append(out, Coordinate{c.X - 1, c.Y + 1}) - } - if spaceDown && spaceRight { - out = append(out, Coordinate{c.X + 1, c.Y + 1}) - } - } - - return -} - func returnContent(path string) *[][]int { //read file and return it as an array of integers diff --git a/day13/13a/main.go b/day13/13a/main.go index 098e046..8cee056 100644 --- a/day13/13a/main.go +++ b/day13/13a/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -12,7 +13,7 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - sheet := make(map[Coordinate]bool) + sheet := make(map[shared.Coordinate]bool) answer := 0 for _, line := range *content { @@ -41,7 +42,7 @@ func main() { x, _ := strconv.Atoi(coordinates[0]) y, _ := strconv.Atoi(coordinates[1]) - sheet[Coordinate{X: x, Y: y}] = true + sheet[shared.Coordinate{X: x, Y: y}] = true } } @@ -54,8 +55,8 @@ func main() { } -func FoldX(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool) { - folded = make(map[Coordinate]bool) +func FoldX(sheet map[shared.Coordinate]bool, foldPoint int) (folded map[shared.Coordinate]bool) { + folded = make(map[shared.Coordinate]bool) for mark := range sheet { x := mark.X if x > foldPoint { @@ -63,13 +64,13 @@ func FoldX(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool x = 2*foldPoint - x } - folded[Coordinate{X: x, Y: mark.Y}] = true + folded[shared.Coordinate{X: x, Y: mark.Y}] = true } return } -func FoldY(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool) { - folded = make(map[Coordinate]bool) +func FoldY(sheet map[shared.Coordinate]bool, foldPoint int) (folded map[shared.Coordinate]bool) { + folded = make(map[shared.Coordinate]bool) for mark := range sheet { y := mark.Y if y > foldPoint { @@ -77,16 +78,11 @@ func FoldY(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool y = 2*foldPoint - y } - folded[Coordinate{X: mark.X, Y: y}] = true + folded[shared.Coordinate{X: mark.X, Y: y}] = true } return } -type Coordinate struct { - X int - Y int -} - func returnContent(path string) *[]string { //read file and return it as an array of integers diff --git a/day13/13b/main.go b/day13/13b/main.go index 63d47e0..2e84697 100644 --- a/day13/13b/main.go +++ b/day13/13b/main.go @@ -1,6 +1,7 @@ package main import ( + "AdventOfCode2021/shared" "bufio" "fmt" "os" @@ -12,7 +13,7 @@ func main() { content := returnContent("../input") //content := returnContent("../testInput") - sheet := make(map[Coordinate]bool) + sheet := make(map[shared.Coordinate]bool) //var answer string for _, line := range *content { @@ -37,14 +38,14 @@ func main() { x, _ := strconv.Atoi(coordinates[0]) y, _ := strconv.Atoi(coordinates[1]) - sheet[Coordinate{X: x, Y: y}] = true + sheet[shared.Coordinate{X: x, Y: y}] = true } } for y := 0; y < 8; y++ { for x := 0; x < 200; x++ { - if sheet[Coordinate{X: x, Y: y}] { + if sheet[shared.Coordinate{X: x, Y: y}] { fmt.Print("#") } else { fmt.Print(" ") @@ -55,8 +56,8 @@ func main() { } -func FoldX(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool) { - folded = make(map[Coordinate]bool) +func FoldX(sheet map[shared.Coordinate]bool, foldPoint int) (folded map[shared.Coordinate]bool) { + folded = make(map[shared.Coordinate]bool) for mark := range sheet { x := mark.X if x > foldPoint { @@ -64,13 +65,13 @@ func FoldX(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool x = 2*foldPoint - x } - folded[Coordinate{X: x, Y: mark.Y}] = true + folded[shared.Coordinate{X: x, Y: mark.Y}] = true } return } -func FoldY(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool) { - folded = make(map[Coordinate]bool) +func FoldY(sheet map[shared.Coordinate]bool, foldPoint int) (folded map[shared.Coordinate]bool) { + folded = make(map[shared.Coordinate]bool) for mark := range sheet { y := mark.Y if y > foldPoint { @@ -78,16 +79,11 @@ func FoldY(sheet map[Coordinate]bool, foldPoint int) (folded map[Coordinate]bool y = 2*foldPoint - y } - folded[Coordinate{X: mark.X, Y: y}] = true + folded[shared.Coordinate{X: mark.X, Y: y}] = true } return } -type Coordinate struct { - X int - Y int -} - func returnContent(path string) *[]string { //read file and return it as an array of integers diff --git a/day16/16a/main.go b/day16/16a/main.go new file mode 100644 index 0000000..d384e18 --- /dev/null +++ b/day16/16a/main.go @@ -0,0 +1,107 @@ +package main + +import ( + "bufio" + "fmt" + "math" + "os" + "strings" +) + +func main() { + content := returnContent("../input") + //content := returnContent("../testInput") + fmt.Println(content) + + startingString := (*content)[0] + pairs := make(map[string]string) + count := make(map[string]int) + + //Create map of pair values + for i := 2; i < len(*content); i++ { + split := strings.Split((*content)[i], " -> ") + pairs[split[0]] = split[1] + } + + //Fill initial list + list := LinkedList{Head: &Node{Value: string(startingString[0]), Next: nil}} + current := list.Head + for i := 1; i < len(startingString); i++ { + node := &Node{Value: string(startingString[i]), Next: nil} + count[string(startingString[i])]++ + current.Next = node + current = node + } + + //Run iterations on list + iterations := 10 + for i := 1; i <= iterations; i++ { + current = list.Head + + for current.Next != nil { + value := pairs[current.Value+current.Next.Value] + list.InsertItem(current, current.Next, value) + count[value]++ + current = current.Next.Next + } + list.PrintList() + } + + //determine min and max + min := math.MaxInt + max := 0 + for _, value := range count { + if value > max { + max = value + } else if value < min { + min = value + } + } + + fmt.Println(max - min) + +} + +type LinkedList struct { + Head *Node +} + +func (l *LinkedList) InsertItem(first *Node, second *Node, value string) { + first.Next = &Node{Value: value, Next: second} +} + +func (l *LinkedList) PrintList() { + list := []string{} + current := l.Head + for current != nil { + list = append(list, current.Value) + current = current.Next + } + fmt.Println(list) +} + +type Node struct { + Value string + Next *Node +} + +func returnContent(path string) *[]string { + //read file and return it as an array of integers + + file, err := os.Open(path) + var content []string + + if err != nil { + fmt.Println("Unlucky, the file didn't open") + return &content + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + content = append(content, scanner.Text()) + } + + return &content +} diff --git a/day16/16b/main.go b/day16/16b/main.go new file mode 100644 index 0000000..42ca8f8 --- /dev/null +++ b/day16/16b/main.go @@ -0,0 +1,107 @@ +package main + +import ( + "bufio" + "fmt" + "math" + "os" + "strings" +) + +func main() { + content := returnContent("../input") + //content := returnContent("../testInput") + fmt.Println(content) + + startingString := (*content)[0] + pairs := make(map[string]string) + count := make(map[string]int) + + //Create map of pair values + for i := 2; i < len(*content); i++ { + split := strings.Split((*content)[i], " -> ") + pairs[split[0]] = split[1] + } + + //Fill initial list + list := LinkedList{Head: &Node{Value: string(startingString[0]), Next: nil}} + current := list.Head + for i := 1; i < len(startingString); i++ { + node := &Node{Value: string(startingString[i]), Next: nil} + count[string(startingString[i])]++ + current.Next = node + current = node + } + + //Run iterations on list + iterations := 40 + for i := 1; i <= iterations; i++ { + current = list.Head + + for current.Next != nil { + value := pairs[current.Value+current.Next.Value] + list.InsertItem(current, current.Next, value) + count[value]++ + current = current.Next.Next + } + fmt.Println(i) + } + + //determine min and max + min := math.MaxInt + max := 0 + for _, value := range count { + if value > max { + max = value + } else if value < min { + min = value + } + } + + fmt.Println(max - min) + +} + +type LinkedList struct { + Head *Node +} + +func (l *LinkedList) InsertItem(first *Node, second *Node, value string) { + first.Next = &Node{Value: value, Next: second} +} + +func (l *LinkedList) PrintList() { + list := []string{} + current := l.Head + for current != nil { + list = append(list, current.Value) + current = current.Next + } + fmt.Println(list) +} + +type Node struct { + Value string + Next *Node +} + +func returnContent(path string) *[]string { + //read file and return it as an array of integers + + file, err := os.Open(path) + var content []string + + if err != nil { + fmt.Println("Unlucky, the file didn't open") + return &content + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + content = append(content, scanner.Text()) + } + + return &content +} diff --git a/day16/input b/day16/input new file mode 100644 index 0000000..5fef7e8 --- /dev/null +++ b/day16/input @@ -0,0 +1,102 @@ +SHHBNFBCKNHCNOSHHVFF + +CK -> N +VP -> B +CF -> S +FO -> V +VC -> S +BV -> V +NP -> P +SN -> C +KN -> V +NF -> P +SB -> C +PC -> B +OB -> V +NS -> O +FH -> S +NK -> S +HO -> V +NV -> O +FV -> O +FB -> S +PS -> S +FN -> K +HS -> O +CB -> K +HV -> P +NH -> C +BO -> B +FF -> N +PO -> F +BB -> N +PN -> C +BP -> C +HN -> K +CO -> P +BF -> H +BC -> S +CV -> B +VV -> F +FS -> B +BN -> P +VK -> S +PV -> V +PP -> B +PH -> N +SS -> O +SK -> S +NC -> P +ON -> F +NB -> N +CC -> N +SF -> H +PF -> H +OV -> O +KH -> C +CP -> V +PK -> O +KC -> K +KK -> C +KF -> B +HP -> C +FK -> H +BH -> K +VN -> H +OO -> S +SC -> K +SP -> B +KO -> V +KV -> F +HK -> N +FP -> N +NN -> B +VS -> O +HC -> K +BK -> N +KS -> K +VB -> O +OH -> F +KB -> F +KP -> H +HB -> N +NO -> N +OF -> O +BS -> H +VO -> H +SH -> O +SV -> K +HF -> C +CS -> F +FC -> N +VH -> H +OP -> K +OK -> H +PB -> K +HH -> S +OC -> V +VF -> B +CH -> K +CN -> C +SO -> P +OS -> O \ No newline at end of file diff --git a/day16/testInput b/day16/testInput new file mode 100644 index 0000000..6c1c3a1 --- /dev/null +++ b/day16/testInput @@ -0,0 +1,18 @@ +NNCB + +CH -> B +HH -> N +CB -> H +NH -> C +HB -> C +HC -> B +HN -> C +NN -> C +BH -> H +NC -> B +NB -> B +BN -> B +BB -> N +BC -> B +CC -> N +CN -> C \ No newline at end of file diff --git a/shared/Board.go b/shared/Board.go new file mode 100644 index 0000000..ffcd414 --- /dev/null +++ b/shared/Board.go @@ -0,0 +1,16 @@ +package shared + +type Board struct { + Values [5][5]BoardValue + Hash map[int]Location +} + +type BoardValue struct { + Value int + Visited bool +} + +type Location struct { + X int + Y int +} diff --git a/shared/Coordinate.go b/shared/Coordinate.go new file mode 100644 index 0000000..19b4c0a --- /dev/null +++ b/shared/Coordinate.go @@ -0,0 +1,43 @@ +package shared + +type Coordinate struct { + X int + Y int +} + +func (c *Coordinate) Neighbours(gridWidth int, gridHeight int, diagonal bool) (out []Coordinate) { + spaceLeft := c.X > 0 + spaceRight := c.X < gridWidth-1 + spaceUp := c.Y > 0 + spaceDown := c.Y < gridHeight-1 + + if spaceLeft { + out = append(out, Coordinate{c.X - 1, c.Y}) + } + if spaceRight { + out = append(out, Coordinate{c.X + 1, c.Y}) + } + if spaceUp { + out = append(out, Coordinate{c.X, c.Y - 1}) + } + if spaceDown { + out = append(out, Coordinate{c.X, c.Y + 1}) + } + + if diagonal { + if spaceUp && spaceLeft { + out = append(out, Coordinate{c.X - 1, c.Y - 1}) + } + if spaceUp && spaceRight { + out = append(out, Coordinate{c.X + 1, c.Y - 1}) + } + if spaceDown && spaceLeft { + out = append(out, Coordinate{c.X - 1, c.Y + 1}) + } + if spaceDown && spaceRight { + out = append(out, Coordinate{c.X + 1, c.Y + 1}) + } + } + + return +} diff --git a/shared/LinkedList.go b/shared/LinkedList.go new file mode 100644 index 0000000..c21a78a --- /dev/null +++ b/shared/LinkedList.go @@ -0,0 +1,21 @@ +package shared + +import "fmt" + +type LinkedList struct { + Head *Node +} + +func (l *LinkedList) InsertItem(first *Node, second *Node, value string) { + first.Next = &Node{Value: value, Next: second} +} + +func (l *LinkedList) PrintList() { + list := []string{} + current := l.Head + for current != nil { + list = append(list, current.Value) + current = current.Next + } + fmt.Println(list) +} diff --git a/shared/Node.go b/shared/Node.go new file mode 100644 index 0000000..44f2e65 --- /dev/null +++ b/shared/Node.go @@ -0,0 +1,6 @@ +package shared + +type Node struct { + Value string + Next *Node +} diff --git a/day10/10b/sort.go b/shared/Sort.go similarity index 84% rename from day10/10b/sort.go rename to shared/Sort.go index d4f857f..0bd28b1 100644 --- a/day10/10b/sort.go +++ b/shared/Sort.go @@ -1,6 +1,6 @@ -package main +package shared -func mergeSort(nums []int, start int, end int) []int { +func MergeSort(nums []int, start int, end int) []int { if start == end { return []int{nums[start]} } @@ -8,8 +8,8 @@ func mergeSort(nums []int, start int, end int) []int { var mid int = ((end - start) / 2) + start //Assign values back into Left and right - left := mergeSort(nums, start, mid) - right := mergeSort(nums, mid+1, end) + left := MergeSort(nums, start, mid) + right := MergeSort(nums, mid+1, end) var combined []int diff --git a/shared/Stack.go b/shared/Stack.go new file mode 100644 index 0000000..8272992 --- /dev/null +++ b/shared/Stack.go @@ -0,0 +1,33 @@ +package shared + +type Stack struct { + head *Node +} + +func (s *Stack) Push(item string) { + if s.head == nil { + s.head = &Node{ + Value: item, + Next: nil, + } + } else { + s.head = &Node{ + Value: item, + Next: s.head, + } + } +} + +func (s *Stack) Pop() string { + node := s.Peek() + s.head = node.Next + return node.Value +} + +func (s *Stack) Peek() (node *Node) { + node = s.head + if node == nil { + node = &Node{} + } + return +}