From 32e42d1f51c48f87d1a67dba961d416b21ce8255 Mon Sep 17 00:00:00 2001 From: Luke Else Date: Mon, 13 Dec 2021 20:37:33 +0000 Subject: [PATCH] day 12b complete bit of a cheat day here to try and catch up. Tired from exams and so have very little motivation at the moment --- day12/day 12b/go.mod | 3 ++ day12/day 12b/main.go | 93 +++++++++++++++++++++++++++++++++++++++++ day12/day 12b/testInput | 10 +++++ 3 files changed, 106 insertions(+) create mode 100644 day12/day 12b/go.mod create mode 100644 day12/day 12b/main.go create mode 100644 day12/day 12b/testInput diff --git a/day12/day 12b/go.mod b/day12/day 12b/go.mod new file mode 100644 index 0000000..e938e2e --- /dev/null +++ b/day12/day 12b/go.mod @@ -0,0 +1,3 @@ +module PWD + +go 1.17 diff --git a/day12/day 12b/main.go b/day12/day 12b/main.go new file mode 100644 index 0000000..1a160de --- /dev/null +++ b/day12/day 12b/main.go @@ -0,0 +1,93 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +func main() { + content := returnContent("../input") + //content := returnContent("testInput") + + findEnd("", "start", *content, []string{"start"}, true) + fmt.Println(counter) + +} + +//Cave Class +type Cave struct { + name string + next []string + isBig bool + isEdge bool +} + +var counter = 0 + +func findEnd(path string, cave string, caves map[string]*Cave, visited []string, oneSmall bool) { + if cave == "end" { + // fmt.Println(path + "," + "end") + counter++ + return + } + for _, c := range (*caves[cave]).next { + if !caves[c].isBig { + if isIn, _ := isInSlice(c, visited); !isIn { + findEnd(path+","+cave, c, caves, append(visited, c), oneSmall) + } else if oneSmall && !caves[c].isEdge { + findEnd(path+","+cave, c, caves, visited, false) + } + } else { + findEnd(path+","+cave, c, caves, visited, oneSmall) + } + } +} + +func isInSlice(target string, slice []string) (bool, int) { + for i, s := range slice { + if s == target { + return true, i + } + } + return false, 0 +} + +func returnContent(path string) *map[string]*Cave { + //read file and return it as an array of integers + + file, err := os.Open(path) + content := make(map[string]*Cave) + + if err != nil { + fmt.Println("Unlucky, the file didn't open") + return &content + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + line := strings.Split(scanner.Text(), "-") + from, to := line[0], line[1] + parseCave(from, to, content) + parseCave(to, from, content) + } + + return &content +} + +func parseCave(cave string, to string, caves map[string]*Cave) { + if target, ok := caves[cave]; !ok { + caves[cave] = &Cave{ + name: cave, + next: []string{to}, + isBig: strings.ToUpper(cave) == cave, + isEdge: cave == "start", + } + } else { + target.next = append(target.next, to) + } + +} diff --git a/day12/day 12b/testInput b/day12/day 12b/testInput new file mode 100644 index 0000000..ef30b81 --- /dev/null +++ b/day12/day 12b/testInput @@ -0,0 +1,10 @@ +dc-end +HN-start +start-kj +dc-start +dc-HN +LN-dc +HN-end +kj-sa +kj-HN +kj-dc \ No newline at end of file