Day 12
This commit is contained in:
parent
e47b886324
commit
333a4c9675
|
@ -0,0 +1,22 @@
|
|||
zi-end
|
||||
XR-start
|
||||
zk-zi
|
||||
TS-zk
|
||||
zw-vl
|
||||
zk-zw
|
||||
end-po
|
||||
ws-zw
|
||||
TS-ws
|
||||
po-TS
|
||||
po-YH
|
||||
po-xk
|
||||
zi-ws
|
||||
zk-end
|
||||
zi-XR
|
||||
XR-zk
|
||||
vl-TS
|
||||
start-zw
|
||||
vl-start
|
||||
XR-zw
|
||||
XR-vl
|
||||
XR-ws
|
|
@ -0,0 +1,59 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/thoas/go-funk"
|
||||
)
|
||||
|
||||
func main() {
|
||||
inputBytes, _ := os.ReadFile("input.txt")
|
||||
input := strings.Split(string(inputBytes), "\n")
|
||||
|
||||
log.Println("Puzzle 1:", puzzle1(input))
|
||||
log.Println("Puzzle 2:", puzzle2(input))
|
||||
}
|
||||
|
||||
func puzzle1(input []string) int {
|
||||
return do(input, false)
|
||||
}
|
||||
|
||||
func puzzle2(input []string) int {
|
||||
return do(input, true)
|
||||
}
|
||||
|
||||
func do(input []string, puzzle2 bool) int {
|
||||
connections := map[string][]string{}
|
||||
// Read input
|
||||
for _, line := range input {
|
||||
split := strings.Split(line, "-")
|
||||
connections[split[0]] = append(connections[split[0]], split[1])
|
||||
connections[split[1]] = append(connections[split[1]], split[0])
|
||||
}
|
||||
// Find all routes from start to end
|
||||
return len(route(puzzle2, connections, []string{"start"}, false))
|
||||
}
|
||||
|
||||
func route(puzzle2 bool, connections map[string][]string, visited []string, smallTwice bool) (routes [][]string) {
|
||||
// Find all routes from last visited to end
|
||||
for _, next := range connections[visited[len(visited)-1]] {
|
||||
// Check if next is end
|
||||
if next == "end" {
|
||||
routes = append(routes, append(visited, next))
|
||||
continue
|
||||
}
|
||||
// Can visit a single small cave twice, but all remaining caves once
|
||||
if next[0] >= 'a' && next[0] <= 'z' && funk.ContainsString(visited, next) {
|
||||
if next != "start" && puzzle2 && !smallTwice {
|
||||
routes = append(routes, route(puzzle2, connections, append(visited, next), true)...)
|
||||
}
|
||||
continue
|
||||
}
|
||||
// Check next possible routes
|
||||
routes = append(routes, route(puzzle2, connections, append(visited, next), smallTwice)...)
|
||||
}
|
||||
// Return all found routes
|
||||
return routes
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func Test(t *testing.T) {
|
||||
// Test 1
|
||||
|
||||
inputBytes, _ := os.ReadFile("test1.txt")
|
||||
input := strings.Split(string(inputBytes), "\n")
|
||||
|
||||
assert.Equal(t, 10, puzzle1(input))
|
||||
assert.Equal(t, 36, puzzle2(input))
|
||||
|
||||
// Test 2
|
||||
|
||||
inputBytes, _ = os.ReadFile("test2.txt")
|
||||
input = strings.Split(string(inputBytes), "\n")
|
||||
|
||||
assert.Equal(t, 19, puzzle1(input))
|
||||
assert.Equal(t, 103, puzzle2(input))
|
||||
|
||||
// Test 3
|
||||
|
||||
inputBytes, _ = os.ReadFile("test3.txt")
|
||||
input = strings.Split(string(inputBytes), "\n")
|
||||
|
||||
assert.Equal(t, 226, puzzle1(input))
|
||||
assert.Equal(t, 3509, puzzle2(input))
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
start-A
|
||||
start-b
|
||||
A-c
|
||||
A-b
|
||||
b-d
|
||||
A-end
|
||||
b-end
|
|
@ -0,0 +1,10 @@
|
|||
dc-end
|
||||
HN-start
|
||||
start-kj
|
||||
dc-start
|
||||
dc-HN
|
||||
LN-dc
|
||||
HN-end
|
||||
kj-sa
|
||||
kj-HN
|
||||
kj-dc
|
|
@ -0,0 +1,18 @@
|
|||
fs-end
|
||||
he-DX
|
||||
fs-he
|
||||
start-DX
|
||||
pj-DX
|
||||
end-zg
|
||||
zg-sl
|
||||
zg-pj
|
||||
pj-he
|
||||
RW-he
|
||||
fs-DX
|
||||
pj-RW
|
||||
zg-RW
|
||||
start-pj
|
||||
he-WI
|
||||
zg-he
|
||||
pj-fs
|
||||
start-RW
|
Reference in New Issue