2021-12-13 20:32:09 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
content := returnContent("../input")
|
2021-12-16 19:55:49 +00:00
|
|
|
//content := returnContent("../testInput")
|
2021-12-13 20:32:09 +00:00
|
|
|
|
|
|
|
findEnd("", "start", *content, []string{"start"})
|
|
|
|
fmt.Println(counter)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//Cave Class
|
|
|
|
type Cave struct {
|
|
|
|
name string
|
|
|
|
next []string
|
|
|
|
isBig bool
|
|
|
|
}
|
|
|
|
|
|
|
|
var counter = 0
|
|
|
|
|
|
|
|
func findEnd(path string, cave string, caves map[string]*Cave, visited []string) {
|
|
|
|
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))
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
findEnd(path+","+cave, c, caves, visited)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
target.next = append(target.next, to)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|