d12
This commit is contained in:
parent
b196009d5a
commit
3656193dfa
5 changed files with 109 additions and 0 deletions
65
d12/common.go
Normal file
65
d12/common.go
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
package d12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type caveMap map[string][]string
|
||||||
|
|
||||||
|
func getLines(in string) []string {
|
||||||
|
return strings.Split(strings.TrimSpace(in), "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPairs(lines []string) [][]string {
|
||||||
|
pairs := [][]string{}
|
||||||
|
|
||||||
|
for _, line := range lines {
|
||||||
|
pairs = append(pairs, strings.Split(line, "-"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return pairs
|
||||||
|
}
|
||||||
|
|
||||||
|
func createMap(paths [][]string) caveMap {
|
||||||
|
caveMap := make(map[string][]string)
|
||||||
|
|
||||||
|
for _, path := range paths {
|
||||||
|
left := path[0]
|
||||||
|
right := path[1]
|
||||||
|
|
||||||
|
caveMap[left] = append(caveMap[left], right)
|
||||||
|
caveMap[right] = append(caveMap[right], left)
|
||||||
|
}
|
||||||
|
|
||||||
|
return caveMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func countPaths(caveMap caveMap, key string, visited map[string]int, duplicate bool) int {
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
if key == "end" {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if visited[key] > 0 {
|
||||||
|
if key == "start" {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.ToUpper(key) != key {
|
||||||
|
if duplicate {
|
||||||
|
return 0
|
||||||
|
} else {
|
||||||
|
duplicate = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[key]++
|
||||||
|
for _, path := range caveMap[key] {
|
||||||
|
count += countPaths(caveMap, path, visited, duplicate)
|
||||||
|
}
|
||||||
|
visited[key]--
|
||||||
|
|
||||||
|
return count
|
||||||
|
}
|
31
d12/d12_test.go
Normal file
31
d12/d12_test.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package d12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestP1(t *testing.T) {
|
||||||
|
in := `start-A
|
||||||
|
start-b
|
||||||
|
A-c
|
||||||
|
A-b
|
||||||
|
b-d
|
||||||
|
A-end
|
||||||
|
b-end`
|
||||||
|
|
||||||
|
assert.EqualValues(t, 10, P1(in))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestP2(t *testing.T) {
|
||||||
|
in := `start-A
|
||||||
|
start-b
|
||||||
|
A-c
|
||||||
|
A-b
|
||||||
|
b-d
|
||||||
|
A-end
|
||||||
|
b-end`
|
||||||
|
|
||||||
|
assert.EqualValues(t, 36, P2(in))
|
||||||
|
}
|
5
d12/p1.go
Normal file
5
d12/p1.go
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package d12
|
||||||
|
|
||||||
|
func P1(input string) int {
|
||||||
|
return countPaths(createMap(getPairs(getLines(input))), "start", make(map[string]int), true)
|
||||||
|
}
|
5
d12/p2.go
Normal file
5
d12/p2.go
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package d12
|
||||||
|
|
||||||
|
func P2(input string) int {
|
||||||
|
return countPaths(createMap(getPairs(getLines(input))), "start", make(map[string]int), false)
|
||||||
|
}
|
3
main.go
3
main.go
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/fotonmoton/aoc2021/d1"
|
"github.com/fotonmoton/aoc2021/d1"
|
||||||
"github.com/fotonmoton/aoc2021/d10"
|
"github.com/fotonmoton/aoc2021/d10"
|
||||||
"github.com/fotonmoton/aoc2021/d11"
|
"github.com/fotonmoton/aoc2021/d11"
|
||||||
|
"github.com/fotonmoton/aoc2021/d12"
|
||||||
"github.com/fotonmoton/aoc2021/d2"
|
"github.com/fotonmoton/aoc2021/d2"
|
||||||
"github.com/fotonmoton/aoc2021/d3"
|
"github.com/fotonmoton/aoc2021/d3"
|
||||||
"github.com/fotonmoton/aoc2021/d4"
|
"github.com/fotonmoton/aoc2021/d4"
|
||||||
|
@ -52,4 +53,6 @@ func main() {
|
||||||
fmt.Printf("day 10 part 2: %v\n", d10.P2(client.Day(10)))
|
fmt.Printf("day 10 part 2: %v\n", d10.P2(client.Day(10)))
|
||||||
fmt.Printf("day 11: %v\n", d11.P1(client.Day(11)))
|
fmt.Printf("day 11: %v\n", d11.P1(client.Day(11)))
|
||||||
fmt.Printf("day 11 part 2: %v\n", d11.P2(client.Day(11)))
|
fmt.Printf("day 11 part 2: %v\n", d11.P2(client.Day(11)))
|
||||||
|
fmt.Printf("day 12: %v\n", d12.P1(client.Day(12)))
|
||||||
|
fmt.Printf("day 12 part 2: %v\n", d12.P2(client.Day(12)))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue