chore: add day16
This commit is contained in:
parent
e742db7ec9
commit
18bf5a4aef
10
day16/example.txt
Normal file
10
day16/example.txt
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
.|...\....
|
||||||
|
|.-.\.....
|
||||||
|
.....|-...
|
||||||
|
........|.
|
||||||
|
..........
|
||||||
|
.........\
|
||||||
|
..../.\\..
|
||||||
|
.-.-/..|..
|
||||||
|
.|....-|.\
|
||||||
|
..//.|....
|
110
day16/input.txt
Normal file
110
day16/input.txt
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
\.......................\..........................................-..................-.../................-..
|
||||||
|
....../.......\...-......-.|...\..............\.................|............././....-........................
|
||||||
|
...............-...-........................................\......\..-.............|......-....\....-........
|
||||||
|
..\..|.|...........................-.|........................................./.|....|................|......
|
||||||
|
|../................|............................................................\........../..\..............
|
||||||
|
........\............../................/..........................\...\....|............./....-.........\\...
|
||||||
|
.................-...-...................\../........-|.................../......-...........|................
|
||||||
|
........-............/...|-............-.....\.|..............-....-../\../..................\...\././........
|
||||||
|
........................-|................................................................-........-..........
|
||||||
|
-......./.................|.....\.................\.....//............-........./..../....|...................
|
||||||
|
....-.............-........-..........-|.......|...../...\...................\.....................|..........
|
||||||
|
...|...\.........|.................|.....|....-....\.......\./........................-.../..../.....-........
|
||||||
|
....|....-.-..............\.........|.......................-.......-..............\................/.........
|
||||||
|
.....|.\...........-.................-.-........../...\............|...............|...|......./.......|...../
|
||||||
|
.....\.........................-.../..-./...\...................../......\...-.......|.\........-|............
|
||||||
|
............|.....................................-....../....\.............../-...|...\..\................./.
|
||||||
|
......-./|....../............|.........\............-../...-......./.\..\....../......|/...\..................
|
||||||
|
................................|.......|..-..../.............................../.-..................-..-/..|.
|
||||||
|
...............................-......./......................|./...............-............./....../........
|
||||||
|
..................../....................\........\...........................-............/.../..............
|
||||||
|
.|||......../.................|.................../..\............................-......./..|...|/.-.........
|
||||||
|
......-......./\....../.........|....../.......-...............|.\........-............/.../..................
|
||||||
|
.....................-.\/|................//.../.........|.|......\.-..|.........|.........\..................
|
||||||
|
.........................\/.......|.|............................|........|.............................././..
|
||||||
|
.................................|.................\../..|/.................\.................-...-........-/.
|
||||||
|
......................-...-.........../...........................\....\......-..-.......\.-....\....|........
|
||||||
|
......-......../..............\/..................\..|........-..............|...-...../......|...............
|
||||||
|
|.......|.../....|..............//.....................|..........|/......../................|................
|
||||||
|
...|.|..................../|..../.-.......-...........|.....|./....\......-......-................|...........
|
||||||
|
......\/./.|\..../|.|..|..........-....|...........|.-.|...................-.\.....|....................\.....
|
||||||
|
......../.\......................|.....|...........|.........../.......|....|...|.......-......../......\...-.
|
||||||
|
...|...-...||......-..|..-...........|.-.................|.................................-..................
|
||||||
|
..............-.\.-........|......\..........................................\./.\........../.....|...........
|
||||||
|
../\.........|...............|............|.\/.-/.................-....|...-.................-.....|..../.....
|
||||||
|
....................../......../..../-.....\........................\..-.\....|....-.........../-.............
|
||||||
|
.................................|................|.........|................../|.....|....\\............/.\..
|
||||||
|
...///./.....\.................|/.....................\...................-............|................|.....
|
||||||
|
............-...........................--........\................/.............-\................\.....-.../
|
||||||
|
...............\.........../|............................|.....................\...-...\.....................-
|
||||||
|
...\.............|.............|................\............\|...../...|.........................|...........
|
||||||
|
..................|......|..........-.-..............\.........................\..............................
|
||||||
|
....-................../.........../...|................/...............|./.|.../....\..../......./......//...
|
||||||
|
...../....../..............................|...\../..........-..........-........-..//..../...................
|
||||||
|
...............-......|......................|./........./............/..-...........|../.....-........-./....
|
||||||
|
..\.........................|...-.......\.................|..............-........\....-.............-....|...
|
||||||
|
.......|......|....../........\...........|......-........../......-..................../....................\
|
||||||
|
.......................|....-..|........./.|.-...............|..\......\.....-.......\...-/....|/.........\...
|
||||||
|
\......\..-.....................\..........................\................................../...........\...
|
||||||
|
-....-......../............................................................../.\.......|..............|....-..
|
||||||
|
........|......................|.............-....\................................./..\.......|..........-...
|
||||||
|
...-...............|........./......\...../.......|...|...............\.../...\.../......|.....-.\......\.....
|
||||||
|
............./.....|......................|.....................................\...||.................-....|.
|
||||||
|
./.....-................/........|./....-......../......./..............\..................................\..
|
||||||
|
.../..../\........-..........................|.-/.|..\................\\-.......|......./...||.......|........
|
||||||
|
.....-.........................-...............\...........|.............-.\.../.|......-.|......../...-.....-
|
||||||
|
......\....................|...../......................|.../......-..|............|......./.../.........|....
|
||||||
|
...|...........-....................................../.|............./....|..../........./.....\../..........
|
||||||
|
....../.../................\........................\...\....\......\............../|...............\.-.......
|
||||||
|
./....\.../.............|............................-.../............../............/...........\...|........
|
||||||
|
............................|.................|/..........//.........../..-...............|...................
|
||||||
|
.....\......\.................|.....|...\-./...............\................|....../.....-..\........-....-...
|
||||||
|
........................./-........\................./........-/.|....-.......\............-/\......|.\...-...
|
||||||
|
..../../..|.|...............\.......................................-.........................................
|
||||||
|
...........|...................................................-...-......|..................\............../.
|
||||||
|
/....|......................................................................|\.../.......-...........-...|....
|
||||||
|
......|.-.\......-........|.....-..|.\..............-......./......-|.........................-...............
|
||||||
|
............\......................................|........................|.-...............................
|
||||||
|
.........-.........../....\./....../.-...-..//.........../.......\\...........................................
|
||||||
|
........\......../............./...-......\.../..|..|............................../......../..\..............
|
||||||
|
--.........|.....-...|............../...|.......|..............\|............|.........................|.-....
|
||||||
|
-\......./..............-....-....\...|.-........\/.\./............-/...\........|-.........../../...\........
|
||||||
|
.\|\..............-......-.\...-....\..........................\........|...........-......./.............../.
|
||||||
|
..........................|...\..../.../..........\.............-...//...............\..................-.....
|
||||||
|
........./..........................\............|-.....|..-...|......../........-...........................\
|
||||||
|
.......\.../.....\....../.......|..|...............-......................|....-...................-.|........
|
||||||
|
......|.......\.../..............................-..............................|......-.-...................\
|
||||||
|
/.....|.......-............/|.....|-......./..../......-........../..|......../.-..\..../....../...|..........
|
||||||
|
............/..--..........-............\.......\................\........................../../....|.........
|
||||||
|
..|..-................|.|..|................/.......\............-//.......................\..\...............
|
||||||
|
.......................-......-..................|....\................-......\.|....\....|..../../|.-........
|
||||||
|
........................-..................-...........................-..-................-................|.
|
||||||
|
/.\....|.-.................................\..-.....\./.........../-.|..............\..\.....--|/....\........
|
||||||
|
.......-..-../..................\..--|..............|...............|\........|...--................|./.\.....
|
||||||
|
..........|................-.......|..................................................|...................|...
|
||||||
|
-.-..|....-.|........-./...|.-.........\.....\/........-........\........../................./.../........\...
|
||||||
|
..................../...|/......................................../............\.|./../................/\|....
|
||||||
|
...//.........................\....../..............\../.......-..\....|......................................
|
||||||
|
............................./..|./../.........-/..\..........................................................
|
||||||
|
......\.....|..................|..................\.....\.-..\...../............................../...........
|
||||||
|
..........\...........-..........-.....-....\/................../.................................\.....|..\..
|
||||||
|
..../.\...................................\............\...\....|.................|.....................-.....
|
||||||
|
...........-...........................\.......|-../.|....|.....|......................-...../................
|
||||||
|
.......|.........\..............|....\...-......../...........-.....-..-...........-..................\...\.|.
|
||||||
|
...........|.......................|....-..........\............................\.................../.\.......
|
||||||
|
..../.................\.......-..|.................../........................|...............\...........-.|.
|
||||||
|
............./..|.-\..../.....-............-....|..\......|......../............-.........|................\..
|
||||||
|
...................\...\/......\............|......................\....|...................-./-..............
|
||||||
|
..-\...........|.................../.....|....|............................-..|............\.............\....
|
||||||
|
.|.....\....\........|..................\...............|..-/.........|.-/...........-............-...........
|
||||||
|
.....\...../......-............|........./..|............-........................\....-......................
|
||||||
|
......\......../........|..............\...-..-...|.......................................................|...
|
||||||
|
...................|.................................\.....\...........................|../.|.-......-........
|
||||||
|
..................|..............\.....\............|........../....../...............\.........\.............
|
||||||
|
..|...........-..../....\.........--...\................../.............-...-....................-..../....|..
|
||||||
|
.|...\...................|......-...........-\..........\.....|.....|..........|.........|....|-../...........
|
||||||
|
.............\|...................../\...............\....../.......-....\.....................-..............
|
||||||
|
.......//.....................\....\......\......\.........|...................../......../.........\......-..
|
||||||
|
.\./.........-...-./-.\.............../......|................................\|....\...../....-..............
|
||||||
|
.......|......../......../......./.........../...............|............................../..|......../.....
|
||||||
|
............./.........|.....-./.........../....-......./|......-................|............................
|
189
day16/main.go
Normal file
189
day16/main.go
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
_ "embed"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
aoc "go.sour.is/advent-of-code"
|
||||||
|
)
|
||||||
|
|
||||||
|
// var log = aoc.Log
|
||||||
|
|
||||||
|
func main() { aoc.MustResult(aoc.Runner(run)) }
|
||||||
|
|
||||||
|
type result struct {
|
||||||
|
valuePT1 int
|
||||||
|
valuePT2 int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r result) String() string { return fmt.Sprintf("%#v", r) }
|
||||||
|
|
||||||
|
func run(scan *bufio.Scanner) (*result, error) {
|
||||||
|
var m Map
|
||||||
|
|
||||||
|
for scan.Scan() {
|
||||||
|
text := scan.Text()
|
||||||
|
m = append(m, []rune(text))
|
||||||
|
}
|
||||||
|
|
||||||
|
rows := len(m)
|
||||||
|
cols := len(m[0])
|
||||||
|
|
||||||
|
options := make([]int, 2*(rows+cols)+2)
|
||||||
|
i := 0
|
||||||
|
for j:=0; j<=rows-1; j++ {
|
||||||
|
options[i+0] = runCycle(m, ray{[2]int{j, -1}, RT})
|
||||||
|
options[i+1] = runCycle(m, ray{[2]int{j, cols}, LF})
|
||||||
|
i+=2
|
||||||
|
}
|
||||||
|
for j:=0; j<=cols-1; j++ {
|
||||||
|
options[i+0] = runCycle(m, ray{[2]int{-1, j}, DN})
|
||||||
|
options[i+1] = runCycle(m, ray{[2]int{rows, j}, UP})
|
||||||
|
i+=2
|
||||||
|
}
|
||||||
|
|
||||||
|
// fmt.Println(options)
|
||||||
|
return &result{valuePT1: options[0], valuePT2: aoc.Max(options[0], options[1:]...)}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type stack[T any] []T
|
||||||
|
|
||||||
|
func (s *stack[T]) Push(v T) {
|
||||||
|
if s == nil {
|
||||||
|
panic("nil stack")
|
||||||
|
}
|
||||||
|
*s = append(*s, v)
|
||||||
|
}
|
||||||
|
func (s *stack[T]) Pop() T {
|
||||||
|
if s == nil || len(*s) == 0 {
|
||||||
|
panic("empty stack")
|
||||||
|
}
|
||||||
|
defer func() { *s = (*s)[:len(*s)-1] }()
|
||||||
|
return (*s)[len(*s)-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ZERO = [2]int{0, -1}
|
||||||
|
|
||||||
|
UP = [2]int{-1, 0}
|
||||||
|
DN = [2]int{1, 0}
|
||||||
|
LF = [2]int{0, -1}
|
||||||
|
RT = [2]int{0, 1}
|
||||||
|
)
|
||||||
|
|
||||||
|
type ray struct {
|
||||||
|
pos [2]int
|
||||||
|
dir [2]int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ray) next() [2]int {
|
||||||
|
r.pos[0] += r.dir[0]
|
||||||
|
r.pos[1] += r.dir[1]
|
||||||
|
return r.pos
|
||||||
|
}
|
||||||
|
|
||||||
|
type Map [][]rune
|
||||||
|
|
||||||
|
func (m *Map) Get(p [2]int) rune {
|
||||||
|
if p[0] < 0 || p[0] >= len((*m)) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if p[1] < 0 || p[1] >= len((*m)[0]) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return (*m)[p[0]][p[1]]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func runCycle(m Map, r ray) int {
|
||||||
|
current := r
|
||||||
|
|
||||||
|
s := stack[ray]{}
|
||||||
|
s.Push(current)
|
||||||
|
|
||||||
|
energized := make(map[[2]int]bool)
|
||||||
|
// energized[current.pos] = true
|
||||||
|
|
||||||
|
cycle := make(map[[4]int]bool)
|
||||||
|
|
||||||
|
for len(s) > 0 {
|
||||||
|
current = s.Pop()
|
||||||
|
|
||||||
|
r := m.Get(current.next())
|
||||||
|
// fmt.Println("pos", current.pos, current.dir, string(r), len(s))
|
||||||
|
if r == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
energized[current.pos] = true
|
||||||
|
v := [4]int{
|
||||||
|
current.pos[0],
|
||||||
|
current.pos[1],
|
||||||
|
current.dir[0],
|
||||||
|
current.dir[1],
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := cycle[v]; ok {
|
||||||
|
// fmt.Println("cycle")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
cycle[v] = true
|
||||||
|
|
||||||
|
switch r {
|
||||||
|
case '|':
|
||||||
|
switch current.dir {
|
||||||
|
case UP, DN:
|
||||||
|
// pass
|
||||||
|
case LF, RT:
|
||||||
|
current.dir = UP
|
||||||
|
s.Push(ray{current.pos, DN})
|
||||||
|
}
|
||||||
|
case '-':
|
||||||
|
switch current.dir {
|
||||||
|
case LF, RT:
|
||||||
|
// pass
|
||||||
|
case UP, DN:
|
||||||
|
current.dir = LF
|
||||||
|
s.Push(ray{current.pos, RT})
|
||||||
|
}
|
||||||
|
case '/':
|
||||||
|
switch current.dir {
|
||||||
|
case UP:
|
||||||
|
current.dir = RT
|
||||||
|
case DN:
|
||||||
|
current.dir = LF
|
||||||
|
case LF:
|
||||||
|
current.dir = DN
|
||||||
|
case RT:
|
||||||
|
current.dir = UP
|
||||||
|
}
|
||||||
|
case '\\':
|
||||||
|
switch current.dir {
|
||||||
|
case UP:
|
||||||
|
current.dir = LF
|
||||||
|
case DN:
|
||||||
|
current.dir = RT
|
||||||
|
case LF:
|
||||||
|
current.dir = UP
|
||||||
|
case RT:
|
||||||
|
current.dir = DN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.Push(current)
|
||||||
|
}
|
||||||
|
|
||||||
|
// for i := range m {
|
||||||
|
// for j := range m[i] {
|
||||||
|
// if v := energized[[2]int{i,j}]; v {
|
||||||
|
// fmt.Print("#")
|
||||||
|
// } else {
|
||||||
|
// fmt.Print(".")
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// fmt.Println("")
|
||||||
|
// }
|
||||||
|
|
||||||
|
return len(energized)
|
||||||
|
}
|
50
day16/main_test.go
Normal file
50
day16/main_test.go
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
_ "embed"
|
||||||
|
|
||||||
|
"github.com/matryer/is"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed example.txt
|
||||||
|
var example []byte
|
||||||
|
|
||||||
|
//go:embed input.txt
|
||||||
|
var input []byte
|
||||||
|
|
||||||
|
func TestExample(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
scan := bufio.NewScanner(bytes.NewReader(example))
|
||||||
|
|
||||||
|
result, err := run(scan)
|
||||||
|
is.NoErr(err)
|
||||||
|
|
||||||
|
t.Log(result)
|
||||||
|
is.Equal(result.valuePT1, 46)
|
||||||
|
is.Equal(result.valuePT2, 51)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSolution(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
scan := bufio.NewScanner(bytes.NewReader(input))
|
||||||
|
|
||||||
|
result, err := run(scan)
|
||||||
|
is.NoErr(err)
|
||||||
|
|
||||||
|
t.Log(result)
|
||||||
|
|
||||||
|
is.Equal(result.valuePT1, 8098)
|
||||||
|
is.Equal(result.valuePT2, 8335)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStack(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
s := stack[int]{}
|
||||||
|
s.Push(5)
|
||||||
|
is.Equal(s.Pop(), 5)
|
||||||
|
}
|
80
tools_test.go
Normal file
80
tools_test.go
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
package aoc_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/matryer/is"
|
||||||
|
aoc "go.sour.is/advent-of-code"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestReverse(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
is.Equal(aoc.Reverse([]int{1, 2, 3, 4}), []int{4, 3, 2, 1})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLCM(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
is.Equal(aoc.LCM([]int{}...), 0)
|
||||||
|
is.Equal(aoc.LCM(5), 5)
|
||||||
|
is.Equal(aoc.LCM(5, 3), 15)
|
||||||
|
is.Equal(aoc.LCM(5, 3, 2), 30)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadStringToInts(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
is.Equal(aoc.ReadStringToInts([]string{"1", "2", "3"}), []int{1, 2, 3})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRepeat(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
is.Equal(aoc.Repeat(5, 3), []int{5, 5, 5})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPower2(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
is.Equal(aoc.Power2(0), 1)
|
||||||
|
is.Equal(aoc.Power2(1), 2)
|
||||||
|
is.Equal(aoc.Power2(2), 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestABS(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
is.Equal(aoc.ABS(1), 1)
|
||||||
|
is.Equal(aoc.ABS(0), 0)
|
||||||
|
is.Equal(aoc.ABS(-1), 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTranspose(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
is.Equal(
|
||||||
|
aoc.Transpose(
|
||||||
|
[][]int{
|
||||||
|
{1, 1},
|
||||||
|
{0, 0},
|
||||||
|
{1, 1},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
[][]int{
|
||||||
|
{1, 0, 1},
|
||||||
|
{1, 0, 1},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestList(t *testing.T) {
|
||||||
|
is := is.New(t)
|
||||||
|
|
||||||
|
lis := aoc.NewList[int](nil)
|
||||||
|
lis.Add(5, 0)
|
||||||
|
|
||||||
|
a, _ := lis.Head().Value()
|
||||||
|
|
||||||
|
is.Equal(a, 5)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user