New Shared Library
This commit is contained in:
		@@ -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
 | 
			
		||||
}
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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++
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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++
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
				}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										107
									
								
								day16/16a/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								day16/16a/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										107
									
								
								day16/16b/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								day16/16b/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										102
									
								
								day16/input
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								day16/input
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										18
									
								
								day16/testInput
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								day16/testInput
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										16
									
								
								shared/Board.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								shared/Board.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								shared/Coordinate.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								shared/Coordinate.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								shared/LinkedList.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								shared/LinkedList.go
									
									
									
									
									
										Normal file
									
								
							@@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								shared/Node.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								shared/Node.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
package shared
 | 
			
		||||
 | 
			
		||||
type Node struct {
 | 
			
		||||
	Value string
 | 
			
		||||
	Next  *Node
 | 
			
		||||
}
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										33
									
								
								shared/Stack.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								shared/Stack.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user