|
@@ -6,16 +6,17 @@ import (
|
|
"log"
|
|
"log"
|
|
"os"
|
|
"os"
|
|
"strings"
|
|
"strings"
|
|
|
|
+ "unicode"
|
|
)
|
|
)
|
|
|
|
|
|
-func readInput(file string) [][]string {
|
|
|
|
|
|
+func readInput(file string) map[string][]string {
|
|
content, err := ioutil.ReadFile(file)
|
|
content, err := ioutil.ReadFile(file)
|
|
if err != nil {
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
|
|
lines := strings.Split(string(content), "\n")
|
|
lines := strings.Split(string(content), "\n")
|
|
- var input [][]string
|
|
|
|
|
|
+ input := make(map[string][]string)
|
|
for _, line := range lines {
|
|
for _, line := range lines {
|
|
if line == "" {
|
|
if line == "" {
|
|
continue
|
|
continue
|
|
@@ -26,18 +27,51 @@ func readInput(file string) [][]string {
|
|
log.Fatal("Invalid input")
|
|
log.Fatal("Invalid input")
|
|
}
|
|
}
|
|
|
|
|
|
- input = append(input, []string{points[0], points[1]})
|
|
|
|
- input = append(input, []string{points[1], points[0]})
|
|
|
|
|
|
+ input[points[0]] = append(input[points[0]], points[1])
|
|
|
|
+ input[points[1]] = append(input[points[1]], points[0])
|
|
}
|
|
}
|
|
|
|
|
|
return input
|
|
return input
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+var paths [][]string
|
|
|
|
+
|
|
|
|
+func findAllPaths(start string, end string, visited map[string]bool, input map[string][]string, localPath []string) {
|
|
|
|
+ if start == end {
|
|
|
|
+ paths = append(paths, localPath)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if unicode.IsLower(rune(start[0])) {
|
|
|
|
+ visited[start] = true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, next := range input[start] {
|
|
|
|
+ if !visited[next] {
|
|
|
|
+ localPath = append(localPath, next)
|
|
|
|
+ findAllPaths(next, end, visited, input, localPath)
|
|
|
|
+ localPath = localPath[:len(localPath)-1]
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if visited[start] {
|
|
|
|
+ visited[start] = false
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func part1(input map[string][]string) int {
|
|
|
|
+ visited := make(map[string]bool)
|
|
|
|
+ localPath := []string{"start"}
|
|
|
|
+ findAllPaths("start", "end", visited, input, localPath)
|
|
|
|
+
|
|
|
|
+ return len(paths)
|
|
|
|
+}
|
|
|
|
+
|
|
func main() {
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
if len(os.Args) < 2 {
|
|
log.Fatal("Please provide a file name as argument")
|
|
log.Fatal("Please provide a file name as argument")
|
|
}
|
|
}
|
|
|
|
|
|
input := readInput(os.Args[1])
|
|
input := readInput(os.Args[1])
|
|
- fmt.Println(input)
|
|
|
|
|
|
+ fmt.Println("Part 1:", part1(input))
|
|
}
|
|
}
|