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