diff --git a/day14/day 14a/go.mod b/day14/day 14a/go.mod new file mode 100644 index 0000000..e938e2e --- /dev/null +++ b/day14/day 14a/go.mod @@ -0,0 +1,3 @@ +module PWD + +go 1.17 diff --git a/day14/day 14a/main.go b/day14/day 14a/main.go new file mode 100644 index 0000000..5bc969f --- /dev/null +++ b/day14/day 14a/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/day14/day 14a/testInput b/day14/day 14a/testInput new file mode 100644 index 0000000..6c1c3a1 --- /dev/null +++ b/day14/day 14a/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/day14/input b/day14/input new file mode 100644 index 0000000..5fef7e8 --- /dev/null +++ b/day14/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