Compare commits
49 Commits
c53e7db1ea
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| bcd7daea9e | |||
| 9c2e2c68dd | |||
|
|
90083f28e5 | ||
|
|
7f6c31c003 | ||
|
|
015607cde3 | ||
| 358249e78a | |||
| d730d3c444 | |||
| 759b9c9544 | |||
|
|
a529516bab | ||
|
|
ba588cbc77 | ||
|
|
225d74acf9 | ||
| 3e69c5b463 | |||
| 6ab021face | |||
| 1ee00e8d45 | |||
| 952def48a0 | |||
| 08b38c2bd3 | |||
| 29387606b0 | |||
|
|
4619bc7775 | ||
|
|
305ce52a98 | ||
|
|
a5b1227979 | ||
|
|
53557adddb | ||
|
|
5b8676f6e0 | ||
|
|
ee128f3aa8 | ||
|
|
d93049c434 | ||
|
|
507cb1a907 | ||
|
|
a64c3ef3c4 | ||
|
|
2c9b7766e3 | ||
|
|
ae293fe5a2 | ||
|
|
c1c89faef8 | ||
| b1a4969f6d | |||
|
|
e2ab6dce9a | ||
| f8c29be7ef | |||
| 19c4afdc98 | |||
|
|
616618c7e2 | ||
|
|
360ae5edbd | ||
|
|
88938a8627 | ||
| 235999524b | |||
|
|
f6f5a10270 | ||
| 8f4649e0aa | |||
| e0b4f292c2 | |||
|
|
8f5cb6b236 | ||
|
|
c133fe757c | ||
| ab9bdc63b1 | |||
| 0034691f2a | |||
| 2584df5496 | |||
| 6753ed26ca | |||
| e9a6c5178a | |||
| 3948cbaa8c | |||
| 84e8207917 |
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
2024
|
||||||
|
2023/*
|
||||||
|
|
||||||
103
2022/go/day12/day12.go
Normal file
103
2022/go/day12/day12.go
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
package day12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
"adventofcode2022/utils/grid2d"
|
||||||
|
)
|
||||||
|
|
||||||
|
type cell struct {
|
||||||
|
height int
|
||||||
|
distance int
|
||||||
|
}
|
||||||
|
|
||||||
|
type coord struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
startCoord, grid := parseInput(input)
|
||||||
|
fillGrid(grid)
|
||||||
|
printGrid(grid)
|
||||||
|
c := grid.Get(startCoord.x, startCoord.y)
|
||||||
|
return c.distance
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
_, grid := parseInput(input)
|
||||||
|
fillGrid(grid)
|
||||||
|
min := utils.MaxInt
|
||||||
|
for j := 0; j < grid.SizeY(); j++ {
|
||||||
|
for i := 0; i < grid.SizeX(); i++ {
|
||||||
|
c1 := grid.Get(i, j)
|
||||||
|
if c1.height == 0 {
|
||||||
|
min = utils.Min(min, c1.distance)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) (coord, *grid2d.Grid[*cell]) {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
grid := grid2d.NewGrid[*cell](len(lines[0]), len(lines), nil)
|
||||||
|
startCoord := coord{-1, -1}
|
||||||
|
for j, line := range lines {
|
||||||
|
for i, c := range line {
|
||||||
|
newCell := &cell{height: int(c - 'a'), distance: utils.MaxInt}
|
||||||
|
if c == 'S' {
|
||||||
|
newCell.height = 0
|
||||||
|
startCoord.x = i
|
||||||
|
startCoord.y = j
|
||||||
|
} else if c == 'E' {
|
||||||
|
newCell.height = 25
|
||||||
|
newCell.distance = 0
|
||||||
|
}
|
||||||
|
grid.Set(i, j, newCell)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return startCoord, grid
|
||||||
|
}
|
||||||
|
|
||||||
|
func fillGrid(grid *grid2d.Grid[*cell]) {
|
||||||
|
done := false
|
||||||
|
for !done {
|
||||||
|
done = true
|
||||||
|
for j := 0; j < grid.SizeY(); j++ {
|
||||||
|
for i := 0; i < grid.SizeX(); i++ {
|
||||||
|
c1 := grid.Get(i, j)
|
||||||
|
if c1.distance == utils.MaxInt {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
moves := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
|
||||||
|
for _, move := range moves {
|
||||||
|
x2 := i + move[0]
|
||||||
|
y2 := j + move[1]
|
||||||
|
c2 := grid.Get(x2, y2)
|
||||||
|
if c2 == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if c2.height < c1.height-1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if c2.distance > c1.distance+1 {
|
||||||
|
c2.distance = c1.distance + 1
|
||||||
|
done = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func printGrid(grid *grid2d.Grid[*cell]) {
|
||||||
|
r := grid.StringWithFormatter(func(c *cell, i, j int) string {
|
||||||
|
if c.distance == utils.MaxInt {
|
||||||
|
return "?? "
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%02d ", c.distance)
|
||||||
|
})
|
||||||
|
fmt.Println(r)
|
||||||
|
}
|
||||||
27
2022/go/day12/day12_test.go
Normal file
27
2022/go/day12/day12_test.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package day12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`Sabqponm
|
||||||
|
abcryxxl
|
||||||
|
accszExk
|
||||||
|
acctuvwj
|
||||||
|
abdefghi`)
|
||||||
|
require.Equal(t, 31, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`Sabqponm
|
||||||
|
abcryxxl
|
||||||
|
accszExk
|
||||||
|
acctuvwj
|
||||||
|
abdefghi`)
|
||||||
|
require.Equal(t, 29, r)
|
||||||
|
}
|
||||||
41
2022/go/day12/input.txt
Normal file
41
2022/go/day12/input.txt
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
abccccaaaaaaaaaaaaaccaaaaaaaacccccccccaaaaaaaaccccccccaaacaaacccccccaaaaaaccccccccccccccccccccccaaaacccccccccccacccccccccccccccccccccccccccccccccccccccccccccccaaaa
|
||||||
|
abccccaaaaacaaaaaaccccaaaaaaccccccccccaaaaaaacccccccccaaaaaaacccccaaaaaaaaaacccccccccccccccccccaaaaaacccccccccaaaaaaaaccccccccccccccccccccccccccccccccccccccccaaaaa
|
||||||
|
abcccaaaaaccaaaaaaccccaaaaaaccccccaacccaaaaaacccccccccaaaaaacccaaaaaaaaaaaaaaacaaccacccccccccccaaaaaaccccccccccaaaaaacccccccccccccccccccccccccccccccccccccccccaaaaa
|
||||||
|
abccccccaaccaaaaaaccaaaaaaaaccccccaaacaaaacaaacccccccaaaaaaaaccaaaaaaaaaaaaaaacaaaaacccccccccccccaaccccccccccccaaaaaaccccccccccccccccccccccccccccacccccccccccaaaaaa
|
||||||
|
abccccccccccaaccaaccaaaaccaacccccccaaaaaaaccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccaaaaccccccccccccccccaaaaaaaacccccccccccccccccccccccccccaaccccccccccccccaa
|
||||||
|
abcccccccaaaaacccaaaaaaaacccaaccccaaaaaaccccccccccccaaaaaaaaaaaaaaaacaaaaaaaccaaaaaaccccccaaaaaccccccccccccccaaaaaaaaaaccaccccccccccccccccccccccccaccccccccccccccca
|
||||||
|
abcccccccaaaaacccaaaaaaaaccaaaaccaaaaaaaaccccccccccccccaaacaaaaaaaaacaaaaaacccccaaaacccccaaaaaaccccccccccccccaaaaaaaaaaaaacccccccccccccccllllllccccdccccccccccccccc
|
||||||
|
abccccccaaaaaacccccaaaaccccaaaaacaaaaaaaaccccccccccccccaaacccccaaaccccaaaaaacccaaccccccccaaaaaacccccccccccccccccaaaaaaaaaacccccccccccccklllllllllcddddccaccaaaccccc
|
||||||
|
abccccccaaaaaacccccaaaaaaaaaaaaaaaccaaccccccaacaacccccccaaccccccccccccaaacaacccccccccccccaaaaaacccccccccccccccccaaaaaaaaaacccccccccccckklllppllllcddddddddaaaaccccc
|
||||||
|
abccccccaaaaaaccccaaacaaaaaaaaaaaaccaaccccccaaaaaccccccccccccccccccccccccccccccccccccccccccaaccccccaaccccccccccccaacaaaaaaaccccccccccckklpppppplllmdddddddddacccccc
|
||||||
|
abccccccccaaacccccaacccaccaaaaaaccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaccccccccccccaaaaaaaaaaccccccccckkkkppppppplmmmmmmddddddaacccc
|
||||||
|
abccccaaacaaacccccccccccccaaaaaaccccccccccccaaaaaacccccccccccccccccaaaccccccccccccccccccccccccccccaaaaccccccccccccaaaaaaaaaaccccccccckkkppppuppppmmmmmmmmddeeeacccc
|
||||||
|
abccccaaaaaaacccccccccccccaaaaaacccaccccccccaaaaaacccccccccccccccccaaaacccccccccccccccccccccaaacccaaaacccccccccccaaaacaaaccccccccccckkkpppuuuuuppqqmmmmmmmmeeeacccc
|
||||||
|
abcccccaaaaaaccccccccccccaaaaaaaacaaccccccccccaaaccccccccccccccccccaaaaccccccccccccccccccccaaaaccccccccccccccccccaaaaaaaacccccccccckkkkpppuuuuupqqqqqqqmmmmeeeccccc
|
||||||
|
abcccccaaaaaaaacccccccccccaccccaaaaacccccccccccccccccccccccccccccccaaaccccccccccccccaaaccccaaaacccccccccccccaaccaaaaaaaaccccccccckkkkkrrpuuuxuuuqqqqqqqqmmmmeeccccc
|
||||||
|
abccccaaaaaaaaaccccccccccccccaaaaaacccccccacaacccccccccccccccccccccccccccccccccccccaaaaaacccaaaccccccccccaaaaccaaaaaaacccccccccckkkkrrrrruuuxxuvvvvvvqqqqnnneeccccc
|
||||||
|
abcccaaaaaaaaaaccccccccccccccaaaaaaaacccccaaaaacccccccccccccccaaaaaccccccccccccccccaaaaaaccccccccccccccccaaaaaaaaaaaaacccccccccjjjkrrrrruuuxxxxvvvvvvvqqqnnneeccccc
|
||||||
|
abcaaaaacaaacccccccccccccccccaaaaaaaacccccaaaaaccaacccccccccccaaaaaccccccccccccccccaaaaaccccccccccccccccccaaaaaccaaaaaacccccccjjjrrrrruuuuuxxxyvyyyvvvqqqnneeeccccc
|
||||||
|
abcaaaaacaaaccaaccccccccccccccccaacccccccaaaaaaaaaaaccccccccccaaaaaaccccccccccccccccaaaaaccccccccccccccccaaaaacccaaaaaaaacaaacjjjrrrtttuuxxxxxyyyyyvvvqqnnneeeccccc
|
||||||
|
abaaaaaccaacccaaaccaacccaaccccccaccccccccaaaaaaaaaacccccccccccaaaaaaccccccccccccccccaacaacccccccccccccccccccaacccaaccccaaaaaacjjjrrrtttxxxxxxxyyyyyvvvrrnnneeeccccc
|
||||||
|
SbaaaaacccccccaaaaaaaccaaaacccccccccccccccaaaaaaaaacccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccccccaacccaaaaaacjjjrrrtttxxxEzzzzyyyvvvrrnnneeecccccc
|
||||||
|
abcaaaaacccccccaaaaaaccaaaacccccccccccccccaaaaaaaaacccccccccccccaaccccccccccccccccccccccccccccaaccccccccccaaccccacaaaacaaaaaaajjjrrrtttxxxxxyyyyyvvvrrrnnnfffcccccc
|
||||||
|
abcaacccccccaaaaaaaacccaaaaccccccccccccccccaaaaaaaaaaccccccccccccccccccccccccccccccccccccccaaaaaccccccccccaaccccaaaaaaaaaaaaaajjjqqqttttxxxxyyyyyyvvrrrnnnfffcccccc
|
||||||
|
abccccccccccaaaaaaaaaccccccccccccccccccccaaaaaaaaaaaaacccccccccccccccccaacccccccccccccccccccaaaaaccccccaacaaaaaccaaaacaaaaaaaacjjjqqqqttttxxyywyyyywvrrnnnfffcccccc
|
||||||
|
abccccccccccaaaaaaaaaacccccccccccccccccccaaaaaaaaacaaacccccccccccccaaacaacccccccccccccccccccaaaaaccccccaaaaaaaaccaaaaccccaaacccjjjjqqqqtttxwywwwyywwwrrnnnfffcccccc
|
||||||
|
abcccccccccccccaaaaaaacccccccccccccccccccaaaaaaaaaaaaaaaacccccccccccaaaaaccccccccccccccccccaaaaacccaaccccaaaaccccaacaacccaaaccccjjjiqqqtttwwywwwwwwwwrrroofffcccccc
|
||||||
|
abcccccccccccccaaaccccccccccccccccccccccaaaaaaaaaaaaaaaaaccccccccccccaaaaaacccccccccccccccccccaaacaaaccccaaaaaccccccccccccccccccciiiiqqqttwwwwwswwwwrrrroofffcccccc
|
||||||
|
abcccccccccccccaaccccccccccccaaaacccccccaaaaaaaaccaaaaacccccccccccccaaaaaaacccccccccccccccccccaaaaaaacccaaacaacccccaaaaacccccccccciiiqqqttwwwwsssssrrrrroofffaccccc
|
||||||
|
abcccccccccccccccccccccccccccaaaaccccccccacaaacccaaaaaaccccccaaccccaaaaaaccccccccaacaaccccccccaaaaaaccccaaaacacccccaaaaacccccccccciiiqqqtsswsssssssrrrrooofffaccccc
|
||||||
|
abcccccccccccccccccccccccccccaaaaccccccccccaaaccaaaaaaaccccccaaaaccaacaaaccccccccaaaaacccccccccaaaaaaaaccaaacacccccaaaaaacccccccccciiqqqssssssspposrrroooofffaccccc
|
||||||
|
abccccaaacccccccccccccccccccccaaacccccccccccccccaaacaaaccccaaaaaacccccaaaccccccccaaaaaacccccccaaaaaaaaaaaaaaaaaccccaaaaaaccccccaccciiiqqpsssssppppooooooogffaaccccc
|
||||||
|
abccccaaaaaacccaaaccccccccccccccccccccccccccccccccccccaccccaaaaacccccccccccccccccaaaaaaccccccaaaaaaaaaaaaaaaaaaccccaaaaaacccaaaaccciiiqqppppppppppoooooogggfaaacccc
|
||||||
|
abcccaaaaaaacccaaaccccccccccccccccccccccccccccccccccccccccccaaaaaccccccccccccccccaaaaaaccccccaaacaaaccccaaaaaacccccccaacccccaaaaaacciiipppppppphgggggggggggaaaacccc
|
||||||
|
abccaaaaaaaacccaaacaaacccccccccccccccccccccaacccccccccccccccaacaacccccaacccccccccccaaacccccccccccaaacccccaaaaacccccccccccccccaaaaacciiihppppphhhhgggggggggaaccccccc
|
||||||
|
abccaaaaaaacaaaaaaaaaacccccccccccccccccccccaaaccccccacccccccccccccccccaaccccccccccccccccccccccccaaaaccccaaaaaaccccccccccccccaaaaacccciihhhhhhhhhhgggggggccaaccccccc
|
||||||
|
abccccaaaaaaaaaaaaaaacccccccccccccccccccaaaaaaaaccccaaacaaaccccccccccaaaaccaaccccccccaacaacccccaaaaaaacccaacccccccccccccccccaacaaccccchhhhhhhhhaaaacccccccccccccccc
|
||||||
|
abccccaaaaaacaaaaaaaccccccccccccccccccccaaaaaaaaccccaaaaaaaccccccccccaaaaaaaacaccccccaaaaaccccccaaaaacccccccccccccccccccccccccccccccccchhhhhhacaaaaaccccccccccccccc
|
||||||
|
abccccaaccccccaaaaaacccccccccccccaaccccccaaaaaacccccaaaaaaccccccaaaaaaaaaaaaaaaccccccaaaaaacccaaaaaaacccccccccccccccccccccccccccccccccccccaaaaccaaacccccccccccaaaca
|
||||||
|
abccccccccccccaaaaaaaccccccccccccaaccccccaaaaaacccaaaaaaaaccccccaaaaaaaaaaaaaacccccccaaaaaacccaaaaaaaaccccccaaacccccccccccccccccccccccccccaaaaccccccccccccccccaaaaa
|
||||||
|
abccaaacccccccaaacaaacccccccccaaaaaaaacccaaaaaacccaaaaaaaaacccccaaaaaaaaaaaaaacccccccaaaaaccccaaaaaaaaccccccaaaaccccccccccccccccccccccccccaaaccccccccccccccccccaaaa
|
||||||
|
abcaaaacccccccaaccccccccccccccaaaaaaaacccaaccaacccaaaaaaaaaaccccccccaaaaaaacaacccccccccaaaccccccaaacaaccccccaaaacccccccccccccccccccccccccccccccccccccccccccccaaaaaa
|
||||||
86
2022/go/day13/day13.go
Normal file
86
2022/go/day13/day13.go
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "fmt"
|
||||||
|
"encoding/json"
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input []string) int {
|
||||||
|
sum := 0
|
||||||
|
for i := 0; i < len(input); i += 3 {
|
||||||
|
left, right := input[i], input[i+1]
|
||||||
|
|
||||||
|
if isOrderRight(left, right) {
|
||||||
|
sum += i/3 + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input []string) int {
|
||||||
|
var trimmed []string
|
||||||
|
for _, str := range input {
|
||||||
|
if str != "" {
|
||||||
|
trimmed = append(trimmed, str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
trimmed = append(trimmed, "[[2]]", "[[6]]")
|
||||||
|
sort.Slice(trimmed, func(i, j int) bool {
|
||||||
|
return isOrderRight(trimmed[i], trimmed[j])
|
||||||
|
})
|
||||||
|
|
||||||
|
start := 0
|
||||||
|
end := 0
|
||||||
|
for i, value := range trimmed {
|
||||||
|
if value == "[[2]]" {
|
||||||
|
start = i + 1
|
||||||
|
}
|
||||||
|
if value == "[[6]]" {
|
||||||
|
end = i + 1
|
||||||
|
return start * end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func isOrderRight(left, right string) bool {
|
||||||
|
var l, r = unmarshal(left, right)
|
||||||
|
|
||||||
|
if cmp(l, r) <= 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func unmarshal(left, right string) (any, any) {
|
||||||
|
var l, r any
|
||||||
|
|
||||||
|
json.Unmarshal([]byte(left), &l)
|
||||||
|
json.Unmarshal([]byte(right), &r)
|
||||||
|
|
||||||
|
return l, r
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmp(left, right any) int {
|
||||||
|
l, lok := left.([]any)
|
||||||
|
r, rok := right.([]any)
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case !lok && !rok:
|
||||||
|
return int(left.(float64) - right.(float64))
|
||||||
|
case !lok:
|
||||||
|
l = []any{left}
|
||||||
|
case !rok:
|
||||||
|
r = []any{right}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(l) && i < len(r); i++ {
|
||||||
|
if res := cmp(l[i], r[i]); res != 0 {
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(l) - len(r)
|
||||||
|
}
|
||||||
67
2022/go/day13/day13_test.go
Normal file
67
2022/go/day13/day13_test.go
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"strings"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
input := `[1,1,3,1,1]
|
||||||
|
[1,1,5,1,1]
|
||||||
|
|
||||||
|
[[1],[2,3,4]]
|
||||||
|
[[1],4]
|
||||||
|
|
||||||
|
[9]
|
||||||
|
[[8,7,6]]
|
||||||
|
|
||||||
|
[[4,4],4,4]
|
||||||
|
[[4,4],4,4,4]
|
||||||
|
|
||||||
|
[7,7,7,7]
|
||||||
|
[7,7,7]
|
||||||
|
|
||||||
|
[]
|
||||||
|
[3]
|
||||||
|
|
||||||
|
[[[]]]
|
||||||
|
[[]]
|
||||||
|
|
||||||
|
[1,[2,[3,[4,[5,6,7]]]],8,9]
|
||||||
|
[1,[2,[3,[4,[5,6,0]]]],8,9]`
|
||||||
|
stringSlice := strings.Split(input, "\n")
|
||||||
|
r := Part1(stringSlice)
|
||||||
|
|
||||||
|
require.Equal(t, 13, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
input := `[1,1,3,1,1]
|
||||||
|
[1,1,5,1,1]
|
||||||
|
|
||||||
|
[[1],[2,3,4]]
|
||||||
|
[[1],4]
|
||||||
|
|
||||||
|
[9]
|
||||||
|
[[8,7,6]]
|
||||||
|
|
||||||
|
[[4,4],4,4]
|
||||||
|
[[4,4],4,4,4]
|
||||||
|
|
||||||
|
[7,7,7,7]
|
||||||
|
[7,7,7]
|
||||||
|
|
||||||
|
[]
|
||||||
|
[3]
|
||||||
|
|
||||||
|
[[[]]]
|
||||||
|
[[]]
|
||||||
|
|
||||||
|
[1,[2,[3,[4,[5,6,7]]]],8,9]
|
||||||
|
[1,[2,[3,[4,[5,6,0]]]],8,9]`
|
||||||
|
stringSlice := strings.Split(input, "\n")
|
||||||
|
r := Part2(stringSlice)
|
||||||
|
|
||||||
|
require.Equal(t, 140, r)
|
||||||
|
}
|
||||||
449
2022/go/day13/input.txt
Normal file
449
2022/go/day13/input.txt
Normal file
@@ -0,0 +1,449 @@
|
|||||||
|
[[[[8,6]],[8,[7],[6,7,6,2,4]],10,[[1,7,9],7,[7,9]]],[[4,[],[10,5],[5,4,7],5],8,9,[[5,3,3,6,9],[9,5,10],8],[[0,6,9],[8],4,6,8]]]
|
||||||
|
[[[],3,[[10,6,9,6],[6,8,7],[1,2]],8]]
|
||||||
|
|
||||||
|
[[4,[4],[[10,7,2],[1,6,5,7,4],[7,3,3,1,5],[]],1],[[],[[7,6,3]],5,5]]
|
||||||
|
[[[10]]]
|
||||||
|
|
||||||
|
[[[[7,9]],[[0,9]],0,[[2,1,1,2,9],4],[[5]]],[]]
|
||||||
|
[[8]]
|
||||||
|
|
||||||
|
[[9,[[5,4,5,1,10]]],[[[6,9],3,[0,2]],5,6,[3,4,[2,2],10],[10,5,9]],[[[10,3,8],[],[6,9]],4]]
|
||||||
|
[[[4,[7],[1,1,4,3,8],[3],[]],[[5,10,2,1],9,[2],6,7],4,[],[[10],[6,3,1,7]]],[4,[6],[[6],[6,6]]],[[[0,2,5],[3,5,10,7],[10,7,2,9],[],[0]],[[9,9,8],[]],[10,[2,10,7,7,3],4],[2,7]]]
|
||||||
|
|
||||||
|
[[[],2,2,9,[[9],[1,10,5,1]]],[[[],9,5,[8]],10,9,[[1,4,0],[5]]]]
|
||||||
|
[[5],[3],[],[9,[[7,2,0,9,3],[6,8,6],[]]],[[[6],3],6,[[2,8],8]]]
|
||||||
|
|
||||||
|
[[]]
|
||||||
|
[[[5,4],5]]
|
||||||
|
|
||||||
|
[[7,7,5]]
|
||||||
|
[[[[4,7,3],[6,0],1,6],[6,1,4,5]],[]]
|
||||||
|
|
||||||
|
[[[[4,7,0,9,8],10,7,2]],[6,6,9],[[2,10],8,9,1,[1,[0,4]]],[[[2,0,2],[]]]]
|
||||||
|
[[[[]],[],3],[],[[[],[8]],[[4,7,3,7,10],3,5]],[[9,[10,5,8,9,1]],0],[[[6,7,5,4,10],4,6,0,[8,3,1,2,7]],5,[10,1,5],10,0]]
|
||||||
|
|
||||||
|
[[],[[3,8,2]]]
|
||||||
|
[[8,4],[5],[3]]
|
||||||
|
|
||||||
|
[[0,1,5,[[],[6,6,8,0],[0,2,5,9,9],[3,2,7],[5,2]],10],[],[[8,8],[1,3],3,2],[[[4,0],[]],[[4,1,2],[2],6,9,6],1,10,[[7],[0,7],5]],[4]]
|
||||||
|
[[[],[6,[5,9,6,0,8],2,9,[4,2]],7,[9,6,0,10]]]
|
||||||
|
|
||||||
|
[[],[],[],[9,[[1],[6,3,4,9]],10,8]]
|
||||||
|
[[1,[[2],10,[0,9,3]]]]
|
||||||
|
|
||||||
|
[[0,1,4,4],[[7,[6],[2,5,1,3],5],[[8,3,7],[6],[],8],8,1,[9,0,[]]],[[0,[3,9,3,5],[2,0,9,0,7],6]],[[[3,3,1,10,9]],[[0,7,1],8,[10,0],8],[[9,3,5,4],5,[0],5],8,[[3,6,10],0,2,6]]]
|
||||||
|
[[[8,[1,2,10,9],2,[8,4,4]],[3,[5,5]],4],[[],2,[],6,3],[[10,7],[],7,[8,6,[5],4,3],2]]
|
||||||
|
|
||||||
|
[[[[],1,2],[[7,7,7],6,[1,7,1]]],[4,8],[]]
|
||||||
|
[[3,1,[1,6,[9,9,5],5],[[1,7,0,6],[10,8,10],[3,8],[6,2,7,5]]]]
|
||||||
|
|
||||||
|
[[1]]
|
||||||
|
[[[3],[[9,4,10,10],[8,9,1],[],[0,3,10,5]],[8,[]]],[[[10,6,0],2,1],5,0,[7],[[9]]],[[[],[9,9,3,2,3],5]]]
|
||||||
|
|
||||||
|
[[],[7,2],[5,[9,[]],1,[4,6,5],[[9,10,8,3],6]]]
|
||||||
|
[[[[]],0,[1,8],[5,2,7,2],6],[],[[],[[2,1,3,9],6,9,5,3],2],[[[10],[0],[4,0,3,6,8]],4],[9]]
|
||||||
|
|
||||||
|
[[],[],[],[]]
|
||||||
|
[[],[[3,6],6,[6],[[3,10,4],6],[]]]
|
||||||
|
|
||||||
|
[[8,7,10],[3],[9,[],[[5,1,6,10,4]],4,[[9,8,1,1],[0,0,2],1]]]
|
||||||
|
[[[1,6,[4,5,3,1]]],[[],[[7,0,5,1,9],6,[0,9,4,3]]]]
|
||||||
|
|
||||||
|
[[2,2,1,8],[],[[[10,4,10,6],[2,8,3,10,6],[]],1,6],[6,0]]
|
||||||
|
[[2,3,[8,[2,7]],8],[4,[[6,6,4,2],4,5,[7,5]],8,1,[]],[7]]
|
||||||
|
|
||||||
|
[[[],[1,[9,1,9],[8,8,8,5]],3,[4,9,4,[2,6,6]],[]],[[7,[1,9,6]],6,[[10,0,0],[4,7,1],4,9,7]]]
|
||||||
|
[[[[],8,5,1],3,[[8,2,2],4,[2,1,2,3,7]],10,[2,[5,7,6],3,[9,6,5,0,9],4]],[],[9,3,2,7],[4,[[4,10],[8,3,8]],6,[],9]]
|
||||||
|
|
||||||
|
[[[],[[],[5]],4],[[0,[],9,[8,5,3,2,2]],[8]],[[[2,5]],[10,8,[7,8,7,3]],5,[[2,10],3,8,0,[6,9,10]],5],[[0,[7],[]],[[3,9,4,1,6],8],[[4,4,7,2],8],[[3],[],3],7]]
|
||||||
|
[[[2,0,[7,5]],[1,5,7,6,[]],9,[2,1,[6,0],3,[3]]]]
|
||||||
|
|
||||||
|
[[1,3,10,[]],[],[7,[8,4],[[],0,[4,8],6],4,[[4,0],[5,0,8,3],[0,1],8,[2,9,7,6,5]]],[3,5],[9,[[8,3,6,0],[10,0,5],10],[[10,1,4,0],4,8,5],9,[7,[0],[7,9],7,2]]]
|
||||||
|
[[2,9,0,[[5,8,10,10,5],8,4,[5,6,10]],10],[8,[0,[10],[6],4,[]],[[9,4,0],[],[2,10,3,3,4],[3]],1,10],[[[],0,7,3,3],9,[[5,3,0],5,[4,6,6,7]],[]],[6,[[3,1],10,[0,8],0],8,[4,[],[8,0,7,9]],7],[9,4,[10],[[2,10,7,6]],1]]
|
||||||
|
|
||||||
|
[[[],8,9,2,[6,[0,2,10,2],[4,9,7,2,10]]],[9,[[3,4]],5,9]]
|
||||||
|
[[9],[[],[1,6,[5,9,9,9,0]],6]]
|
||||||
|
|
||||||
|
[[5,2,10],[2,[[],7,9,3],0,[7,[]]],[[9,[5,6,5,0],4,0,3],10,1,[]],[8,10,3,9]]
|
||||||
|
[[[2,[3]],9]]
|
||||||
|
|
||||||
|
[[],[6,[3,[],[]],8,[[7,7,8,2],4],0]]
|
||||||
|
[[[[0,5,7]],[[]],7,[4,[9,0,5],7,3]],[5,[[0,8,10,0],3],[1,4],[10],[]]]
|
||||||
|
|
||||||
|
[[1,5],[10,[[9,7,1]],0,[9,[6,3],[7],9,[]]]]
|
||||||
|
[[5,[2,[4,0,4,7,8],[4]]],[8,[2,9],5],[],[4,2]]
|
||||||
|
|
||||||
|
[[7,[[0,0,5,4]],4],[[[2,4]],[1,[3,2,8],[9,1,8,2,2],0,1],2],[[[4,7],3,3,9]]]
|
||||||
|
[[],[[[8],0,10,[0,4]],2,[9,2]],[10,4],[2,[7],10]]
|
||||||
|
|
||||||
|
[[[],10],[[6,7,[8,6,6],2],5,[9,[5,7,9,0],[10,6],7]],[[],[5],10,[[6],6,7,6,[6]]],[[]]]
|
||||||
|
[[[[],[]],[]],[[[6],[9],[4,0,8,5]],[3],[[8,2,7,7]],[],[3,[5,1],[9],[7,1]]],[[7,[0],[],3],[2]],[[]]]
|
||||||
|
|
||||||
|
[7,10,4,6]
|
||||||
|
[7,10,4,6,9]
|
||||||
|
|
||||||
|
[[9]]
|
||||||
|
[[7,2,6],[[6,9,[]],[5,3,6],[2],[[0,7,1],[0],[2],[9,9,0,8,2],[9,5,7,6,8]]],[[8,6,10,0,8],[9,[3,10],4,[2,4,3,4,4],5]],[],[]]
|
||||||
|
|
||||||
|
[[[3,8,[]],1,7],[[4],[10]],[[[2],8,8],[[1,0,6,5],4],6,[4]],[[[],[9,8,7,10,6],2,[1]],[[],9,3,[1,6,5],[]],6,4,9]]
|
||||||
|
[[8,[2,[3,7,1,0]]],[8,4,[[9,4],[0,3,5,5]]],[8,[[2,10,4],7,5,[9,0,5,0,4]],3,9,[8,8,3,3,0]],[[9,4,[0],4,[6]],[[0,10,0],6,[9,4,10,0]]]]
|
||||||
|
|
||||||
|
[]
|
||||||
|
[[[[0,4,6,7],3],2],[5,[10,[8],[4,9,4],[],5],6,[[0,6],[4,7,7],[],10,[]]]]
|
||||||
|
|
||||||
|
[[[3],8,10,[[8],2]],[9,8,10],[[[],[],3,[]],[],[1,9]]]
|
||||||
|
[[2,0,0,9],[[],[[10,2],[]],[7,[1],4,[2,5,8,1,2],6]],[[8],[[9,3,3,8],2,[5,5,2,9],2],[5,[],6,[2,1,4,10,1],7]],[],[]]
|
||||||
|
|
||||||
|
[[[[1],[7,1,9]],[[],0,[0,7]],[6],9,[]],[]]
|
||||||
|
[[[[2,8,7,3],[4,2],10,[8,4],7]],[],[[7,[3,2]]],[[[8,7],8,10],0,2]]
|
||||||
|
|
||||||
|
[[[1,[6,7,0,8]],6],[2],[6,7],[],[[[1,9,2,10],[9],[0,4,3,1],[6,10,2,4],[4,0,10,6]],[6,5],6,[5,10,[1,0,10,1,2],[5,10,5],9],[[3]]]]
|
||||||
|
[[[[3,9,0,6,3],[]],1,7,4,[[9,8,5],1,6,[]]]]
|
||||||
|
|
||||||
|
[[],[[[]],9,[[2,6,2,9,5],9,[6,6]],[[1,0,7],[4,4]]]]
|
||||||
|
[[1,[[5]],1,0],[2,[[9,9,1,8],2,8,[0,5]],[]],[0,[5,8,4],[[6,2],[3,6,0,8],[4,2,5],[5,10,4,6,6],[5,5,6]],[7,2,10,[]]],[7,[]]]
|
||||||
|
|
||||||
|
[[5,[4],[0,[5,3,2],[]],0],[3,[10,2,7,[]]]]
|
||||||
|
[[],[4,9],[[[2],[0,10,6,1],1,[0],[9,4,8,1,9]],0,[[0],8,9,[1,1,10,10]],7],[[[3,10],10],10,2,[10,3]],[[5]]]
|
||||||
|
|
||||||
|
[[4,[],[[0,3,5]],[[]],1],[9,[0,4,7],[3,[5,10,9,2],6,2,6]],[]]
|
||||||
|
[[[1,4,[10,3,8],[7,7]],[1,[]],[[1,2,5]],9],[],[],[0,6,2,8]]
|
||||||
|
|
||||||
|
[[[[5,9,4,1]]],[0,1,[],7],[[[]],[9,[2,5,10],5,1],[[]],[[9],[6,4,0,4,9],1],[8]],[[10,1,7],6,10,7,6]]
|
||||||
|
[[[8,9,[0,9,2,5]],10]]
|
||||||
|
|
||||||
|
[[9,[[4,8,2,0],[0,1,7,7],5,[4,3,0]],6,[1,[3,9],[3,10,10,3,1],6]]]
|
||||||
|
[[],[5,[[4,0,9,5],1,[2,0,5,6],8,3],1,[[9,3,10,10],[],[10],7]]]
|
||||||
|
|
||||||
|
[[[[4,7,4,1],8],1],[[8,0,0,5,[0]],2,[]],[[[5,8,6,10,0],[],7,[],1],[7,[7,8,0,2,5],9,[8,5]],[8,[7,4]]],[10,[9,3,[0,5],[2]]],[[6,3,6],6,[[7,1,10],5,4,[3,5,1,7,10],9],[1,5,[2],[5],[3,7,0]]]]
|
||||||
|
[[],[[],10],[0,[],5],[2,[8,2,0],[3]]]
|
||||||
|
|
||||||
|
[[2,3,[3,6,8],5,2]]
|
||||||
|
[[],[0,0,[],8,2],[[[],[0]],[[],4,6,0,[8]],5,7,10],[[],[[1,6,3],[6],[6,7,0],4],[],[[1,10,4],2,0]],[[9,[1,0,7,1,7],3],3,9]]
|
||||||
|
|
||||||
|
[6,1,3,9,6]
|
||||||
|
[6,1,3,9]
|
||||||
|
|
||||||
|
[[3,10],[8,[[8,4]],0],[],[0]]
|
||||||
|
[[[[6,6,9,5]],[[4,0,0],[9,8,10,9]],6],[[1,[1,8,7,9],[]],4]]
|
||||||
|
|
||||||
|
[[[],4],[[[]],6,1],[[4,1,[8,8,9,3],6,9],1,8,[],3],[[[3,4,6,0]],9,0,0,[]],[[[5],[4,7,9,6]],2]]
|
||||||
|
[[9],[[[3,2,2,3],0],5,[[6,6,0,9,6],[10,3,3],3],[]]]
|
||||||
|
|
||||||
|
[[],[],[],[7]]
|
||||||
|
[[[4,[5,0,7],[5,5,4,4,2],9,[8,0,0]]]]
|
||||||
|
|
||||||
|
[[7,[[0,3]],4],[9]]
|
||||||
|
[[],[4,[[7,10,4,7,6],[3,8,2,1,6],8,8],2,5],[7]]
|
||||||
|
|
||||||
|
[[[4,0],0,7,[0]]]
|
||||||
|
[[1,[8,[4,2],6,2],0,[],8],[[]]]
|
||||||
|
|
||||||
|
[[],[0],[[[7,2,10]],3,[[8],2,[5,2,1,5],1],[8,[9,9],1]],[],[2,[[10,3,8],0,[8,6,0,5,1]],[2,7],[[3,6,7]],[2,[0,7,2,4]]]]
|
||||||
|
[[],[[],6,7],[3,5,[0]]]
|
||||||
|
|
||||||
|
[[10,7,[[9,2,5,10],[],3,[2,3]]],[[[1,0,10],0],[[6,6,2,9,6],[2,3],4,[2,4,5,2]],7,[5,7,8,[10,4,10,4],9],4],[]]
|
||||||
|
[[[9,9,3,2]]]
|
||||||
|
|
||||||
|
[[5,0,9,8,1]]
|
||||||
|
[[3,5,[[],5,0],7],[7,9,9,[[6,0,4,4],2,[10,3],5,6]],[]]
|
||||||
|
|
||||||
|
[[0],[[],[],[1,[7]],[]]]
|
||||||
|
[[],[[4],[8,[0,1,5,2],[0,9,3]],9],[1,[1,[],4,9],6,[],8],[[2],[[7,3,4,9],10,6,[5,7,10],8],5,1,5]]
|
||||||
|
|
||||||
|
[[],[9,[[],3,4],[],3,[1,[8,5,1,9,7],[1,9,3,2],[2],4]],[[1,4,1,[0]],[[6,6,3,6],[2,2,6,9,5],0]],[[3],[]]]
|
||||||
|
[[],[[[2,8,10,3]],10,[[5,3],4,8,[8]]],[1,1,[[]]],[],[]]
|
||||||
|
|
||||||
|
[[],[7,[6,[1,4],9],10,8,[[],6,1,3,8]]]
|
||||||
|
[[9,0,[[7,0]]],[],[2,9,3],[[[5,8,8,8],9],[6],0,[[1],9,8,[]],2],[[],[5,0,[],8],[[9,4,0,2],9,1,9],3]]
|
||||||
|
|
||||||
|
[[[5],[[3,1,7,10,3],8,[],7,[1,7]],5,0]]
|
||||||
|
[[[2,[3,4,9,8,10],[5,6],[9,10,8],[6]],[1,[10,7,3,7],[8],4],3,9,9],[[2,[5,1,10,8],[1,9,8,9,9],10],6,2,[]]]
|
||||||
|
|
||||||
|
[[9,[],[[1,0,4],[7,5],[0]],[2,2,[5,3,10,9],[8,4,6,0,0]],[1,[4,2]]]]
|
||||||
|
[[[[5,6,4,3,6],4,[3,5,10,7]],1,[8,[7,5,9,10,7],2,5,7],0],[[6,[0],[],[3,3,2]],[[5,2,4,2,3],10,2,4,8]]]
|
||||||
|
|
||||||
|
[[[],8],[6],[[[7]],6,[[9,7,5],[5,0,3,3],[2,2,0,8,3],[5,7,8,1,3],[1,6,4]]],[8,[6,4,[],0]]]
|
||||||
|
[[[[3,3,3],7,10,2,[0,1]],[[2,4,3,2,2],[7,2,4,4],10,[8,1,1]],4],[4,3,[[],5,[1],[0,7]]],[8,6,10,[]],[[5,[7,0,6]],3,10,10],[7,0,[10,4,3,7],3,2]]
|
||||||
|
|
||||||
|
[[[7,[0,2],[],3,[5,0,6,9,0]],0],[[[8],[6,8,4,2],[8,6,4,8],4,3]],[[3,2,4],[6,2],10,[[6],3,[2,6,0]],[[7],4,6,[]]],[]]
|
||||||
|
[[7,1,2,1,[[2,0,8,10,10],[5,6,1],[6],[5]]],[[6,[10,5,10,1,1],6],1],[[[8,1,2,5,8],0],[10,9,[2,4,4,8]],6,[2,[1],0],6]]
|
||||||
|
|
||||||
|
[[9,3,8,[1,[1,2,6,8,0],9,0]],[[6,[9],[6,2,1,5],[3,6,0,0]],[[6,0,1]]],[[[3,9,8,8,5],[1,8,3,10,5]]],[1,[[3,4],4,[9,7]]]]
|
||||||
|
[[0],[[[],7,[8],[7,8,9],3],[[],3,[9,7,7]],[8,[3],0],[1,4],[[8],[]]],[[[6,10,0,1],[4,6,1,5],[6,3,1,4,0]],2,4],[]]
|
||||||
|
|
||||||
|
[[[[2,0],[10,1,7,7,7],[8,4],[],[7,4,5]],4,[],1,4],[7],[4,7,9,[3],[[3,4],3,4,[5,6,4,7,10]]],[3,7,8,[2,7,[8,0],4]]]
|
||||||
|
[[8,7,9],[[[3,7,9,8,8],[5,6,5],1],9,[[0,5],[]],[5]],[[[8,2,7,9,0],1],1,[],[],[[4,2,0,10],[],0,[2]]],[]]
|
||||||
|
|
||||||
|
[[[],3,5,[[],[6,10],[7],5]],[[[9,7,0]],[0,4,3],9,[[],0,[5,5,1],10],[8,[]]],[[[3,3,10,3]],0],[[1,[3,3],[],0],[[],8,7,[5,3,6,2],[7,6,9,3,5]],6,2]]
|
||||||
|
[[[[1,4,6,8]],0,[3,0,[],8]],[1,8],[7,[]],[7,[6,7,4],10,[3,0,[7,3],7,7],1],[5,[8,[2,4],3],[3],1]]
|
||||||
|
|
||||||
|
[[[1,0,2],[5]]]
|
||||||
|
[[[9],[[1,3,9],[4,3,9,2,4],[7,0,1,10,1]],[0]],[3,[[2,7],4,[6,1,5,5,6],10],9,7,[[8,7,8,9],9,[],[0,2,3,4,10],0]],[4,[[6,6,1,9,0],2,0,[2,10,6]],6,0,3],[3,5,9,[]]]
|
||||||
|
|
||||||
|
[[0,0,0,[10]],[[[1,7,4,0,5]],7,2]]
|
||||||
|
[[[[9,10,9,10,7],1],[],1,[[]],4],[8],[3,[7,5,9,[0,0,5,10]],6,10,2],[5,3,4,[[7],7],3]]
|
||||||
|
|
||||||
|
[[[[6,2],5,10],0,8,[[10,1,4,4]]],[[[1],5,7]],[[[2,7,9,5,7],4,10],[[8,8,2],[],6,0,[3,8]],[[],[],[],[6,7,8],9]],[[6,4,[6,10],1,[3,2,8]],[],1,[[0,3,9,5,2],[3,2],9,8],1],[]]
|
||||||
|
[[2,[7,[3,5,6,0],4,1],6,[[7,2,3,10],3]],[],[6]]
|
||||||
|
|
||||||
|
[[8,[],[],[10,8,[0,7,8,8,3]],[[7,3,7],[8,8,10,10]]],[8,10,[4],7]]
|
||||||
|
[[[]]]
|
||||||
|
|
||||||
|
[[9,[[3,10]],5,10],[9,1],[5,4]]
|
||||||
|
[[[]],[6,6,5],[[1]],[6],[]]
|
||||||
|
|
||||||
|
[[6,[5,2],9],[6,9],[4,[[4,4],1,[0,2,4],8,1],0,8]]
|
||||||
|
[[[8]],[[[5,6],2,3,6],[2,9,[7,0,0,7,3]]],[[[],3]]]
|
||||||
|
|
||||||
|
[[[],10,[5,[3,3,3,6,0],[7,8,2]]],[],[]]
|
||||||
|
[[5,[8]]]
|
||||||
|
|
||||||
|
[[[4,[],[],[1,6,4,7,9]]],[[9,[1,4,7,10],9,[9,3,1,7]],2],[],[]]
|
||||||
|
[[[[2,6]],0,10,[1,10,0],[5,[5]]],[4],[4]]
|
||||||
|
|
||||||
|
[[10,[],10,2],[],[5]]
|
||||||
|
[[[]],[6,5,8,10,[[0],[5,9],[8]]],[],[10,[[8,2],7]],[[[],9],6,[[8,8],[1,3,7,3],6,8,[9,3,0,9,8]],[],9]]
|
||||||
|
|
||||||
|
[[[[],[7,10],0,5],[0,[]],9],[2,7]]
|
||||||
|
[[3,[]],[[6,10],[1,[7],[2,0],7,[]],[[6,8],1]]]
|
||||||
|
|
||||||
|
[[[],3]]
|
||||||
|
[[[3,9,6],9,[6,3,[0,8]],[6,8,5,[10,5,9,10]]]]
|
||||||
|
|
||||||
|
[[[7,2,10,[]],7,[[],[],[],10]],[0,0,9]]
|
||||||
|
[[],[[[1,1,8,1],[1],6,8],[[8,3,0],9,[3]],[4,[7],5,[1,2,9,8],[6]]],[8,[[],[7,2,4,6,5],[1,4,6,7]]],[[1,3,2,9],[[0,3,4,0,0],3],3,9],[5,[[5,7],[5,7,3,8,3],[6,0,2,3]],5]]
|
||||||
|
|
||||||
|
[[],[[1]],[5],[2,[],[2,[9,7,1,4],[9,4,4,2,4]],3]]
|
||||||
|
[[3],[],[6,[[10,10,10],2],[3,2],5],[]]
|
||||||
|
|
||||||
|
[[],[[9,[10,3],[1,4]]]]
|
||||||
|
[[5],[[],[[5,6],[],9],[]]]
|
||||||
|
|
||||||
|
[[5,5,10]]
|
||||||
|
[[[[10,9],[2,10,0,8],[4]]]]
|
||||||
|
|
||||||
|
[[],[[10,[]],[[8,7,3,9],2,10,7],1,7,[1,0]]]
|
||||||
|
[[[[6,4,3],0,5,3,9],[],9,[3,[4,4,0,1,9],10],[10,[0,2],[7,7,1,5,9]]],[2,3,3],[[],[2,1,[]],9,9],[[3],[5,9],[2,[10,7,3,4],[2],10]],[]]
|
||||||
|
|
||||||
|
[[5],[[],5,8,7],[[[0,0,10,6,5],3,[10,4,8],[]],[[3,5],[2,0,2,7],9],9,[7,9],[1]],[],[[0,5]]]
|
||||||
|
[[8,[8],3,[[4],8],[5]],[8,4,5,[7,1,[4,7,1,2],4,9]]]
|
||||||
|
|
||||||
|
[[2,9,4,[[10,8,10,2,6],[],7,[7,0,6,8,2]]]]
|
||||||
|
[[5,[],10],[2,[3,6],[],[],[]],[[6]],[9,7,[0]],[]]
|
||||||
|
|
||||||
|
[[1,1],[0]]
|
||||||
|
[[7,[9,10,5],[[5,6,5,6,7]],0,[[1,8,4,10,1]]],[],[[8],[[],9,6],10,9],[[[],10,0,3,10],[[3,3,8,5]]],[[1,6,10,5,[2,0,3,5,0]],[8,[],10,10]]]
|
||||||
|
|
||||||
|
[[[8,2,[],[],8],[[9,3],10]],[]]
|
||||||
|
[[[4,10,9,2],5,2],[[10]],[[1,7],[10,5,2],2,5,4]]
|
||||||
|
|
||||||
|
[[[9],4,4,9,[1]],[[7],5]]
|
||||||
|
[[],[8,6,[],[[0,4],[],[7,4,6],7,7],[]],[[4],[[7,3,6,8],5,1],[8,7,5],[2,7,[3,4,6,2],[],[]],8],[2],[[1,9,[9,8,9,2,7]],3,[],3,[]]]
|
||||||
|
|
||||||
|
[[2,[10,2],[[6],10,[10,6,8],[5,8,7,5,6]]],[2,8,9],[]]
|
||||||
|
[[5,[[4,10,6,10],5,[1,1,10,8],9,[4,1,4,0,3]],9,9]]
|
||||||
|
|
||||||
|
[[6,5],[[7,0]],[7,4,7]]
|
||||||
|
[[[7,[],[2,6],1,4],8,7,9],[[[]]],[[5,4,[2,9,1]],10,2]]
|
||||||
|
|
||||||
|
[[[[0,2,4,8]],[[6,10,8,6,1],10,[4],7,7],10,[[6,5],[],3,[8,6],[]],[[]]],[[9,10,7]],[],[7,6,[[]]],[[4,8,[6,5,3,5],9],6,[[7,8],[1,0,8,10,7],[7,3]],[7,2,0,8,[5,7]]]]
|
||||||
|
[[[[7,3,6],3,[6,1,10,9],7,[5,0,7]],10]]
|
||||||
|
|
||||||
|
[[[6,[6],9,[3,1,7,3]],6,[[6,9,6,10,0],[],5,4,3]],[[[10,1,2,4,2]],[2,[],[6],8],[[5,4],[3,4,9],[4],5],0]]
|
||||||
|
[[[[1,4],[2,5,8]]],[9,[4,0,1],[10,8,[3,9],6,7],[[3],1,[0,1],[3,0]],[[9],1,1,9]],[[9,[3],8],3,3],[]]
|
||||||
|
|
||||||
|
[[2,6,[2]],[4,2,9],[],[7,4,[2]]]
|
||||||
|
[[[[2,8,1,3],[],9,2],8,[],[8,[]]],[[],[[2,9,2,0],9,[],1],5],[8,[[7,7,3,8,3]],8,3],[[[]],[6,2,[6,8,6,1],8],[[0,6],[3,9,2],[8,7,4],9],[2],[6]],[2,8,9,[[5,2,4]],10]]
|
||||||
|
|
||||||
|
[[[]],[],[[[],10],[2,9,5],0,[[9,4,3,10,10],[2,0,8,9],[1,6,6],1,[]],[[10]]],[7,6,[[],[5],[2,6,7,10,5],8],[],[[],9,2,5,2]],[[3,3,[6,10,10]],6,8]]
|
||||||
|
[[1,0,4,[7],[7,9]],[10,[[1],[],2,8,0],0,7]]
|
||||||
|
|
||||||
|
[[[],10,6,3],[1,[[5,5,8],4]],[5,4]]
|
||||||
|
[[[[8],[2,7],[0,3,3,7]],1,[2,[1,5,5,5],[],[2]],1],[[[4,9,8,9],[8,10,4,2,3]],[],3],[[[10,0,6,10,7],6,[8,4,5,3,9],[1,7]],10],[[[9,3],9,[]],8,3,10,[10,10,[5,1,2,7,4]]]]
|
||||||
|
|
||||||
|
[[[[]],[[9],[4,1,4,4,0],7,1,3],8,[8,[10,8,6,1,3],[],[7,2],0],[]],[0,5,6],[5,[10,[0,3],4],[6,[5,9,7],[3,8],[4,1],9],3,[]],[5,[],10,[]],[0,9,[],3]]
|
||||||
|
[[10,3,8],[],[],[0,[6,0],[6],[[],0,[10,0,6,3]]]]
|
||||||
|
|
||||||
|
[[[[7,6,6],[7,1,0,9],6,5,[]],[0],[]],[6,0,5,0],[10,[[4,6]],[[3]]],[[],[[0,5,6,10],2,[3]],5]]
|
||||||
|
[[3,1,[[9],8],[9,10,2]]]
|
||||||
|
|
||||||
|
[[[],[4,3],[[],[9,3,6,9,7],10,[0,2]]],[[8,7,10],8]]
|
||||||
|
[[[3,9,[],[10],0],[2,10,2,0]],[10],[],[0,[3,[2,2]],10,3],[[[3,4,4,7,1],1,9],2,[3,[7,7],[4,4,0]],0,[]]]
|
||||||
|
|
||||||
|
[[6,8,[[0,4,0],2],[[3,2,9,2],0,[8,7,0,5,9],[3,8,2,6]]],[7,3,2],[6,[[]],[8,1,[8,4,2,0,7]],[],[[3,4,1,8,0],[7,5],6,[4,9],7]],[5,[4,[],1],[[8],1],6],[]]
|
||||||
|
[[[7,[]]],[1,10]]
|
||||||
|
|
||||||
|
[[0,3,9],[1],[3,0],[4],[[9,[4,8,8],[],8,[]]]]
|
||||||
|
[[[[0,10],[2,10,7],1,10]],[8,8,2,[6]],[[1],[2,[9,6,9],3,4],3],[5,2,[],[0,4],1],[[2,10,[0,3,6],7],9,[3,[5,7,4,8,3],4,4,0]]]
|
||||||
|
|
||||||
|
[[[4,[0,10,9],3,[]],2,0,[5,5,9,[],0],10],[[6,4,[6,2,9,9,2],[9,1,9,6],2]],[],[[],6,6,4,[]],[[],8,[[9,9,7],[2,0,3,8,0]]]]
|
||||||
|
[[],[4],[[4,[0,9,5,7,3]],3],[[9,[5,1],[6]],5]]
|
||||||
|
|
||||||
|
[[6,[[5],2],7,[0,9,[6,3,5,0,6],2],[[4,7,3,8],[9,8,6,5],8,8]],[]]
|
||||||
|
[[[[4,2,3,10],[],0]],[[[9,0,7,4],[6],3,8,5],[],3,3],[[3,[3],[],[3,5,2,4,1],[7,3,5]],9,4,1],[],[5,6,[1]]]
|
||||||
|
|
||||||
|
[[1,[],[6,[7,1]],10,[[1,7,2],8,[9,6,3]]],[4,[[],[8,8,5,5,3],1]],[[[]],6,2,[2],[[],3]]]
|
||||||
|
[[6,2,[3,6,0,5],[9,[9,8,9,3,10]]],[4,[6,7,8,[],[2]]],[4,[[1,9],[],[7,9,6,10,7],9,8],6,0],[]]
|
||||||
|
|
||||||
|
[[[[8]],[9,8,[3,2,6,2,7],[3,6,2,5],8],[[3,6],0]]]
|
||||||
|
[[[[5,3],1,7],9,3,[9,0,[3,2]],[10,9,[4,9,6,8,8],[],[7,5]]]]
|
||||||
|
|
||||||
|
[[4,2,5,6,[1,1,5,[8,2]]],[[0,[3],3],0,0,0],[7,[3,[9,9,5,1],[],3],[]],[4,[[9,8],[6]]]]
|
||||||
|
[[],[2,0,[[],[8,5,4,7],9,[3,5]],[9,2,[8,4],[7,5,6,7,3]],7]]
|
||||||
|
|
||||||
|
[[1],[[10,5],[[],[],[],3],7,4],[[10,[6,4,9,1],6,0,[2,0,0,6]],[5,2,9,[8,1]],[[9,0,2,3]],[],6]]
|
||||||
|
[[7,[2,[6],1,1,[1,8,1,6]],[],4],[7,[7]]]
|
||||||
|
|
||||||
|
[[[[5],10,[10],[],[8,6,4,2]],5],[8,[[5],6,[],[8,4,9]],[10,0]],[[3],[],9],[4,[6,6],[]]]
|
||||||
|
[[1],[4],[[7,[],[3,9],1],5,[[9,0,8,4],7,[8,6,3],[10,9,4,2],9],10],[[8,7,[2,8,10,9,9],9],5,[]]]
|
||||||
|
|
||||||
|
[[[[5,1,5],[8,4,6,5],[9,10,0]],7,4],[[[7,2,8,5],0,[]],[],3,4],[[4,3,[2,6,9,9,6],9,[8,7]],5,10],[1,[],9],[9,[[9,9]],[1,6]]]
|
||||||
|
[[[[9,5,9,10],[]]],[9],[]]
|
||||||
|
|
||||||
|
[[[[3,3,6,0],6],10]]
|
||||||
|
[[[3,2,[0],0],[],[[6]]],[5]]
|
||||||
|
|
||||||
|
[[[2],[]],[1],[[[9],10],5]]
|
||||||
|
[[8],[10,7],[],[4,6]]
|
||||||
|
|
||||||
|
[[[[5],10,[1,8,1,5,1]]],[[],[9,8,8]]]
|
||||||
|
[[3,1],[],[3,4,[[7,3],5]]]
|
||||||
|
|
||||||
|
[[3,10],[[4,7,[1,8,6,10,8],5]]]
|
||||||
|
[[[10,[8,6,7,6,10],[1]],[[10,4,5,5],[5,5,9,4,1]],5]]
|
||||||
|
|
||||||
|
[[[10,8,2]],[],[]]
|
||||||
|
[[[[0,9,0],[6],[0],6],8],[[10,[0,1]]]]
|
||||||
|
|
||||||
|
[[[]],[[[9,9,8],[],[8,10]]]]
|
||||||
|
[[5,[[0,6,0,2,1],4,9,[6,2]],9,[[4,4,8,0,0]],[[],[5,3,1]]],[8],[[[6,10]],2,6]]
|
||||||
|
|
||||||
|
[[[[6,1,5,10],6,[8,7,3]],5,[1,[10,5,7],2],[[7],8,6,8]],[[[10,10,5,4]],3]]
|
||||||
|
[[],[10,10,[9,[8,2,0,10],9,[7,7]],8,[6,9,[6,8],[5,5,10,5],4]],[5,8,10,[0]],[[[10]],[5,10,5,[0,5,9,10]],3],[]]
|
||||||
|
|
||||||
|
[[[[4,1,2,9],[8,5,10,5,7],0],[[0,3,6],10],8]]
|
||||||
|
[[[3,[2,2],[5],[8,2,0,0,9],4]],[8,7,[[3,8,9,4],10],7]]
|
||||||
|
|
||||||
|
[[9,9,[10,[0,5,1,5],[5,9],[7,10,9,10]],8],[1,0],[],[5,3,[5,10],2]]
|
||||||
|
[[[0,8,8,8]]]
|
||||||
|
|
||||||
|
[[5,[[10]]],[[],1,[[9],[10,6,6,0],4],[7,8,6]],[[5,[2]],[],[8,[10],1],10],[[10,[5,5,1],6,0],0]]
|
||||||
|
[[10,[9,1,[7,5,3],8],[[10],8]],[[6,[6]],[10,0,6,0,2]],[[[],0],[10,9,8,4,[1,6,8,3]]],[9,9,6],[10,[]]]
|
||||||
|
|
||||||
|
[[[[6],[1]],4,[[5,10],[0,10],6],[[5,7,10,10],[6,5,0,10],[],[3,9,8,1,0]],4],[],[[0],3,1,0],[6,[[9]],[[5,9],4,[9]]]]
|
||||||
|
[[[[9,8,6]]]]
|
||||||
|
|
||||||
|
[[10,6]]
|
||||||
|
[[],[4,[[0,3,8,8,1],[0,10,7,7,7],[],[8]],[[],[1,1,10],4],2,[[6,3,1,5]]],[]]
|
||||||
|
|
||||||
|
[[[],0,5,8]]
|
||||||
|
[[3,[10],10,[],7],[[[5],[8,8,6]],[[7,2,0],6],0,6],[[5],[[3,6,1,8,6],8,5],[[],[9,7,0,9,4],0,9],10,5]]
|
||||||
|
|
||||||
|
[[],[]]
|
||||||
|
[[1,0,[[5,4,5,2],0,6,[7,2,8],4],[[2,10],9,3],4],[4],[[4]],[[6,3,[],4],0,4],[4,[]]]
|
||||||
|
|
||||||
|
[[[[4],[2,4],6,[]],1],[10,[3,0,4,[2,0,4,3]],[[5,6,0,1,2]],[[3],0,[]],[[6,10]]],[4],[],[2,2]]
|
||||||
|
[[[3,[4,1,4,2],[1,3],[6,6]],[[10],9,[2,0,1]]],[3,9,[3,[5,9,5],7,[1,10,9],8],10],[[3,[7,9,1,10,4],[5,8],[9,10,8,7,1],5],9,2,[[3,7,0],10,[],[7,6,2,5,1],[]],[]]]
|
||||||
|
|
||||||
|
[[[[2,9],[]]],[[10,[2,10],[],[7,1,2],9]]]
|
||||||
|
[[5,9,6,[0,[2,9,6],[2,2,1]]],[1,[[8,4],[9,1],[7,1,10,5,4],[9,4]],9,6],[4]]
|
||||||
|
|
||||||
|
[[[0,[10,3,10,0],5,4,1],[],8,1,10],[[],[[7],[8,3,7,8],[3,9,2,0],9,[9,5,7,4,1]]],[],[0,10,[0,[9,5,0,5],[7,9,7,10,9],0,[]]],[]]
|
||||||
|
[[1,1,7,0],[10,7],[[1,0,[8],5],6]]
|
||||||
|
|
||||||
|
[[[8,4,[5,5,2],3]]]
|
||||||
|
[[0,7,[6,[],[10,5]],5],[3],[9,8,[],[[2],[1],9,[3,6]],[[]]],[0]]
|
||||||
|
|
||||||
|
[[[6],[[2,6,10],[8,3,10,1,10]],2],[[[8,2,8,10,3],5]]]
|
||||||
|
[[[[]],8,[[8,4],[],[],[4,4,1,0,10],[1,5,2,4,6]],3,[0,[8,0,2]]]]
|
||||||
|
|
||||||
|
[[8,3,[4,[]],[[3,5,5,7,8],[2],1]],[]]
|
||||||
|
[[[[6,5,1,3],0,6]],[7,9,[],0]]
|
||||||
|
|
||||||
|
[[4,0,[[8,0,10,7],10,1,[10,1,8,10],[]],4,10],[7,1],[8],[7,[[4,0,7,1]],[7],[]],[]]
|
||||||
|
[[8,[[10,8,4,7,10]],[[10,2]],[5],[[1,5,2,6]]],[[[4,4,3,4,4],6],9,[6],[0,[9,6,5,1],[9],[8,5,0],[0]]],[8,5,[8,[2,6,0,3,4],7,4],8,[6,[4,0,10],[]]],[[[8],[0,2,8,0]],[6,[1]],[],1],[]]
|
||||||
|
|
||||||
|
[[2],[[[8]],6],[2,[[7],10,0,[8,7]],9,[9]],[]]
|
||||||
|
[[2,[[4,9],4,[],9]],[[1,[8,7,3],0,2],2],[[],5,2],[0,10]]
|
||||||
|
|
||||||
|
[[4,7,0,[],[0,[0],[3,2,10,1],[0,4,4]]],[7,5,[[0,4,6]],[[2,9,1,4,0],9,[8,10,5,7]]],[6,[5,9,[8,0]],[5],[]]]
|
||||||
|
[[[6,[4,1,6,0,2],10,[2,5,3]],[5],9]]
|
||||||
|
|
||||||
|
[[8,[2],[]],[1,10,3],[10,[[1,8,6,7],9,6,0,5],[3,10,0]],[[[1,9]],5],[10]]
|
||||||
|
[[[[],[6,6,4,6,2],10,[7,5,8]],[[3,8,7,3],2,9],0],[2,1,[9,[7,7,3]],[9,8],[[3,9],[8,10],[7,10,6],0,[]]],[0,2,5],[[[3,6,6,10,3],[],[3,6,5,0],[]],[9,[4,6,8,5,9]],[[8],[1,1,8,1],7,4,[2,10]],8],[10,[6,[],[]]]]
|
||||||
|
|
||||||
|
[[[3],[],8,[[3,9,9]]]]
|
||||||
|
[[[[3,0,3],9,[3],2,10],6],[[],[0,7,8,8,[5]],9,[8]]]
|
||||||
|
|
||||||
|
[[1,3,[[5],[3,7,1],7,[10,8,5,10,6]]],[[10,5,4],7,[0,[4,8,1,4,5],[5,0,5,4,8],5,8]],[6],[7],[[[7,6]],9,[0,[9,10,10],9],2,9]]
|
||||||
|
[[5,10],[6,5,[]],[2,2,1,[],5]]
|
||||||
|
|
||||||
|
[[[9,[3,7,5,0,10],[2,4,8],[8,9,5]],[],2],[10,8],[[[10,6,4,9],[5,5,3,0,10],[8,10,3,7,5],[8,4,3,5]]]]
|
||||||
|
[[[1]],[[],6,[1,[4,3,6,8,8],7,[3,3,4,9],[9,8,1,3]],[[7,8],0,1]],[5,[8],8],[[[0],4,[1],[7,0,7,8,8],7],[6,5,[5,0]],10,[[7],[6],9]],[3,10,[2],[[8,2,4]],0]]
|
||||||
|
|
||||||
|
[[[3,9],5,3,7],[2,2,4],[[[7,1],3,4],[]],[[[8,1,10,9,10],7,[7,10,3,8],1,3]],[[10]]]
|
||||||
|
[[[0]],[]]
|
||||||
|
|
||||||
|
[[[]],[[4,8,[8,0,7,3]],5,3,1],[5,8,[8,[2,7,9,3,2],[5,0,1,4,7],5],8,[[9],3,[9],[8,2,5,3],[5,8,4]]],[9,1,1,[7],[]],[6,[2,[1,3]],[3,4,[8,6],0,2]]]
|
||||||
|
[[[2,7,2],[]],[6,3,[8]],[4]]
|
||||||
|
|
||||||
|
[[],[[2],[[5,8,1,9,6],[],7],4],[],[[6,9,[7],2,1],[8]]]
|
||||||
|
[[[3,7,[],6,3],[6],5,3]]
|
||||||
|
|
||||||
|
[[3,8,[[3,4,1,2,3]],[0,[1],[7,3,8,10,9]],[[2,10,7]]],[[[0,3,8,9],[0,6,8],8,1,2],7,[9,0,7,[9,5,0]],[[]],[[5,3,6]]]]
|
||||||
|
[[10,[]],[2,[4],[]],[[[0],[0,6,5],[7,4,3,2,3]]],[]]
|
||||||
|
|
||||||
|
[[4,[[8],[5,10,9,6,5]],9,5],[2],[2,10,5,[]],[[[0,10,8,1],3,6],8,8,[[5,10,9,6,10],[4,10,9,9],4,10]],[2,[4,[9]],8,1,[7,7,1,[]]]]
|
||||||
|
[[[8,5,0,[10,6,5],[0,6,1,0]],[[1,1,3],[6,6,3,7,5],9,10,[8]],[[3,3],7,[5,0],4,[9,3,9]]],[[4],[[6,6,0],7,5,3]],[],[3,[0,[10,8,10],[3,0],8],[3,3]],[[[10]],[[7,6],[2,7,10,0,5],6,0],[[9,3,10,2],8,[5,8,1]],10]]
|
||||||
|
|
||||||
|
[[[],6,9,[2,[10,4,6,9,1]]],[[[8,6,4,5],1,[5,5,3,7,8],[]]],[[[5,5,10,7]],[[2,4],0,[2,2],10,[]],[[1],[0],[1,1,7,3,8],[4,10,0,0]]]]
|
||||||
|
[[7,5,[[],10,[],6,[4,1,1,1]],[8,4,[4,0,9,0]],[]]]
|
||||||
|
|
||||||
|
[[[[4,0],[]]]]
|
||||||
|
[[[6],7],[[6],3],[6,[[2,6,10,7,8],1,2,10,4],[[1],6,5,6]],[]]
|
||||||
|
|
||||||
|
[[8,[2],[4]],[],[]]
|
||||||
|
[[[[6,8,10,8,5]],9],[]]
|
||||||
|
|
||||||
|
[[[]],[],[[[8,3,5,4,4],[9,5,4],[2],[9,4,3],[3,7,3,9]]],[4,[3,[]],0,[[10,9,0],2,8,[1],[]]]]
|
||||||
|
[[],[7,[]]]
|
||||||
|
|
||||||
|
[[],[1,[2,5,[]],4,10,2],[0,8,5,[[10,9],1],[[],3,[3,6,0,7,2],0,[2]]],[[[7,2,9,2],[],[3],8,[]],10,[8,0,[6]],[10]],[5,[[9,10],2,[9]],3,[9,[4,9,5,9,7]]]]
|
||||||
|
[[[[2],[5,1,3,2,10]],[7,[3,7,4,2,7],[9,2,6,8],1],[[8,4,3],[8,8,5],5,6,6]],[]]
|
||||||
|
|
||||||
|
[[6],[7,[[0]],[3,7,[7,5,8,0,9]]],[],[7,[3]],[0,0]]
|
||||||
|
[[0,0],[[9,0],[[10,7],[2,5,8,8],6],[[9,5,3,3,9],[7,4],8,6,2]]]
|
||||||
|
|
||||||
|
[[[],[3],1],[[[0,4,0,8,0],3,[5,1,9,5]],8,8,6]]
|
||||||
|
[[2,1,5]]
|
||||||
|
|
||||||
|
[[],[[8,[6,1,0,9],6],9,3,1]]
|
||||||
|
[[],[4]]
|
||||||
|
|
||||||
|
[[[[3,5,4,10,4],10,[2,3],9],8,[4,[2,4,3,10,6]],5]]
|
||||||
|
[[0,8,[]],[10],[8,[2,[9,6,9,9],[10,9]],8,[1,0,2],7],[[8,5,[1,2],[7,7,5,1],[1,5,6,6,0]],8,[],[0,[9],1,[3],[8,4]]],[[6],9,8,5,[0,3,[8,10,4,9]]]]
|
||||||
|
|
||||||
|
[[[1,[5,2,4,0],[3,8,7,3],[6,4],[]]],[],[],[7,8]]
|
||||||
|
[[[[7,4],7,[5,8,2,4,9],8,[8,7,10,7]]],[[5,[],8,[0,9,4,5,8]],[[5,1,8],10,[],7,8],0,[],1],[[[0,3,3],[]],2]]
|
||||||
|
|
||||||
|
[[],[[7,[7,10,3,8,8],[],6]],[3,[[2,0,8,2],[],2],[[4,7,2,7,10],5,[0,6]],10,[[],[8,0,8,9,0],[0,1,10,8,1],3,9]],[[[3,3,0,6]],[[10,1,0,5,8],7,3]],[0,[4,[1,1,0,10,10],5,1],[[1,4,8,2],8,[6,9,1],8],1]]
|
||||||
|
[[10,10],[6,6,[5,[],6,[4,4,9,9]],4],[],[7]]
|
||||||
|
|
||||||
|
[[],[[[8,5,2,0]],7,4],[[8,[7]],1],[],[0,0,[1,[0,6,10],[4],[],1],[4],3]]
|
||||||
|
[[[[],[10,1],9,[2,6]],[[],9],[3,[7,0,10,3,8],[0,6]],3],[1,[[3,7,6,5]]],[[]],[[],[10,2,0,[8,3]]]]
|
||||||
|
|
||||||
|
[[[0]],[4,7,[[3,8,4],9],[[8,1,5],[1,1,7,6,2]]],[],[]]
|
||||||
|
[[[5,0],[3],[1],[]],[[[5,1],6,7,0,10]],[[[6,0,1],0,[]],[9],[],[[9]],[9,[6,0,4,1]]],[]]
|
||||||
|
|
||||||
|
[[10],[],[3]]
|
||||||
|
[[[[5,2,0,3],5,[],[7,1,5,7]]]]
|
||||||
|
|
||||||
|
[[[5,10,[3,4,5,4],8,0]],[[4],[[3,9,2,8,0],6,6]],[[],7,5,[0,0,[],[10]]]]
|
||||||
|
[[2,3,5,[[9,5],6],0],[[[4,5,7,6,5],[6,1,9],8,[6,6,6],8],[7],8,5],[0,[6,[0,9,3,5],[9,1,9],3,7],[]],[[[1,6,0,5,0],[1,2,5,6,8],0,8],7]]
|
||||||
|
|
||||||
|
[[[],9],[]]
|
||||||
|
[[8],[[[]],[],[3,3,[10,7,9,0,6],0],9],[],[[[5,10,5,8,10],[5,1,8,10,8]],6,0,[3],[[]]]]
|
||||||
|
|
||||||
|
[[7,[]]]
|
||||||
|
[[[],9,[[0,9,1],[6],9,[8,4,10,4,7],[6]]],[3,[2,[0,5],7,9],2],[[[9],7,[1,7],9]]]
|
||||||
56
2022/go/utils/inputFile.go
Normal file
56
2022/go/utils/inputFile.go
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GenInputFile(day int) string {
|
||||||
|
var d string
|
||||||
|
if day < 10 {
|
||||||
|
d = fmt.Sprintf("0%d", day)
|
||||||
|
} else {
|
||||||
|
d = fmt.Sprintf("%d", day)
|
||||||
|
}
|
||||||
|
|
||||||
|
pwd, _ := os.Getwd()
|
||||||
|
path := fmt.Sprintf("%s\\day%s\\input.txt", pwd, d)
|
||||||
|
fi, _ := os.Stat(path)
|
||||||
|
if fi != nil {
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Creating new input file...")
|
||||||
|
f, _ := os.OpenFile(path, os.O_CREATE, 0700)
|
||||||
|
f.WriteString(readHttp(2022, day))
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
func readHttp(year, day int) string {
|
||||||
|
fmt.Println("Fetching data into file...")
|
||||||
|
|
||||||
|
url := fmt.Sprintf("https://adventofcode.com/%d/day/%d/input", year, day)
|
||||||
|
session := os.Getenv("sessionAoC")
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
req.AddCookie(&http.Cookie{Name: "session", Value: session})
|
||||||
|
client := &http.Client{}
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(body)
|
||||||
|
}
|
||||||
|
|
||||||
16
2023/go/.vscode/launch.json
vendored
Normal file
16
2023/go/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Launch Package",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "auto",
|
||||||
|
"args": ["16"],
|
||||||
|
"program": "${fileDirname}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
101
2023/go/day08/day08.go
Normal file
101
2023/go/day08/day08.go
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
_ "adventofcode2023/utils"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Node struct {
|
||||||
|
left string
|
||||||
|
right string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Network map[string]Node
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
instructions, network := parseInput(input)
|
||||||
|
return getSteps("AAA", instructions, network, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
instructions, nexts, network := parseInput2(input)
|
||||||
|
fmt.Println(nexts)
|
||||||
|
ans := 1
|
||||||
|
for _, next := range nexts {
|
||||||
|
ans = lcm(ans, getSteps(next, instructions, network, false))
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
// gcd calculates the greatest common divisor using Euclid's algorithm
|
||||||
|
func gcd(a, b int) int {
|
||||||
|
for b != 0 {
|
||||||
|
a, b = b, a%b
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// lcm calculates the least common multiple using the formula: LCM(a, b) = |a * b| / GCD(a, b)
|
||||||
|
func lcm(a, b int) int {
|
||||||
|
if a == 0 || b == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return int(math.Abs(float64(a*b)) / float64(gcd(a, b)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([]rune, Network) {
|
||||||
|
network := make(Network)
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
instructions := []rune(lines[0])
|
||||||
|
re := regexp.MustCompile(`(\w+) = \((\w+), (\w+)\)`)
|
||||||
|
|
||||||
|
for _, line := range lines[2:] {
|
||||||
|
matches := re.FindAllStringSubmatch(line, -1)
|
||||||
|
network[matches[0][1]] = Node{matches[0][2], matches[0][3]}
|
||||||
|
}
|
||||||
|
return instructions, network
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput2(input string) ([]rune, []string, Network) {
|
||||||
|
network := make(Network)
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
start := []string{}
|
||||||
|
instructions := []rune(lines[0])
|
||||||
|
re := regexp.MustCompile(`(\w+) = \((\w+), (\w+)\)`)
|
||||||
|
|
||||||
|
for _, line := range lines[2:] {
|
||||||
|
matches := re.FindAllStringSubmatch(line, -1)
|
||||||
|
network[matches[0][1]] = Node{matches[0][2], matches[0][3]}
|
||||||
|
if matches[0][1][2] == 'A' {
|
||||||
|
start = append(start, matches[0][1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instructions, start, network
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSteps(next string, instructions []rune, network Network, partOne bool) int{
|
||||||
|
steps := 0
|
||||||
|
for {
|
||||||
|
for _, ins := range instructions {
|
||||||
|
steps++
|
||||||
|
if ins == 'L' {
|
||||||
|
next = network[next].left
|
||||||
|
} else {
|
||||||
|
next = network[next].right
|
||||||
|
}
|
||||||
|
if partOne {
|
||||||
|
if next == "ZZZ" {
|
||||||
|
return steps
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if next[2] == 'Z' {
|
||||||
|
fmt.Println(next)
|
||||||
|
return steps
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
32
2023/go/day08/day08_test.go
Normal file
32
2023/go/day08/day08_test.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`LLR
|
||||||
|
|
||||||
|
AAA = (BBB, BBB)
|
||||||
|
BBB = (AAA, ZZZ)
|
||||||
|
ZZZ = (ZZZ, ZZZ)`)
|
||||||
|
require.Equal(t, 6, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`LR
|
||||||
|
|
||||||
|
11A = (11B, XXX)
|
||||||
|
11B = (XXX, 11Z)
|
||||||
|
11Z = (11B, XXX)
|
||||||
|
22A = (22B, XXX)
|
||||||
|
22B = (22C, 22C)
|
||||||
|
22C = (22Z, 22Z)
|
||||||
|
22Z = (22B, 22B)
|
||||||
|
XXX = (XXX, XXX)`)
|
||||||
|
require.Equal(t, 6, r)
|
||||||
|
}
|
||||||
704
2023/go/day08/input.txt
Normal file
704
2023/go/day08/input.txt
Normal file
@@ -0,0 +1,704 @@
|
|||||||
|
LRRRLRRRLRRLRRLRLRRLRRLRRRLRRLRRRLRRRLLRRRLRRRLRRRLRLRRLRRRLRLRRRLRRRLLRLRLRRLRRLLLRRLRRLRRRLLRRRLLRRRLRLRRRLRRRLLRRLRLLRLRRRLRRLRRLRLRLRLRLRLRRRLRLRRRLLRLRRLRRRLRRRLRLRRLRLLLRLRLRLRLRLRRRLLRRLRLRLLRRRLRRLRRRLRRLRRLRRRLLRRLRLRRLRRRLRRLRLRRLRLLRRLLRLRRRLRRLRLLRRRR
|
||||||
|
|
||||||
|
RHQ = (QNL, HDC)
|
||||||
|
FVH = (LMX, SDD)
|
||||||
|
MCR = (THP, XKJ)
|
||||||
|
RFJ = (TVQ, HGJ)
|
||||||
|
MLK = (KKF, MMK)
|
||||||
|
JDL = (XXQ, BFT)
|
||||||
|
KXN = (HFS, XFM)
|
||||||
|
NJP = (MSB, PBD)
|
||||||
|
KDR = (VFC, SBM)
|
||||||
|
RKR = (MBK, RFS)
|
||||||
|
RJB = (PQK, FHB)
|
||||||
|
XTL = (LMG, LMF)
|
||||||
|
QDD = (KFF, JSD)
|
||||||
|
CFP = (VBK, XNS)
|
||||||
|
BQX = (FFP, SKX)
|
||||||
|
NSJ = (HNC, MLQ)
|
||||||
|
KQQ = (LTG, TNH)
|
||||||
|
KVN = (SSJ, LNK)
|
||||||
|
QCT = (FQQ, LLX)
|
||||||
|
LBB = (VMQ, THT)
|
||||||
|
DPQ = (PGL, GTC)
|
||||||
|
RTH = (QNQ, CMS)
|
||||||
|
QLS = (NFV, FKX)
|
||||||
|
FST = (DNQ, QJQ)
|
||||||
|
MHX = (LFT, JDL)
|
||||||
|
JLF = (CCF, JNJ)
|
||||||
|
TQJ = (VVT, TBV)
|
||||||
|
HSC = (LKR, GTS)
|
||||||
|
GHV = (NFS, RNT)
|
||||||
|
VBK = (CPT, MBX)
|
||||||
|
HVV = (CFH, QGR)
|
||||||
|
JMG = (LXR, NHP)
|
||||||
|
DDJ = (LNK, SSJ)
|
||||||
|
NKV = (HLG, TCT)
|
||||||
|
QBG = (FHB, PQK)
|
||||||
|
FKH = (DDS, JLK)
|
||||||
|
TLF = (VKH, QLQ)
|
||||||
|
NTR = (MLL, GKH)
|
||||||
|
KFF = (MDN, HCD)
|
||||||
|
NPF = (FCP, VLM)
|
||||||
|
PKP = (HXS, KGH)
|
||||||
|
DVV = (TDH, XKB)
|
||||||
|
SNM = (BJN, SGS)
|
||||||
|
JVC = (PKX, CGR)
|
||||||
|
VLB = (RDM, VBP)
|
||||||
|
RQQ = (KQQ, HHB)
|
||||||
|
SHH = (RRP, CSQ)
|
||||||
|
DPN = (HLR, LCK)
|
||||||
|
MCT = (BQG, SMV)
|
||||||
|
FNJ = (QML, TVP)
|
||||||
|
RGK = (CTF, KTS)
|
||||||
|
HNC = (VPX, PPR)
|
||||||
|
JLG = (THT, VMQ)
|
||||||
|
RJJ = (PLT, TFH)
|
||||||
|
VRK = (CMS, QNQ)
|
||||||
|
JGJ = (JLF, RFM)
|
||||||
|
RMD = (BVV, XTG)
|
||||||
|
MBB = (QTQ, MCH)
|
||||||
|
KDN = (LMF, LMG)
|
||||||
|
SPR = (KHB, BPG)
|
||||||
|
TFN = (CTT, JGH)
|
||||||
|
LXR = (VTV, GRD)
|
||||||
|
MPX = (LSD, RDD)
|
||||||
|
SDN = (FLL, XSG)
|
||||||
|
RMR = (TMB, NKV)
|
||||||
|
FJM = (STG, DLM)
|
||||||
|
HKK = (VPV, HFQ)
|
||||||
|
GQG = (JDL, LFT)
|
||||||
|
SQM = (CJM, HSN)
|
||||||
|
BFM = (LKX, LKX)
|
||||||
|
KMH = (NDL, GNG)
|
||||||
|
THT = (DXV, PHQ)
|
||||||
|
XHT = (FXG, PVN)
|
||||||
|
JCJ = (BVJ, FKM)
|
||||||
|
MBX = (CKQ, CST)
|
||||||
|
XPJ = (QHB, RKH)
|
||||||
|
NLL = (KXP, RXV)
|
||||||
|
VJD = (MBK, RFS)
|
||||||
|
SGS = (QQB, DMG)
|
||||||
|
FBS = (PQH, MCR)
|
||||||
|
XFT = (FHC, PKJ)
|
||||||
|
LXS = (GCR, FVL)
|
||||||
|
CPC = (KFS, RTM)
|
||||||
|
PKX = (CND, KFP)
|
||||||
|
TKK = (XBR, NTR)
|
||||||
|
NTJ = (QCQ, MJQ)
|
||||||
|
DVC = (TPP, FBS)
|
||||||
|
NVC = (DPN, CNF)
|
||||||
|
CFG = (TRX, VFS)
|
||||||
|
SDQ = (KMH, GFG)
|
||||||
|
GNG = (RLH, FKJ)
|
||||||
|
TXL = (XNP, XHF)
|
||||||
|
FKM = (STF, BDQ)
|
||||||
|
DDN = (NKG, CFP)
|
||||||
|
KMB = (NKG, CFP)
|
||||||
|
VQD = (TQJ, VGS)
|
||||||
|
DBX = (BGX, SSX)
|
||||||
|
QTX = (QCX, MSS)
|
||||||
|
VMN = (SDQ, DFD)
|
||||||
|
MJQ = (GGM, XSR)
|
||||||
|
VGS = (TBV, VVT)
|
||||||
|
HDC = (NNN, BNV)
|
||||||
|
FVB = (TQS, XBQ)
|
||||||
|
QML = (LDS, PVQ)
|
||||||
|
GTS = (PJK, XQP)
|
||||||
|
LLX = (QNG, RHD)
|
||||||
|
NRG = (VFK, QHK)
|
||||||
|
KVD = (MBB, TJD)
|
||||||
|
FMV = (CSX, BKH)
|
||||||
|
RDK = (NKP, JGJ)
|
||||||
|
HFR = (DFD, SDQ)
|
||||||
|
QLQ = (VMN, HFR)
|
||||||
|
MVB = (JNM, DKL)
|
||||||
|
RXQ = (MMT, DFP)
|
||||||
|
QQP = (VFS, TRX)
|
||||||
|
SCN = (XRD, XRD)
|
||||||
|
SDR = (JKQ, XHC)
|
||||||
|
VCB = (JGD, VQD)
|
||||||
|
PPR = (KGD, DJJ)
|
||||||
|
QVZ = (JLB, DXR)
|
||||||
|
CMT = (JDG, CNN)
|
||||||
|
FGX = (HRX, VLQ)
|
||||||
|
KTS = (CPB, DMP)
|
||||||
|
CJM = (VTX, NTJ)
|
||||||
|
SPQ = (RGS, KKV)
|
||||||
|
DDS = (MCT, FMS)
|
||||||
|
LMT = (RJJ, MTR)
|
||||||
|
NNN = (RTH, VRK)
|
||||||
|
NHP = (GRD, VTV)
|
||||||
|
CGX = (MMM, MJT)
|
||||||
|
FDQ = (NHM, QTX)
|
||||||
|
XHF = (JGM, PBC)
|
||||||
|
QJQ = (TFJ, HKR)
|
||||||
|
STF = (RFR, DHN)
|
||||||
|
CVV = (LSD, RDD)
|
||||||
|
MPR = (JVC, XMS)
|
||||||
|
VFG = (MFV, RPC)
|
||||||
|
DVH = (SHS, FML)
|
||||||
|
CNF = (LCK, HLR)
|
||||||
|
VFK = (GSH, FVB)
|
||||||
|
HXB = (KPC, PMF)
|
||||||
|
TRX = (VMG, LXF)
|
||||||
|
DBP = (KQQ, HHB)
|
||||||
|
TKQ = (RCD, RLC)
|
||||||
|
MFT = (BNR, TFN)
|
||||||
|
XMM = (GCR, FVL)
|
||||||
|
DSJ = (QLS, CFJ)
|
||||||
|
XNM = (RKJ, MGB)
|
||||||
|
CPB = (CDM, XSL)
|
||||||
|
BVV = (DQK, FDC)
|
||||||
|
XVN = (VVM, NTB)
|
||||||
|
LTB = (MBB, TJD)
|
||||||
|
LTG = (FCK, JMG)
|
||||||
|
JTG = (CGX, PBQ)
|
||||||
|
MSB = (PXM, SHH)
|
||||||
|
GHS = (XDT, RKG)
|
||||||
|
HPN = (PMF, KPC)
|
||||||
|
VHN = (MHX, GQG)
|
||||||
|
PGB = (XBR, NTR)
|
||||||
|
RHD = (NFR, XRV)
|
||||||
|
DKL = (CDJ, MPR)
|
||||||
|
PVN = (LSN, RRQ)
|
||||||
|
VFC = (QXB, RTX)
|
||||||
|
HFQ = (MCC, QVB)
|
||||||
|
MGB = (RGN, TGP)
|
||||||
|
JDD = (KVB, GGL)
|
||||||
|
GRB = (FCC, GHR)
|
||||||
|
NLC = (NJC, JJL)
|
||||||
|
FQM = (MSB, PBD)
|
||||||
|
VSN = (BPD, FKN)
|
||||||
|
RFS = (GKT, TQQ)
|
||||||
|
XSG = (RKS, RRV)
|
||||||
|
CXS = (SHB, XDD)
|
||||||
|
MKN = (JNQ, SDN)
|
||||||
|
PXM = (RRP, CSQ)
|
||||||
|
JNQ = (XSG, FLL)
|
||||||
|
NCP = (HPV, KKX)
|
||||||
|
NKS = (PJH, XPT)
|
||||||
|
PGL = (VGD, VGD)
|
||||||
|
SDD = (LRG, FRT)
|
||||||
|
JKV = (XVS, KKR)
|
||||||
|
LXF = (BFM, PSF)
|
||||||
|
XBR = (GKH, MLL)
|
||||||
|
DQK = (RSF, STP)
|
||||||
|
QLR = (DXR, JLB)
|
||||||
|
DQD = (LCC, XFT)
|
||||||
|
CST = (VFG, NRV)
|
||||||
|
SNR = (BPG, KHB)
|
||||||
|
GKH = (BNJ, NRL)
|
||||||
|
XTG = (FDC, DQK)
|
||||||
|
PBC = (JFV, VHN)
|
||||||
|
FRT = (SXR, CTX)
|
||||||
|
TTQ = (MGB, RKJ)
|
||||||
|
TKJ = (HHM, RTD)
|
||||||
|
LLQ = (RNT, NFS)
|
||||||
|
QGZ = (NQV, CCP)
|
||||||
|
GCN = (CSX, BKH)
|
||||||
|
SSM = (RCF, VNG)
|
||||||
|
XRT = (DLB, BJB)
|
||||||
|
BVJ = (STF, BDQ)
|
||||||
|
QXM = (CSK, SDR)
|
||||||
|
QJM = (DBP, RQQ)
|
||||||
|
VVM = (KDD, HDN)
|
||||||
|
CTX = (JVG, XCN)
|
||||||
|
XCM = (KXN, KCQ)
|
||||||
|
FDC = (RSF, STP)
|
||||||
|
KFS = (KMF, XSS)
|
||||||
|
RVN = (GDL, GHS)
|
||||||
|
JXZ = (RMD, SMQ)
|
||||||
|
SXF = (VBP, RDM)
|
||||||
|
JCS = (RQF, QFL)
|
||||||
|
CSX = (RXD, LSC)
|
||||||
|
TXS = (GBQ, JHK)
|
||||||
|
RQF = (MBC, SQM)
|
||||||
|
QXB = (NXK, DFN)
|
||||||
|
PKJ = (BSB, NDP)
|
||||||
|
VMQ = (DXV, PHQ)
|
||||||
|
HLG = (NCP, KBQ)
|
||||||
|
CSQ = (LJP, BGN)
|
||||||
|
MMT = (MVB, GHX)
|
||||||
|
KXG = (XCF, HKK)
|
||||||
|
FBH = (XFT, LCC)
|
||||||
|
SQG = (LTB, KVD)
|
||||||
|
VMG = (BFM, PSF)
|
||||||
|
FFP = (SSF, QJM)
|
||||||
|
KVF = (JCS, GMR)
|
||||||
|
HXS = (RLR, NPQ)
|
||||||
|
PVM = (BMM, PTQ)
|
||||||
|
JFD = (DLB, BJB)
|
||||||
|
FTD = (BMP, XXL)
|
||||||
|
JLK = (FMS, MCT)
|
||||||
|
BGN = (JTG, NCV)
|
||||||
|
KGH = (NPQ, RLR)
|
||||||
|
QFL = (MBC, SQM)
|
||||||
|
XNP = (JGM, PBC)
|
||||||
|
DHN = (SPR, SNR)
|
||||||
|
LJP = (JTG, NCV)
|
||||||
|
KKX = (PKP, GTB)
|
||||||
|
KKR = (KKC, SNM)
|
||||||
|
DBG = (LKR, GTS)
|
||||||
|
RCN = (FQQ, LLX)
|
||||||
|
BKH = (RXD, LSC)
|
||||||
|
HCD = (KDR, LGD)
|
||||||
|
KVB = (JLS, TMH)
|
||||||
|
SPC = (SXF, VLB)
|
||||||
|
NKG = (XNS, VBK)
|
||||||
|
FNN = (RMB, NPF)
|
||||||
|
QNT = (SJD, KTM)
|
||||||
|
RXK = (NKV, TMB)
|
||||||
|
RDF = (FCJ, FST)
|
||||||
|
XSS = (GKK, SQG)
|
||||||
|
LRG = (SXR, CTX)
|
||||||
|
FMS = (SMV, BQG)
|
||||||
|
DVA = (DXR, JLB)
|
||||||
|
JKQ = (KTP, RDF)
|
||||||
|
LCC = (FHC, PKJ)
|
||||||
|
LSD = (NKS, DPC)
|
||||||
|
HHM = (BTG, NXB)
|
||||||
|
XBQ = (QPF, TLF)
|
||||||
|
JNM = (MPR, CDJ)
|
||||||
|
TCB = (KXG, PJD)
|
||||||
|
TBV = (RXK, RMR)
|
||||||
|
KTP = (FCJ, FST)
|
||||||
|
HSN = (VTX, NTJ)
|
||||||
|
GDL = (XDT, RKG)
|
||||||
|
FCJ = (DNQ, QJQ)
|
||||||
|
DXR = (FFT, HNQ)
|
||||||
|
RTB = (SVP, BQX)
|
||||||
|
HLR = (DSC, SSR)
|
||||||
|
LVL = (QML, TVP)
|
||||||
|
KXQ = (RJP, DVV)
|
||||||
|
BKN = (LXS, XMM)
|
||||||
|
JHK = (FFR, QXX)
|
||||||
|
DLS = (MKN, PTL)
|
||||||
|
BTD = (CCP, NQV)
|
||||||
|
JVG = (LMT, SKC)
|
||||||
|
FFT = (LTR, PMD)
|
||||||
|
XDD = (KRC, JBN)
|
||||||
|
QNL = (BNV, NNN)
|
||||||
|
LNK = (KDN, XTL)
|
||||||
|
CMS = (DLS, VQG)
|
||||||
|
TJD = (MCH, QTQ)
|
||||||
|
LHR = (HNC, MLQ)
|
||||||
|
FKS = (MPX, CVV)
|
||||||
|
CCP = (XFP, XHT)
|
||||||
|
QCX = (KQL, SPQ)
|
||||||
|
KXP = (QXM, QXM)
|
||||||
|
HHG = (FML, SHS)
|
||||||
|
HDS = (KTS, CTF)
|
||||||
|
BPG = (GMQ, NDD)
|
||||||
|
QPR = (TFG, CDF)
|
||||||
|
QCQ = (GGM, XSR)
|
||||||
|
DFN = (KXQ, XCV)
|
||||||
|
KRC = (FGX, XTP)
|
||||||
|
RLR = (DDJ, KVN)
|
||||||
|
PVX = (TGJ, XPJ)
|
||||||
|
SVX = (MQN, QNJ)
|
||||||
|
VQG = (PTL, MKN)
|
||||||
|
GTM = (CFH, QGR)
|
||||||
|
KVJ = (JLK, DDS)
|
||||||
|
HHB = (TNH, LTG)
|
||||||
|
BCB = (RVN, NHB)
|
||||||
|
XTP = (HRX, VLQ)
|
||||||
|
DJJ = (PGT, VCM)
|
||||||
|
JQA = (CSK, SDR)
|
||||||
|
PSR = (GLC, DQV)
|
||||||
|
HDN = (CPC, GCF)
|
||||||
|
VPX = (DJJ, KGD)
|
||||||
|
BNR = (CTT, JGH)
|
||||||
|
QRC = (XDD, SHB)
|
||||||
|
VRX = (XNP, XHF)
|
||||||
|
BTG = (QNS, QDL)
|
||||||
|
RRP = (LJP, BGN)
|
||||||
|
PFS = (RJB, QBG)
|
||||||
|
BSB = (LKN, SBH)
|
||||||
|
RXD = (SHQ, RHR)
|
||||||
|
JJL = (VCK, RTB)
|
||||||
|
RJP = (XKB, TDH)
|
||||||
|
RCD = (DPT, FXX)
|
||||||
|
PHQ = (PDH, KVF)
|
||||||
|
DDL = (JSD, KFF)
|
||||||
|
VBP = (DDN, KMB)
|
||||||
|
GRD = (KVJ, FKH)
|
||||||
|
CKQ = (NRV, VFG)
|
||||||
|
KNM = (PTQ, BMM)
|
||||||
|
XCD = (NXG, FSP)
|
||||||
|
LGD = (VFC, SBM)
|
||||||
|
RTD = (NXB, BTG)
|
||||||
|
VCK = (SVP, BQX)
|
||||||
|
GBC = (NHB, RVN)
|
||||||
|
STP = (MQQ, KGJ)
|
||||||
|
NKP = (RFM, JLF)
|
||||||
|
JBN = (XTP, FGX)
|
||||||
|
SBS = (RGK, HDS)
|
||||||
|
RRQ = (FDM, CSB)
|
||||||
|
FDM = (KSX, TFM)
|
||||||
|
NXB = (QDL, QNS)
|
||||||
|
NHB = (GHS, GDL)
|
||||||
|
DQV = (FNJ, LVL)
|
||||||
|
MBC = (HSN, CJM)
|
||||||
|
QHK = (FVB, GSH)
|
||||||
|
MDN = (KDR, LGD)
|
||||||
|
FCP = (PBH, RHQ)
|
||||||
|
NRL = (DXL, KXK)
|
||||||
|
MSS = (SPQ, KQL)
|
||||||
|
PBD = (SHH, PXM)
|
||||||
|
JBB = (XKD, PSR)
|
||||||
|
TVP = (PVQ, LDS)
|
||||||
|
DKB = (TTQ, XNM)
|
||||||
|
LSN = (FDM, CSB)
|
||||||
|
XRD = (CQQ, CQQ)
|
||||||
|
TGP = (MMV, BKN)
|
||||||
|
NDD = (VCB, NSB)
|
||||||
|
FSP = (KNM, PVM)
|
||||||
|
CDM = (VSC, VSC)
|
||||||
|
NXG = (PVM, KNM)
|
||||||
|
SSF = (DBP, RQQ)
|
||||||
|
RKJ = (TGP, RGN)
|
||||||
|
SRF = (FJM, CPG)
|
||||||
|
MSP = (RLC, RCD)
|
||||||
|
BDQ = (RFR, DHN)
|
||||||
|
DTR = (LBN, GRB)
|
||||||
|
SHS = (SRF, QBT)
|
||||||
|
LGT = (JHK, GBQ)
|
||||||
|
BQG = (SBS, LHK)
|
||||||
|
XVS = (SNM, KKC)
|
||||||
|
TFG = (VSN, VSN)
|
||||||
|
NTB = (HDN, KDD)
|
||||||
|
HNQ = (PMD, LTR)
|
||||||
|
PMF = (XCM, RPX)
|
||||||
|
FLV = (NJP, FQM)
|
||||||
|
PTQ = (PFS, XPF)
|
||||||
|
XXQ = (PGB, TKK)
|
||||||
|
PJL = (DQD, FBH)
|
||||||
|
GHX = (JNM, DKL)
|
||||||
|
GMR = (QFL, RQF)
|
||||||
|
TFH = (DTR, HNK)
|
||||||
|
KVM = (PGL, GTC)
|
||||||
|
DPC = (XPT, PJH)
|
||||||
|
KDD = (GCF, CPC)
|
||||||
|
JMM = (FBH, DQD)
|
||||||
|
XCF = (VPV, VPV)
|
||||||
|
JLS = (HSC, DBG)
|
||||||
|
GKT = (BKM, KSH)
|
||||||
|
DNQ = (TFJ, HKR)
|
||||||
|
PTA = (SMQ, RMD)
|
||||||
|
XFV = (RKR, VJD)
|
||||||
|
RKG = (LHR, NSJ)
|
||||||
|
RPC = (JDD, HPK)
|
||||||
|
HNK = (GRB, LBN)
|
||||||
|
NSB = (VQD, JGD)
|
||||||
|
HKR = (MQT, XHH)
|
||||||
|
FKX = (BXX, RTN)
|
||||||
|
BPD = (NRG, LPP)
|
||||||
|
NJC = (RTB, VCK)
|
||||||
|
QXX = (CKT, MRX)
|
||||||
|
SFG = (DDL, QDD)
|
||||||
|
FGV = (PSR, XKD)
|
||||||
|
PJH = (NRJ, NVC)
|
||||||
|
CPG = (STG, DLM)
|
||||||
|
NPQ = (DDJ, KVN)
|
||||||
|
SSR = (PCJ, HVX)
|
||||||
|
XCV = (RJP, DVV)
|
||||||
|
SMV = (LHK, SBS)
|
||||||
|
PCJ = (FTK, HHN)
|
||||||
|
RHX = (FDK, DBX)
|
||||||
|
DXL = (XFV, PKV)
|
||||||
|
RDM = (KMB, DDN)
|
||||||
|
NFR = (QQP, CFG)
|
||||||
|
VNG = (MSP, TKQ)
|
||||||
|
QDL = (DSQ, QNT)
|
||||||
|
HPV = (GTB, PKP)
|
||||||
|
SBM = (QXB, RTX)
|
||||||
|
RGQ = (SXF, VLB)
|
||||||
|
NRV = (MFV, RPC)
|
||||||
|
DFD = (GFG, KMH)
|
||||||
|
RRV = (RDK, HSB)
|
||||||
|
PBH = (QNL, HDC)
|
||||||
|
MMV = (LXS, XMM)
|
||||||
|
VVT = (RMR, RXK)
|
||||||
|
RPX = (KXN, KCQ)
|
||||||
|
LPP = (VFK, QHK)
|
||||||
|
RLH = (NHF, JKV)
|
||||||
|
TPP = (MCR, PQH)
|
||||||
|
XPB = (TGJ, XPJ)
|
||||||
|
FVL = (RNM, JCJ)
|
||||||
|
KGJ = (HPN, HXB)
|
||||||
|
GKK = (LTB, KVD)
|
||||||
|
BGX = (TTS, PHD)
|
||||||
|
BNJ = (KXK, DXL)
|
||||||
|
KBQ = (HPV, KKX)
|
||||||
|
NFS = (JMM, PJL)
|
||||||
|
BXX = (JLG, LBB)
|
||||||
|
TNH = (FCK, JMG)
|
||||||
|
BJB = (DVC, HSL)
|
||||||
|
KHB = (NDD, GMQ)
|
||||||
|
SKX = (SSF, QJM)
|
||||||
|
LTR = (PVX, XPB)
|
||||||
|
FDK = (SSX, BGX)
|
||||||
|
LBN = (FCC, GHR)
|
||||||
|
STG = (DJM, RHX)
|
||||||
|
KGD = (VCM, PGT)
|
||||||
|
PDH = (JCS, GMR)
|
||||||
|
MCC = (QLR, QLR)
|
||||||
|
GKN = (TTQ, XNM)
|
||||||
|
KKC = (SGS, BJN)
|
||||||
|
JDG = (NPX, PKR)
|
||||||
|
DXV = (KVF, PDH)
|
||||||
|
PGT = (QQH, GPS)
|
||||||
|
GGL = (JLS, TMH)
|
||||||
|
LRH = (QGG, LQN)
|
||||||
|
XDT = (LHR, NSJ)
|
||||||
|
TFJ = (XHH, MQT)
|
||||||
|
CKT = (FTD, VPL)
|
||||||
|
QNM = (GPD, HFT)
|
||||||
|
QQB = (HHG, DVH)
|
||||||
|
LKX = (MQN, MQN)
|
||||||
|
HFT = (CMT, ZZZ)
|
||||||
|
GTC = (VGD, NLL)
|
||||||
|
DFP = (MVB, GHX)
|
||||||
|
NDP = (LKN, SBH)
|
||||||
|
PJK = (VRX, TXL)
|
||||||
|
GBQ = (QXX, FFR)
|
||||||
|
BJN = (QQB, DMG)
|
||||||
|
RCF = (TKQ, MSP)
|
||||||
|
FCK = (NHP, LXR)
|
||||||
|
HHN = (RFJ, KHX)
|
||||||
|
XNS = (MBX, CPT)
|
||||||
|
XFM = (SPC, RGQ)
|
||||||
|
VTV = (FKH, KVJ)
|
||||||
|
PXP = (NHM, QTX)
|
||||||
|
FKN = (LPP, NRG)
|
||||||
|
DLM = (DJM, RHX)
|
||||||
|
BCQ = (TFG, TFG)
|
||||||
|
RFR = (SPR, SNR)
|
||||||
|
GPS = (NBG, MKL)
|
||||||
|
FML = (SRF, QBT)
|
||||||
|
JLB = (HNQ, FFT)
|
||||||
|
DLB = (DVC, HSL)
|
||||||
|
DMP = (CDM, XSL)
|
||||||
|
VCM = (QQH, GPS)
|
||||||
|
SKC = (MTR, RJJ)
|
||||||
|
TQZ = (SDR, CSK)
|
||||||
|
XHH = (CXS, QRC)
|
||||||
|
KKF = (RCN, QCT)
|
||||||
|
TDH = (BGT, TCB)
|
||||||
|
DSC = (HVX, PCJ)
|
||||||
|
CND = (XVN, PCV)
|
||||||
|
QBT = (FJM, CPG)
|
||||||
|
KCQ = (HFS, XFM)
|
||||||
|
KFP = (PCV, XVN)
|
||||||
|
MCH = (NLC, NNC)
|
||||||
|
TGJ = (RKH, QHB)
|
||||||
|
RTN = (LBB, JLG)
|
||||||
|
XSL = (VSC, QNM)
|
||||||
|
SMQ = (BVV, XTG)
|
||||||
|
PQH = (XKJ, THP)
|
||||||
|
XQP = (TXL, VRX)
|
||||||
|
PQK = (DRQ, MLK)
|
||||||
|
QNQ = (VQG, DLS)
|
||||||
|
SJD = (JBB, FGV)
|
||||||
|
XSR = (LLQ, GHV)
|
||||||
|
CFJ = (NFV, FKX)
|
||||||
|
RNM = (BVJ, FKM)
|
||||||
|
FSS = (PLL, DSG)
|
||||||
|
SSJ = (XTL, KDN)
|
||||||
|
JGM = (VHN, JFV)
|
||||||
|
RTM = (XSS, KMF)
|
||||||
|
MLQ = (VPX, PPR)
|
||||||
|
SBH = (GXD, LRH)
|
||||||
|
ZZZ = (CNN, JDG)
|
||||||
|
VTX = (QCQ, MJQ)
|
||||||
|
KHX = (TVQ, HGJ)
|
||||||
|
NPX = (FND, FLV)
|
||||||
|
PKR = (FLV, FND)
|
||||||
|
JGD = (VGS, TQJ)
|
||||||
|
JGH = (DPQ, KVM)
|
||||||
|
PFB = (DFP, MMT)
|
||||||
|
LHK = (RGK, HDS)
|
||||||
|
GMQ = (NSB, VCB)
|
||||||
|
DJM = (FDK, DBX)
|
||||||
|
JKH = (XRD, RBT)
|
||||||
|
CGR = (KFP, CND)
|
||||||
|
RSF = (KGJ, MQQ)
|
||||||
|
GQT = (DDL, QDD)
|
||||||
|
RNT = (PJL, JMM)
|
||||||
|
PTL = (SDN, JNQ)
|
||||||
|
NCV = (PBQ, CGX)
|
||||||
|
KTM = (FGV, JBB)
|
||||||
|
FBR = (CFJ, QLS)
|
||||||
|
BFT = (PGB, TKK)
|
||||||
|
TTS = (FDQ, PXP)
|
||||||
|
GTB = (KGH, HXS)
|
||||||
|
XFP = (FXG, PVN)
|
||||||
|
SHQ = (BCQ, BCQ)
|
||||||
|
VGD = (KXP, KXP)
|
||||||
|
CSK = (XHC, JKQ)
|
||||||
|
MLL = (NRL, BNJ)
|
||||||
|
CFH = (SFG, GQT)
|
||||||
|
BMM = (PFS, XPF)
|
||||||
|
LKN = (LRH, GXD)
|
||||||
|
HSL = (FBS, TPP)
|
||||||
|
TMB = (TCT, HLG)
|
||||||
|
CDJ = (XMS, JVC)
|
||||||
|
FQQ = (RHD, QNG)
|
||||||
|
TQQ = (BKM, KSH)
|
||||||
|
PVQ = (GKN, DKB)
|
||||||
|
QTZ = (FKN, BPD)
|
||||||
|
DSQ = (KTM, SJD)
|
||||||
|
TMH = (HSC, DBG)
|
||||||
|
QHB = (FSS, HCN)
|
||||||
|
CQQ = (SMQ, RMD)
|
||||||
|
MBK = (GKT, TQQ)
|
||||||
|
MMM = (RXQ, PFB)
|
||||||
|
LSC = (SHQ, RHR)
|
||||||
|
MQT = (CXS, QRC)
|
||||||
|
PMD = (XPB, PVX)
|
||||||
|
MMK = (QCT, RCN)
|
||||||
|
TVJ = (RCF, VNG)
|
||||||
|
FHB = (MLK, DRQ)
|
||||||
|
QNJ = (BTD, QGZ)
|
||||||
|
TVQ = (NXS, XCD)
|
||||||
|
GLC = (FNJ, LVL)
|
||||||
|
HFS = (RGQ, SPC)
|
||||||
|
BJV = (FKS, KFM)
|
||||||
|
SSX = (TTS, PHD)
|
||||||
|
FXG = (LSN, RRQ)
|
||||||
|
TQS = (TLF, QPF)
|
||||||
|
QVB = (QLR, QVZ)
|
||||||
|
BNV = (RTH, VRK)
|
||||||
|
NXS = (NXG, FSP)
|
||||||
|
KSH = (TDL, FSC)
|
||||||
|
HPK = (KVB, GGL)
|
||||||
|
KKV = (FNN, BRK)
|
||||||
|
XHC = (RDF, KTP)
|
||||||
|
LQN = (BJV, GJC)
|
||||||
|
GPD = (CMT, CMT)
|
||||||
|
HRX = (LGQ, TKJ)
|
||||||
|
CSB = (KSX, TFM)
|
||||||
|
XPT = (NRJ, NVC)
|
||||||
|
QTQ = (NNC, NLC)
|
||||||
|
VPV = (MCC, MCC)
|
||||||
|
TDL = (SCN, SCN)
|
||||||
|
CTT = (DPQ, KVM)
|
||||||
|
JFV = (GQG, MHX)
|
||||||
|
GFG = (GNG, NDL)
|
||||||
|
MKL = (TVJ, SSM)
|
||||||
|
XKB = (TCB, BGT)
|
||||||
|
XRV = (CFG, QQP)
|
||||||
|
CRA = (BPD, FKN)
|
||||||
|
VSC = (GPD, GPD)
|
||||||
|
RGS = (FNN, BRK)
|
||||||
|
MFV = (JDD, HPK)
|
||||||
|
GGM = (GHV, LLQ)
|
||||||
|
FKJ = (JKV, NHF)
|
||||||
|
GCF = (KFS, RTM)
|
||||||
|
JSD = (MDN, HCD)
|
||||||
|
SXR = (XCN, JVG)
|
||||||
|
LMF = (MXP, FVH)
|
||||||
|
AAA = (JDG, CNN)
|
||||||
|
MJT = (RXQ, PFB)
|
||||||
|
PJD = (XCF, HKK)
|
||||||
|
RDD = (NKS, DPC)
|
||||||
|
DPT = (HVV, GTM)
|
||||||
|
NHM = (QCX, MSS)
|
||||||
|
MQQ = (HXB, HPN)
|
||||||
|
FLL = (RKS, RRV)
|
||||||
|
BRK = (RMB, NPF)
|
||||||
|
FHC = (BSB, NDP)
|
||||||
|
RHR = (BCQ, QPR)
|
||||||
|
NNC = (JJL, NJC)
|
||||||
|
LKR = (XQP, PJK)
|
||||||
|
CDF = (VSN, QTZ)
|
||||||
|
MRX = (FTD, VPL)
|
||||||
|
PLT = (DTR, HNK)
|
||||||
|
VLQ = (TKJ, LGQ)
|
||||||
|
GJC = (KFM, FKS)
|
||||||
|
MQN = (BTD, BTD)
|
||||||
|
GHR = (MFT, NRB)
|
||||||
|
XXL = (FBR, DSJ)
|
||||||
|
NHF = (XVS, KKR)
|
||||||
|
LDS = (DKB, GKN)
|
||||||
|
PKV = (RKR, VJD)
|
||||||
|
KPC = (RPX, XCM)
|
||||||
|
NRJ = (DPN, CNF)
|
||||||
|
BGA = (CCP, NQV)
|
||||||
|
LCK = (DSC, SSR)
|
||||||
|
KFM = (MPX, CVV)
|
||||||
|
RMB = (FCP, VLM)
|
||||||
|
XKJ = (FMV, GCN)
|
||||||
|
NBG = (SSM, TVJ)
|
||||||
|
QPF = (VKH, QLQ)
|
||||||
|
RKH = (HCN, FSS)
|
||||||
|
HGJ = (XCD, NXS)
|
||||||
|
RGN = (MMV, BKN)
|
||||||
|
HCN = (DSG, PLL)
|
||||||
|
RFM = (CCF, JNJ)
|
||||||
|
DRQ = (KKF, MMK)
|
||||||
|
XKD = (DQV, GLC)
|
||||||
|
NXK = (KXQ, XCV)
|
||||||
|
FTK = (RFJ, KHX)
|
||||||
|
QQH = (MKL, NBG)
|
||||||
|
HSB = (NKP, JGJ)
|
||||||
|
GSH = (TQS, XBQ)
|
||||||
|
CTF = (CPB, DMP)
|
||||||
|
GCR = (RNM, JCJ)
|
||||||
|
CCF = (XRT, JFD)
|
||||||
|
DSG = (BCB, GBC)
|
||||||
|
XCN = (SKC, LMT)
|
||||||
|
PLL = (GBC, BCB)
|
||||||
|
VKH = (HFR, VMN)
|
||||||
|
PBQ = (MJT, MMM)
|
||||||
|
PSF = (LKX, SVX)
|
||||||
|
LMG = (MXP, FVH)
|
||||||
|
BMP = (FBR, DSJ)
|
||||||
|
GXD = (LQN, QGG)
|
||||||
|
XMS = (PKX, CGR)
|
||||||
|
RLC = (DPT, FXX)
|
||||||
|
NRB = (BNR, TFN)
|
||||||
|
VPL = (XXL, BMP)
|
||||||
|
PCV = (VVM, NTB)
|
||||||
|
QGR = (SFG, GQT)
|
||||||
|
PHD = (PXP, FDQ)
|
||||||
|
NQV = (XFP, XHT)
|
||||||
|
LGQ = (RTD, HHM)
|
||||||
|
CNN = (NPX, PKR)
|
||||||
|
CPT = (CST, CKQ)
|
||||||
|
BGT = (KXG, PJD)
|
||||||
|
THP = (GCN, FMV)
|
||||||
|
QGG = (BJV, GJC)
|
||||||
|
KSX = (LGT, TXS)
|
||||||
|
BKM = (TDL, FSC)
|
||||||
|
FXX = (HVV, GTM)
|
||||||
|
KMF = (SQG, GKK)
|
||||||
|
FCC = (MFT, NRB)
|
||||||
|
NDL = (FKJ, RLH)
|
||||||
|
TFM = (TXS, LGT)
|
||||||
|
LMX = (FRT, LRG)
|
||||||
|
FFR = (MRX, CKT)
|
||||||
|
KXK = (PKV, XFV)
|
||||||
|
JNJ = (XRT, JFD)
|
||||||
|
DMG = (HHG, DVH)
|
||||||
|
TCT = (NCP, KBQ)
|
||||||
|
MXP = (SDD, LMX)
|
||||||
|
FSC = (SCN, JKH)
|
||||||
|
VFS = (VMG, LXF)
|
||||||
|
RBT = (CQQ, JXZ)
|
||||||
|
RXV = (QXM, TQZ)
|
||||||
|
RKS = (HSB, RDK)
|
||||||
|
FND = (FQM, NJP)
|
||||||
|
XPF = (QBG, RJB)
|
||||||
|
LFT = (XXQ, BFT)
|
||||||
|
HVX = (HHN, FTK)
|
||||||
|
RTX = (NXK, DFN)
|
||||||
|
QNG = (XRV, NFR)
|
||||||
|
NFV = (RTN, BXX)
|
||||||
|
KQL = (RGS, KKV)
|
||||||
|
MTR = (TFH, PLT)
|
||||||
|
QNS = (QNT, DSQ)
|
||||||
|
SHB = (KRC, JBN)
|
||||||
|
SVP = (FFP, SKX)
|
||||||
|
VLM = (PBH, RHQ)
|
||||||
71
2023/go/day09/day09.go
Normal file
71
2023/go/day09/day09.go
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2023/utils/inputs"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
ins := parseInput(input)
|
||||||
|
ans := 0
|
||||||
|
for _, in := range ins {
|
||||||
|
ans += f1(in)
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
ins := parseInput(input)
|
||||||
|
ans := 0
|
||||||
|
for _, in := range ins {
|
||||||
|
reverse(in)
|
||||||
|
ans += f1(in)
|
||||||
|
}
|
||||||
|
return ans}
|
||||||
|
|
||||||
|
func f1(in []int) int {
|
||||||
|
out := []int{}
|
||||||
|
for i:=0;i<len(in)-1;i++{
|
||||||
|
out = append(out, in[i+1] - in[i])
|
||||||
|
}
|
||||||
|
if allZero(out) {
|
||||||
|
return in[len(in) -1]
|
||||||
|
} else {
|
||||||
|
return in[len(in) -1] + f1(out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func reverse(nums []int) {
|
||||||
|
for i, j := 0, len(nums)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
nums[i], nums[j] = nums[j], nums[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func allZero(in []int) bool {
|
||||||
|
for _, v := range in {
|
||||||
|
if v != 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func diff(in []int) []int {
|
||||||
|
out := []int{}
|
||||||
|
for i:=0;i<len(in)-1;i++{
|
||||||
|
out = append(out, in[i+1] - in[i])
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([][]int) {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
out := [][]int{}
|
||||||
|
for _, line := range lines {
|
||||||
|
out = append(out, inputs.ToInts(line, " "))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
23
2023/go/day09/day09_test.go
Normal file
23
2023/go/day09/day09_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`0 3 6 9 12 15
|
||||||
|
1 3 6 10 15 21
|
||||||
|
10 13 16 21 30 45`)
|
||||||
|
require.Equal(t, 114, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`0 3 6 9 12 15
|
||||||
|
1 3 6 10 15 21
|
||||||
|
10 13 16 21 30 45`)
|
||||||
|
require.Equal(t, 2, r)
|
||||||
|
}
|
||||||
200
2023/go/day09/input.txt
Normal file
200
2023/go/day09/input.txt
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
12 20 25 35 64 137 305 670 1420 2874 5537 10165 17840 30055 48809 76712 117100 174160 253065 360119 502912
|
||||||
|
4 13 35 72 138 283 626 1388 2906 5608 9961 16503 26276 42338 73621 143357 305888 678423 1499107 3231106 6746590
|
||||||
|
-6 -9 -13 -18 -24 -31 -39 -48 -58 -69 -81 -94 -108 -123 -139 -156 -174 -193 -213 -234 -256
|
||||||
|
18 36 73 131 225 404 773 1526 3020 5945 11675 22920 44839 86819 165175 307081 556102 979762 1679653 2804665 4567997
|
||||||
|
17 31 46 67 109 199 385 775 1650 3729 8722 20406 46627 102917 218904 449526 894459 1731467 3273058 6061549 11026301
|
||||||
|
2 6 26 71 146 246 345 385 290 59 36 1541 8237 29022 84081 217384 522055 1190948 2615907 5580283 11629317
|
||||||
|
12 21 26 32 65 187 511 1216 2562 4905 8712 14576 23231 35567 52645 75712 106216 145821 196422 260160 339437
|
||||||
|
19 40 72 106 141 209 426 1095 2907 7321 17258 38315 80781 162797 315036 587344 1058110 1848293 3145159 5247819 8660620
|
||||||
|
13 13 23 70 203 501 1092 2208 4327 8488 16904 34050 68520 136271 266715 515104 988950 1904948 3709702 7328655 14662978
|
||||||
|
24 39 54 69 84 99 114 129 144 159 174 189 204 219 234 249 264 279 294 309 324
|
||||||
|
7 23 56 125 258 487 856 1466 2597 4971 10261 22027 47409 100206 206569 415728 820556 1597628 3086552 5949705 11498367
|
||||||
|
3 4 13 37 81 153 291 637 1607 4241 10866 26285 59856 129126 266300 530120 1028523 1963486 3722239 7065077 13510923
|
||||||
|
14 24 57 142 319 639 1167 1988 3216 5006 7569 11190 16249 23245 32823 45804 63218 86340 116729 156270 207219
|
||||||
|
0 3 18 73 223 574 1330 2878 5932 11776 22703 42884 80178 149892 282329 537277 1030620 1981333 3791768 7181107 13402261
|
||||||
|
1 2 7 22 71 206 514 1121 2193 3934 6581 10396 15655 22634 31592 42751 56273 72234 90595 111170 133591
|
||||||
|
10 23 53 118 259 555 1140 2226 4144 7426 12968 22337 38311 65782 113288 195931 341930 608937 1125228 2190007 4505341
|
||||||
|
8 24 59 130 257 463 774 1219 1830 2642 3693 5024 6679 8705 11152 14073 17524 21564 26255 31662 37853
|
||||||
|
-5 -1 24 79 168 290 439 604 769 913 1010 1029 934 684 233 -470 -1481 -2861 -4676 -6997 -9900
|
||||||
|
15 30 63 114 187 312 590 1276 2932 6720 14984 32418 68369 141221 286394 570321 1113889 2130302 3984201 7281214 12999963
|
||||||
|
14 33 65 120 219 398 725 1342 2547 4946 9746 19341 38473 76428 150937 294658 565256 1060083 1936163 3435442 5913859
|
||||||
|
13 23 49 105 201 338 503 664 765 721 413 -317 -1671 -3900 -7309 -12262 -19187 -28581 -41015 -57139 -77687
|
||||||
|
17 32 46 59 69 68 32 -100 -463 -1324 -3166 -6803 -13531 -25320 -45052 -76810 -126223 -200872 -310762 -468865 -691739
|
||||||
|
14 17 25 48 110 259 586 1269 2665 5480 11054 21805 41883 78092 141145 247324 420624 695467 1120079 1760630 2706244
|
||||||
|
14 8 9 30 85 189 358 609 960 1430 2039 2808 3759 4915 6300 7939 9858 12084 14645 17570 20889
|
||||||
|
16 43 85 156 281 496 848 1395 2206 3361 4951 7078 9855 13406 17866 23381 30108 38215 47881 59296 72661
|
||||||
|
19 44 91 172 296 466 677 924 1251 1918 3844 9613 25529 65528 158335 360406 779575 1619184 3262021 6431310 12498130
|
||||||
|
0 4 12 44 135 335 709 1337 2314 3750 5770 8514 12137 16809 22715 30055 39044 49912 62904 78280 96315
|
||||||
|
16 24 46 91 161 248 338 441 691 1595 4568 13006 34383 84308 194283 426251 899158 1835982 3644382 7050745 13316497
|
||||||
|
7 29 70 137 240 394 619 949 1478 2503 4891 10937 26256 63759 151635 348678 772493 1649381 3399400 6776661 13093860
|
||||||
|
4 4 5 13 34 74 139 235 368 544 769 1049 1390 1798 2279 2839 3484 4220 5053 5989 7034
|
||||||
|
4 -4 -7 8 59 169 365 671 1095 1624 2264 3194 5144 10157 22954 53189 118958 252012 505219 962924 1754969
|
||||||
|
26 42 74 139 263 487 877 1543 2672 4587 7863 13560 23658 41777 74239 131622 231718 407726 733983 1402568 2931267
|
||||||
|
11 33 70 131 245 486 1027 2238 4843 10151 20376 39061 71621 126020 213597 350056 556635 861469 1301162 1922583 2784901
|
||||||
|
23 36 60 110 212 411 788 1488 2763 5049 9135 16554 30434 57184 109535 211570 406399 766978 1410118 2512830 4328616
|
||||||
|
9 21 53 112 202 321 466 654 967 1629 3123 6356 12880 25177 47016 83890 143541 236581 377217 584088 881222
|
||||||
|
1 12 44 109 239 501 1018 1996 3753 6743 11566 18954 29723 44682 64492 89471 119345 152950 187896 220211 243991
|
||||||
|
5 8 15 37 102 271 668 1537 3347 6972 13982 27113 51102 94431 173443 322385 617316 1230502 2548499 5417988 11639807
|
||||||
|
22 32 42 52 62 72 82 92 102 112 122 132 142 152 162 172 182 192 202 212 222
|
||||||
|
26 52 91 142 204 276 357 446 542 644 751 862 976 1092 1209 1326 1442 1556 1667 1774 1876
|
||||||
|
24 49 87 138 202 279 369 472 588 717 859 1014 1182 1363 1557 1764 1984 2217 2463 2722 2994
|
||||||
|
9 19 42 78 127 189 264 352 453 567 694 834 987 1153 1332 1524 1729 1947 2178 2422 2679
|
||||||
|
-3 -2 3 24 99 302 758 1676 3415 6612 12449 23248 43805 84286 166263 334878 682850 1397511 2853324 5795757 11710724
|
||||||
|
4 16 41 95 214 468 975 1915 3544 6208 10357 16559 25514 38068 55227 78171 108268 147088 196417 258271 334910
|
||||||
|
11 15 29 64 141 299 617 1259 2547 5059 9732 17919 31299 51465 78912 111010 138371 138799 67743 -156150 -672167
|
||||||
|
5 1 3 18 62 174 431 964 1975 3755 6703 11346 18360 28592 43083 63092 90121 125941 172619 232546 308466
|
||||||
|
26 51 99 184 339 632 1182 2174 3872 6638 10991 17798 28811 48009 84666 159878 319614 659405 1368755 2807428 5631043
|
||||||
|
15 31 66 141 300 634 1325 2728 5517 10935 21220 40345 75348 138842 254046 465448 862165 1629328 3158970 6281548 12730658
|
||||||
|
15 25 35 45 55 65 75 85 95 105 115 125 135 145 155 165 175 185 195 205 215
|
||||||
|
13 28 56 103 181 308 508 811 1253 1876 2728 3863 5341 7228 9596 12523 16093 20396 25528 31591 38693
|
||||||
|
6 14 37 87 177 324 552 895 1400 2130 3167 4615 6603 9288 12858 17535 23578 31286 41001 53111 68053
|
||||||
|
7 8 24 73 191 441 920 1764 3151 5302 8480 12987 19159 27359 37968 51374 67959 88084 112072 140189 172623
|
||||||
|
-2 -2 12 49 123 269 565 1156 2284 4356 8142 15299 29577 59291 121951 252342 515850 1029450 1993520 3738533 6791719
|
||||||
|
4 18 57 143 320 671 1342 2569 4699 8191 13578 21366 31841 44750 58817 71050 75790 63448 18871 -80727 -268338
|
||||||
|
20 38 71 128 214 335 513 809 1360 2467 4852 10383 23936 57774 141126 339947 795762 1798994 3922635 8258484 16823056
|
||||||
|
8 23 43 72 128 263 609 1478 3558 8273 18421 39274 80432 158922 304459 568717 1042388 1887535 3399479 6123936 11073736
|
||||||
|
-2 11 49 137 313 643 1251 2364 4372 7903 13913 23791 39479 63607 99643 152058 226506 330019 471217 660533 910453
|
||||||
|
20 31 52 97 178 300 456 622 752 773 580 31 -1058 -2918 -5832 -10140 -16244 -24613 -35788 -50387 -69110
|
||||||
|
-5 3 17 38 76 154 313 628 1253 2518 5099 10262 20122 37721 66459 107930 156415 187029 132637 -158066 -992728
|
||||||
|
8 8 4 -5 -7 36 201 617 1478 3056 5714 9919 16255 25436 38319 55917 79412 110168 149744 199907 262645
|
||||||
|
10 31 59 95 157 308 702 1659 3795 8256 17136 34198 66064 124095 227245 406244 709544 1211549 2023745 3309449 5303007
|
||||||
|
25 52 96 157 230 305 367 396 367 250 10 -393 -1004 -1873 -3055 -4610 -6603 -9104 -12188 -15935 -20430
|
||||||
|
18 37 77 154 307 616 1230 2412 4621 8671 16030 29344 53288 95854 170181 297010 507804 848505 1383803 2201662 3417681
|
||||||
|
9 20 38 68 119 223 484 1169 2848 6589 14224 28739 54945 100848 180737 322294 582607 1082858 2080310 4111590 8267015
|
||||||
|
16 18 33 83 206 461 946 1857 3630 7218 14557 29273 57696 110321 204066 366139 641204 1105050 1890401 3234215 5561242
|
||||||
|
14 39 80 138 211 310 503 1012 2395 5849 13675 29974 61745 120819 227613 418689 761752 1384239 2525270 4625678 8477307
|
||||||
|
19 45 82 127 174 220 274 368 586 1153 2671 6688 17013 42674 104354 247812 570611 1273115 2752498 5772143 11763838
|
||||||
|
28 38 42 49 77 148 287 540 1031 2078 4381 9279 19046 37156 68392 118602 193814 298310 431124 580269 713811
|
||||||
|
11 21 27 29 29 29 33 66 233 867 2865 8396 22316 54917 127224 281225 599691 1244513 2530267 5063511 10002115
|
||||||
|
12 24 40 58 72 67 23 -54 -55 377 2098 6907 18400 43773 97860 212323 456296 981519 2117896 4569227 9801250
|
||||||
|
24 32 39 42 29 -11 -65 -47 306 1640 5357 14241 33467 72245 146671 285119 539198 1006862 1881469 3554582 6826371
|
||||||
|
0 10 24 38 55 91 181 385 794 1536 2782 4752 7721 12025 18067 26323 37348 51782 70356 93898 123339
|
||||||
|
10 8 6 4 2 0 -2 -4 -6 -8 -10 -12 -14 -16 -18 -20 -22 -24 -26 -28 -30
|
||||||
|
23 36 57 99 187 369 743 1519 3140 6491 13242 26420 51424 97971 184086 344653 650095 1247110 2446146 4905196 10007393
|
||||||
|
6 3 1 0 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136
|
||||||
|
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63
|
||||||
|
27 44 63 84 107 132 159 188 219 252 287 324 363 404 447 492 539 588 639 692 747
|
||||||
|
-1 -7 1 47 173 448 984 1975 3790 7182 13743 26886 53965 110835 231521 488214 1031309 2166751 4500097 9195505 18426041
|
||||||
|
5 17 35 67 143 330 753 1622 3265 6167 11015 18749 30619 48248 73701 109560 159005 225901 314891 431495 582215
|
||||||
|
-6 -2 7 21 40 64 93 127 166 210 259 313 372 436 505 579 658 742 831 925 1024
|
||||||
|
5 0 -4 -3 7 30 70 131 217 332 480 665 891 1162 1482 1855 2285 2776 3332 3957 4655
|
||||||
|
-2 9 35 94 215 440 844 1582 2973 5640 10750 20449 38679 72726 136138 254178 473924 882791 1642073 3046724 5629899
|
||||||
|
10 14 30 70 158 349 763 1655 3561 7584 15905 32613 64946 125058 232597 419003 736198 1276697 2222168 3959477 7350468
|
||||||
|
26 35 42 44 33 -4 -85 -233 -476 -847 -1384 -2130 -3133 -4446 -6127 -8239 -10850 -14033 -17866 -22432 -27819
|
||||||
|
8 4 13 52 139 289 508 786 1087 1337 1434 1368 1675 4707 17679 59383 174380 462612 1141265 2674334 6042821
|
||||||
|
10 23 36 49 62 75 88 101 114 127 140 153 166 179 192 205 218 231 244 257 270
|
||||||
|
5 7 9 13 27 82 254 695 1695 3828 8282 17539 36659 75535 152627 300855 576537 1072501 1936783 3398649 5804051
|
||||||
|
4 12 35 82 161 278 436 634 866 1120 1377 1610 1783 1850 1754 1426 784 -268 -1841 -4062 -7075
|
||||||
|
-6 -8 -10 -12 -14 -16 -18 -20 -22 -24 -26 -28 -30 -32 -34 -36 -38 -40 -42 -44 -46
|
||||||
|
13 22 42 92 218 505 1089 2169 4019 7000 11572 18306 27896 41171 59107 82839 113673 153098 202798 264664 340806
|
||||||
|
16 13 21 55 130 261 463 751 1140 1645 2281 3063 4006 5125 6435 7951 9688 11661 13885 16375 19146
|
||||||
|
18 27 47 88 160 273 437 662 958 1335 1803 2372 3052 3853 4785 5858 7082 8467 10023 11760 13688
|
||||||
|
7 6 17 58 155 342 661 1162 1903 2950 4377 6266 8707 11798 15645 20362 26071 32902 40993 50490 61547
|
||||||
|
11 13 24 50 109 246 543 1125 2175 3985 7097 12658 23281 45058 92042 195689 423683 915597 1947414 4043610 8164997
|
||||||
|
6 0 5 31 87 200 455 1071 2540 5886 13167 28475 59942 123730 251825 506902 1009910 1989788 3870441 7418499 13987325
|
||||||
|
-2 8 27 55 92 138 193 257 330 412 503 603 712 830 957 1093 1238 1392 1555 1727 1908
|
||||||
|
13 22 31 40 49 58 67 76 85 94 103 112 121 130 139 148 157 166 175 184 193
|
||||||
|
14 35 68 128 246 470 871 1568 2805 5143 9869 19770 40471 82590 165018 319686 598232 1081027 1889058 3199196 5263396
|
||||||
|
15 24 35 58 111 227 481 1046 2297 5016 10835 23231 49728 106580 228292 486215 1023782 2122091 4321254 8645623 17024708
|
||||||
|
12 19 40 83 160 292 519 913 1602 2837 5172 9879 19786 40806 84519 172277 341424 654359 1211320 2167931 3758732
|
||||||
|
18 36 68 124 214 348 536 788 1114 1524 2028 2636 3358 4204 5184 6308 7586 9028 10644 12444 14438
|
||||||
|
12 20 33 45 47 24 -54 -236 -556 -887 -527 2807 15236 51518 144801 365619 857408 1900374 4022237 8183901 16081297
|
||||||
|
11 22 33 49 89 203 511 1293 3174 7478 16893 36733 77363 158858 319822 633666 1237753 2383938 4523501 8445701 15497657
|
||||||
|
11 27 54 110 220 428 835 1670 3410 6992 14206 28422 55898 108100 205914 387755 726239 1363956 2591066 5011451 9889470
|
||||||
|
25 33 54 116 273 627 1364 2810 5519 10416 19034 33905 59191 101672 172244 288121 475981 776347 1249550 1983682 3105013
|
||||||
|
4 5 10 23 64 183 481 1157 2623 5768 12514 26902 57092 118886 241719 478527 921458 1725895 3145362 5578917 9629452
|
||||||
|
13 18 25 38 72 159 357 772 1610 3302 6805 14297 30695 66820 145791 315686 674243 1416334 2923593 5930084 11821362
|
||||||
|
9 22 35 48 61 74 87 100 113 126 139 152 165 178 191 204 217 230 243 256 269
|
||||||
|
9 32 76 153 275 454 702 1031 1453 1980 2624 3397 4311 5378 6610 8019 9617 11416 13428 15665 18139
|
||||||
|
20 31 45 59 80 140 311 720 1564 3125 5785 10041 16520 25994 39395 57830 82596 115195 157349 211015 278400
|
||||||
|
13 34 81 180 383 779 1505 2757 4801 7984 12745 19626 29283 42497 60185 83411 113397 151534 199393 258736 331527
|
||||||
|
11 5 -4 -6 24 128 377 921 2123 4846 10990 24409 52376 107807 212503 401722 730451 1281811 2178096 3595020 5779824
|
||||||
|
18 33 65 129 254 496 951 1774 3217 5699 9911 16936 28325 46012 71871 106613 147588 184893 194989 130795 -93048
|
||||||
|
8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68
|
||||||
|
22 27 35 57 123 295 675 1408 2681 4714 7734 11938 17521 25028 36693 60269 118556 271189 661633 1614015 3824955
|
||||||
|
-5 -5 -2 13 74 258 712 1704 3727 7703 15360 29910 57292 108555 204579 385428 728331 1380599 2616414 4928519 9165614
|
||||||
|
6 18 41 74 113 150 183 257 568 1674 4869 12788 30323 65942 133515 254763 462458 804514 1349121 2191086 3459557
|
||||||
|
12 32 70 144 289 562 1047 1860 3154 5124 8012 12112 17775 25414 35509 48612 65352 86440 112674 144944 184237
|
||||||
|
4 7 26 89 233 513 1028 1982 3817 7474 14867 29724 59116 116351 226576 437541 839650 1601693 3031396 5672739 10454035
|
||||||
|
7 11 21 37 59 87 121 161 207 259 317 381 451 527 609 697 791 891 997 1109 1227
|
||||||
|
-7 2 36 105 233 474 929 1764 3229 5678 9590 15591 24477 37238 55083 79466 112113 155050 210632 281573 370977
|
||||||
|
19 22 21 20 27 60 160 405 916 1850 3392 5794 9570 16048 28609 55115 112249 232766 476991 950304 1828829
|
||||||
|
6 5 0 -6 0 51 230 744 2075 5250 12281 26835 55203 107646 200205 357071 613620 1020227 1646982 2589440 3975546
|
||||||
|
12 37 74 122 181 253 357 565 1076 2385 5694 13877 33581 79455 182089 402060 853572 1742597 3426234 6502268 11940701
|
||||||
|
4 10 11 11 21 59 153 358 813 1892 4560 11162 27101 64273 147816 328805 707113 1470932 2962722 5786321 10978172
|
||||||
|
2 -4 -14 -18 12 132 452 1185 2736 5872 12053 24061 47144 91002 173091 323920 595278 1072668 1893660 3274424 5547388
|
||||||
|
23 41 67 100 149 247 471 965 1969 3883 7451 14250 27840 56227 116812 245915 516543 1070717 2176959 4330256 8422019
|
||||||
|
-8 -1 26 83 188 387 799 1712 3775 8367 18292 39066 81247 164533 324739 625287 1175530 2159111 3876662 6808509 11704702
|
||||||
|
16 38 75 146 286 563 1110 2172 4168 7768 13985 24282 40694 65965 103700 158532 236304 344266 491287 688082 947454
|
||||||
|
3 13 24 47 116 313 808 1918 4203 8640 16944 32132 59444 107734 191412 332941 565755 937247 1511160 2368277 3603724
|
||||||
|
2 16 51 124 266 545 1099 2180 4216 7907 14378 25406 43703 73161 118865 186656 282365 412201 589508 861747 1389619
|
||||||
|
5 18 39 68 105 150 203 264 333 410 495 588 689 798 915 1040 1173 1314 1463 1620 1785
|
||||||
|
1 12 50 141 322 641 1157 1940 3071 4642 6756 9527 13080 17551 23087 29846 37997 47720 59206 72657 88286
|
||||||
|
4 16 50 124 269 540 1042 1983 3766 7129 13340 24457 43668 75726 127504 208826 334362 529529 849438 1435283 2668205
|
||||||
|
15 35 66 111 173 255 360 491 651 843 1070 1335 1641 1991 2388 2835 3335 3891 4506 5183 5925
|
||||||
|
13 21 53 130 286 580 1111 2043 3651 6395 11024 18730 31461 52741 89851 159160 297973 588757 1205355 2496214 5127228
|
||||||
|
8 8 25 87 239 540 1055 1842 2934 4316 5897 7477 8709 9056 7743 3704 -4476 -18624 -41047 -74605 -122789
|
||||||
|
-7 -9 -1 35 138 374 851 1761 3471 6696 12810 24386 46095 86118 158201 284361 497961 846321 1391101 2203233 3347012
|
||||||
|
6 25 62 140 292 567 1043 1842 3136 5122 7923 11332 14243 13482 1523 -37788 -136855 -357062 -808189 -1674217 -3239703
|
||||||
|
19 45 92 165 260 365 468 573 730 1101 2119 4861 11861 28749 67333 151061 324229 666861 1317902 2510261 4622346
|
||||||
|
-5 -2 2 2 -11 -53 -145 -295 -444 -333 813 5032 17356 49671 128921 313695 726202 1611289 3441257 7095887 14162940
|
||||||
|
9 10 21 64 187 481 1104 2321 4569 8551 15353 26563 44351 71444 110900 165550 236937 323536 417989 503034 545747
|
||||||
|
13 11 9 7 5 3 1 -1 -3 -5 -7 -9 -11 -13 -15 -17 -19 -21 -23 -25 -27
|
||||||
|
20 27 27 32 64 150 317 587 972 1469 2055 2682 3272 3712 3849 3485 2372 207 -3373 -8796 -16560
|
||||||
|
8 12 17 29 59 128 272 546 1040 1949 3795 8014 18355 43992 106087 251024 576095 1277813 2740616 5697006 11513670
|
||||||
|
13 23 39 67 110 168 238 314 387 445 473 453 364 182 -120 -572 -1207 -2061 -3173 -4585 -6342
|
||||||
|
15 30 54 93 161 295 578 1180 2445 5079 10538 21785 44698 90622 181037 356507 695002 1351447 2644938 5249563 10601080
|
||||||
|
15 30 49 72 99 130 165 204 247 294 345 400 459 522 589 660 735 814 897 984 1075
|
||||||
|
0 2 10 36 96 215 444 911 1953 4421 10323 24086 54908 121006 257211 528674 1056138 2063596 3969400 7560556 14322468
|
||||||
|
19 48 92 151 225 314 418 537 671 820 984 1163 1357 1566 1790 2029 2283 2552 2836 3135 3449
|
||||||
|
19 29 38 54 96 194 391 747 1345 2299 3764 5948 9126 13656 19997 28729 40575 56425 77362 104690 139964
|
||||||
|
-10 -15 -20 -25 -30 -35 -40 -45 -50 -55 -60 -65 -70 -75 -80 -85 -90 -95 -100 -105 -110
|
||||||
|
20 35 62 113 200 345 611 1160 2344 4842 9886 19707 38540 74949 146995 293023 592748 1206017 2440198 4861569 9471136
|
||||||
|
15 18 23 39 98 273 696 1582 3277 6368 11928 22026 40718 75857 142225 266705 496483 911606 1643629 2902569 5014954
|
||||||
|
0 -1 8 38 103 226 448 850 1612 3147 6362 13112 26927 54106 105286 197608 357616 625039 1057620 1737170 2777039
|
||||||
|
9 16 34 87 224 535 1183 2463 4899 9399 17522 31996 57798 104412 190375 351970 659005 1242114 2338026 4361877 8019004
|
||||||
|
4 0 6 35 101 219 405 676 1050 1546 2184 2985 3971 5165 6591 8274 10240 12516 15130 18111 21489
|
||||||
|
10 27 60 117 212 385 745 1542 3286 6958 14400 29028 57084 109730 206389 379855 683826 1203661 2071324 3485655 5739300
|
||||||
|
5 7 22 60 131 245 412 642 945 1331 1810 2392 3087 3905 4856 5950 7197 8607 10190 11956 13915
|
||||||
|
18 30 43 52 47 21 -14 9 296 1369 4407 11874 28661 64160 136010 276761 545454 1047184 1965179 3611880 6508043
|
||||||
|
22 46 92 168 282 442 656 932 1278 1702 2212 2816 3522 4338 5272 6332 7526 8862 10348 11992 13802
|
||||||
|
8 13 20 44 110 253 518 960 1644 2645 4048 5948 8450 11669 15730 20768 26928 34365 43244 53740 66038
|
||||||
|
-3 1 10 24 43 67 96 130 169 213 262 316 375 439 508 582 661 745 834 928 1027
|
||||||
|
13 39 85 169 321 590 1056 1847 3161 5293 8667 13873 21709 33228 49790 73119 105365 149171 207745 284937 385321
|
||||||
|
5 14 36 83 195 464 1065 2288 4561 8450 14618 23721 36215 52044 70175 87942 100157 97942 67232 -13105 -173589
|
||||||
|
15 19 30 62 145 335 724 1453 2731 4863 8290 13644 21821 34075 52136 78355 115879 168859 242694 344314 482505
|
||||||
|
2 11 44 125 296 629 1253 2418 4645 9063 18123 37017 76329 156717 316782 625734 1203028 2247827 4081966 7211053 12409462
|
||||||
|
11 35 81 170 335 621 1094 1881 3275 5959 11445 22918 46892 96576 198907 409378 843048 1738176 3583686 7367983 15052310
|
||||||
|
22 31 41 57 91 170 363 840 1989 4657 10673 23996 53165 116277 250554 529758 1094371 2201726 4306420 8185830 15132182
|
||||||
|
-1 7 15 33 92 259 668 1582 3518 7495 15514 31474 62920 124397 243884 474989 919525 1767999 3369645 6349039 11792984
|
||||||
|
9 6 4 22 93 267 617 1248 2307 3990 6549 10333 15971 24949 41114 74263 148526 322161 734795 1719395 4061142
|
||||||
|
17 28 42 71 134 259 488 894 1635 3095 6196 13008 27836 59024 121786 242453 464613 857718 1528838 2638357 4420530
|
||||||
|
20 33 55 105 212 427 857 1727 3474 6875 13209 24451 43494 74393 122623 195341 301640 452781 662387 946581 1324048
|
||||||
|
-2 -6 -6 16 84 227 476 858 1392 2102 3076 4617 7550 13765 27086 54555 108202 207330 381270 672446 1139424
|
||||||
|
11 28 58 105 175 280 442 697 1099 1724 2674 4081 6111 8968 12898 18193 25195 34300 45962 60697 79087
|
||||||
|
6 6 4 10 50 174 461 1020 1989 3537 5877 9301 14251 21443 32064 48065 72576 110472 169122 259356 396688
|
||||||
|
9 33 72 143 291 617 1321 2757 5491 10347 18432 31172 50503 79595 124911 201104 341341 617245 1174920 2296653 4502083
|
||||||
|
1 -3 -6 6 57 181 422 834 1481 2437 3786 5622 8049 11181 15142 20066 26097 33389 42106 52422 64521
|
||||||
|
20 45 92 183 353 648 1120 1828 2877 4577 7895 15519 34068 78280 178405 392536 826242 1662637 3206942 5950687 10661971
|
||||||
|
9 20 49 105 197 326 471 562 423 -334 -2454 -7125 -15718 -28520 -41047 -34951 42817 325984 1127851 3148993 7902215
|
||||||
|
4 13 22 31 40 49 58 67 76 85 94 103 112 121 130 139 148 157 166 175 184
|
||||||
|
3 18 39 62 84 110 166 321 721 1638 3537 7164 13658 24690 42632 70759 113487 176650 267819 396666 575376
|
||||||
|
23 33 49 79 132 217 335 464 539 441 41 -595 -643 2719 16711 57254 156427 375417 827593 1720891 3437190
|
||||||
|
7 24 50 85 142 258 514 1069 2207 4385 8261 14704 24907 41055 68751 123960 250328 558763 1312713 3104284 7206249
|
||||||
|
-7 -1 21 79 208 466 962 1919 3787 7421 14339 27075 49642 88120 151384 251987 407213 640315 981953 1471847 2160660
|
||||||
|
-7 -4 0 6 17 40 94 224 527 1208 2702 5922 12723 26708 54544 108004 207005 383972 689924 1202750 2038221
|
||||||
|
18 29 55 112 225 446 901 1884 4033 8657 18343 38083 77387 154338 303618 592833 1156238 2264577 4468621 8890194 17802535
|
||||||
|
13 27 43 70 138 306 667 1350 2519 4369 7119 11002 16252 23088 31695 42202 54657 68999 85027 102366 120430
|
||||||
|
1 14 48 125 277 551 1022 1814 3129 5284 8756 14235 22685 35413 54146 81116 119153 171786 243352 339113 465381
|
||||||
|
-1 8 23 44 71 104 143 188 239 296 359 428 503 584 671 764 863 968 1079 1196 1319
|
||||||
|
19 43 77 127 215 395 790 1669 3597 7724 16343 33959 69302 139053 274682 535059 1030155 1966898 3740787 7123974 13657889
|
||||||
|
18 45 91 164 275 438 677 1048 1684 2871 5163 9544 17645 32024 56517 96668 160246 257857 403659 616188 919303
|
||||||
|
6 22 59 136 291 594 1160 2162 3844 6534 10657 16748 25465 37602 54102 76070 104786 141718 188535 247120 319583
|
||||||
|
23 37 65 118 212 377 687 1329 2735 5816 12367 25768 52224 103069 199356 381630 731614 1420871 2818778 5726452 11868843
|
||||||
|
13 24 32 38 55 126 345 876 1970 3996 7534 13631 24400 44252 82197 155837 297907 566504 1060484 1941908 3467885
|
||||||
|
9 11 8 7 38 173 559 1479 3462 7483 15333 30296 58341 110127 204263 372559 668647 1182699 2067602 3586753 6201896
|
||||||
|
18 44 92 182 354 678 1272 2352 4352 8165 15568 29905 57112 107177 196136 348713 601718 1008322 1643332 2609592 4045638
|
||||||
|
-6 -2 12 37 85 189 422 952 2183 5066 11718 26576 58470 124296 255549 510096 993680 1899506 3581116 6685619 12394363
|
||||||
|
10 18 40 85 167 323 635 1262 2502 4919 9598 18672 36477 72155 145400 298517 620281 1290667 2661351 5397302 10725062
|
||||||
|
8 7 10 36 112 276 581 1096 1900 3059 4565 6212 7427 7257 5226 4991 25352 128511 485816 1520388 4200090
|
||||||
|
6 1 -4 -9 -14 -19 -24 -29 -34 -39 -44 -49 -54 -59 -64 -69 -74 -79 -84 -89 -94
|
||||||
306
2023/go/day10/day10.go
Normal file
306
2023/go/day10/day10.go
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"adventofcode2023/utils"
|
||||||
|
"adventofcode2023/utils/grid2d"
|
||||||
|
"adventofcode2023/utils/inputs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Coord struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
type Direction struct {
|
||||||
|
dir string
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := inputs.ToGrid2D(input, "\n", "", ".", func(c string) string { return c})
|
||||||
|
start, _ := findStart(grid)
|
||||||
|
tunnel := findTunnel(grid, start)
|
||||||
|
fmt.Println(start)
|
||||||
|
return len(tunnel)/2
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := inputs.ToGrid2D(input, "\n", "", ".", func(c string) string { return c})
|
||||||
|
start, _ := findStart(grid)
|
||||||
|
tunnel := findTunnel(grid, start)
|
||||||
|
maskJunkPipes(grid, tunnel)
|
||||||
|
bigGrid := expand(grid)
|
||||||
|
floodFill(bigGrid, Coord{0,0})
|
||||||
|
return countTiles(bigGrid, tunnel)
|
||||||
|
}
|
||||||
|
|
||||||
|
func floodFill(grid *grid2d.Grid[string], coord Coord) {
|
||||||
|
// Base cases to stop recursion
|
||||||
|
if coord.x < 0 || coord.x >= grid.SizeX() || coord.y < 0 || coord.y >= grid.SizeY() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid.Get(coord.x, coord.y) != "." || grid.Get(coord.x, coord.y) == "O" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change the color of the current pixel
|
||||||
|
grid.Set(coord.x, coord.y, "O")
|
||||||
|
|
||||||
|
// Recursively call floodFill for neighboring pixels
|
||||||
|
floodFill(grid, Coord{coord.x+1, coord.y})
|
||||||
|
floodFill(grid, Coord{coord.x-1, coord.y})
|
||||||
|
floodFill(grid, Coord{coord.x, coord.y+1})
|
||||||
|
floodFill(grid, Coord{coord.x, coord.y-1})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Magnify grid
|
||||||
|
|
||||||
|
// +-
|
||||||
|
// F => |
|
||||||
|
//
|
||||||
|
// L => |
|
||||||
|
// +-
|
||||||
|
//
|
||||||
|
// |
|
||||||
|
// | => |
|
||||||
|
// |
|
||||||
|
|
||||||
|
|
||||||
|
func findTunnel(grid *grid2d.Grid[string], start Coord) []Coord {
|
||||||
|
directions := []Direction{{"s", 0, 1}, {"n", 0, -1}, {"e", 1, 0}, {"w", -1, 0}}
|
||||||
|
steps := 0
|
||||||
|
current := start
|
||||||
|
last := Direction{}
|
||||||
|
tunnel := []Coord{}
|
||||||
|
tunnel = append(tunnel, start)
|
||||||
|
for {
|
||||||
|
for _, dir := range directions {
|
||||||
|
if dir == oposite(last) { continue }
|
||||||
|
x := current.x + dir.x
|
||||||
|
y := current.y + dir.y
|
||||||
|
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ! possible(dir, grid.Get(current.x, current.y) ) { continue }
|
||||||
|
pipe := grid.Get(x, y)
|
||||||
|
if pipe == "S" {
|
||||||
|
return tunnel
|
||||||
|
}
|
||||||
|
switch dir.dir {
|
||||||
|
case "n":
|
||||||
|
if pipe == "|" || pipe == "F" || pipe == "7" {
|
||||||
|
current = Coord{x, y}
|
||||||
|
steps++
|
||||||
|
last = dir
|
||||||
|
tunnel = append(tunnel, current)
|
||||||
|
if current == start { return tunnel }
|
||||||
|
}
|
||||||
|
case "s":
|
||||||
|
if pipe == "|" || pipe == "L" || pipe == "J" {
|
||||||
|
current = Coord{x, y}
|
||||||
|
steps++
|
||||||
|
last = dir
|
||||||
|
tunnel = append(tunnel, current)
|
||||||
|
if current == start { return tunnel }
|
||||||
|
}
|
||||||
|
case "e":
|
||||||
|
if pipe == "-" || pipe == "J" || pipe == "7" {
|
||||||
|
current = Coord{x, y}
|
||||||
|
steps++
|
||||||
|
last = dir
|
||||||
|
tunnel = append(tunnel, current)
|
||||||
|
if current == start { return tunnel }
|
||||||
|
}
|
||||||
|
case "w":
|
||||||
|
if pipe == "-" || pipe == "F" || pipe == "L" {
|
||||||
|
current = Coord{x, y}
|
||||||
|
steps++
|
||||||
|
last = dir
|
||||||
|
tunnel = append(tunnel, current)
|
||||||
|
if current == start { return tunnel }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func expand(grid *grid2d.Grid[string]) *grid2d.Grid[string] {
|
||||||
|
bigGrid := grid2d.NewGrid(grid.SizeX() * 3, grid.SizeY() * 3, ".")
|
||||||
|
for y:=0;y<grid.SizeY();y++ {
|
||||||
|
for x:=0;x<grid.SizeX();x++ {
|
||||||
|
switch grid.Get(x, y) {
|
||||||
|
case "F":
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"+")
|
||||||
|
bigGrid.Set(x*3+2,y*3+1,"-")
|
||||||
|
bigGrid.Set(x*3+1,y*3+2,"|")
|
||||||
|
case "L":
|
||||||
|
bigGrid.Set(x*3+1,y*3,"|")
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"+")
|
||||||
|
bigGrid.Set(x*3+2,y*3+1,"-")
|
||||||
|
case "|":
|
||||||
|
bigGrid.Set(x*3+1,y*3,"|")
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"|")
|
||||||
|
bigGrid.Set(x*3+1,y*3+2,"|")
|
||||||
|
case "7":
|
||||||
|
bigGrid.Set(x*3,y*3+1,"-")
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"+")
|
||||||
|
bigGrid.Set(x*3+1,y*3+2,"|")
|
||||||
|
case "-":
|
||||||
|
bigGrid.Set(x*3,y*3+1,"-")
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"-")
|
||||||
|
bigGrid.Set(x*3+2,y*3+1,"-")
|
||||||
|
case "J":
|
||||||
|
bigGrid.Set(x*3+1,y*3,"|")
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"+")
|
||||||
|
bigGrid.Set(x*3,y*3+1,"-")
|
||||||
|
case "X":
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"X")
|
||||||
|
case "S":
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,"*")
|
||||||
|
default:
|
||||||
|
bigGrid.Set(x*3+1,y*3+1,".")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bigGrid
|
||||||
|
}
|
||||||
|
func maskJunkPipes(grid *grid2d.Grid[string], tunnel []Coord) {
|
||||||
|
for y:=0;y<grid.SizeY();y++ {
|
||||||
|
for x:=0;x<grid.SizeX();x++ {
|
||||||
|
if ! containsCoord(Coord{x, y}, tunnel) && grid.Get(x, y) != "." {
|
||||||
|
grid.Set(x, y, ".")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func countTiles(grid *grid2d.Grid[string], tunnel []Coord) int {
|
||||||
|
count := 0
|
||||||
|
tiles := []Coord{}
|
||||||
|
directions := []Coord{{0,1}, {0,-1},{1,0}, {-1, 0},{1,1},{1,-1},{-1,1},{-1,-1}}
|
||||||
|
for y:=0;y<grid.SizeY();y=y+3 {
|
||||||
|
for x:=0;x<grid.SizeX();x=x+3 {
|
||||||
|
coord := Coord{x, y}
|
||||||
|
if coord.x == 0 || coord.x == grid.SizeX() - 1 || coord.y == 0 || coord.y == grid.SizeY() - 1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
found := true
|
||||||
|
if grid.Get(coord.x, coord.y) == "." {
|
||||||
|
for _, dir := range directions {
|
||||||
|
if grid.Get(coord.x+dir.x, coord.y+dir.y) != "." {
|
||||||
|
found = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
count++
|
||||||
|
tiles = append(tiles, coord)
|
||||||
|
grid.Set(coord.x, coord.y, "I")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fmt.Println(grid.StringWithFormatter(func(c string, x int, y int) string { return c}))
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func containsCoord(coord Coord, tunnel []Coord) bool {
|
||||||
|
for _, v := range tunnel {
|
||||||
|
if v == coord {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func maxX(tunnel []Coord) int {
|
||||||
|
max := 0
|
||||||
|
for _, v := range tunnel {
|
||||||
|
if v.x > max {
|
||||||
|
max = v.x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
func minX(tunnel []Coord) int {
|
||||||
|
min := utils.MaxInt
|
||||||
|
for _, v := range tunnel {
|
||||||
|
if v.x < min {
|
||||||
|
min = v.x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min
|
||||||
|
}
|
||||||
|
func maxY(tunnel []Coord) int {
|
||||||
|
max := 0
|
||||||
|
for _, v := range tunnel {
|
||||||
|
if v.y > max {
|
||||||
|
max = v.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
func minY(tunnel []Coord) int {
|
||||||
|
min := utils.MaxInt
|
||||||
|
for _, v := range tunnel {
|
||||||
|
if v.y < min {
|
||||||
|
min = v.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min
|
||||||
|
}
|
||||||
|
|
||||||
|
func possible(dir Direction, pipe string) bool {
|
||||||
|
v := false
|
||||||
|
if pipe == "S" { return true }
|
||||||
|
switch dir.dir {
|
||||||
|
case "n":
|
||||||
|
if pipe == "|" || pipe == "L" || pipe == "J" {
|
||||||
|
v = true
|
||||||
|
}
|
||||||
|
case "s":
|
||||||
|
if pipe == "|" || pipe == "F" || pipe == "7" {
|
||||||
|
v = true
|
||||||
|
}
|
||||||
|
case "e":
|
||||||
|
if pipe == "-" || pipe == "F" || pipe == "L" {
|
||||||
|
v = true
|
||||||
|
}
|
||||||
|
case "w":
|
||||||
|
if pipe == "-" || pipe == "J" || pipe == "7" {
|
||||||
|
v = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func findStart(grid *grid2d.Grid[string]) (Coord, error) {
|
||||||
|
// for j := 0; j < grid.SizeY(); j++ {
|
||||||
|
// for i := 0; i < grid.SizeX(); i++ {
|
||||||
|
// if grid.Get(i, j) == "S" {
|
||||||
|
// return Coord{i, j}, nil
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return Coord{}, fmt.Errorf("S not found")
|
||||||
|
return Coord{x:74, y:95}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func oposite(dir Direction) Direction {
|
||||||
|
switch dir.dir {
|
||||||
|
case "n":
|
||||||
|
return Direction{"s", 0, 1}
|
||||||
|
case "s":
|
||||||
|
return Direction{"n", 0, -1}
|
||||||
|
case "e":
|
||||||
|
return Direction{"w", -1, 0}
|
||||||
|
case "w":
|
||||||
|
return Direction{"e", 1, 0}
|
||||||
|
}
|
||||||
|
return Direction{}
|
||||||
|
}
|
||||||
32
2023/go/day10/day10_test.go
Normal file
32
2023/go/day10/day10_test.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`..F7.
|
||||||
|
.FJ|.
|
||||||
|
SJ.L7
|
||||||
|
|F--J
|
||||||
|
LJ...`)
|
||||||
|
require.Equal(t, 8, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`.F----7F7F7F7F-7....
|
||||||
|
.|F--7||||||||FJ....
|
||||||
|
.||.FJ||||||||L7....
|
||||||
|
FJL7L7LJLJ||LJ.L-7..
|
||||||
|
L--J.L7...LJF7F-7L7.
|
||||||
|
....F-J..F7FJ|L7L7L7
|
||||||
|
....L7.F7||L7|.L7L7|
|
||||||
|
.....|FJLJ|FJ|F7|.LJ
|
||||||
|
....FJL-7.||.||||...
|
||||||
|
....L---J.LJ.LJLJ...`)
|
||||||
|
require.Equal(t, 8, r)
|
||||||
|
}
|
||||||
140
2023/go/day10/input.txt
Normal file
140
2023/go/day10/input.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
FL7L-F7FJF-7FFF7FF|-F-F|JF--|.|-J-7.F--FJF|-7.F.-FF7.-F7-L-|FF-F-|-7.-F7-FF-|7J-J.F-J7.FF7..L7F|7F-7JF-L7F.|--FL7F---|.FFF-L7FL--L777L-.FF7F
|
||||||
|
7FFJ.FLJF-.FJ||F-FJJJJ||F|-F7FLJ.7-F7J||-FFF7.L7-FJL7.F|||-J7JJ.LL77F|LF7LJJ||L7--|-7F-F|F-7JLJ.LJL--F-|LLJ|7J|L|-|7|FF|7|J.LJFFJ7.|-J.F.|L|
|
||||||
|
L-77.L77JF-JF7.||||.F7FFF7-|-7L.L--|.FF.|F-JL77.|L-7|F7|-|7F|-.-7L-F7--JJ|.||L7L-.|JF|.|JL-77F-|J-L|JL--FLJLJ7JF|7||7.FJL|7--L|---7|.|FF-J-|
|
||||||
|
LF7--FFJFLJLFL|J|.77---J-F-|F7-7.|7.L|J--L--7L7F7F7|LJL7-77-L.--J7LL-7.|LF-J--.F-J7-F--L7|-F7LFJ--77-7.77LJJ.7FL.J-JFJJ|F|J|LF|7||F|7FFJL|LJ
|
||||||
|
L|J7.-JJ-.|F|FJJJL||FL77LJ.|FJ7|FL7F.L7JJFLFJFJ|LJLJF--J-F7...FF||.FJL.-7L|.FL7JJLL-JJ.|||F||.L7|JFJ.|FJ7|--7JJ-|7LLF-FJ-F.--FJF|-LJFLJ-J.FJ
|
||||||
|
FJF-L-|.LF-F||J-7.-7|FF7-77J-7|LLJ|JJLJ--7-L7|JL-7F-JF-7.||7F-JJF7.J7.||L.--JJ.---77L7--777||7FLJFJJ-|7||F-L|-J7LJ-FJL|J.|.F77.L|F|JFJ|7.FF7
|
||||||
|
|-FJ.-F7.F..L|LF|7---LL77|L7FJJ.L.|LF-JFF|-FJ|F--JL-7|FJFJ|-7JLL||F7FL.JLLJ..F.L--LF7L.LF-7|L77J.FL7.FFLF--FF.L|7|.J|FJFL|-|7-7|F|7-J..777|F
|
||||||
|
F77.F|L77LFF-|LJ-L7|-LJ|F|.--7|.L--F-|7-L7.L7|L--7F-J|L-JFJFJJ-|JFF-7---FJ..-77||7.F7||-L7LJFJ77F7JLFF7L|7|||L7||7-J-|7-.|.L|.LJ.|LJJ.FLL-L7
|
||||||
|
|.|--F-J-7L7-FF|---7-|.J7JF.LFL-J.||LF-J.F--J|LF-JL7FJF7FJ77|F7--FL7|-L7-77F7F---7-||F7F7L-7|JLF77-L|||F-7-|JLJJLL7FF...JL-J.77|FJ.|.77|L-|J
|
||||||
|
-F7FLJ|LF7.|.L-LJ.LJ..F|..F.L-|.F-J77|F-7L--7L7L--7LJFJ|L7F777J|.F-JL7LJ---L7L--7|FJ||||L7FJL7.|L7-F7|||FJ7L|J.L|LJ7JF77L.|FLJ7-7FF7|77|.F-7
|
||||||
|
J.-77LF7||F77FJ-7.|L7F-7-.F7.|F7JJ-F7J7LF7F7L7L7F7|F7L7L-J||F7-JFL7F7|--7L|LF---J||FJ||L7|L7FJF|FJF|LJLJL-7L7|F7|FLL7LLJ77LJ7|.FJ-J||L7J.JF-
|
||||||
|
|.LL-.LLL-|L-7|---L-7.LL.FL7.FJ||.F-7|F7||||JL7|||||L-JFF-J|||.F7FJ|LJ7F7-JLL7F-7|||FJL7|L7|L--JL-7L-7F---JF|7LF-LJFL-J-LLJF---FJ.F|LJJ.JJLJ
|
||||||
|
L||L|7.L7LL77LJ.F|J7|7||7|7J|.|--FL7L-JLJ|||F7|||LJ|F7F7L7FJ||FJ|L7L7F7|L7J-FLJFJLJLJF-J|FJ|F--7F-JF-JL--7L--L7JFJ.L|L|FL7.JJ-||J-7-|JFJ.FF|
|
||||||
|
|JF7LL-.|7-|77.-F|LF--FJ-JF7F77FFLJL----7LJLJLJ|L7FJ||||FJL7|LJFJ-|FJ|||FJ|--LFJF---7|F7|L7|L7-LJF7|F--7FJ.JJ7F7|.J-J7-7-F-|..FJF-.J.LJJ-F7.
|
||||||
|
F7.|-|.FF7L|.L7||..|.|.JFF|LJ|F7J-F-7F7JL-----7L-JL-J||||F-JL-7L7FJ|FJ|||F77.LL-JF--JLJLJFJL7L-7-||LJF7||F7|.F||77|.|L7L-L.F-F-LLJ7.FF-|.L--
|
||||||
|
L7FF-FF-LJ.7-FJJ|JFL-L7FJLL-7|||F7L7LJL-7F77F7L--7F--J||||F7F7L7||FJ|FJ|||||F7F77L---7F--JF7|F-JFJ|F7|||LJL77F||F7J--.|F|LF|.L-.|FF--J7LF-||
|
||||||
|
.J-J.|JLF|F|7F|.JLJ|.F-7|FF-J||LJ|JL-7F7LJ|FJ|F--JL7|FJ||||||L7|LJ|FJ|FJ||L7|LJL-7F7FJL7JFJLJL-7|FJ|||||F--JF7||||JFL-J-J.-7-|F-|-|7L-F.J--J
|
||||||
|
FJL-7|FF-FFL--7-LFJ7-J.---|F7LJF-JF-7LJL-7|L7LJF7F7L7L7|||||L7|L7FJL7||FJ|FJL---7LJ|L-7L7L---7FJ||FJ||||L-7FJ||||L7F7LF|.|-LL|-||-LFF-JF.F|7
|
||||||
|
|7LF77-J-L-.|L||.L7|-|F|-LLJL-7L77L7|F-7L|||L-7|||L7L-J||||L-JL-JL-7|||L7|L-7LF7L-7L--JFJF7|FJL7|||FJ|||F-JL7||||FJ|L--777J.F---J7L|J7-7-FJ7
|
||||||
|
LFFL|J|..F.FJ|F-7.LJFF|7.LF7F7|FJF7|||FJFJL--7LJLJ.|F--J|||F--7F7F7||LJFJ|F-JFJ|F7|F--7L7|L-JF-J|||L7||||.F7|||LJL-JF--J7.|FJ.FL7L-7-77||J.J
|
||||||
|
|F7-JFJ-FLFJ.FJL-7J--LJ|FF|LJLJL7|LJ||L7L---7|.F7-FJL7F7|||L7FJ|LJLJL-7|-||F7L7|||LJF7L7|L--7|F7||L7||||L7|||||F---7|F7F-777.77L|J7L-J-FF--J
|
||||||
|
LJ|7.FJ.|.F7F|.77|J.F|J|--|F---7LJF-J|FJ7F7FJ|FJ|FJF7LJ||||FJL7|F7|F7FJL7|LJ|FJ||L--JL-JL7F7|||||L-JLJLJFJ||||||LF7LJ|LJFJL7-7JL|LFJF|LFJ7|7
|
||||||
|
F-|JF|JFLJJ-77.L|J|F|-F7FFLJF7LL-7L7J|L7FJ|L7|L7|L-J|F7||LJL77LJ||FJ|L7FJ|F-JL7|L-------7LJLJLJLJF------JF|LJLJL-J|F7|F7L-7JF|7.7JF-FJ||F-JL
|
||||||
|
F-J7L.F|J7.|L-7F-J-7JFJ|F7F-J|F-7L7L7|FJL7L-JL7||F--J|LJL7F7L-7F|||FJFJL7|L7F7||F-7F-7F7L---7F---JF7F-7F-7|F--7F--J||||L--J|FJF-7-J-|JLJJ-7J
|
||||||
|
L7L-7.J7--.|--77F7FL-L7|||L-7LJFJ|L7LJ|JJL---7|||L--7L7F7||L--JFJ|||JL-7LJFJ|LJ|L7|L7|||F-7-|L---7||L7||FJ||F7LJFF7||||F--7FJ-|FJ|J.|.L|J.|7
|
||||||
|
L-JF--FFJ.F|7FLLJJ|JLF|LJ|F7L-7|F-7L-7L7F7F7FJ||L7-FJFJ|LJL--7F|FJ|L7|FJF-J.L-7L7|L-JLJ||FJFJF---J||FJLJL7|LJL7F7|||||||F-J--||L-7LL77.F--FJ
|
||||||
|
-JJ|J.|J7-F-JJL||-JF-7L7FJ|L7FJ||FJF7|FJ||||L7LJFJFJFJFJF---7|FJL7|FJFJFJF7FF7L7|L--7F7LJL7L7L-7F-J|L7F7FJ|F--J|||||LJLJ|F7J.FJF-JF||7LL-LJ|
|
||||||
|
....-.|F|.LJ.FFFF7.|--FJL7|FJL7LJL7||||FJ|||7L-7L7L7|F|FJF-7LJL-7|||FJFJFJL7||FJ|F-7LJL--7|FJF-JL-7L7LJ||FJL-7FJ||||F7F-J||.FJFJJ-7L-J||.|L-
|
||||||
|
-F77LFJFJ-7|F|LFJ|-F7.L-7|||F7L--7LJ|||L7LJL7F7L7L7|L7|L7L7L77F7||||L7L7L7FJ|||FJ|FJF7F7FJLJFJ7F7|L7|F7||L7F-J|FJ|LJ|LJF7|L7|FJ7FF77J|FFF.|.
|
||||||
|
|LL-F|.FJ-7L|J-L7|J||F--J||||L7F7L-7||||L-7FJ|L-JFJ|FJ|FJ.|FJFJ||LJL-JFJFJL-J||L7|L7|LJ|L-7FJ.FJL7FJ||||L7||F-JL-JF7L7-|||FJ||L|||L7LJ-7J77-
|
||||||
|
JJL7FL.L..|.7FF7||FJ|L7F7|||L7||L7FJ||L7F-JL7L--7|FJL-JL-7||FJFJL-7F--JFL-7F-J|FJL7|L-7L7-|L-7L-7|L7||||FJ|||F--7FJL-JFJ|||FJL--7JJLFL-JL-..
|
||||||
|
..FLJL|L|J|-JFJLJ|L7|JLJ|||||||L7|L7|L7|L--7L-7FJ||F7F---J|||FJF77|L7F7F7FJL7-|L7FJ|F7L7L-JF-JF-JL7||||||FJLJL-7LJF7F7L7||LJF---JF-JL||.F|L.
|
||||||
|
F-L|7.-7|LJLFL--7L-JL7F7|LJ|FJ|FJ|FJL7||-F-JF-JL7|||LJF7F-J||L7||FJFJ||||L-7L7|FJ|FJ||FL--7|F7|F7FJ||||||L7F---JF-JLJL7|||F-J7LJJL77FLF.LLL|
|
||||||
|
.|-|-7L--L.FFF--JF--7|||L-7|L7|L7|L-7LJL7L-7L7F7|LJ|F7||L-7||FJ|||FJL||||F-JFJ|L7|L7||F7F7|LJ|||||FJ||||L-JL--7|L7F---J|LJL--7-JL|-FF..7L|L|
|
||||||
|
-LFJ.7|L-..FFL---JF-J|||F-JL7|L7||F7L7F-JF7|FJ||L7FJ||||F7||||-||||F7||||L7FJJL7||FJ||||||L7FJLJ||L7||||F-----JF7||F7F-JF7F-7|77FFF-77-L-7-7
|
||||||
|
L||LJJ7.L-7JJF----JF7LJ||F7FJL7||LJL-JL7FJ||L7|L7||FJLJ||||||L7|||||LJ||L7|L7F7||||FJ|||||FJL-7FJL7|||LJL-----7|||||||F-JLJ.LJF7F7|FJ7JFL|F|
|
||||||
|
.LJ|7|F-JJ||-L-----JL7FJLJ|||FJ|L----7-||FJL7|L7|||L-7FJ|LJ|L7|||||L7||L7|L7||LJ||||F||LJ||F7FJ|F7||||F------7||||||LJL-7F7F77|||||L77||FFLJ
|
||||||
|
F7-|J-7|J.F7.L-F-----J|F7FJL-JFJ|F7F7L7|||F7||FJLJL7FJL7|F7|FJ|||||FJFJFJ|FJ||-FJ|||FJL-7|LJ||FJ|LJ||||F---7LLJ|||||F---J||||FJLJ|L7|F7|LFJ.
|
||||||
|
FJF|JJLL--JF7LFJF7F7F7LJLJF7F7L--JLJL7|||LJLJLJF---JL7J|LJ|LJFJ|||LJFJFJFJL7|L7|FJ||L7F7||F7||L7|F7|LJLJF--JF-7|LJLJL-7F7|||||F--JFJLJ|-JL7F
|
||||||
|
.F-J|F.L-LFJL7L-JLJLJL---7|||L7F-7F-7LJ|L-----7L7F7F7|FJF7L-7L-J|L-7L7|FJF7||FJ||FJ|FJ|||||LJ|FJLJLJFF-7L7F7L7LJF-7F--J|LJLJLJL7F7|F--JF7-F7
|
||||||
|
F|LFF.7.7|L-7|LF--7F7F7F-J|LJFJ|FJ|FJF7L----7FJFJ|LJ||L7||F-JF--JF7L7|||FJ|||L7LJ|FJL-J|||L7FJ|F----7L7|FLJL7|F-J|LJF7FL7F-----J|LJL7F77F7--
|
||||||
|
-J-JJ7|7LJJL|L7L-7LJLJLJF7L7FJFJL-JL-JL----7LJJ|FJF-J|-|||L-7L-7FJ|FJ||||FJ|L7|F-JL---7|||FJL7|L7F-7L-JL---7LJL-----JL7FJL------JF--J|L-J|7|
|
||||||
|
|J..LJF|FJLFJFJF7L---7F-J|FJL7|F-----7F-7F7L--7||FJF7|FJ||F-J7FJ|FJL7||LJ|FJFJ|L7F7F7FJLJ|L7FJL7||FJF7F--7.L---7F7F7F-J|F-----7F-JF7FJF--JF7
|
||||||
|
|-FF.FLJJ|-L7L-JL-7F7LJF-J|F7LJ|F7F7.LJLLJ|F--J||L-JLJL7|LJ-F-JFJL7FJ|L-7LJFJFJJ||||LJF-7|FJL7FJLJL7|LJF-JF-7F7LJ||LJF7||-F--7LJF7||L7L--7||
|
||||||
|
-7FJ-J.|L77.L----7||L--JF-J||F7LJLJL----7FJL--7|L7F--7F|L--7L-7|F-JL7|F7L7.L7L-7LJ|L-7L7LJL-7|L7F-7LJ7FJF7L7||L-7LJF-JLJL-JF7L7||||L-JF-7LJ|
|
||||||
|
FLJJL7--F--------J|L----JF-JLJ|-F-----7FJL7F7FJL-JL-7L-JF--JF-J||F7FJ||L-JF7|F-JF-JF-JFJF7F-J|FJL7L--7L-JL-JLJF-JF7L7F----7|L7L-JLJF7FJFJF-J
|
||||||
|
FL-...|.L7F7F7F7F7|F-----JF7F7L7L--7F7||F7LJ|L--7F--JF-7L-7FJF7|||||FJ|7F7|LJL77L-7L7FJFJ|L-7||F7|F-7|F7F-----JF-JL-JL---7LJFJF7F7FJLJFJFJ||
|
||||||
|
|-FFF-7-LLJLJLJLJ||L------J||L7L7F7LJ||LJ|F7L7F7||F7FJFJF7|L7|||||||L7|FJLJF-7L--7|FJL7|JL7FJ||||LJFJ|||L------JF--7F7F-7L-7|FJLJ|L--7L7L7F|
|
||||||
|
J-|-J|.LJ7|LL|F--JL-------7LJ-L7LJL--JL--J|L7LJLJ||||FJFJ||FJ|||||||FJ|L7F7L7|F--J||F7||F-J|FJ|||F7L7|||FF--7F-7L-7LJLJLL7FJ||F--JF-7L7L-J-7
|
||||||
|
|-J|FFL---J-F-JF---------7|F--7L7F-7F7|F--JFJF-7-LJLJ|FJLLJ|FJ||||LJL7|L||L7||L--7LJ|LJ|L7FJ|FJ|LJL-JLJL-JF7LJL|F7L-----7|L7||L7F7L7L7L-7JL-
|
||||||
|
.LJF7LL-J7||L-7|-F-------J|L-7|JLJFLJL-JF-7L-JFJF7F--JL---7||FJ||||F7||FJ|FJ|L7F-JF-JF7L7||FJ|.L7F7F------JL--7LJL---7F-J|FJLJ-LJ|FJ7L-7|7LL
|
||||||
|
|7JFL77.||-J.L||FJF------7|F-J|F-------7L7|F--JFJLJF-7F7F-JLJL7||L7||||L7||FJFJ|F-JF7||FJLJL-JF-J|LJF---7F-7F7L-7F--7LJF-JL7F7FF7|L--7.LJJ7|
|
||||||
|
|J-LL.7--||J-FLJL-JF----7||L-7|L----7F7|FJ|L7F7L7F7|7|||L--7F-J||FJ||LJFJ||L7L-JL--J|||L7F7F-7L-7|F-JF-7LJ.LJL-7LJF7|F7L-7FJ||FJLJF7FJF|LFL-
|
||||||
|
LFF7J-LJFJJ-F7F77F7L---7LJL--JL-7F7FJ||LJFL7LJL7LJ|L7||L7F-JL-7||L-JL7FJFJL7L7F-----J||FJ|LJFJF7LJL-7|FJF77F--7L7FJLJ|L-7LJFJ|L7F7|LJ7FJ.7J7
|
||||||
|
||LJJ7J7||L-|LJL-J|F7F7L---7F7F7LJLJ||L--7-L7F-J.FJFJ|L7|L7JF7||L7F7FJ|FJ|FJFJ|F7F-7FJ|L7|F7L-JL7F--J|L-JL-JF-J||L---JF-JF7|FJ7LJ|L-7-|JF|FJ
|
||||||
|
F|-JFFFFJ7|.L----7||LJL--7LLJLJL-7F--JF--JF7LJF-7|FJFJFJ|FJFJLJ|F||LJFJ|F7L7L7||LJJLJ|L-JLJL-7F7LJF7FJ7F--7FJ.F7|F7F-7|JFJ|||F--7|F7L7--J.|J
|
||||||
|
LLJFJ--L-J-FJF7F-JLJF7F-7L7F-----J|F--JFF-JL--JFJLJJL-J.|L7L7F-JFJL-7L7LJ|F|FJ||.F7-F77F7F7F7LJ|F7|LJF7L-7|L--J|LJ||FJL7|FJ|LJF-J||L7|JJ|-J|
|
||||||
|
LL7LJ|L-7|||FJLJF---JLJ-L7LJF7F7F7|L---7|F--7F-JF-7F7F-7|FJ-LJF-JF7FJFJF7|FJ||||FJL-JL-JLJ|||F7LJLJF7|L--JL---7L-7|||F7LJL-JF7L-7LJL||-F|L-7
|
||||||
|
FL7JL7---7F-JF--JF77F7F--JF7|LJLJLJF7F7LJL7LLJF7L7||||FJLJF7F7L-7|||FL7|LJL7L7||L7F7F7F7F7LJLJL7F--JLJF-----7|L--JLJLJL7F7F-JL--JJ|JLJ-FL-L7
|
||||||
|
77LF-FF-L-L--JF--JL-JLJF7FJLJF7F7F-JLJL---JF7FJ|FJLJLJL-77|||L--J||L-7|L-7FJFJLJFJ|||LJ|||F-7F7LJF----JF7F-7L--------7F|||L------7JJFLF7|JLF
|
||||||
|
|L-77.J.L7JF-7L-----7F-JLJF7FJLJLJF--7F-7F7|||FJL--7F-7FJFJ|L--7FJ|F7|L--JL7|J|.|FJ||F-J||L7LJ|F7|F----JLJJL-----7F--JFJ||F-----7|.FFFFJ|J-F
|
||||||
|
LJL|77-FFF7L7|F7F7F7|L7F--JLJF--7FJF-J|FJ|LJLJ|LF-7|L7LJL|FJLF-J|FJ||L7J7F-J|F-7LJ-LJL--JL-JF7|||||F--7F--------7|L--7L7||L----7LJ.LL.JFJ-FJ
|
||||||
|
L|--.|F-FJL-JLJLJ|||L7|L-7F7FJF-JL7L--JL-JF7F7L7L7||FJF-7||.FJF7|L7|L-J|FL-7||FJF----7F-----J|LJLJLJF7||F-------JL-7FJJLJL7F7F-JL|-FFJ.|J.F7
|
||||||
|
-|J-7|J-L-7F7F7F7LJL7LJF7LJLJ.L---JF-7F---JLJL7|FJLJL7L7||L7|FJ|L7||JFFF..FJLJ|JL---7|L-----7L-7F7F7||LJL---------7|L---7J|||L-7F7|FFJ7J.-FL
|
||||||
|
|L77L|.7FLLJ||||L7F-JF7|L---7FF7JF-JFLJF7F---7LJ|F--7|FJLJFJLJ.L7|||J|7LF-L7F7|J.LLFJ|F7F7F7L-7LJLJLJL----7F------J|F7F7L7|||F7LJ|7L-JL-7|||
|
||||||
|
JJ||.LF|7.F7LJLJFJL-7||L7F7FJFJL-JF7F7FJLJF--JF7|L-7LJ|F7FJF7F-7||LJ-JLF--LLJLJ77-FL7||LJ|||F7|F----7F---7|L------7LJLJ|FJ||LJ|F7|J7L7-L.FFL
|
||||||
|
LFJFF---F-J|J.F7L--7|||-LJ||FJF---JLJLJF-7|JF-JLJF-JF-J|LJFJLJFJ||J|L--7.|7|.FLJ--|F|LJF7LJLJ|LJF--7LJF--JL--7F7F7L--7LLJFJL7JLJLJ77LJ7L-F|.
|
||||||
|
L77LL7||L-7L7FJL---JLJL---JLJFJF--7F7F-JFJL-JF7F-JF7|F-JF7|F--JLLJF-77.L.7-.L7LLJ-F7L--JL-7F7|F7L-7L-7L-----7LJLJL7F7L--7L--JF777|.J77F-FFF7
|
||||||
|
FJF7LL--L-L7LJF7F-----7F7F7F7|JL-7LJ|L-7|F7F7||L--JLJL7-|LJL---7LJ7L|77.F|JFLJ7-FFJ|F7-F--J||LJL-7L7FJ-F7F-7L-7F-7||L--7|F7F7|L--7JF7JL7FLJF
|
||||||
|
|-7J7FLF77LL7FJLJF----J|LJ||||F--JF7L--JLJ||||L7F--7F7L7|F----7L7FJJLL7-FF.7.|7FLL7LJL7L---JL---7L-JL-7|LJ-L-7LJFJ|L7F7LJ|||||F--J||JJJLFJ7|
|
||||||
|
7F|FLJ7FF7F-J||F-JF-7F7L7LLJLJL--7|L-----7|||L7|L-7LJL7LJL---7L7L77F77|7F-FJ7|F|.LL--7L-7|F-----JF7F-7LJF7LF7L--J-L-J||F7||||||J||-FJ7.F|-J.
|
||||||
|
--JFJFLF|LJF7|FJF7L7LJL-JF7F7F7F7||F--7F7|LJL-J|F-J-F-JF-7F-7L7L7|-L77|LF.|--JLJFJJF-JF7L7L---7F-J|L7L7FJL-JL7F---7F-JLJLJLJLJL7F7F77-|-|J.|
|
||||||
|
L|--.|.FJF-JLJL-JL-JJF7-FJLJLJLJ|LJL-7LJLJF7F-7|L--7|F7|-|L7L-JLLJ-JF--J|F-7JFLF7JFL--JL7L-7F7LJF7L-J-LJF----J|F-7|L7F---7F7F-7LJLJL7.LF7.F|
|
||||||
|
.7FJ.J.L-J|-F-----77FJL7L----7F7L-7F7L--7L|||FJL--7|||||FJFJJ.F77L|JJ.|FLJFLF7.JJF------JF7LJL-7||.F7FF7L-----JL7LJFJL--7LJLJ|L7F-7FJ7F7JFJ.
|
||||||
|
F-JFJJF|-L|.L--7F7|FJF7L-7|F-J||F7LJL--7L7|||L7F77LJ||||L-J.F-JL7L|-.7JLL-JJ.J7||L--7F7F7|L7F-7LJL-JL-JL-------7L--JF7F7|F7LF7|LJ7LJF-J|-|J7
|
||||||
|
|7L|F|-|.LLFF-7LJ||L-J|F7L7|F7|LJL----7L-J||L7LJL--7||||F7F7L-7FJF7J-|7.L---..F7LJLFJ|LJ||FJ|FJF--7F----------7L--7FJLJ|||L7|L7F7F7FJF-J7LF|
|
||||||
|
7J-FJ7.J7LLFL7L--JL---J|L7LJ|||F------JJF-JL-JF7F--JLJLJ|LJL7-|||||F-|-F7F7-77FLJLLL7|F7||L7|L7|F-J|F--------7L7F7|L--7LJ|FJL7LJLJ||FJJFJ7|7
|
||||||
|
L-F7JJ7.7-FFJL7F-7F7F7FJ|L7FJLJL-7F--7FFJF7F--J||F7F7-F7|F--JFJL-J|7J|F777JF-77JJFLLLJ||LJ-LJ7LJL--JL----7F-7L-J||L---JF7||F7|F---J|L77|J|L|
|
||||||
|
||||L-J|LF-|-LLJ7LJLJ|L--7LJF7F7FLJF7L7L7|LJF7.LJ|LJL-JLJL7F7|F7F7L-7-LF7FF7|F77FJ.||FJL-----7FF--7LF----J|FJF--J|F7F--JLJLJLJL----JFJFL.JJ|
|
||||||
|
J-|F-L-F7L-|FF7F7F---JF--JF7||||F7FJL7L-JL--JL--7|F7F----7|||||LJ|F-JFL|L7||FJL7LJFF7L-----7FJFJF7L7L-----JL-JF-7||LJF--7F7F7F--7F-7|F7--.F.
|
||||||
|
.LLJLLFJ-J-FFJLJLJF-7FJLF-J|||||||L-7L--7F7F7F-7LJ|LJF--7LJ|LJL-7LJF77JL7||||F-J7JFJL-7F---JL7L-JL7|FF7LF----7L7|LJF7L-7|||||L-7LJ7LJ-|7..F7
|
||||||
|
|.|7F-JJ.J--L7F7F-JFJ|F-JF7LJLJLJ|F-JF7LLJLJ||JL--JF7L7FJF7|F---J.FJ|F77|LJ|||JF7JL--7|L7F7F7L----JL-JL7L---7L7||F7|L7FJLJ|||F7|F--77|L--7L.
|
||||||
|
L-JL|7777FF||LJLJF7L7||F7|L-----7|L--J|F---7|L-----JL-JL7|LJL-7F7FL7||L7|F7|||FJL7F--JL7LJLJL7F7F-7F7F7L----JJLJLJ|L7|L-7FJ||||||F-J7JF-F-77
|
||||||
|
FJFLJL|7-L-F-----JL7LJLJ||F-----JL----J|F--JL--7F--7F7F7LJF-7FJ||F-J||FJLJ|||LJF7|L--7FJF---7LJLJFJ||||F-7F7.F---7|FJL--JL-JLJLJ||F7J.FL--77
|
||||||
|
J7|7|JLJ7JLL------7L7F77LJL----7F------JL----7F||F7LJLJL7FJ|LJFJ|L-7|||F7FJ||F-JLJ7F7|L7L--7|-F--JFJLJLJFLJL7|F--J|L---7F7F7F7|FJLJL-7JJ-F||
|
||||||
|
FF|-L.|7L7|L7|FF7L|FJ||F7F-7F-7||F---7F----7FJFJLJL----7|L-7F7|FJF7||||||L7||L7F7F7||L7L7F7|L-JF-7|F--7F7F7FJ||F7||F---J|||LJL-JF7F7FJJ.-F77
|
||||||
|
F7F-L7L-7JF--LFJL-JL-J|||L7|L7|LJL--7|L---7|L7|F7F7F7F-JL--J|LJ|FJ||LJ|||FJ|L7||LJ||L7L7LJ|L--7|FJ|L-7||LJLJJ|||L7LJF-7FJLJF7F7FJ||LJJF|.L|7
|
||||||
|
J7L77F|L|.JJF|L------7|||FJ|FJL-----JL---7|L-J||||||LJF7|F-7|F-JL7|L7FJ|LJFJ.|LJF-JL7|7L-7L7F7LJL-JF-JLJF7|F-JLJFJF7|FJL7F-JLJLJLLJJ..FJL.L7
|
||||||
|
L|.LLJF-JF|7FF--7F7F7||||L7|L7F7F-------7|L--7||||LJF7|L7|FJ||F-7|L-JL7L-7|F7L-7|-F-J|F7FJFJ|L7F--7L--7FJL-JF7F7L7|LJL7FJL-----7|LF-7-|7|.7|
|
||||||
|
7||7LLLJ-FJF7L-7LJLJLJLJL-JL7LJLJF------JL---JLJLJF7|||FJ|||||L7|L---7L77|LJL7FJL-JF7||LJFJFL7||F-JF--J|F---J|||FJ|F--J|F--7F-7|F7|FJ7|FF|LJ
|
||||||
|
L-L7.|.7.FFJ|F7L-----7F--7F7L7LF7L---------7F-7-F7|||||L7|L7||FJ|F7F7L7L-JF--JL-7F-JLJL-7|F7FJ|||F7L---JL7FF7LJLJF|L---J|LFJL7LJ|LJL7FF7L7-7
|
||||||
|
|.FF-7-FFFL7LJL----7LLJF-J|L7L-JL7F----7F--J|FJFJ||||||FJL7||||FJ||||JL--7L7F7F-JL7F7F7F|LJ|L7LJ|||F7F7F7L-JL-----JF7F-7L7L-7L--JF-7L-JL7J-J
|
||||||
|
77|L7L.||LFJF--7F-7L-7FJF7L7L7F7FJL---7|L---JL7L7|||||||F7|||||L7|||L-7F7|FJ||L7F7|||||FJF7L7|F7LJLJLJ|||F-7F7F7F-7||L7L7L-7L----JFJF--7|J-7
|
||||||
|
--L-JF|LJ.L7|J7LJFJF7LJFJ|FJ-LJ|L-----JL------JFJ|||||||||||||L7LJ||F-J|||L7|L7LJ|||||||FJL-JLJL-----7|||L7|||||L7LJL-J7L--JF----7L7L7.LJJF7
|
||||||
|
|-J-J-F-J7JLJFF7-L-J|F-JFLJF7F-JF7F--------7F-7L7||LJ||LJLJ|||7L-7|||F7|LJFJ|FJFFJLJ||LJ|F77F---7F7LFJLJ|FJLJ||L7L---------7|F---JJL-J77L7F7
|
||||||
|
F7.FL7J.FF-LLFJ|F7F-JL7F---J|L--JLJF-----7FJ|FJFJ||F7||F---J|L-77||||||L-7L7||F7|F-7||F-J|L7L--7|||FJF-7LJF7-LJFJF7F7F--7F7LJL--7-FL-|.7F|JL
|
||||||
|
L|7F7|.F|LF7FL7|||L-7FJL-7F7L-7F--7L7F--7LJFJ|LL7|LJ|||L---7L-7|FJLJ|||F-JFJ|LJ|LJ-|LJ|F7L7|F-7||||L-J||F7||F7.L-JLJ|L-7|||F7F-7L7L|---L7|.|
|
||||||
|
F-J|J.FFF-J|F-J||L--JL--7LJL-7|L-7L-J|F-JF7L7L7FJL-7|LJF---JF7||L-7FJ||L-7|J|F7L7F7|F7LJL-J|L7||LJL--7FJ|LJLJL7F7F7JL--JLJLJ|L7L-JL--|.LF77.
|
||||||
|
-JJL.FLLL-7|L-7LJF---7F7|7F7FJ|F7L---JL--JL7|FJL7F-JL-7|FF7F|LJ|F7||FJL7FJL7LJL7|||LJL-7F--JFJ|L--7F-JL-JF-7F7LJ|||F-------7L7L--77.FF-F.L77
|
||||||
|
FLFJ-J.LLFJL--JF7|F--J|||FJ|L7|||F---------J|L-7|L7-F7|L7|L7L7FJ|LJ|L-7|L7FJF-7|LJL7F--J|F7FJFJF--J|F7F--JJLJ|F-J|LJF---7F7L7|F7FJ-L-J|.F.L7
|
||||||
|
|-7J.J...L-7F7FJ|||F7FJLJL7L-JLJ|L------7F7-|F-JL7L7|||FJ|FJFJL7L7FJ|FJL7|L7|FJL7F-JL-7FJ||L7||L--7|||L-----7LJF7|F-JF7-LJL-J|||||.L|FJ7L-7|
|
||||||
|
|FJ..|-7FLLLJLJ.LJLJLJF-7-L7F7F7L---7F--J||FJ|F7FJFJ|||L7||FJF-J7||F7L-7LJFJ||F7|L-7F7||FJL7||F7F-JLJ|7F7F-7L-7|||L--JL-----7LJ|L-7-LF-L..77
|
||||||
|
F-JJ-|.FFF--7F-7JF---7L7|F7||LJL-7F7LJLF7|||FJ||L7L7|||FJ||L7|JF7||||F7|F-JJ||||L-7|||||L7FJ||||L--7FJFJ|L7|F7LJLJF-----7F--JF7L--J7.J-|7..|
|
||||||
|
7JJ-7J7FFJF7|L7|FJF-7L-JLJLJ|F--7LJ|F--J||LJL7||LL7|||||FJ|FJ|FJ||||||||L-7FJ|||F7|||||L7|L7|LJ|F7FJ|-L7L-JLJL---7L7F--7LJF7FJL-7JJL7.L7J7-L
|
||||||
|
LF-FF---JFJ|L7||L-J-L-----7FJ|F7L--J|F--JL7F-J||F7||||||L7|L7|L7||||||||F-JL7||||||||||FJ|FJ|F-J||L7|F7L--7-F--7LL-J|F-JJ-|||F--J7||77LJ||7|
|
||||||
|
7|FFL7F7FJ.L7LJL-7F7JF77F-J|JLJL7F-7||F7F7|L7FJ||||||LJ|FJL7|L7||||||||||F-7||||||||||||FJL7|L7FJ|FJ||L7F7L7|F-JF---JL-7FFJ|||F-7J-.FJ-LJ7-J
|
||||||
|
L-7--LJLJF--JF7F7LJL-JL-JF7|F---J|FJ|||||||FJL7LJ|||L-7||F7|L7||||||||||||FJ|||||||||||LJF-JL7||FJ|FJ|-||L7LJL--JF--7F7L7|FJ|LJFJ.L-J--F|L|.
|
||||||
|
.|||7.||-L---J||L7F7F-7F7|||L-7F7|L7|||||||L7FJF7||L7FJLJ|LJFJ||LJLJ||||||L7|LJ||||||||F7L---JLJL7|L7|FJL7L7F7F--JF7||L7LJL-JF-JJJF|JFF.J-FF
|
||||||
|
|J|-7F|FF--7F7||.LJLJFJ|||LJF-J|||FJ||||||L7|L7|LJL7||F--JF-JFJL7LF7LJ||||.|L-7||LJLJ|LJL--7F---7||F|||F7|FJ||L7|FJ|||FJF-7F7L--7JJLL|JL-F|J
|
||||||
|
|FJ||7LFJF7LJ|LJF7-F7L7|LJF-JF7|||L7|||LJL7|L7|L7F-JLJL-7FJJFJF7L7||F-J|||FJF-JLJLF7FJF-7F7LJF-7|||FJ|||||L7|L7L-JFJLJL7|F||L---JJ|..|-|FL77
|
||||||
|
F--|L-JL-J|F7L--JL-JL-JL7FJF7|LJ|L7||LJF--JL7||FJL---7F7||F-JFJL7LJ|L7FJLJL7|.F77FJLJFJ-||L-7L7LJ||L7|||||L||FL---JJF77|L7|L7F7JF7J---7F7|L7
|
||||||
|
FJJLJ.FF7|LJL------7F7F-J|FJ||F-JFJ||F-JF7F7|||L7F7F7||LJ||F7L-7|F7|FJ|F---JL7|L7|F7FJF-JL-7|FJF7LJFJ|LJLJFJL-------JL7L7|L7LJL-J||JL|-LJ-LF
|
||||||
|
-JFL.F7|L--7F------J||L-7LJ|LJL7FJ-LJ|F7|LJLJ|L7||||||L-7|||L7FJLJLJL-JL--7F7LJFJLJ|L7|F7F7||L-JL7.|FJF---JF7F----7F-7L7LJFJF7F--J77-|||7..|
|
||||||
|
|L|LFJ|L--7|L---7F-7||F7|F---7FJL7F7FJ||L7F--JFJLJ||||F-J||L7|L----7F-----J||F7|F--JFJLJ||LJL7F-7L7|L7|F7F7||L---7LJ7L7L-7L-J||F|.F77.-L-7F-
|
||||||
|
L7-FL7L---JL----J|FJ||||||F-7LJF-J|LJFJ|FJL-7FJF7LLJ|||F7|L7|L7F-7FJL--7F7FJ||||L7F7L7|FJL77FJL7L-JL-JLJLJLJL7F--JF7F7L-7L--7|L777JLF7FJLF|J
|
||||||
|
|.LJ.L----7F7F--7||FJ||||||FL-7L-7L7FJ|||F--JL-JL7F7||||||FJ|-|L7|L7F-7|||||||||FJ|L7L7|F7L7|F7L----7F7F7F---JL---JLJL7J|F7FJ|FJL-.FL.L7.|L7
|
||||||
|
-JFL.|7FLFJ|LJF-J|||FJ||||L7-FJF-J.|L-7||L--7F7F7||LJ|||LJL7L7|FJ|FJL7LJ||L7LJ||L7L7L7|LJL-JLJ|F-7F7LJLJ||F--7F7F7F7F7L7||LJL||-F.F||-L-F|-.
|
||||||
|
JF-JFL-7-L7|F-JF-JLJL7||||FJFJFJF--JF7|||F--J|LJLJL7FJLJF--JFJLJJ||F-JF7|L7L7FJL7L-JJ|L-----7FJ|FJ||F7F7|||F-J|||||LJ|FJ|L--7LJJ|---F-J7-JFF
|
||||||
|
J7.L-7.-F-J||F7L--7F7||||LJLL7|FJF7FJ|||||F-7L--7F-JL7F-JF-7L---7LJL7FJ||LL-J|F7L-7F-JF---7FJL-JL7|LJLJ||LJ|F7||||L-7LJFJF7FJ-|7L-JJ..||.LFJ
|
||||||
|
F|-FJ---|F7|LJ|F--J|LJ|||JF--J||FJ||LLJ||LJ-|F7FJL7F7|L7FJFJF7F7|-F-J|FJL7F--J|L7FJL-7L-7|LJ|.F--JL--7FJ|F-J|||||L7FJF7L-JLJ.||F-JJ.-7L|7--7
|
||||||
|
FL-F7FJFLJ||F-JL-7LL7FJLJ.L--7|||7|L-7FJ|F--J||L-7||||FJL7L7|LJLJFJF7|L7FJ|F-7L7||LF-JF7L---7FJF7F7F7|L7|L-7|||LJ-|L-JL----7-|L7-||FLJ7L|7|J
|
||||||
|
-.FL||-FJ||||F-7FJ.LLJJF|-J|LLJ||FJF7|L7||F7FJ|F-J||||L--J7|L---7L-JLJFJL7||F|FJ|L7L-7|L----JL7|LJ||LJJLJF-J||L--7L7F7F-7F-J7JF---JLJ-|7LF77
|
||||||
|
L-7JLL.-JFLJ||||L7FLL|-J.|JLF--J|L7|LJFJ||||L7|L-7||||F----JF-7FJ|F---JF-J|L7||JL-JFFJL---7F-7|L-7|L---7FL7FJL7F-JL||||FJL7.F----J|F-7J--J|7
|
||||||
|
|--.7JF77.LFJL7L-J7|F|||77|.L7F7|FJL-7L7|LJL7||F7|LJ|||F---7L7||F-JF7F7|F-JFJLJF----JF7F--J|FJL-7||F---JF-J|F-J|F-7||LJL7FJ.|LJJ|JFL-JJ77F-J
|
||||||
|
F7-7|-F7-|JL-7L7LF7-L|JJL||-LLJLJL7F7|LLJ|F-J|||LJJFJ|||F--JFJLJ|F7|LJ|||F7L--7L-7F7FJ|L---JL--7LJ||F7|FJF7||F7LJFJ||JJJ||-77J.-7F7L7.LFLJ7|
|
||||||
|
||FF|7L7-|-|-|FJ-LJ.FJJ.F7|7.|7L-|LJLJ7JF7L-7||L--7|FJLJL-7FJF7-|||L-7||||L7F-JLFJ||L7L7F7F7F-7|F-JLJL7|FJ||||L7FJ|LJ--FJL7|FJFLJF7-|7J.L7L|
|
||||||
|
L-J|..FJL7.J.LJ|-L7J77.F|J7F-77|.F7LJ|L-|L--J||F7FJ|L7F---JL-J|FJ||F7|LJ|L7|L-7F|FJL-JFJ||||L7||L7F7F7|||-||||FJL-7.LFLL7FJJ|-F.-FJ7FL.F7|.|
|
||||||
|
|J-F7-77-LJLJ|J7-7JL|FJ-||-7LLJ-JLJ|||.LL7F7FJLJ|L7L7|L-7F7F-7|L-J||LJF-JFJ|F7|FJL--7FL-J|||FJ|L7||||LJ|L7LJ||L7F-JFFJJJLJ.||LLJLL-J.LJJ-L-7
|
||||||
|
|.7---L|-|F7J|-77|--.J|F77.|.L|..|-|-LJJ-LJ|L7|FJFJJLJF-J||L7LJ|7LLJ7FJF7L7LJLJL7F--JF---J||L7L-JLJ|L-7L7L7.LJ.|L7|F77|J|J7FL7L|7LF-L-|J.7-L
|
||||||
|
F77.|F7.FJ-J.JJLJ|JL|LLL-J.FF.|F-L7J7LJ77|-L-JFJFJJLF-JF7|L7L7L|J-|FFJFJ|FJ7F-7FJL7F-JF7F7|L7L---7FJF-JFJFJFJ-LL7|J77FJ.LJLJFL-FJ.F7.L7.FL-J
|
||||||
|
FLF-|JL7||FL-JL||F..JJFJ.L.|L.F|J-F-|7L-|F-JJLL-JJLFL7FJLJFJFJ.|--J-|FJFJ|F7L7LJF-J|F7|||LJ7|F7F-JL7L7FJFJ.|7.LLLJL--FJF||L77|.|FF--7.JF-|F|
|
||||||
|
L.|-77LFFF7JL7-LJ|--7F7-L77-.7.|..JJ.L7|.LJF7J|FJ|F|LLJ7L-L7||-|-JFFLJ-L7LJ|FJF7|-FJ||||L-7FJ|||-|FL-JL7|J7LLJ.F|.||J|FLJ-|LJ.FLFJ.|FFJL7J||
|
||||||
|
.FL-J--||LF-|-F-|7|JF-JLLJJ7.LFFJ7J..FF--.FF7.L|LL||-LLJL7JLJ7FL-.FL..F-JF7|L7|LJJL7|LJL7FJ|FJ||FLLJ||-LJ.F-|L7J|F7L.LF|7-L|7FLL|J---L-L7F|J
|
||||||
|
FJJ7.|-F|7JF|LLF-L77..|7.FF7-.LF7JLFJ|L7J..FJ-J..|||77||.||L.LJJ.F|.F-L-7|LJFJ|J|7.||.F-JL7LJL|L7||F|7.L|-LF--F-7LJ.L.F.|.||-JLLJ.-.|7J|L7J7
|
||||||
|
|JJF7.L|LJ.LL77|J-|J7-J|FFLJ7.JLJL7J|7LL7.F|7-L-L-LJL7-|7L7|.|7--JFF|.LLLJJLL-J.L|-LJFJF-7L7JFL7L7LJLF7FF-77LLJJLJ.7J-L-7.L7L|7L7FLFF77|F|JL
|
||||||
|
L7FJF-7F.LFJ|JL--7|-|FL-FJ7-|.L--L|--|7F-7|JL7-JJF|-FJ.LJ.-F7|--L7LJ|7-J7-F7-L-7LJ.|L|FJFJFJ.|.L-J.|7L7|||LJ-F77FJ-J-FLJ|F-7.|7-|JL-J.7-J..|
|
||||||
|
.JJJ|JFL7F|FJ7..LL|-|7FFL-J||JFL-J.F||.L.L-77|F---J|JFJ.L7LFJJ7LJLF7|7.LF-FJ7LF|7FJ7JLJLL7|JJ--JJ7.F|-|77F||JLL-|...FJ7F|7-|F|7L|.7|F-|J.FF7
|
||||||
|
J-LF|.|7|7|L-F-77-L-.|LJL7LLF.|JJ.L--J7JJ|LJFLF777LL-J-F.|-7JFJ.|FJ|L-7F7||-|7|---J7.||J7LJ.FL.L7LL7|-|L7-J|..|7J7.7J7F.L|J|7LL-7-L-J-|7FFJJ
|
||||||
|
LF.FJF7-|-L--FL7L-7|-F.F-JL|.LF7F7L7-7JJFLLFFJ.LJ7-L|FF|F|.|7|.7J7...|LLL-F-7J.JFFF-7F.LFJJ-7.|7L7JLF7|F|J.|F7FJ...J||JJFF7LJF.FL7L-J.L-77|7
|
||||||
|
F--JJL-7J|LJLJJLF-L7---J-|.J-.JLJJLL7JL7JJ.7.L|LLJ-.L-J-7J-L7LLJ---FJ-LJJ..JLL7.L-JLLLL-7-FJLF77L---7JJLJ.LFJL--F-F-JJ.LLJ|-F7-JJ.JJ.JJF7--7
|
||||||
146
2023/go/day11/day11.go
Normal file
146
2023/go/day11/day11.go
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
package day11
|
||||||
|
|
||||||
|
import (
|
||||||
|
"adventofcode2023/utils"
|
||||||
|
_ "fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Galaxy struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
galaxies := []Galaxy{}
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
var expand_rows []int
|
||||||
|
var expand_cols []int
|
||||||
|
for y,line := range lines {
|
||||||
|
for x,char := range line {
|
||||||
|
if char == '#' {
|
||||||
|
galaxies = append(galaxies, Galaxy{x, y})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fmt.Println(galaxies)
|
||||||
|
for y,line := range lines {
|
||||||
|
no_galaxy := true
|
||||||
|
for _,char := range line {
|
||||||
|
if char != '.' {
|
||||||
|
no_galaxy = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if no_galaxy {
|
||||||
|
expand_rows = append(expand_rows, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for x:=0;x<len(lines[0]);x++ {
|
||||||
|
no_galaxy := true
|
||||||
|
for _,line := range lines {
|
||||||
|
if line[x] != '.' {
|
||||||
|
no_galaxy = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if no_galaxy {
|
||||||
|
expand_cols = append(expand_cols, x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
galaxies = expand_row(expand_rows, galaxies, true)
|
||||||
|
galaxies = expand_col(expand_cols, galaxies, true)
|
||||||
|
// fmt.Printf("r: %v c: %v\n%v\n", expand_rows, expand_cols, galaxies)
|
||||||
|
dist := 0
|
||||||
|
for i:=0;i<len(galaxies)-1;i++{
|
||||||
|
g1 := galaxies[i]
|
||||||
|
for _, g2 := range galaxies[i+1:] {
|
||||||
|
dist = dist + distance(g1, g2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dist
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
galaxies := []Galaxy{}
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
var expand_rows []int
|
||||||
|
var expand_cols []int
|
||||||
|
for y,line := range lines {
|
||||||
|
for x,char := range line {
|
||||||
|
if char == '#' {
|
||||||
|
galaxies = append(galaxies, Galaxy{x, y})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fmt.Println(galaxies)
|
||||||
|
for y,line := range lines {
|
||||||
|
no_galaxy := true
|
||||||
|
for _,char := range line {
|
||||||
|
if char != '.' {
|
||||||
|
no_galaxy = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if no_galaxy {
|
||||||
|
expand_rows = append(expand_rows, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for x:=0;x<len(lines[0]);x++ {
|
||||||
|
no_galaxy := true
|
||||||
|
for _,line := range lines {
|
||||||
|
if line[x] != '.' {
|
||||||
|
no_galaxy = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if no_galaxy {
|
||||||
|
expand_cols = append(expand_cols, x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
galaxies = expand_row(expand_rows, galaxies, false)
|
||||||
|
galaxies = expand_col(expand_cols, galaxies, false)
|
||||||
|
// fmt.Printf("r: %v c: %v\n%v\n", expand_rows, expand_cols, galaxies)
|
||||||
|
dist := 0
|
||||||
|
for i:=0;i<len(galaxies)-1;i++{
|
||||||
|
g1 := galaxies[i]
|
||||||
|
for _, g2 := range galaxies[i+1:] {
|
||||||
|
dist = dist + distance(g1, g2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dist
|
||||||
|
}
|
||||||
|
|
||||||
|
func expand_row(rows []int, galaxies []Galaxy, partOne bool) []Galaxy {
|
||||||
|
new := []Galaxy{}
|
||||||
|
for _,galaxy := range galaxies {
|
||||||
|
new = append(new, Galaxy{galaxy.x, galaxy.y + howMany(rows, galaxy.y, partOne)})
|
||||||
|
}
|
||||||
|
return new
|
||||||
|
}
|
||||||
|
|
||||||
|
func expand_col(cols []int, galaxies []Galaxy, partOne bool) []Galaxy {
|
||||||
|
new := []Galaxy{}
|
||||||
|
for _,galaxy := range galaxies {
|
||||||
|
new = append(new, Galaxy{galaxy.x + howMany(cols, galaxy.x, partOne), galaxy.y})
|
||||||
|
}
|
||||||
|
return new
|
||||||
|
}
|
||||||
|
|
||||||
|
func howMany(xs []int, a int, partOne bool) int {
|
||||||
|
count := 0
|
||||||
|
incr := 1
|
||||||
|
if !partOne { incr = 1000000 - 1 }
|
||||||
|
for _,x := range xs {
|
||||||
|
if x < a {
|
||||||
|
count = count + incr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func distance(g1 Galaxy, g2 Galaxy) int {
|
||||||
|
val := utils.Abs(g1.x - g2.x) + utils.Abs(g1.y - g2.y)
|
||||||
|
// fmt.Printf("%v - %v = %v\n", g1, g2, val)
|
||||||
|
return val
|
||||||
|
}
|
||||||
38
2023/go/day11/day11_test.go
Normal file
38
2023/go/day11/day11_test.go
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package day11
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`...#......
|
||||||
|
.......#..
|
||||||
|
#.........
|
||||||
|
..........
|
||||||
|
......#...
|
||||||
|
.#........
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
.......#..
|
||||||
|
#...#.....`)
|
||||||
|
require.Equal(t, 374, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`...#......
|
||||||
|
.......#..
|
||||||
|
#.........
|
||||||
|
..........
|
||||||
|
......#...
|
||||||
|
.#........
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
.......#..
|
||||||
|
#...#.....`)
|
||||||
|
require.Equal(t, 8410, r)
|
||||||
|
require.Equal(t, 0, r)
|
||||||
|
}
|
||||||
140
2023/go/day11/input.txt
Normal file
140
2023/go/day11/input.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
.......#...........................................................................#........................................................
|
||||||
|
.............#...........#..................#.............................................................#..............#.......#..........
|
||||||
|
..................................................................#.........#......................................#........................
|
||||||
|
.................#...........................................................................................................#..............
|
||||||
|
.............................................................#..............................................................................
|
||||||
|
......................#.....................................................................#............................................#..
|
||||||
|
.....#...........................................#..........................................................................................
|
||||||
|
............................#..........................................#...............................#....................................
|
||||||
|
...........#......................................................................................#......................#..................
|
||||||
|
....................................................#.....#................................................#......................#.........
|
||||||
|
#..................................................................#.............#...........................................#..............
|
||||||
|
......................................#..................................................#...............................................#..
|
||||||
|
.................................#..........................................................................................................
|
||||||
|
...............#........#..............................................#...............................................#....................
|
||||||
|
.......#....................................................................................................................................
|
||||||
|
............................................................................#...................#..................#.......#.........#......
|
||||||
|
...................#......................#......#.......#.......#..........................................................................
|
||||||
|
............#...........................................................................#................#..................................
|
||||||
|
.....................................................#..................#................................................................#..
|
||||||
|
.............................#.....#..........................................................................#...................#.........
|
||||||
|
...#.......................................................#...............................#................................................
|
||||||
|
............................................#........................................................#......................................
|
||||||
|
...................................................................#..................................................................#.....
|
||||||
|
..........................................................................................................................#.................
|
||||||
|
#.......................#............................#.......................................#..............................................
|
||||||
|
..........................................#.................#.....................................#................................#........
|
||||||
|
..................#............................................................#........................#..............#....................
|
||||||
|
............................................................................................................................................
|
||||||
|
......#........................................................................................#.............................#..............
|
||||||
|
...............#........................#.........#.....#......#...................#..............................#.........................
|
||||||
|
.........................#.....#..........................................#.................................................................
|
||||||
|
.................................................................................................................................#..........
|
||||||
|
...........................................................#..................................................#..........#............#.....
|
||||||
|
.............#.................................................................#............................................................
|
||||||
|
.....................#............#..............#.......................................#..................................................
|
||||||
|
#..........................#...........................#..................................................#.................................
|
||||||
|
.............................................................#....................................................................#.......#.
|
||||||
|
......................................................................................................................#.....................
|
||||||
|
............#..................#...........#........#...............................#..............#...........#............................
|
||||||
|
.......#..............................#.....................................................................................................
|
||||||
|
........................#...............................................................#..............#.................#.............#....
|
||||||
|
.#..........................................................................................................#...............................
|
||||||
|
.........................................................#.....................#.................................................#..........
|
||||||
|
..........................................#..........................................#...........................#.........................#
|
||||||
|
.....#..........................#.................#..........#........#.....................................................................
|
||||||
|
..........#...........#.................................................................................#...................................
|
||||||
|
.............................................................................................................................#.......#......
|
||||||
|
..........................................................#.................#............#..................................................
|
||||||
|
.....................................................#..........................................#...........#...............................
|
||||||
|
.......................................#...............................#.............................#......................................
|
||||||
|
..................................#...............................................#........................................#.............#..
|
||||||
|
.......#.......#.......#..........................................#.........................................................................
|
||||||
|
.............................................#...............#..............................................................................
|
||||||
|
............................#................................................................#..............................................
|
||||||
|
........................................................#..................#.............................#........................#.........
|
||||||
|
...................................................................................................#..........#.............................
|
||||||
|
......#............................................................................#....................................#..................#
|
||||||
|
..................#.....#...............#.....#......#...................................#.....................................#............
|
||||||
|
..................................................................#...........#.............................................................
|
||||||
|
#.............#..........................................#...............#...................#.........#....................................
|
||||||
|
........#.............................................................................................................#.............#.......
|
||||||
|
......................#......................................#............................................................................#.
|
||||||
|
..............................#....................................................#........................................................
|
||||||
|
............................................................................................................................................
|
||||||
|
...............#.............................................................................................#..............................
|
||||||
|
........................#............#............................#................................................................#........
|
||||||
|
...#.....................................................#................#..............#...................................#..............
|
||||||
|
.............................................#..............................................................................................
|
||||||
|
...........................#................................................................................................................
|
||||||
|
.....................................................#......#....................................................#.....#....................
|
||||||
|
.....#....................................#.....#...........................#...................#...........................................
|
||||||
|
..............#.....................#...................................................................#...................................
|
||||||
|
#........................................................................................#..................................................
|
||||||
|
.....................#........................................................................................#.............................
|
||||||
|
..........................#.......................#..................................................................................#......
|
||||||
|
.........#................................................#.........#.......................................................#...............
|
||||||
|
...............................#................................................................#.....#.....................................
|
||||||
|
...................#..........................#.................#..................#..............................................#.........
|
||||||
|
......#......#..............................................................................................................................
|
||||||
|
............................#......................................................................#........#...............................
|
||||||
|
....................................................................................................................#.......................
|
||||||
|
................................................#...........#.................#........................#....................................
|
||||||
|
.................#..........................................................................................................................
|
||||||
|
..........................#......................................................................................#..........#..........#....
|
||||||
|
#...............................................................................................#.....................#.....................
|
||||||
|
............#......................#...................#.................................#.........................................#........
|
||||||
|
............................................................................................................................................
|
||||||
|
....................................................................#.......................................................................
|
||||||
|
.....#........................................#...........................................................#...................#.............
|
||||||
|
..........................................................#..................................#..............................................
|
||||||
|
.............................#............................................#.................................................................
|
||||||
|
......................#............................................................................................................#........
|
||||||
|
..#.....................................................................................................................................#...
|
||||||
|
...........#..........................#............................................................................#........................
|
||||||
|
..............................................#.................#....................#...............#........#.............................
|
||||||
|
...........................#...........................#......................................#...........................#.....#...........
|
||||||
|
.........................................................................................................#..................................
|
||||||
|
.........#......#................................................................................................#........................#.
|
||||||
|
...#.....................................................................#..............#...................................................
|
||||||
|
.............................#......#...............................#................................................#......................
|
||||||
|
.........................................#............................................................................................#.....
|
||||||
|
.....................#............................#............#.................#...........................#...............#..............
|
||||||
|
.............#..........................................#...................................#...............................................
|
||||||
|
..#.............................#...........................................#.....................#................#........................
|
||||||
|
...........................................#...........................#.................................................#..............#...
|
||||||
|
........#...........................#.......................#.......................#.......................................................
|
||||||
|
...........................#.............................................................................#.......................#..........
|
||||||
|
............................................................................................................................................
|
||||||
|
...............#...............................................................................#..........................................#.
|
||||||
|
............................................................................................................................................
|
||||||
|
#...............................................#......#.......#...............#............................................................
|
||||||
|
.........#.................................#...........................................................#....................................
|
||||||
|
......................................#............................#...............................................#........................
|
||||||
|
......................#.........#.............................................................................#.............................
|
||||||
|
....................................................................................#............#..........................................
|
||||||
|
..........................................................................#...............#.................................................
|
||||||
|
...........#.....#................................#.........................................................................#...............
|
||||||
|
..................................................................#.......................................#.........................#.......
|
||||||
|
.........................#................................#........................................................#........................
|
||||||
|
........#...................................................................................#......#....................................#...
|
||||||
|
...............................................................#...............#............................................................
|
||||||
|
.............................................#.........................#.....................................#..............................
|
||||||
|
...................#...............#........................................................................................................
|
||||||
|
..........................#..............................#....................................#..................................#..........
|
||||||
|
...........#.....................................................................#.....#....................................................
|
||||||
|
...#.................................................#...............................................#...........#...........#..............
|
||||||
|
...............#........................#................................................................................................#..
|
||||||
|
....................#..............................................#.....................................#..................................
|
||||||
|
..................................#.....................#................................#..................................................
|
||||||
|
............................................#...................................................#.............#.............................
|
||||||
|
........................................................................................................................#.....#......#.....#
|
||||||
|
...........................................................#..................#......................#......................................
|
||||||
|
...................#.........#....................................#.........................#...............................................
|
||||||
|
....................................................#...............................................................#.......................
|
||||||
|
.............#........................#....................................................................................#................
|
||||||
|
....................................................................................#...................................................#...
|
||||||
|
.......#................................................#................#..................................................................
|
||||||
|
.#.................................................................#..............................................................#.........
|
||||||
|
...................#.....#...................................................................#.........#.........#..........................
|
||||||
|
............................................#.....#............#..................................#.........#................#..............
|
||||||
136
2023/go/day12/day12.go
Normal file
136
2023/go/day12/day12.go
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
package day12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2023/utils"
|
||||||
|
"adventofcode2023/utils/inputs"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cache = make(map[string]int)
|
||||||
|
|
||||||
|
type memoized struct {
|
||||||
|
f func(int) int
|
||||||
|
cache map[string]int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
ans := 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
slices := strings.Split(line, " ")
|
||||||
|
record := slices[0]
|
||||||
|
groups := inputs.ToInts(slices[1], ",")
|
||||||
|
ans += calc(record, groups)
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
ans := 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for i, line := range lines {
|
||||||
|
slices := strings.Split(line, " ")
|
||||||
|
record := slices[0] + "?" + slices[0] + "?" + slices[0] + "?" + slices[0] + "?" + slices[0]
|
||||||
|
groups := inputs.ToInts(slices[1] + "," + slices[1] + "," + slices[1] + "," + slices[1] + "," + slices[1] , ",")
|
||||||
|
ans += calc(record, groups)
|
||||||
|
fmt.Printf("running total after lines %v = %v\n",i, ans)
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
func calc(record string, groups []int) int {
|
||||||
|
key := record + fmt.Sprint(groups)
|
||||||
|
if v, ok := cache[key]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
// ADD LOGIC HERE ... Base-case logic will go here
|
||||||
|
// Did we run out of groups? We might still be valid
|
||||||
|
if len(groups) == 0 {
|
||||||
|
// Make sure there aren't any more damaged springs, if so, we're valid
|
||||||
|
if ! strings.Contains(record, "#") {
|
||||||
|
cache[key] = 1
|
||||||
|
return 1
|
||||||
|
} else {
|
||||||
|
// Not valid to runout of groups and still have damaged springs "#"
|
||||||
|
cache[key] = 0
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(record) == 0 {
|
||||||
|
// Already know there are more groups but no records
|
||||||
|
cache[key] = 0
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look at the next element in each record and group
|
||||||
|
next_character := record[0]
|
||||||
|
next_group := groups[0]
|
||||||
|
out := 0
|
||||||
|
|
||||||
|
if next_character == '#' {
|
||||||
|
// Test pound logic
|
||||||
|
out = pound(record, groups, next_group)
|
||||||
|
} else if next_character == '.' {
|
||||||
|
// Test dot logic
|
||||||
|
out = dot(record, groups)
|
||||||
|
} else if next_character == '?' {
|
||||||
|
// This character could be either character, so we'll explore both
|
||||||
|
//possibilities
|
||||||
|
out = dot(record, groups) + pound(record, groups, next_group)
|
||||||
|
} else {
|
||||||
|
utils.PanicOnErr(fmt.Errorf("RuntimeError"))
|
||||||
|
|
||||||
|
}
|
||||||
|
// Help with debugging
|
||||||
|
// fmt.Println(record, groups, out)
|
||||||
|
cache[key] = out
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logic that treats the first character as pound-sign "#"
|
||||||
|
func pound(record string, groups []int, next_group int) int {
|
||||||
|
|
||||||
|
// If the first is a pound, then the first n characters must be
|
||||||
|
// able to be treated as a pound, where n is the first group number
|
||||||
|
if next_group > len(record) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
this_group := record[:next_group]
|
||||||
|
this_group = strings.Replace(this_group, "?", "#", -1)
|
||||||
|
|
||||||
|
// If the next group can't fit all the damaged springs, then abort
|
||||||
|
if this_group != strings.Repeat("#", next_group) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the rest of the record is just the last group, then we're
|
||||||
|
// done and there's only one possibility
|
||||||
|
if len(record) == next_group {
|
||||||
|
// Make sure this is the last group
|
||||||
|
if len(groups) == 1 {
|
||||||
|
//We are valid
|
||||||
|
return 1
|
||||||
|
} else {
|
||||||
|
// There's more groups, we can't make it work
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the character that follows this group can be a seperator
|
||||||
|
if record[next_group] == '?' || record[next_group] == '.' {
|
||||||
|
// It can be seperator, so skip it and reduce to the next group
|
||||||
|
return calc(record[next_group+1:], groups[1:])
|
||||||
|
}
|
||||||
|
// Can't be handled, there are no possibilites
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logic that treats the first character as dot "."
|
||||||
|
func dot(record string, groups []int) int {
|
||||||
|
// ADD LOGIC HERE ... need to process this character and call
|
||||||
|
// We just skip over the dot looking for the next pound
|
||||||
|
return calc(record[1:], groups)
|
||||||
|
}
|
||||||
29
2023/go/day12/day12_test.go
Normal file
29
2023/go/day12/day12_test.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package day12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`???.### 1,1,3
|
||||||
|
.??..??...?##. 1,1,3
|
||||||
|
?#?#?#?#?#?#?#? 1,3,1,6
|
||||||
|
????.#...#... 4,1,1
|
||||||
|
????.######..#####. 1,6,5
|
||||||
|
?###???????? 3,2,1`)
|
||||||
|
require.Equal(t, 21, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`???.### 1,1,3
|
||||||
|
.??..??...?##. 1,1,3
|
||||||
|
?#?#?#?#?#?#?#? 1,3,1,6
|
||||||
|
????.#...#... 4,1,1
|
||||||
|
????.######..#####. 1,6,5
|
||||||
|
?###???????? 3,2,1`)
|
||||||
|
require.Equal(t, 525152, r)
|
||||||
|
}
|
||||||
1000
2023/go/day12/input.txt
Normal file
1000
2023/go/day12/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
144
2023/go/day13/day13.go
Normal file
144
2023/go/day13/day13.go
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"adventofcode2023/utils"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mirrorLoc struct {
|
||||||
|
orient string
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
func Part1(input string) int {
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
patterns := strings.Split(input, "\n\n")
|
||||||
|
for p, pattern := range patterns {
|
||||||
|
rows := strings.Split(pattern, "\n")
|
||||||
|
if v, ok := findMirror(rows); ok {
|
||||||
|
count = count + v * 100
|
||||||
|
} else {
|
||||||
|
cols := swap(rows)
|
||||||
|
if v, ok := findMirror(cols); ok {
|
||||||
|
count = count + v
|
||||||
|
} else {
|
||||||
|
utils.PanicOnErr(fmt.Errorf("p: %v\n %v\n", p, pattern))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
count := 0
|
||||||
|
patterns := strings.Split(input, "\n\n")
|
||||||
|
|
||||||
|
for p, pattern := range patterns {
|
||||||
|
rows := strings.Split(pattern, "\n")
|
||||||
|
loc, _ := findMirrorLoc(rows)
|
||||||
|
found := false
|
||||||
|
for i:=0;i<len(rows[0])*len(rows);i++{
|
||||||
|
newRows := smudge(i, rows)
|
||||||
|
if v, ok := findNewMirrorLoc(loc, newRows); ok {
|
||||||
|
if v != loc {
|
||||||
|
found = true
|
||||||
|
if v.orient == "row" {
|
||||||
|
count = count + v.index * 100
|
||||||
|
} else {
|
||||||
|
count = count + v.index
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ! found {
|
||||||
|
utils.PanicOnErr(fmt.Errorf("p: %v\n %v\n", p, pattern))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func smudge(i int, rows []string) []string {
|
||||||
|
out := make([]string, len(rows))
|
||||||
|
copy(out, rows)
|
||||||
|
col := i % len(rows[0])
|
||||||
|
row := i / len(rows[0])
|
||||||
|
if col >= 0 && col < len(rows[0]) {
|
||||||
|
v := rows[row][col]
|
||||||
|
if v == '#' {
|
||||||
|
out[row] = out[row][:col] + "." + out[row][col+1:]
|
||||||
|
} else {
|
||||||
|
out[row] = out[row][:col] + "#" + out[row][col+1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func findNewMirrorLoc(loc mirrorLoc, rows []string) (mirrorLoc, bool) {
|
||||||
|
if v, ok := findNewMirror(loc, "row", rows); ok {
|
||||||
|
return mirrorLoc{"row", v}, true
|
||||||
|
}
|
||||||
|
cols := swap(rows)
|
||||||
|
if v, ok := findNewMirror(loc, "col", cols); ok {
|
||||||
|
return mirrorLoc{"col", v}, true
|
||||||
|
}
|
||||||
|
return mirrorLoc{}, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func findMirrorLoc(rows []string) (mirrorLoc, bool) {
|
||||||
|
if v, ok := findMirror(rows); ok {
|
||||||
|
return mirrorLoc{"row", v}, true
|
||||||
|
}
|
||||||
|
cols := swap(rows)
|
||||||
|
if v, ok := findMirror(cols); ok {
|
||||||
|
return mirrorLoc{"col", v}, true
|
||||||
|
}
|
||||||
|
return mirrorLoc{}, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func swap(in []string) []string {
|
||||||
|
out := []string{}
|
||||||
|
for j:=0;j<len(in[0]);j++ {
|
||||||
|
o := ""
|
||||||
|
for i:=0;i<len(in);i++ {
|
||||||
|
o = o + string(in[i][j])
|
||||||
|
}
|
||||||
|
out = append(out, o)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func findMirror(rows []string) (int, bool) {
|
||||||
|
for i:=0;i<len(rows)-1;i++ {
|
||||||
|
if rows[i] == rows[i+1] {
|
||||||
|
if isMirror(i, 0, rows) {
|
||||||
|
return i+1, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func findNewMirror(loc mirrorLoc, orient string, rows []string) (int, bool) {
|
||||||
|
for i:=0;i<len(rows)-1;i++ {
|
||||||
|
if orient == loc.orient && i == loc.index - 1{ continue }
|
||||||
|
if rows[i] == rows[i+1] {
|
||||||
|
if isMirror(i, 0, rows) {
|
||||||
|
return i+1, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func isMirror(i int, offset int, rows []string) bool {
|
||||||
|
if i == 0 || i == len(rows) - 1 { return true }
|
||||||
|
|
||||||
|
if i - offset < 0 || i+1+offset > len(rows) - 1 { return true }
|
||||||
|
|
||||||
|
if rows[i+1+offset] == rows[i-offset] {
|
||||||
|
return isMirror(i, offset+1, rows)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
47
2023/go/day13/day13_test.go
Normal file
47
2023/go/day13/day13_test.go
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`#.##..##.
|
||||||
|
..#.##.#.
|
||||||
|
##......#
|
||||||
|
##......#
|
||||||
|
..#.##.#.
|
||||||
|
..##..##.
|
||||||
|
#.#.##.#.
|
||||||
|
|
||||||
|
#...##..#
|
||||||
|
#....#..#
|
||||||
|
..##..###
|
||||||
|
#####.##.
|
||||||
|
#####.##.
|
||||||
|
..##..###
|
||||||
|
#....#..#`)
|
||||||
|
require.Equal(t, 405, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`#.##..##.
|
||||||
|
..#.##.#.
|
||||||
|
##......#
|
||||||
|
##......#
|
||||||
|
..#.##.#.
|
||||||
|
..##..##.
|
||||||
|
#.#.##.#.
|
||||||
|
|
||||||
|
#...##..#
|
||||||
|
#....#..#
|
||||||
|
..##..###
|
||||||
|
#####.##.
|
||||||
|
#####.##.
|
||||||
|
..##..###
|
||||||
|
#....#..#`)
|
||||||
|
require.Equal(t, 400, r)
|
||||||
|
}
|
||||||
1377
2023/go/day13/input.txt
Normal file
1377
2023/go/day13/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
59
2023/go/day13b/day13.go
Normal file
59
2023/go/day13b/day13.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "adventofcode2023/utils"
|
||||||
|
"adventofcode2023/utils/inputs"
|
||||||
|
_ "fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
return symmetry(input, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
return symmetry(input, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func symmetry(input string, smudges int) int {
|
||||||
|
ans := 0
|
||||||
|
|
||||||
|
patterns := strings.Split(input, "\n\n")
|
||||||
|
for _, pattern := range patterns {
|
||||||
|
grid := inputs.ToGrid2D[rune](pattern, "\n", "", ' ', func(c string) rune { return rune(c[0])})
|
||||||
|
G := grid.Matrix()
|
||||||
|
R := len(G)
|
||||||
|
C := len(G[0])
|
||||||
|
// vertical symmetry
|
||||||
|
for c:=0;c<C-1;c++ {
|
||||||
|
badness := 0
|
||||||
|
for dc:=0;dc<C;dc++ {
|
||||||
|
left := c-dc
|
||||||
|
right := c+1+dc
|
||||||
|
if left < 0 || left > right || right > C -1 { break }
|
||||||
|
for r:=0;r<R;r++ {
|
||||||
|
if G[r][left] != G[r][right] {
|
||||||
|
badness += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if badness == smudges { ans += c+1 }
|
||||||
|
}
|
||||||
|
// horizontal symmetry
|
||||||
|
for r:=0;r<R-1;r++ {
|
||||||
|
badness := 0
|
||||||
|
for dr:=0;dr<R;dr++ {
|
||||||
|
up := r-dr
|
||||||
|
down := r+1+dr
|
||||||
|
if up < 0 || up > down || down > R -1 { break }
|
||||||
|
for c:=0;c<C;c++ {
|
||||||
|
if G[up][c] != G[down][c] {
|
||||||
|
badness += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if badness == smudges { ans += 100*(r+1) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
47
2023/go/day13b/day13_test.go
Normal file
47
2023/go/day13b/day13_test.go
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`#.##..##.
|
||||||
|
..#.##.#.
|
||||||
|
##......#
|
||||||
|
##......#
|
||||||
|
..#.##.#.
|
||||||
|
..##..##.
|
||||||
|
#.#.##.#.
|
||||||
|
|
||||||
|
#...##..#
|
||||||
|
#....#..#
|
||||||
|
..##..###
|
||||||
|
#####.##.
|
||||||
|
#####.##.
|
||||||
|
..##..###
|
||||||
|
#....#..#`)
|
||||||
|
require.Equal(t, 405, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`#.##..##.
|
||||||
|
..#.##.#.
|
||||||
|
##......#
|
||||||
|
##......#
|
||||||
|
..#.##.#.
|
||||||
|
..##..##.
|
||||||
|
#.#.##.#.
|
||||||
|
|
||||||
|
#...##..#
|
||||||
|
#....#..#
|
||||||
|
..##..###
|
||||||
|
#####.##.
|
||||||
|
#####.##.
|
||||||
|
..##..###
|
||||||
|
#....#..#`)
|
||||||
|
require.Equal(t, 400, r)
|
||||||
|
}
|
||||||
1377
2023/go/day13b/input.txt
Normal file
1377
2023/go/day13b/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
95
2023/go/day14/day14.go
Normal file
95
2023/go/day14/day14.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package day14
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "adventofcode2023/utils"
|
||||||
|
"adventofcode2023/utils/grid2d"
|
||||||
|
"adventofcode2023/utils/inputs"
|
||||||
|
"fmt"
|
||||||
|
_ "strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := inputs.ToGrid2D[rune](input, "\n", "", ' ', func(c string) rune { return rune(c[0])})
|
||||||
|
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
|
||||||
|
slide(grid)
|
||||||
|
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
|
||||||
|
return score(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := inputs.ToGrid2D[rune](input, "\n", "", ' ', func(c string) rune { return rune(c[0])})
|
||||||
|
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
|
||||||
|
x:= 0
|
||||||
|
for j:=0;j<125;j++ {
|
||||||
|
for i:=0;i<4;i++ {
|
||||||
|
slide(grid)
|
||||||
|
grid = rotate(grid)
|
||||||
|
}
|
||||||
|
if score(grid) == 101375 {
|
||||||
|
fmt.Println(j, j - x)
|
||||||
|
x = j
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(score(grid))
|
||||||
|
for j:=999999840+125;j<1000000000;j++ {
|
||||||
|
for i:=0;i<4;i++ {
|
||||||
|
slide(grid)
|
||||||
|
grid = rotate(grid)
|
||||||
|
}
|
||||||
|
if score(grid) == 101375 {
|
||||||
|
fmt.Println(j, j - x)
|
||||||
|
x = j
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)}))
|
||||||
|
return score(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func slide(grid *grid2d.Grid[rune]) {
|
||||||
|
G := grid.Matrix()
|
||||||
|
R := len(G)
|
||||||
|
C := len(G[0])
|
||||||
|
for c:=0;c<C;c++ {
|
||||||
|
for r:=0;r<R;r++ {
|
||||||
|
for dr:=0;dr<R;dr++ {
|
||||||
|
if G[dr][c]=='O' && dr>0 && G[dr-1][c]=='.' {
|
||||||
|
G[dr][c]='.'
|
||||||
|
G[dr-1][c] = 'O'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func rotate(grid *grid2d.Grid[rune]) *grid2d.Grid[rune] {
|
||||||
|
G := grid.Matrix()
|
||||||
|
R := len(G)
|
||||||
|
C := len(G[0])
|
||||||
|
New := grid2d.NewGrid[rune](R, C, '?')
|
||||||
|
NG := New.Matrix()
|
||||||
|
for r:=0;r<R;r++ {
|
||||||
|
for c:=0;c<C;c++ {
|
||||||
|
NG[c][R-1-r] = G[r][c]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return New
|
||||||
|
}
|
||||||
|
|
||||||
|
func score(grid *grid2d.Grid[rune]) int {
|
||||||
|
ans := 0
|
||||||
|
|
||||||
|
G := grid.Matrix()
|
||||||
|
R := len(G)
|
||||||
|
C := len(G[0])
|
||||||
|
|
||||||
|
for r:=0;r<R;r++ {
|
||||||
|
for c:=0;c<C;c++ {
|
||||||
|
if G[r][c]=='O' {
|
||||||
|
ans += len(G)-r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
37
2023/go/day14/day14_test.go
Normal file
37
2023/go/day14/day14_test.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package day14
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`O....#....
|
||||||
|
O.OO#....#
|
||||||
|
.....##...
|
||||||
|
OO.#O....O
|
||||||
|
.O.....O#.
|
||||||
|
O.#..O.#.#
|
||||||
|
..O..#O..O
|
||||||
|
.......O..
|
||||||
|
#....###..
|
||||||
|
#OO..#....`)
|
||||||
|
require.Equal(t, 136, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`O....#....
|
||||||
|
O.OO#....#
|
||||||
|
.....##...
|
||||||
|
OO.#O....O
|
||||||
|
.O.....O#.
|
||||||
|
O.#..O.#.#
|
||||||
|
..O..#O..O
|
||||||
|
.......O..
|
||||||
|
#....###..
|
||||||
|
#OO..#....`)
|
||||||
|
require.Equal(t, 64, r)
|
||||||
|
}
|
||||||
100
2023/go/day14/input.txt
Normal file
100
2023/go/day14/input.txt
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
O...#.O......#...##....O#.#.OO...O.#OO#.....#O.O.....#......#.OO...O...O..O#O#....#...O..O...O.....O
|
||||||
|
.OO......O.OO.O.#.#O.O...#.##OO.....#.#O#...OOOOO..##O#O..O#O.##O...#O....O#.#.OO....#.........O.O.O
|
||||||
|
......O.O.O.....O.#.#.#OO#O#.O...O.#.......#O....#.O.#....OOO...#....O#O.......#......O...O##...O...
|
||||||
|
O...##O..#....OO.OO....O...O...O#..##.OOO..O..#OO....###....OO.O.O...........O...O..O.....#.#..O.O#.
|
||||||
|
............#.#.##O.O.#.#OO#........O..O.O..##....O.#..#O..O...O#.#.#.........O...........OO......O.
|
||||||
|
#.OO........#..#O.#......#....#....#......OO..OO...O#...#...#..##..O#.O......#.#..O..#O#...#..#.O#.O
|
||||||
|
O.O.##...........O...O..O...O.OO.......##....#...O.....##...#.....OO...O.O#...OO..........O...O..#O.
|
||||||
|
.O##....#.O#O....O.O.#.#O.O#..OO..##..#OO.#...#......#.#O#.....O...O#.O...#..O.#.#......#.##.O....O.
|
||||||
|
.........#..#.O..O..O.O...#.#.O...#.OOO.##..#.O.....OO#....O...OOO#.O#....##O..#.O.O.....O.O.O.O..O.
|
||||||
|
......#O.....OOO###.O..O####O.#.O...............#..O......##O...#.#..###...O....#O...OO.OO.O......O.
|
||||||
|
#.O....#.O..#O...#...#...O....OOO.#O.#.#..#.....#.#..OO..#OO.......#OO.OOO....O.#O.#.O......####..O.
|
||||||
|
OOOO...#.OO.#....O...O.O...##....#OO...O.##.O.....###..O........OO..O.O.......#.#...O..#..O.#..O....
|
||||||
|
OOO..##....O...O.....O#..O.O.#..O..#.#.#..O........O..#OOO.....#....O#OO.#.#.....O..#..O...O..O.#OO#
|
||||||
|
...##.#.##.#O....O#..O..O.........#.#.#O...O.......O...O#..OOOO....O...O.OO#.O.##...#....O..O.......
|
||||||
|
....##.###OOO.O...#.......OO....OOO....O.OO#..O.#..OO....OO......O..OO...OOO.OO#...#..OOO..O.###O...
|
||||||
|
O###O.....O.O.#O#.O.O#O.O###.....O..O........#....#..O#..#.#..O...........#......#OO........O..O####
|
||||||
|
.#.#.OOO.O.......#O..O.#..O.OO.OO.O..O.#.#...O.O.OO..##..O...#...#O#..O.........O.O..O.O#....O..#O..
|
||||||
|
.#..#O.#O..#.O.O.O...#OO....#...O....O..O.O...#..#.##O.O..O..#O.....OO##...O#.......O#O.#..........#
|
||||||
|
#O...#.#OO.O...#O...O...#.#.O#..#.O#.###.#......O..O....#..#.OO..#....O..O.O....#.O.O.O.#..O..OOO..O
|
||||||
|
O.....#...#.#OOO.OOOO..#O.O.#...O.##..OO..#O...#.....OO#..#.#...O##OO...O.....O..#...#...........O.O
|
||||||
|
.##.O#.O..#O#.O##.O.#.........##.O......#OO...OO.......#...#O.O#...O..#.#...O..#...#O...O.#....OO.OO
|
||||||
|
.O#OO.O..#...#..O..O...##.O....###O.....O...#.#OOO...OO...O.......#.#.#.OO....#OO.#..O..........OO..
|
||||||
|
.....#OO.O..O.O.O...O.O#.#.O...O..#...O##.......#......#O...#.#.#....#..O.O..#..........O..#.#..#O..
|
||||||
|
...O.O.O.OO...O#..O..OO..O#.#.O.#OO..O.O..OO..O#...#.O#...O.......#..#..O..##..O..#O......O.OO...O.O
|
||||||
|
#.O....O.O.#...O.....O.....O#......#.#..OO...#.....O.#.#.O...#.#....#....O#.O.#......#OOO.O...O#....
|
||||||
|
...OOO......#..O..O#.......#....O#OO..#O.#.#...#...O.O..OO..#.O...O..#.....OO..O..#...#.O...O#..O.OO
|
||||||
|
#OO.OO#.OOO...##............O....O.O..#.##.#.O.........##...#O.O..#................#..O.O.O#O.O#..##
|
||||||
|
.O.O.O##..#O.O#O...##.#OO#...#.OO#..O...O#...O....O#..OO....O....#...O...#OO.OO#O....#..O..#OO....O.
|
||||||
|
.OO.#.......#...O...OO..#..OO.O.O.OO#O.O.O...O....O#..#.O.........O..#.O...#.#...O.O......O........O
|
||||||
|
.O....##..#....#.....O.#...O.O.#....#....OOOO...O.O###.O........O.....O.O..#.##OOO.O.......#.#.O..O.
|
||||||
|
.#.....O...#.O...#........#...#....#OO.O...O#O........OOO...#.O....OOO#.O.....OO....#.#...#..OO..#..
|
||||||
|
OO.OO...O..#..#O....O.O....OOOOO.#O.#O.O...#.O....O#.O.O.#O.#...#..O...O.#O.O.#..O....OOO......#.O#.
|
||||||
|
.O##..OO.....#.OO..#..O..#...#.#........O..OO...#O..O....#..O..O#.....O#..##O..O#.##.#...#.O..O.O.O.
|
||||||
|
..#...#O.....OO#.....O..#.#O.#.#..#..O.....#...OO.#.....O..O.O##.O.....OOOO.#O.....O.#..O........#.#
|
||||||
|
.#.#O..O.O..#..O##.....O.OO...##.........O...####..O..O....#O..O.....##........O.#..#.#OO.#..O.##.O#
|
||||||
|
#...#.O....OO......#O...#O..O#..#O#O.#..#.....OO....OO#..#O....O.O..#.O.#.....O#.O.OO..O#.O.O..O.O#.
|
||||||
|
OO....OO......#O........#O...#.#..O##....O#..#.#O.O.#....O..O..O.O....O.......#..OOO#.........O....O
|
||||||
|
O.....#O.OO##......#O##..O..O...##..O..........O..OO.O..#O....O..OOO#OO.##..#....O#..#...O.O.O...O..
|
||||||
|
.............#.#.#.O...#.#..#......O.#.O..#....#..##....#.##.##.#.O...O.O..#.#.#...OO....O..#O..#..O
|
||||||
|
.O.#.....O.O..O..##O...OO.#.O....#..#.#...O.O#...#O.O.OO...O..#..OO...O...O...O.....#.O..O#..#.#..OO
|
||||||
|
.....O..OO......#.#.#.O.##.OO...O..O.#..#...#OO....OOO......O.OO.#.O..O#O...O.#......OO##O.O.#O..O..
|
||||||
|
O##O.#.#..#..OO.O.........#O.#..O.#.##.O#..OOOO..#....O...O.........O..O..###...O...O.#.....O..##.O.
|
||||||
|
..O...#O#O.O...O.#..#O.......OO...........#...#..##.O......#..O.O.#OO.OO.#O....#.O.....O..#..#.#..#.
|
||||||
|
O#..O..##O#....O..OOO..OO...#O..O.O...O#O...OO.O##.O#O..#......OO##O.##...OOO.O..#....O##O..#......#
|
||||||
|
..#O...O..O.O...#..O.O...#O.....O.O......##OO#..O......#..O.#.O......OO.#O........O.....OO...O...O.O
|
||||||
|
........OO.#.OO..O......#...#...#..OOOO.OO.#....O.OO...O.##.....O.O....#O.#.OO..##.##..#.#O#.OO...O#
|
||||||
|
....#......#O.OO.....OOO....OO..O.O.O....##..O..O.O#.O....O.#O.#O.....O..O........#O.....O.O.....O#.
|
||||||
|
#.O#.O#......##.....O.#O...###...##....#O#.#.#....OO...O..#.O....O..#..#..O..........O......#.O.O...
|
||||||
|
.O.#..O#.OO....O.#...#O....#....OO......#O.O..#O..........O.#..#...#OOO........#.#.........O.#..O...
|
||||||
|
#OO.OO..O..O.O.#O.O.....O.##..#.O#..#.O....#........#.OOO#.#.....#.#.......O#..##..#.OO....O#O#.....
|
||||||
|
.......#O.O....#.OOO..OO...O...#....O..#.#....OO..O....O.#.O.#O#..O#.#.O..O......##...OO..#....O.#..
|
||||||
|
.O..O#.#OO.O.O.O.##...O..O.O..O.##O...#.O..O..O..O..O.....O...#..OO#O..O###...#...#....O##.OO...#...
|
||||||
|
#O....#...##..O..#...#OO.O.O.#......O...O.#.#O..O...O....OOO..O.O..O...O.OO...O...#..O....O#.###....
|
||||||
|
....#..O.....##.O.......##.##..OOO.O.#.#.....#....O..#..O....#....O...#.O..O#..O##...#.##....O.#OO##
|
||||||
|
O....O...OO.O........#..O...#..#.....O......O.O.OO.OO..#....O..O.............##.O.....##O#.OOO......
|
||||||
|
........#.O.####O.OO.#.O..O.O.#.#....OO#.......O..#....##.OOO..O.O.O..#.O.#...O.O.O..O.##O..O#....O.
|
||||||
|
...#....#.....O....O.O.O##.O..#O.OO...#.##.O..###OO##.O......#..##.OO...O.......O.......#..O.#.O..O.
|
||||||
|
.O.O...O......OO.#....#O..O.O.O..OO.O..O##O...O....O..OO.#..O....O..#.O..OO.OO....O#O..#.O..#O...#.#
|
||||||
|
..O#O.#O..#...##..#.O...OO..O#.......#..O........#.OO#..O#.#.#O....##...O.........O......OO#.....O.#
|
||||||
|
....OO.......###..O#.....O##..#O..#..#.O.....##.......##..O#O....#....#O.O..#..#..O.###O..#.O#......
|
||||||
|
O..##..O...#..O...O#OOO....#.O##O.#........#.O..O.#..#.OO.#O.#.....##.O..O.O....#..#..OO....#..#..##
|
||||||
|
.#...O.OO#O.O..O.##O..O#...##...O....OO.O#....#...#O.O#....O..........#....#............##.......#..
|
||||||
|
.O.#........##O...#O..O..O....OO#O....#.O..OO.##..O..OO#.###OO.....#..#.......O.#.....OO........OO.#
|
||||||
|
.OO...O.#..##.....OO..O.O.O.#.###.##.O.#..O..#..O..O...##.#......O....O.O.........O..#.O.O#O.#O...#.
|
||||||
|
#..#.#..O...##.....OO#O.OOO.....#...#.....##.#...O....O....#..OO#.#.OO....#.....O.O...O#.#..#..O#O.O
|
||||||
|
.O#.O.#..O..O#...OO...O...O#...O..O..#.O..#...O#.#....O......O#...O...OO.O##.#O....O....#OO....#O...
|
||||||
|
OO..OOO.O......OO...OO#O...#.#.#O.OOO#....#.OO#.#.O.#......O.O.OO#..O..#..O.O#.O#.O....O..O...O.....
|
||||||
|
...OO....O...#OO#..#..O.#O#....O.....OO.O.#.OO##.....#..O#.OO..#.#.O#..#..O.#..O....#....O.#O...OO#O
|
||||||
|
..#.......OO..##.O#...O#....O.#.O..##..#O.......#O#......O..O.........O#..#OO..O..#O.#.#.O.O#.#OO#.O
|
||||||
|
...#O#...O...OO...OO..OO...#OO...O...##.O....##.#O##.O....#..O#..O.....O.......###.#.OO#...O......#.
|
||||||
|
.O.OO#O##O##...#..#....#..#O...O#..O.O##......#........#O.........#.O....O..#..O.....O..#......O.#.#
|
||||||
|
..#....#.O.O.O..O.....O.O#O.O..#......O............O.........O#.O....#.O#..O..O.#OO.....#......O...#
|
||||||
|
OO...#..O..O##.#.#O.O.#.#....O....O...O.#..O##...O...#.O...#.O.OO...#........O#O..O.O.O..O.....#.O..
|
||||||
|
.OOO....#...O..O.....O..O...O...O..O...O#...#O....O.O...#..OO##.O.#..O..........O#..#..#..OO#.....#.
|
||||||
|
O..#..O#....#O..##O..#.#.......OO..O..#...O....O.#....O..O.##........O...O..OO...#....OO#..O.#.#.#..
|
||||||
|
O#O.O.O#.#OO#..OO.O.#......#.....#.......##.O..#.O..#..OO..O.#.#.O.O.O#.#......O....####OO#.#O#OO.#.
|
||||||
|
.#.....O#..O#O#..OO...#.O.#....#.#..##....O##....#.........##OO...##...O......#.OO...#O....O.O.O#O..
|
||||||
|
O......#.O....O...O.....OO.#....#O.##....#.O.O...O..#...O....#.O....O.O....#.OO.#.......#...#..#...O
|
||||||
|
...#OO..#......#..OO.O.O.##.O....O.##O##.OO#O.O.O..O.#O#O.OO...........O...###.#......O..#..#O#..OOO
|
||||||
|
O..O.#..O.OO.O...OO.OO..OOOO....O...#....##.OO.O.....#.......O.O........O.#.......#.......#..#.O..O.
|
||||||
|
.OO.##...#O..O#....O....#..O#....#.....O...O#.....OOO#.....................#..#..#..#O.......O.#OO..
|
||||||
|
.#OO..O....O..#.....#O...OO.#....#.#.O...O.#........O...O..O..OO#..#.....#.......OOOOO.OO....O....O.
|
||||||
|
.O#...#.......O.O...O.O.O#...OO.O#...O#O.O.#......#......O..O##.##.....O.....##...........O#...O....
|
||||||
|
.#.O.O#.....O.#..OO......#O.#..O..O.O.O..#.#...O##.#O..OOO......#...#..OO...O.#.....#O.OOO...#.O..##
|
||||||
|
.........O..##OO.#OOOO.O.O..OOO...OO.#.....#...O.#O##..O#..#.#..#...#..O.O...#OO.O...O...#O...#..#..
|
||||||
|
.#.#O.#...#OO.O.........O#..O...OO#.....O....OOOO#.....O.O....#...O...........O#.#.O..O.#.O.#.O.#.#.
|
||||||
|
......O.#...O.....O.O..O#...O.#........#.O...O.O....#..O#....O.#.O.O....O...#OO...#........OO..O.O.O
|
||||||
|
....O.O..OO.....#...OOOO.O#............O#OO....OOOOOO..#..#O#..#.#.O.OO.#O.....O.#......##..O#..#O..
|
||||||
|
..#......#...#O.#..#.#....OOO#...O.#....O..#O.....O.....O.O......O.......O.O..O..O.OO.O.#OO..O#...#.
|
||||||
|
.O.#.O.OO..O#.O#OO..........O.......O..#..#.#..O...#...##.....####...#........##O.......#....#...O##
|
||||||
|
........#.#.O.#O.......#O...O...#.#O..#OOO..#O..###...O.#.#O...O.O#..O..O...O.O....###.OO.#OO..O.#.O
|
||||||
|
..#O....#..O..####.O#...O....O.#O.##.O....O.O......O#O...OO###...O..#........#.#O.O#OO.......#.....O
|
||||||
|
....O.....#.#.O.#..O.#O.#.#O.#.......OO.....OOO...O.O..#.#....#..O.O..#.OO.O..O..OO##.....#.O..OO#O.
|
||||||
|
O#O..OO.O....OO.#O......O......#...#.....O.#OO.#.....OO..O#.O..O.O...#....O.O..OO.O....#....OO..O...
|
||||||
|
...O.....##....#....#....#......O#O..OO.....OO#O.OO......#OO.......O.#..###OO...#.O..OO.#.O.O#OO..#.
|
||||||
|
.O.#.O..#O.....#.#O....##OO.#O..##..##.##...#OO.O.#O#..O..O.O..O..##O.O.....O.OOO..#..#O..O#..OO...O
|
||||||
|
..##O#O.O.#.........O....O.OO#O#O.....O.....O#O.OO.O......O.O.OO......#.....O.O.O.O.O.....#.O.......
|
||||||
|
.....#OO.#O........O#....O.#OO.OO........#.O....O.OOOOOO.#.#O......O.#...O#.O.O..OO.....O.OO...#.O.#
|
||||||
|
.....#................OO..OOOO..#.....O.###O.O...O..#O..........OO.#...OO.O#...O......O..OOOO.#..###
|
||||||
|
O.....O...#O.#..........#O......O..OOO#....O.OOOO....O..#..#O....O.....O#..O..#.O.O....#OO.#....#O..
|
||||||
80
2023/go/day15/day15.go
Normal file
80
2023/go/day15/day15.go
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
package day15
|
||||||
|
|
||||||
|
import (
|
||||||
|
"adventofcode2023/utils"
|
||||||
|
_ "fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Lens struct {
|
||||||
|
label string
|
||||||
|
fl int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
ans := 0
|
||||||
|
seqs := strings.Split(input, ",")
|
||||||
|
for _,seq := range seqs {
|
||||||
|
ans += hash(seq)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
Boxes := [256][]Lens{}
|
||||||
|
cmds := strings.Split(input, ",")
|
||||||
|
for _,cmd := range cmds {
|
||||||
|
if cmd[len(cmd)-1] == '-' {
|
||||||
|
label := cmd[:len(cmd)-1]
|
||||||
|
hash := hash(label)
|
||||||
|
nl := []Lens{}
|
||||||
|
for _, lens := range Boxes[hash] {
|
||||||
|
if lens.label != label {
|
||||||
|
nl = append(nl, lens)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Boxes[hash] = nl
|
||||||
|
} else {
|
||||||
|
tokens := strings.Split(cmd, "=")
|
||||||
|
label := tokens[0]
|
||||||
|
fl := utils.MustAtoi(tokens[1])
|
||||||
|
hash := hash(label)
|
||||||
|
nl := []Lens{}
|
||||||
|
if len(Boxes[hash]) == 0 {
|
||||||
|
Boxes[hash] = append(Boxes[hash], Lens{label:label, fl:fl})
|
||||||
|
} else {
|
||||||
|
found := false
|
||||||
|
for _, lens := range Boxes[hash] {
|
||||||
|
if lens.label == label {
|
||||||
|
nl = append(nl, Lens{label:label, fl:fl})
|
||||||
|
found = true
|
||||||
|
} else {
|
||||||
|
nl = append(nl, lens)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Boxes[hash] = nl
|
||||||
|
if ! found {
|
||||||
|
Boxes[hash] = append(Boxes[hash], Lens{label:label, fl:fl})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ans := 0
|
||||||
|
for i, box := range Boxes {
|
||||||
|
for j, lens := range box {
|
||||||
|
ans += (i+1) * (j +1) * lens.fl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
func hash(in string) int {
|
||||||
|
result := 0
|
||||||
|
for _, letter := range in {
|
||||||
|
result += int(letter)
|
||||||
|
result = result * 17
|
||||||
|
result = result % 256
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
17
2023/go/day15/day15_test.go
Normal file
17
2023/go/day15/day15_test.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package day15
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1("rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7")
|
||||||
|
require.Equal(t, 1320, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2("rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7")
|
||||||
|
require.Equal(t, 145, r)
|
||||||
|
}
|
||||||
1
2023/go/day15/input.txt
Normal file
1
2023/go/day15/input.txt
Normal file
File diff suppressed because one or more lines are too long
BIN
2023/go/day16/__debug_bin946177999
Executable file
BIN
2023/go/day16/__debug_bin946177999
Executable file
Binary file not shown.
202
2023/go/day16/day16.go
Normal file
202
2023/go/day16/day16.go
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
package day16
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "adventofcode2023/utils"
|
||||||
|
"adventofcode2023/utils/grid2d"
|
||||||
|
_ "adventofcode2023/utils/grid2d"
|
||||||
|
"adventofcode2023/utils/inputs"
|
||||||
|
"fmt"
|
||||||
|
_ "strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Tile struct {
|
||||||
|
object rune
|
||||||
|
energized int
|
||||||
|
}
|
||||||
|
|
||||||
|
type Beam struct {
|
||||||
|
dir rune
|
||||||
|
r int
|
||||||
|
c int
|
||||||
|
rm bool
|
||||||
|
}
|
||||||
|
|
||||||
|
var startBeams []Beam
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
beams := []Beam{}
|
||||||
|
beams = addBeam(beams, Beam{'s', 0, 3, false})
|
||||||
|
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
|
||||||
|
return score(grid, beams)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
|
||||||
|
G := grid.Matrix()
|
||||||
|
R := len(G)
|
||||||
|
C := len(G[0])
|
||||||
|
ans := 0
|
||||||
|
for r:=0;r<R;r++{
|
||||||
|
beams := []Beam{}
|
||||||
|
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
|
||||||
|
beams = addBeam(beams, Beam{'e', r, 0, false})
|
||||||
|
ans = max(ans, score(grid, beams))
|
||||||
|
beams = []Beam{}
|
||||||
|
beams = addBeam(beams, Beam{'w', r, C-1, false})
|
||||||
|
grid = inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
|
||||||
|
ans = max(ans, score(grid, beams))
|
||||||
|
}
|
||||||
|
for c:=0;c<C;c++{
|
||||||
|
beams := []Beam{}
|
||||||
|
grid := inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
|
||||||
|
beams = addBeam(beams, Beam{'s', 0, c, false})
|
||||||
|
ans = max(ans, score(grid, beams))
|
||||||
|
beams = []Beam{}
|
||||||
|
beams = addBeam(beams, Beam{'n', R-1, c, false})
|
||||||
|
grid = inputs.ToGrid2D[Tile](input, "\n", "", Tile{}, func(c string) Tile { return Tile{ object: rune(c[0]), energized: 0}})
|
||||||
|
ans = max(ans, score(grid, beams))
|
||||||
|
}
|
||||||
|
|
||||||
|
return ans
|
||||||
|
}
|
||||||
|
|
||||||
|
func max(a, b int) int {
|
||||||
|
if a > b {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func score(grid *grid2d.Grid[Tile], beams []Beam) int {
|
||||||
|
fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { return string(t.object)}))
|
||||||
|
G := grid.Matrix()
|
||||||
|
R := len(G)
|
||||||
|
C := len(G[0])
|
||||||
|
fmt.Println("r:", R, "c:", C, "tiles:", R*C )
|
||||||
|
for i:=0;i<1000;i++ {
|
||||||
|
beams = rmBeams(beams)
|
||||||
|
fmt.Println(i, ":", len(beams), ":", energy(G))
|
||||||
|
for i, _ := range beams {
|
||||||
|
r := beams[i].r
|
||||||
|
c := beams[i].c
|
||||||
|
if r >= 0 && r < R && c >= 0 && c < C {
|
||||||
|
G[r][c].energized++
|
||||||
|
switch beams[i].dir {
|
||||||
|
case 'n':
|
||||||
|
tile := &G[r][c]
|
||||||
|
switch tile.object {
|
||||||
|
case '.':
|
||||||
|
beams[i].r--
|
||||||
|
case '|':
|
||||||
|
beams[i].r--
|
||||||
|
case '-':
|
||||||
|
beams[i].dir = 'e'
|
||||||
|
beams[i].c++
|
||||||
|
beams = addBeam(beams, Beam{'w', beams[i].r, beams[i].c-1, false})
|
||||||
|
case '\\':
|
||||||
|
beams[i].dir = 'w'
|
||||||
|
beams[i].c--
|
||||||
|
case '/':
|
||||||
|
beams[i].dir = 'e'
|
||||||
|
beams[i].c++
|
||||||
|
}
|
||||||
|
case 'e':
|
||||||
|
tile := &G[r][c]
|
||||||
|
switch tile.object {
|
||||||
|
case '.':
|
||||||
|
beams[i].c++
|
||||||
|
case '-':
|
||||||
|
beams[i].c++
|
||||||
|
case '|':
|
||||||
|
beams[i].dir = 'n'
|
||||||
|
beams[i].r--
|
||||||
|
beams = addBeam(beams, Beam{'s', beams[i].r+1, beams[i].c, false})
|
||||||
|
case '\\':
|
||||||
|
beams[i].dir = 's'
|
||||||
|
beams[i].r++
|
||||||
|
case '/':
|
||||||
|
beams[i].dir = 'n'
|
||||||
|
beams[i].r--
|
||||||
|
}
|
||||||
|
case 's':
|
||||||
|
tile := &G[r][c]
|
||||||
|
switch tile.object {
|
||||||
|
case '.':
|
||||||
|
beams[i].r++
|
||||||
|
case '|':
|
||||||
|
beams[i].r++
|
||||||
|
case '-':
|
||||||
|
beams[i].dir = 'e'
|
||||||
|
beams[i].c++
|
||||||
|
beams = addBeam(beams, Beam{'w', beams[i].r, beams[i].c-1, false})
|
||||||
|
case '\\':
|
||||||
|
beams[i].dir = 'e'
|
||||||
|
beams[i].c++
|
||||||
|
case '/':
|
||||||
|
beams[i].dir = 'w'
|
||||||
|
beams[i].c--
|
||||||
|
}
|
||||||
|
case 'w':
|
||||||
|
tile := &G[r][c]
|
||||||
|
switch tile.object {
|
||||||
|
case '.':
|
||||||
|
beams[i].c--
|
||||||
|
case '-':
|
||||||
|
beams[i].c--
|
||||||
|
case '|':
|
||||||
|
beams[i].dir = 'n'
|
||||||
|
beams[i].r--
|
||||||
|
beams = addBeam(beams, Beam{'s', beams[i].r+1, beams[i].c, false})
|
||||||
|
case '\\':
|
||||||
|
beams[i].dir = 'n'
|
||||||
|
beams[i].r--
|
||||||
|
case '/':
|
||||||
|
beams[i].dir = 's'
|
||||||
|
beams[i].r++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
beams[i].rm = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { if t.energized > 0 {return "#"}; return "."}))
|
||||||
|
}
|
||||||
|
fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { if t.energized > 0 {return "#"}; return "."}))
|
||||||
|
return energy(G)
|
||||||
|
}
|
||||||
|
|
||||||
|
func rmBeams(slice []Beam) []Beam {
|
||||||
|
var result []Beam
|
||||||
|
|
||||||
|
for _, value := range slice {
|
||||||
|
if ! value.rm {
|
||||||
|
result = append(result, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func addBeam(beams []Beam, beam Beam) []Beam {
|
||||||
|
for _, value := range startBeams {
|
||||||
|
if value == beam { return beams }
|
||||||
|
}
|
||||||
|
startBeams = append(startBeams, beam)
|
||||||
|
for _, value := range beams {
|
||||||
|
if value == beam { return beams }
|
||||||
|
}
|
||||||
|
return append(beams, beam)
|
||||||
|
}
|
||||||
|
|
||||||
|
func energy(G [][]Tile) int {
|
||||||
|
ans := 0
|
||||||
|
R := len(G)
|
||||||
|
C := len(G[0])
|
||||||
|
for r:=0;r<R;r++ {
|
||||||
|
for c:=0;c<C;c++ {
|
||||||
|
if G[r][c].energized > 0 {
|
||||||
|
ans++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ans
|
||||||
|
}
|
||||||
68
2023/go/day16/day16.py
Normal file
68
2023/go/day16/day16.py
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
from copy import deepcopy
|
||||||
|
from math import gcd
|
||||||
|
from collections import defaultdict, Counter, deque
|
||||||
|
D = open(sys.argv[1]).read().strip()
|
||||||
|
L = D.split('\n')
|
||||||
|
G = [[c for c in row] for row in L]
|
||||||
|
|
||||||
|
R = len(G)
|
||||||
|
C = len(G[0])
|
||||||
|
|
||||||
|
DR = [-1, 0, 1, 0]
|
||||||
|
DC = [ 0, 1, 0,-1]
|
||||||
|
|
||||||
|
def step(r,c,d):
|
||||||
|
return (r+DR[d], c+DC[d], d)
|
||||||
|
|
||||||
|
def score(sr,sc,sd):
|
||||||
|
POS = [(sr,sc,sd)]
|
||||||
|
SEEN = set()
|
||||||
|
SEEN2 = set()
|
||||||
|
while True:
|
||||||
|
NP = []
|
||||||
|
if not POS:
|
||||||
|
break
|
||||||
|
for (r,c,d) in POS:
|
||||||
|
#print(r,c,d)
|
||||||
|
if 0<=r<R and 0<=c<C:
|
||||||
|
SEEN.add((r,c))
|
||||||
|
if (r,c,d) in SEEN2:
|
||||||
|
continue
|
||||||
|
SEEN2.add((r,c,d))
|
||||||
|
ch = G[r][c]
|
||||||
|
if ch=='.':
|
||||||
|
NP.append(step(r,c,d))
|
||||||
|
elif ch=='/':
|
||||||
|
# up right down left
|
||||||
|
NP.append(step(r,c,{0:1, 1:0, 2:3, 3:2}[d]))
|
||||||
|
elif ch=='\\':
|
||||||
|
NP.append(step(r,c,{0:3, 1:2, 2:1, 3:0}[d]))
|
||||||
|
elif ch=='|':
|
||||||
|
if d in [0,2]:
|
||||||
|
NP.append(step(r,c,d))
|
||||||
|
else:
|
||||||
|
NP.append(step(r, c, 0))
|
||||||
|
NP.append(step(r, c, 2))
|
||||||
|
elif ch=='-':
|
||||||
|
if d in [1,3]:
|
||||||
|
NP.append(step(r,c,d))
|
||||||
|
else:
|
||||||
|
NP.append(step(r, c, 1))
|
||||||
|
NP.append(step(r, c, 3))
|
||||||
|
else:
|
||||||
|
assert False
|
||||||
|
POS = NP
|
||||||
|
return len(SEEN)
|
||||||
|
|
||||||
|
print(score(0,0,1))
|
||||||
|
ans = 0
|
||||||
|
for r in range(R):
|
||||||
|
ans = max(ans, score(r,0,1))
|
||||||
|
ans = max(ans, score(r,C-1,3))
|
||||||
|
for c in range(C):
|
||||||
|
ans = max(ans, score(0,c,2))
|
||||||
|
ans = max(ans, score(R-1,c,0))
|
||||||
|
print(ans)
|
||||||
37
2023/go/day16/day16_test.go
Normal file
37
2023/go/day16/day16_test.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package day16
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`.|...\....
|
||||||
|
|.-.\.....
|
||||||
|
.....|-...
|
||||||
|
........|.
|
||||||
|
..........
|
||||||
|
.........\
|
||||||
|
..../.\\..
|
||||||
|
.-.-/..|..
|
||||||
|
.|....-|.\
|
||||||
|
..//.|...`)
|
||||||
|
require.Equal(t, 46, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`.|...\....
|
||||||
|
|.-.\.....
|
||||||
|
.....|-...
|
||||||
|
........|.
|
||||||
|
..........
|
||||||
|
.........\
|
||||||
|
..../.\\..
|
||||||
|
.-.-/..|..
|
||||||
|
.|....-|.\
|
||||||
|
..//.|...`)
|
||||||
|
require.Equal(t, 51, r)
|
||||||
|
}
|
||||||
110
2023/go/day16/input.txt
Normal file
110
2023/go/day16/input.txt
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
\.......................\..........................................-..................-.../................-..
|
||||||
|
....../.......\...-......-.|...\..............\.................|............././....-........................
|
||||||
|
...............-...-........................................\......\..-.............|......-....\....-........
|
||||||
|
..\..|.|...........................-.|........................................./.|....|................|......
|
||||||
|
|../................|............................................................\........../..\..............
|
||||||
|
........\............../................/..........................\...\....|............./....-.........\\...
|
||||||
|
.................-...-...................\../........-|.................../......-...........|................
|
||||||
|
........-............/...|-............-.....\.|..............-....-../\../..................\...\././........
|
||||||
|
........................-|................................................................-........-..........
|
||||||
|
-......./.................|.....\.................\.....//............-........./..../....|...................
|
||||||
|
....-.............-........-..........-|.......|...../...\...................\.....................|..........
|
||||||
|
...|...\.........|.................|.....|....-....\.......\./........................-.../..../.....-........
|
||||||
|
....|....-.-..............\.........|.......................-.......-..............\................/.........
|
||||||
|
.....|.\...........-.................-.-........../...\............|...............|...|......./.......|...../
|
||||||
|
.....\.........................-.../..-./...\...................../......\...-.......|.\........-|............
|
||||||
|
............|.....................................-....../....\.............../-...|...\..\................./.
|
||||||
|
......-./|....../............|.........\............-../...-......./.\..\....../......|/...\..................
|
||||||
|
................................|.......|..-..../.............................../.-..................-..-/..|.
|
||||||
|
...............................-......./......................|./...............-............./....../........
|
||||||
|
..................../....................\........\...........................-............/.../..............
|
||||||
|
.|||......../.................|.................../..\............................-......./..|...|/.-.........
|
||||||
|
......-......./\....../.........|....../.......-...............|.\........-............/.../..................
|
||||||
|
.....................-.\/|................//.../.........|.|......\.-..|.........|.........\..................
|
||||||
|
.........................\/.......|.|............................|........|.............................././..
|
||||||
|
.................................|.................\../..|/.................\.................-...-........-/.
|
||||||
|
......................-...-.........../...........................\....\......-..-.......\.-....\....|........
|
||||||
|
......-......../..............\/..................\..|........-..............|...-...../......|...............
|
||||||
|
|.......|.../....|..............//.....................|..........|/......../................|................
|
||||||
|
...|.|..................../|..../.-.......-...........|.....|./....\......-......-................|...........
|
||||||
|
......\/./.|\..../|.|..|..........-....|...........|.-.|...................-.\.....|....................\.....
|
||||||
|
......../.\......................|.....|...........|.........../.......|....|...|.......-......../......\...-.
|
||||||
|
...|...-...||......-..|..-...........|.-.................|.................................-..................
|
||||||
|
..............-.\.-........|......\..........................................\./.\........../.....|...........
|
||||||
|
../\.........|...............|............|.\/.-/.................-....|...-.................-.....|..../.....
|
||||||
|
....................../......../..../-.....\........................\..-.\....|....-.........../-.............
|
||||||
|
.................................|................|.........|................../|.....|....\\............/.\..
|
||||||
|
...///./.....\.................|/.....................\...................-............|................|.....
|
||||||
|
............-...........................--........\................/.............-\................\.....-.../
|
||||||
|
...............\.........../|............................|.....................\...-...\.....................-
|
||||||
|
...\.............|.............|................\............\|...../...|.........................|...........
|
||||||
|
..................|......|..........-.-..............\.........................\..............................
|
||||||
|
....-................../.........../...|................/...............|./.|.../....\..../......./......//...
|
||||||
|
...../....../..............................|...\../..........-..........-........-..//..../...................
|
||||||
|
...............-......|......................|./........./............/..-...........|../.....-........-./....
|
||||||
|
..\.........................|...-.......\.................|..............-........\....-.............-....|...
|
||||||
|
.......|......|....../........\...........|......-........../......-..................../....................\
|
||||||
|
.......................|....-..|........./.|.-...............|..\......\.....-.......\...-/....|/.........\...
|
||||||
|
\......\..-.....................\..........................\................................../...........\...
|
||||||
|
-....-......../............................................................../.\.......|..............|....-..
|
||||||
|
........|......................|.............-....\................................./..\.......|..........-...
|
||||||
|
...-...............|........./......\...../.......|...|...............\.../...\.../......|.....-.\......\.....
|
||||||
|
............./.....|......................|.....................................\...||.................-....|.
|
||||||
|
./.....-................/........|./....-......../......./..............\..................................\..
|
||||||
|
.../..../\........-..........................|.-/.|..\................\\-.......|......./...||.......|........
|
||||||
|
.....-.........................-...............\...........|.............-.\.../.|......-.|......../...-.....-
|
||||||
|
......\....................|...../......................|.../......-..|............|......./.../.........|....
|
||||||
|
...|...........-....................................../.|............./....|..../........./.....\../..........
|
||||||
|
....../.../................\........................\...\....\......\............../|...............\.-.......
|
||||||
|
./....\.../.............|............................-.../............../............/...........\...|........
|
||||||
|
............................|.................|/..........//.........../..-...............|...................
|
||||||
|
.....\......\.................|.....|...\-./...............\................|....../.....-..\........-....-...
|
||||||
|
........................./-........\................./........-/.|....-.......\............-/\......|.\...-...
|
||||||
|
..../../..|.|...............\.......................................-.........................................
|
||||||
|
...........|...................................................-...-......|..................\............../.
|
||||||
|
/....|......................................................................|\.../.......-...........-...|....
|
||||||
|
......|.-.\......-........|.....-..|.\..............-......./......-|.........................-...............
|
||||||
|
............\......................................|........................|.-...............................
|
||||||
|
.........-.........../....\./....../.-...-..//.........../.......\\...........................................
|
||||||
|
........\......../............./...-......\.../..|..|............................../......../..\..............
|
||||||
|
--.........|.....-...|............../...|.......|..............\|............|.........................|.-....
|
||||||
|
-\......./..............-....-....\...|.-........\/.\./............-/...\........|-.........../../...\........
|
||||||
|
.\|\..............-......-.\...-....\..........................\........|...........-......./.............../.
|
||||||
|
..........................|...\..../.../..........\.............-...//...............\..................-.....
|
||||||
|
........./..........................\............|-.....|..-...|......../........-...........................\
|
||||||
|
.......\.../.....\....../.......|..|...............-......................|....-...................-.|........
|
||||||
|
......|.......\.../..............................-..............................|......-.-...................\
|
||||||
|
/.....|.......-............/|.....|-......./..../......-........../..|......../.-..\..../....../...|..........
|
||||||
|
............/..--..........-............\.......\................\........................../../....|.........
|
||||||
|
..|..-................|.|..|................/.......\............-//.......................\..\...............
|
||||||
|
.......................-......-..................|....\................-......\.|....\....|..../../|.-........
|
||||||
|
........................-..................-...........................-..-................-................|.
|
||||||
|
/.\....|.-.................................\..-.....\./.........../-.|..............\..\.....--|/....\........
|
||||||
|
.......-..-../..................\..--|..............|...............|\........|...--................|./.\.....
|
||||||
|
..........|................-.......|..................................................|...................|...
|
||||||
|
-.-..|....-.|........-./...|.-.........\.....\/........-........\........../................./.../........\...
|
||||||
|
..................../...|/......................................../............\.|./../................/\|....
|
||||||
|
...//.........................\....../..............\../.......-..\....|......................................
|
||||||
|
............................./..|./../.........-/..\..........................................................
|
||||||
|
......\.....|..................|..................\.....\.-..\...../............................../...........
|
||||||
|
..........\...........-..........-.....-....\/................../.................................\.....|..\..
|
||||||
|
..../.\...................................\............\...\....|.................|.....................-.....
|
||||||
|
...........-...........................\.......|-../.|....|.....|......................-...../................
|
||||||
|
.......|.........\..............|....\...-......../...........-.....-..-...........-..................\...\.|.
|
||||||
|
...........|.......................|....-..........\............................\.................../.\.......
|
||||||
|
..../.................\.......-..|.................../........................|...............\...........-.|.
|
||||||
|
............./..|.-\..../.....-............-....|..\......|......../............-.........|................\..
|
||||||
|
...................\...\/......\............|......................\....|...................-./-..............
|
||||||
|
..-\...........|.................../.....|....|............................-..|............\.............\....
|
||||||
|
.|.....\....\........|..................\...............|..-/.........|.-/...........-............-...........
|
||||||
|
.....\...../......-............|........./..|............-........................\....-......................
|
||||||
|
......\......../........|..............\...-..-...|.......................................................|...
|
||||||
|
...................|.................................\.....\...........................|../.|.-......-........
|
||||||
|
..................|..............\.....\............|........../....../...............\.........\.............
|
||||||
|
..|...........-..../....\.........--...\................../.............-...-....................-..../....|..
|
||||||
|
.|...\...................|......-...........-\..........\.....|.....|..........|.........|....|-../...........
|
||||||
|
.............\|...................../\...............\....../.......-....\.....................-..............
|
||||||
|
.......//.....................\....\......\......\.........|...................../......../.........\......-..
|
||||||
|
.\./.........-...-./-.\.............../......|................................\|....\...../....-..............
|
||||||
|
.......|......../......../......./.........../...............|............................../..|......../.....
|
||||||
|
............./.........|.....-./.........../....-......./|......-................|............................
|
||||||
@@ -14,6 +14,18 @@ import (
|
|||||||
"adventofcode2023/day05"
|
"adventofcode2023/day05"
|
||||||
"adventofcode2023/day06"
|
"adventofcode2023/day06"
|
||||||
"adventofcode2023/day07"
|
"adventofcode2023/day07"
|
||||||
|
"adventofcode2023/day08"
|
||||||
|
"adventofcode2023/day09"
|
||||||
|
"adventofcode2023/day10"
|
||||||
|
"adventofcode2023/day11"
|
||||||
|
"adventofcode2023/day12"
|
||||||
|
"adventofcode2023/day13"
|
||||||
|
"adventofcode2023/day14"
|
||||||
|
"adventofcode2023/day15"
|
||||||
|
"adventofcode2023/day16"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
)
|
)
|
||||||
// Usage: go run main.go <NN>
|
// Usage: go run main.go <NN>
|
||||||
// assumes input is in day<NN>/input.txt
|
// assumes input is in day<NN>/input.txt
|
||||||
@@ -43,6 +55,33 @@ func main() {
|
|||||||
case 7:
|
case 7:
|
||||||
fmt.Printf("part 1: %d\n", day07.Part1(utils.Readfile(d)))
|
fmt.Printf("part 1: %d\n", day07.Part1(utils.Readfile(d)))
|
||||||
fmt.Printf("part 2: %d\n", day07.Part2(utils.Readfile(d)))
|
fmt.Printf("part 2: %d\n", day07.Part2(utils.Readfile(d)))
|
||||||
|
case 8:
|
||||||
|
fmt.Printf("part 1: %d\n", day08.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day08.Part2(utils.Readfile(d)))
|
||||||
|
case 9:
|
||||||
|
fmt.Printf("part 1: %d\n", day09.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day09.Part2(utils.Readfile(d)))
|
||||||
|
case 10:
|
||||||
|
fmt.Printf("part 1: %d\n", day10.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day10.Part2(utils.Readfile(d)))
|
||||||
|
case 11:
|
||||||
|
fmt.Printf("part 1: %d\n", day11.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day11.Part2(utils.Readfile(d)))
|
||||||
|
case 12:
|
||||||
|
fmt.Printf("part 1: %d\n", day12.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day12.Part2(utils.Readfile(d)))
|
||||||
|
case 13:
|
||||||
|
fmt.Printf("part 1: %d\n", day13.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day13.Part2(utils.Readfile(d)))
|
||||||
|
case 14:
|
||||||
|
fmt.Printf("part 1: %d\n", day14.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day14.Part2(utils.Readfile(d)))
|
||||||
|
case 15:
|
||||||
|
fmt.Printf("part 1: %d\n", day15.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day15.Part2(utils.Readfile(d)))
|
||||||
|
case 16:
|
||||||
|
fmt.Printf("part 1: %d\n", day16.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day16.Part2(utils.Readfile(d)))
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("no such day: %d", d))
|
panic(fmt.Errorf("no such day: %d", d))
|
||||||
}
|
}
|
||||||
@@ -50,7 +89,7 @@ func main() {
|
|||||||
|
|
||||||
// Reads day from os.Args.
|
// Reads day from os.Args.
|
||||||
func day() int {
|
func day() int {
|
||||||
latest := 6
|
latest := 15
|
||||||
if len(os.Args) == 1 {
|
if len(os.Args) == 1 {
|
||||||
return latest
|
return latest
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ func (g *Grid[T]) SizeX() int {
|
|||||||
func (g *Grid[T]) SizeY() int {
|
func (g *Grid[T]) SizeY() int {
|
||||||
return g.sizeY
|
return g.sizeY
|
||||||
}
|
}
|
||||||
|
func (g *Grid[T]) Matrix() [][]T {
|
||||||
|
return g.matrix
|
||||||
|
}
|
||||||
|
|
||||||
func (g *Grid[T]) Get(x, y int) T {
|
func (g *Grid[T]) Get(x, y int) T {
|
||||||
if x < 0 || x >= g.sizeX {
|
if x < 0 || x >= g.sizeX {
|
||||||
|
|||||||
16
2024/.vscode/launch.json
vendored
Normal file
16
2024/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Launch Package",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "auto",
|
||||||
|
"program": "${fileDirname}",
|
||||||
|
"args": ["2"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
54
2024/gareth/day01/day01.go
Normal file
54
2024/gareth/day01/day01.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package day01
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
var leftList, rightList []float64
|
||||||
|
total := 0.0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
sides := strings.Fields(line)
|
||||||
|
leftNum, _ := strconv.ParseFloat(sides[0], 64)
|
||||||
|
rightNum, _ := strconv.ParseFloat(sides[1], 64)
|
||||||
|
leftList = append(leftList, leftNum)
|
||||||
|
rightList = append(rightList, rightNum)
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Float64s(leftList)
|
||||||
|
sort.Float64s(rightList)
|
||||||
|
|
||||||
|
for i := 0; i < len(leftList); i++ {
|
||||||
|
total += math.Abs(leftList[i] - rightList[i])
|
||||||
|
}
|
||||||
|
return int(total)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
var leftList, rightList []int
|
||||||
|
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
sides := strings.Fields(line)
|
||||||
|
leftNum, _ := strconv.Atoi(sides[0])
|
||||||
|
rightNum, _ := strconv.Atoi(sides[1])
|
||||||
|
leftList = append(leftList, leftNum)
|
||||||
|
rightList = append(rightList, rightNum)
|
||||||
|
}
|
||||||
|
|
||||||
|
counts := make(map[int]int)
|
||||||
|
for _, num := range rightList {
|
||||||
|
counts[num]++
|
||||||
|
}
|
||||||
|
|
||||||
|
similarityScore := 0
|
||||||
|
for _, num := range leftList {
|
||||||
|
similarityScore += num * counts[num]
|
||||||
|
}
|
||||||
|
|
||||||
|
return similarityScore
|
||||||
|
}
|
||||||
27
2024/gareth/day01/day01_test.go
Normal file
27
2024/gareth/day01/day01_test.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package day01
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3`)
|
||||||
|
assert.Equal(t, 11, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3`)
|
||||||
|
assert.Equal(t, 31, r)
|
||||||
|
}
|
||||||
1000
2024/gareth/day01/input.txt
Normal file
1000
2024/gareth/day01/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
76
2024/gareth/day02/day02.go
Normal file
76
2024/gareth/day02/day02.go
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package day02
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
total := 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
var report []int
|
||||||
|
nums := strings.Fields(line)
|
||||||
|
for _, num := range nums {
|
||||||
|
intnum, _ := strconv.Atoi(num)
|
||||||
|
report = append(report, int(intnum))
|
||||||
|
}
|
||||||
|
if isSafe(report) {
|
||||||
|
total++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
total := 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
var report []int
|
||||||
|
nums := strings.Fields(line)
|
||||||
|
for _, num := range nums {
|
||||||
|
intnum, _ := strconv.Atoi(num)
|
||||||
|
report = append(report, int(intnum))
|
||||||
|
}
|
||||||
|
if isSafeWithDampener(report) {
|
||||||
|
total++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func isSafe(report []int) bool {
|
||||||
|
increasing := report[1] > report[0]
|
||||||
|
decreasing := report[1] < report[0]
|
||||||
|
|
||||||
|
for i := 1; i < len(report); i++ {
|
||||||
|
diff := report[i] - report[i-1]
|
||||||
|
absDiff := int(math.Abs(float64(diff)))
|
||||||
|
|
||||||
|
if absDiff < 1 || absDiff > 3 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (diff > 0 && !increasing) || (diff < 0 && !decreasing) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func isSafeWithDampener(report []int) bool {
|
||||||
|
if isSafe(report) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(report); i++ {
|
||||||
|
modifiedReport := append(report[:i], report[i+1:]...)
|
||||||
|
if isSafe(modifiedReport) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
27
2024/gareth/day02/day02_test.go
Normal file
27
2024/gareth/day02/day02_test.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package day02
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`7 6 4 2 1
|
||||||
|
1 2 7 8 9
|
||||||
|
9 7 6 2 1
|
||||||
|
1 3 2 4 5
|
||||||
|
8 6 4 4 1
|
||||||
|
1 3 6 7 9`)
|
||||||
|
assert.Equal(t, 2, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`7 6 4 2 1
|
||||||
|
1 2 7 8 9
|
||||||
|
9 7 6 2 1
|
||||||
|
1 3 2 4 5
|
||||||
|
8 6 4 4 1
|
||||||
|
1 3 6 7 9`)
|
||||||
|
assert.Equal(t, 4, r)
|
||||||
|
}
|
||||||
1000
2024/gareth/day02/input.txt
Normal file
1000
2024/gareth/day02/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
45
2024/gareth/day02/poc.py
Normal file
45
2024/gareth/day02/poc.py
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
def is_safe(report):
|
||||||
|
increasing = report[1] > report[0]
|
||||||
|
decreasing = report[1] < report[0]
|
||||||
|
|
||||||
|
for i in range(1, len(report)):
|
||||||
|
diff = report[i] - report[i - 1]
|
||||||
|
abs_diff = abs(diff)
|
||||||
|
if abs_diff < 1 or abs_diff > 3:
|
||||||
|
return False
|
||||||
|
if (diff > 0 and not increasing) or (diff < 0 and not decreasing):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def is_safe_with_dampener(report):
|
||||||
|
if is_safe(report):
|
||||||
|
return True
|
||||||
|
for i in range(len(report)):
|
||||||
|
modified_report = report[:i] + report[i+1:]
|
||||||
|
if is_safe(modified_report):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def read_reports_from_file(filename):
|
||||||
|
reports = []
|
||||||
|
with open(filename, 'r') as file:
|
||||||
|
for line in file:
|
||||||
|
report = list(map(int, line.split()))
|
||||||
|
reports.append(report)
|
||||||
|
return reports
|
||||||
|
|
||||||
|
def main():
|
||||||
|
filename = 'input.txt'
|
||||||
|
reports = read_reports_from_file(filename)
|
||||||
|
|
||||||
|
safe_count = 0
|
||||||
|
for report in reports:
|
||||||
|
if is_safe_with_dampener(report):
|
||||||
|
safe_count += 1
|
||||||
|
|
||||||
|
print("OUTPUT:", safe_count)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
49
2024/gareth/day03/day03.go
Normal file
49
2024/gareth/day03/day03.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package day03
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
regex := regexp.MustCompile(`mul\((\d+),(\d+)\)`)
|
||||||
|
matches := regex.FindAllStringSubmatch(input, -1)
|
||||||
|
|
||||||
|
for _, match := range matches {
|
||||||
|
if len(match) == 3 {
|
||||||
|
x, _ := strconv.Atoi(match[1])
|
||||||
|
y, _ := strconv.Atoi(match[2])
|
||||||
|
total += x * y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
total := 0
|
||||||
|
isEnabled := true
|
||||||
|
|
||||||
|
mulRegex := regexp.MustCompile(`mul\((\d+),(\d+)\)`)
|
||||||
|
doRegex := regexp.MustCompile(`do\(\)`)
|
||||||
|
dontRegex := regexp.MustCompile(`don't\(\)`)
|
||||||
|
|
||||||
|
tokenizeRegex := regexp.MustCompile(`(mul\(\d+,\d+\)|do\(\)|don't\(\))`)
|
||||||
|
tokens := tokenizeRegex.FindAllString(input, -1)
|
||||||
|
|
||||||
|
for _, token := range tokens {
|
||||||
|
if doRegex.MatchString(token) {
|
||||||
|
isEnabled = true
|
||||||
|
} else if dontRegex.MatchString(token) {
|
||||||
|
isEnabled = false
|
||||||
|
} else if mulRegex.MatchString(token) && isEnabled {
|
||||||
|
mulMatch := mulRegex.FindStringSubmatch(token)
|
||||||
|
x, _ := strconv.Atoi(mulMatch[1])
|
||||||
|
y, _ := strconv.Atoi(mulMatch[2])
|
||||||
|
total += x * y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
17
2024/gareth/day03/day03_test.go
Normal file
17
2024/gareth/day03/day03_test.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package day03
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))`)
|
||||||
|
assert.Equal(t, 161, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))`)
|
||||||
|
assert.Equal(t, 48, r)
|
||||||
|
}
|
||||||
6
2024/gareth/day03/input.txt
Normal file
6
2024/gareth/day03/input.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
-:-]what()(+/mul(957,396)?mul(550,844)%+why())-? #}from()mul(488,628)%} ~**mul(770,931)$~mul(791,733)<{mul(985,350)<#why()don't()what()select()$what())]what()who()mul(327,185))<^^mul(542,68)#?who()<from()';^how()mul(619,952)/where(){(!);'@,mul(551,161)select()>when()do()from()mul(51,291)[where()!{]/}'@?mul(233,511)@what()]mul(311,967))&who()how()mul(839,578)^who()]}mul(266,735){mul(176,670)mul(154,710)*select()](':^,mul(531,801)# *why()why()mul(30,325)~,where();select()select()}-/when()mul(512,729)+where();[mul(720,339)[~*when()mul(722,867)!);{+mul(582,286)^:)what()@mul(604,485) (who()why()who()from()[mul(128,295)how()?!%~~<what()mul(156,267)'how(689,161):where()mul(206,221) mul(835,81);] %mul(562,798)^{%where()mul(38,166)#!what()mul(185,550)^! ?,+;}}mul(685,101)select()mul(316,869)>[~}{[&;mul(548,186))(%];mul(841,290)when()where()'?mul(646,803)mul(553,782)how()when()-mul(569,604)@ ++:/%why()]select()mul(257,598)#mul(897,819)how()what()from()how()]when()~/!}mul(856,271)+&why(){}why()>who()mul(373,408)-who()^&%>';,when()mul(54,88)what()!mul(663,711)$#(?;^from()mul(898,810)when()from()%@mul(776,102)why()mul(303,842)!/,%<^;mul(840,791){[@mul(909,714)don't()>who()why()from(545,686)%~mul(483,956)^'why()from()where()$>*:mul(931,649) mul(800,313)):mul(31,69)mul(549,670)$;mul(327,976)@who()^mul(627,907)/[@what(925,706) ;^who()!mul(629,813)when(){$&where(){#mul(504,147)?mul(222,429)#who()*/!select()<what()mul(310,934)])^/$]mul(917,911)-%how()?[;,mul(823,273)*[~select()/select()~%mul(703,815)what()where()?what():'?[who()mul(966,52)how()&-~(%[(^mul(913,694)mul(190,570),&<%'from()where()what(979,309):+mul(662,926)/<!when()'select(),/&*mul(655,410) how()}mul(386,934)where()[mul(159,595)@']from()when()#?@mul(356,559)&)>?$ mul(439,336)?from()*select()*}when()]who()mul(148,356)(who()+mul(271,905)mul(564,172)@?(~mul(628,470)#} mul(301,170)?@,^don't();&:^&how(605,264))(what()'mul(896,108),$mul(413,431):<>where();how()>!}when()do()!}/&:when()>mul(754,737)~:#:* mul(962,620)}mul(26,490)!~,mul(450,234){/]who() <;{mul(938,932)?--#%};}mul(140,314)(-}/,[mul(202,839)^why()-!},mul(459,716),mul(600,932)}when()]who()}who())&mul(752,142$mul(174,573)mul(231,182)from()mul(308,661)what()} mul(178,99)&^*[(mul(858,730)~}from()^mul(17,545)what()~{~*^what(90,714)how(),mul(63,969)-]mul(364,49);mul(130,598<:&why()select(879,794)mul(46,169)>&how()%mul(564,506)/what(255,868)mul(415,375)':@who()mul(525,772)<$mul(277,787)[~mul(314,321)'&@$^%mul(741,325)?(%#;*mul(459,703)why()~what()mul(250,38)what()<-$)when()%(don't()mul(296 ',mul(673,933)?#<@who()from()^?mul(831,912)?/*mul(407,853)mul(119what()why()>mul(816,762) how()<}~from()how()/@:mul(792,799)()@?%:$:mul(289,264)
|
||||||
|
why(),'*),from()mul(767,350):>~mul(123,684)@from()>mul(722,338)<'<select()what()}*select()mul(993,866)where()[;'select()what()select()?why()mul(357,705)what(){+&mul(590,928)how()[why()how()+what()><why()how()mul(417,421)/[?where()mul(298,609)*%who()#where()}why()(~+mul(233,280)when()mul(740,13)where()#why()!/mul(702,342)@;mul(945,10)[}!#mul(758<mul(969,595)+how()from(573,280)what()mul(351,944)what()where()]+<how()&[^mul(211,333)what(590,707)<'mul(579,209)do()^what(324,278):<+)!mul(482,641,^why()/<$from()select()mul(302,432);$where(){*mul(58,633)#]+,select()'$mul(534,736)@+~@what()/mul(492,990)'mul(606,447)~}, #@$)$/mul(878,726)'++'who()!where()what(777,25)why()mul]@>mul(252,529)do()%)%^when()!mul(731,123)mul(582,378)-mul(934,355}where()what()how()@%<[>;<do()(mul(709,553)])?&~mul(936,634)when()who(),do()#$$mul(917,683)select()when()+mul(858,234)!mul(828,850)@(?)^)mul(244,230)*^/%what()[^$who()@mul(716,56)from()/mul(312,20)!)mul(333,734)select()from()from():$how()+$${mul(443,208) &when()&$-&:mul(4,320):*;&#~~mul(261,16)&select()'@who()~^+mul(597,905)]]()who()(mul(273,2)who()how()#+?when(263,200)/mul(699,563)$don't()why()]!mul(744,844)>:mul(5,63) who()!mul(946,479)+}select()$@mul(478,71)~<()-#mul(500,398)'from(612,869)select(98,846)!!<]:select()mul(785,98)',select()//:-mul(192,182):{ why(){;mul(910,471)&^+&who(424,579)/:select()[mul(217,829)where()how(423,674)$*mul(318,444)[!?~mul(254,793)who()select(521,861)how()mul(54,186)why()[:^;-mul(109,234)mul(465,266)+?([-mul(518,485)^mul(403,383)mul(726:how()when()#mul(344,785)/}+?mul(97,996)+@'mul(637,749)how()-%+mul(302,591)don't()%^]}!)]mul(524,902)$[]/*mul(839,651)}^)$when()'what()mul(270,805)#mul(566,750){ how()/mul(716,302)/&*>@-what()>when()what()mul(602,574)+where(619,83)mul(235,585)?where()[%select()+>where(){]mul(209,404)~where(),why()how()-/-mul(123,125)^'how()who()$}/;mul(851,629)how()who()'#;$ do():select()!when()[>+>mul(576,669)what()!,'?from()&mul(423,260) how()-mul(910,922)?<@'->(mul(274,173)why()}<~from(601,667)mul(282,816)<how()when()when()' ^from()mul(939,359)mul(385,79)who()&when()-^?-^don't()how()+*/mul~@, @/!$mul(526,30)}(:~from()do()who()$/!~)what():%mul(366,255)(*+>from(953,125)~mul(98,837)&[how()[what()mul^%} '$from()^-;mul(439,801)mul(761,498))>$'-why()<</mul(557,979)[mul(224,700)*mul(917,173)[-(~;mul(44,236)%select()what()( ![(who()mul(153,275?how()(!/mul(627,465)%/>who():mul(109,723)from()who()mul(391,416)& -how()>mul(496,170)^'${mul(657,96)why(611,959)why())from()%+mul(62,175)>}~,%from() >mul(92,927)mul(17,279)!why(){+where()}how()mul(939,286){;mul(744,904) from()?''who()&who()how()mul(170,192)@,mul(499,985)';from()})!{+who(){mul(572,653)#:why()mul(720,626who()from()(%:mul(676,779)!why() when(58,261)^ *mul +from(){)')@!*mul(802,646)how()(-+[;#when() {mul(742,576)<where()>]* ;mul(38,717)?what()}'how(184,130)mul(126,115)]@>mul(512,978)/where()+*why()mul(705,242)?{$how();when()mul(173,898)'(~who()mul(536,621)&^from()select()when()?@mul(52,680)] -%@;][mul(971,573)^mul(879,466)
|
||||||
|
mul[!-,why()(?mul(770,624)~:mul(197,580){{(%mul(678,337)what()mul(951,457)'<#mul(679,253)?do()who();& who()select()mul(105,231)+{&!when()who()how()!')mul(262,609)):,{'from()/?@}don't()*:mul(471,462):([(@;from()mul(734,965)/&/where()mul(885,324)why(){>/#<:mul(390,818)!mul(684,730)*>>{[!what()what()mul(824,893)mul(801,597/why()!when()how() '>from()%mul(165,825)who(837,795)?? why(187,949)mul(703,551) when()'mul(759,898)select()#$$ where()where()mul(694,292)%(who()%#}mul(884,767)^<mul(900,512)^what(862,782)%*}mul(484,385)]where()where()mul(593@{what()?{{@&who()^*mul(511,975)+%from(193,630)@-~how()/<mul(161,30)mul(462,217)mul(283,656)when()mul(733,613)what()^what()why()/where()what()^!mul(777,858)^select()mul(732,203)how()<mul(574,457)select()where()$who()when()~where()#}mul(525,448)*mul(5,230)mul(347,280)<from()#what()mul(613,165)@who(609,769)@~/,%#;*mul(298,242)what()+~when():($-(mul(118,981)mul(72,529)$^~select(306,809),!/(mul(864,257))what()-?mul(308,631)? //*&,/!don't())>:$mul(945,214) where()how(837,748)(mul(537,489)(%{mul(594,245)who()from()from()%}!)])why()mul(832,704)^~mul(902,18)how()what()who()/#'-#mul(345}who()when()?]&^mul(873,161)^mul(81,518)]$mul(875,700)how()where()(mul(735,369)/-< why()@>mul(703,274)-<mul(949,449)what()+(>from()when()**,)mul(204,896)]+mul(28,596);why()#select()'#]mul(774,171< why() !from()mul(29,711)mul(28,600)}when()!@(^why()~{mul(555,761)%}do()from()-mul(139,179){how()'?mul(294,354)}where()mul(317,957)]select()#;where() where()^@from()mul(461,831)~who(75,120)%who()@-&;,)mul(563,131)mul(607,401)select())from())&,mul(26,412)select(726,797)&)how()@select()mul(416,615)(what()select()!()<<what()who(299,911)mul(628,777){mul(712,971)(*]what()from()<>#;&mul(921,158)>- mul(245,598)select()what()*({mul(468,522)]^select(574,638)]@};do()from(799,930)%who()#:[how()mul(413,674)[how()*mul(327,432)%?@'mul(486,644)}~>-mul(637,16)how(254,818){%where()#where()who():who()mul(431,749)$$where(228,303)<!why(109,819) ]mul(693,21) where(396,89)[mul(60,538){mul(738,595))-&why()how()why()(mul(698,770))*>,%+&mul(593,337)}#:where(){why()[+&!mul(520,180)^mul(723,959)mul(492,739){/?mul(327,463)?-select()-<,mul(102,950)!#do()@when()-when()},select()/mul(274,979/from())who()(~)!^$mul(78,739)why()@{~mul(819~?~+]>@mul(824,208)}mul(338,41)where() &*;;&what()mul(888,646)from(),$:-who(263,596)!!-from()mul(396,204)>{)>{?(%{mul(885,937);!what()&%!<mul(178,507)mul(833,974)^mul(842,332)>from()}mul(207,417)(<;what()mul(187,893)((&&}&why()*)-mul(589,985)^how(310,10)when(),]:mul(989,534)$where()mul(552,604;(!;select(){){where()#mul(152,511)+/$!;+/<+]mul@select()::when()who()how()!what()mul(446,994)from()<}what()select()'why(244,102)+<select()mul(516,369)]&mul(707,483):@}%?what()from()don't()mul(407,712)$:{&:,,,?mul(112,3)-~- what()>)%}who()mul(693,903)?*/}select()mul(282,115)[];why(){mul(925,276)how()&{what()&$when()&-!mul(191,385)*)mul(446,703)[>what()?*}what()^who()*mul(997,718)!>$)@,^*)mul(788,724)from()#&]~/<,)how()mul(181,531)[(why()[mul(409,206)what(604,231) when()why(921,229)]>where()//mul(199,96)when()why()#!/usr/bin/perl~%>~ &:mul(239,884)
|
||||||
|
what())[$^+why()mul(118,89)mul(689,203)#,,what()what()mul(633,394)from();~from()!where()*?@mul(568,753)/[+when()?%:mul(828,475)what()don't()-;@ mul(509,544)[when()};<+'(mul(235,757)<+:%select():mul(241,373)$mulselect() (%where()where()]-)mul(306,62)from()what()mul(285,414)!*&&>who()#mul(543,866)/~select()[+don't()/><why()from() ~#mul(983,515)#mul(731,258)mul(894,831){>)where()!when(),'mul(701,189)/';!:]+how(902,507)-^mul(847,104)mul(883,112){'~}&mul(697,190)what()%-mul(220,860)+^mul(765,74)select(),$who()<mul(685,855)!what()where()why()#{,-;mul(302+^(who()]from()~<?where():mul(383,623)::~(>,@mul(639,551);(mul(26,80)why(480,988)^why():? <[mul(672,116@mul(316,879)}mul(498,582) @,:{'why(589,887)mul(39;]mul(855,31)^from()?mul(93,510)mulwho(){@-what()<where()~select()mul(225,679) 'mul(305,662)/:,mul(887,727)?:~:&/select()#:<mul(755,830)^#}+@)how()?^mul(14,79)-mul(433,926)what()'mul(458,711)>from();where()from()~:(mul(688,799)~when()>from()-select()who()~<mul(71,560)( who()? +#^who()[mul(70,477)}>#+{ >mul(275,916)#?-mul(359,865)where(441,672)'}what()[from()when()<>who()mul(909,227)$:!'mul(330,478)!?[;(+#what(919,466)&/mul(73,181)[{how()mul(403,182);mul(249,968):!from()?!{#-mul(661,975)!-;}'mul(999,285)select(565,140)+>@,$:from(47,825)~!mul(599,436))<when(603,518)@mul(567,365)?(}}where()<{:who()?mul(755,613) <*who()mul(448,608)$$mul(507,887)mulwhen()]when()^$+@();+mul(846,707)]mul(932,511)who()}}where()#mul(122,316)#>+ [>%!mul(959,617)mul(5,150)where()@;&mul(630,775)<select(686,710)who()/';[*%select()mul(859,837)'mul(451,3)(when()($/+mul(499,794){]mul(194,78)from()'?don't();mul(47,314){who()~/]mul(526,464)why(666,133)#}/;]:mul(223,721)how()><&-:;mul(114,820[don't()when()#how()mul(976,290;+-from()where()]mul(338,47)when()what()where()%]mul*who() #+what()mul(679,324)mul(859,321)%'mul(446,297),#select();<mul(797,938)who()mul(531,845)}*select()@{mul(661,677)/)'*mul(837,800)<who()select()<]}<@mul(844,594))when()where():'mul(75,307)mul(676,67)(]what()<select()?mul(851,92)+&)mul(683,41)?<,/:~'mul(179where()from()~<mul(674,897)/!how(529,298) *[}from(),mul(362,131)}! % $mul(168,955)mul(517,218)[(,mul(740,567)}~[)$@from(),do();]mul%/%]why()mul(777,920)what()what()$;<what()mul(307,462)-+from()what()/$select()select()do()<select()&from()why()why()&mul(522,562))<how()-!+when(413,672)&)mul(621~(?select()<*-why()mul(372,852)}]~mul(668,335)mul(512,514){%mul(873,547)[*(mul(887,814)]>';from()mul(206,301)why()-'mul(87,734)<where()+:mul(844,819){#^^mul(130,409)[('@what() ;mul(916,629)@@who()-?}mul(320,288)what()?mul(184,677)[@#select()+::-select(929,36)/mul(329,568)
|
||||||
|
{^mul(75)<:from(){select()select()mul(833,211):[-'mul(702when()who(21,237)+)&!>mul(735,118)] {/what()*@^what()where()mul(685,883)when()what()mul(91,84)}]<select()why(795,767)@why()]}$mul(711,291)select()--+<*who()mul(898,469^how()>-~where(){when(374,912)$do()>~,' how()mul(67,939),)&~@where()(mul(923,997)~,*$when()[from()from()mul(699,705)~/when()+}mul(214,775)'%mul(715,142)-;mul(290,853)from()$why()what()select()-@-mul(682,729)+^$}, !mul(197,39)mul(269,573)@^mul(819,945)/select()-do()%$~'#select() 'mul(64,956)[who()*who()@,)>+}mul(519,356);*/%>why()[[)mul(184,666)what()mul(892,160)+*&where(764,214)--]?(>mul(996,338)>when()what()]))&?mul(865,864))?@[::when()>what()>mul(218,296)&)%:<?mul(903,712),+mul(102,86)' ^,[>[~why()how(416,393)mul(118,100)from()select()#: $mul(7,742)how()&~how()>who()^mul(667,218)?/mul(218,898)!:$from()>mul(746,995)(+select()] when()}mul(971,429), !,&mul(505,165):!-)?-how()from()%mul(921,456)@mul(491,404)#how()-mul(284,834)#?(mul(667,960)]where():how()what(963,920)% what()don't())mul(236,336) why()why()select()where()^mul(33,901)mul(253,866)<#>$]%-mul(216,512),)from()what()what(464,183)where()select()@'}mul(98,640)' :)what()$%~#/mul(283,893)(mul(520,959)#^?{>@*when()when()]mul(80,420)where()mul(751,106)when()when()! how()mul(148,813)@><^[mul(740,246) how()where()!!/mul(242,262) who()who()%,mul(308(#/when()$mul(359,332)from()why()from()~$$^where()@mul(270,445)why()}%mul(623,449)where()how()?& />mul(759,849)-} (mul(84,200),$;who()[!mul(934,76)(@^:where()why()/'mul(650,46)[mul(105,265):)when()+ &'what()^mul(334,290)] $what()/mul(930,226,>^!%don't()mul(243,460){'#/what()+/mul(437,684)mul(501,579)/mul(243,174)mul(988( +<#where(206,306)where()[,from()mul(331,170)(?^~}#mul(940,949)>(,*+mul(925,961)^*from()select()^--^)(mul(994,182)+'+mul(153,816)~<!?[mul(31,276)don't()how():/!*] !^~mul(404,438)from()<]?)})>&mul(260,998)~:],],who()why(348,109)why()<don't()]#?)select()<<where(999,395)mul(342,366);what()select()~&~mul(120,353)when()]mul(198,41)][;(]:select()-[mul(947,937)$$when()-{mul(672,675);/!mul(14,647)>who()when(290,863)why(735,89)!from()@ >#mul(205,831)'$ %'mul(981,644)!<mul(100,956):{#select()#*mul(168,493)who()-%)#;{don't()^]who()~~ *mul(47,958)mul(130,976)how()~how()?what();mul(983who()(why()/)},]*:/mul(374,969)>#,*>mul(910,535))[who()#mul(220,934)how(271,592)-,*$,+mul(11,63)mul(783,580)^&*}~<mul(677,425))select()when()/how()mul(181,298)??why()how()&/mul(670,720)/@!when()where()#mul(403,306)]from()(from()why()*why()don't()^~from()[select()who()select()mul(516,37)what())}-*>(;from(){mul(21,444$what(274,202)<where(),}mul(706,78);select(275,134)]{&}why())@mul(302,87)[@[who()!when())mul(196,98)mul(918,675):,>how()mul(293,78)mul(189,814)#{}why(80,738)}from()mul(456,691)*@{(,[%mul(916,89)how())(]@mul(524,412)];:(mul(374,851)where()[mul(473,999)select()$what()}don't();];(}mul(327,69)%&+;:/what()don't()-%,'()mul(377,536)mul(31,322))@what()^select()mul(719,58)$why()~&what()']}mul(39,890)(+<#who(){how()!<mul(559,894);-&what()from()#$do()mul(256,3)where()^how()when()$:<what() mul(664^-from()}mul(469,922)from()>mul(299,824)(]](+mul(205,11)
|
||||||
|
{mul(602,646)!% ^mul(384,953)do()&&:]<<select()#<mul(766,701)&@(what()who()+>mul(228,736){({}don't()-when()@*>-mul(278,494))/&<mul(596,290)select()when()),{ ~mul(563,584)mul(351,221)how():#where()[{%what(128,820)[ mul(754,363)!{)how()&''from()mul(388,712)?;'>?><(select()mul(916,219)select(),:{(<*mul(360,209)why();~}where()-(,mul~when()when()!where()@:;:#/do()select()select()!,how(972,480)~-how()who()mul(726,867):>mul(549,954)](how(802,821)select()how()[+^mul(535#select()}why()[what()]why()*{#mul(72,525)mul(809,41who()!~where(82,230)}mul(961,563)}who()what(417,588)<how()mul(756,106)!)when() [mul(733,591)how()[why(),<+@,mul(889,603)when()when()mul(60,212)mul(955,930)]~&)/!}-}&mul(206,66)where(882,366)~/<{mul(745,261)'<where()<why();select()(how()mul(74,146)where():~who()what()>&*mul}{,+?%^[when(34,108)who()mul(71,111)$+,}#~-<mul(265,932)]$what();^mul(775,136)mul(192,60)how(){)mul(212,476<who()?mul(264,266)[,^&/how(215,234)mul(447,79)!!+;,who()@{mul(897,924)^what()-%((don't()mul(259,393)who()when(956,639)&where()]@{,mul(637,712)%(mul#'select()!~<+<do(),#&<:% -{)mul(914,330)when()-)?@]{where(240,411)*select()mul(191,984),%?-what()+{mul(623,7)+mul(899,145)</why()select()what()<{~mul(849,743)!where() mul(43,318)when()!~$)mul(607,51)!?<mul(123,500)<]how()!what(){(mul(380,536),mul(367,657)~{,why()?-*$mul(589,520)(#mul(568,853)!-how()'^what()}'^mul(924,205),};'/^!!@mul(765,625)*!+where()[@select()-~do()!!,who()+%mul(369,495)()/mul(530,282)mul(148,870)]*where()mul(668,764)%who()how()how()&![who()mul(678,727)>^]@ when(){:@mul(545,335) &how()from()<:mul(958,59)$ (what()mul(886,155)how()&+mul(525,132)<&}who(502,340)select()when()#^mul(339,398)who(),(how())@@how()$$mul(831,852)when()don't()>mul(935,45) select(930,598)!:select()mul(693,62)(mul(681,508)how()^@*;)mul(235,731)who(468,32)#~>don't()#:what()where()when()~<who()-/mul(137,827)!who()!why()mul(806,939)from()mul(492,899)why()^),who()]#from()$ mul(384,731)>~^>@#{mul(2,62)mul(866,617),>% mul(806,586)how():{/mul(669,407)!/mul(457,522)mul(40,474)>)]select()who()}mul(451,794)]#mul(115,471)~mul(331,456)@^who(){#when()mul(672,70)where()who())(#how()what()!mul(438,748)-/mul(605,224)mul(46,34)~?'</'$#how()&mul(278,426) mul(710,864)mul(296,109);mul(481,73)&<,]mul(650,979) mul(575,478)how()$@%#;mul(319,368)][select()where()/ /,:when()mul(399,630)from()mul(9,26)~'do()mul(953,316)%''%{>mul(650,523)?mul(871,731)?%from(966,980)>when()mul(790,779) from()#$:,'mul(428,763)@# why()mul(724,6)select() ,mul(208,11)why()how()mul(287,562)$[:select()},?mul(531,36)/mul(12,351)#$+,:#:$when():mul(941,380)-[from()!)?-select()mul(102,544)when();~{select()~^;-do() ]who()from(),<who()]/>mul(959,599)>why()/,<%-,!mul(517,558)%])$mul(945,968)mul(854,265)?<when()mul(98,913)<&&}]+mul(830,92)where()]why(132,949)why()from()when()'when();{mul(615,131)(,;}^~!mul(973,226)how()^}){}mul(45,238) where()#)'!~ <
|
||||||
91
2024/gareth/day04/day04.go
Normal file
91
2024/gareth/day04/day04.go
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var directions = [8][2]int{
|
||||||
|
{0, 1},
|
||||||
|
{0, -1},
|
||||||
|
{1, 0},
|
||||||
|
{-1, 0},
|
||||||
|
{1, 1},
|
||||||
|
{1, -1},
|
||||||
|
{-1, 1},
|
||||||
|
{-1, -1},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := parseInput(input)
|
||||||
|
return countXMAS(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := parseInput(input)
|
||||||
|
return countXMASPatterns(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) [][]rune {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
grid := make([][]rune, len(lines))
|
||||||
|
for i, line := range lines {
|
||||||
|
grid[i] = []rune(line)
|
||||||
|
}
|
||||||
|
return grid
|
||||||
|
}
|
||||||
|
|
||||||
|
func countXMAS(grid [][]rune) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
target := "XMAS"
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for r := 0; r < rows; r++ {
|
||||||
|
for c := 0; c < cols; c++ {
|
||||||
|
for _, d := range directions {
|
||||||
|
dr, dc := d[0], d[1]
|
||||||
|
found := true
|
||||||
|
|
||||||
|
for k := 0; k < len(target); k++ {
|
||||||
|
nr := r + k*dr
|
||||||
|
nc := c + k*dc
|
||||||
|
if nr < 0 || nr >= rows || nc < 0 || nc >= cols || grid[nr][nc] != rune(target[k]) {
|
||||||
|
found = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if found {
|
||||||
|
total++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func countXMASPatterns(grid [][]rune) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for r := 1; r < rows-1; r++ {
|
||||||
|
for c := 1; c < cols-1; c++ {
|
||||||
|
|
||||||
|
topLeft := grid[r-1][c-1]
|
||||||
|
topRight := grid[r-1][c+1]
|
||||||
|
center := grid[r][c]
|
||||||
|
bottomLeft := grid[r+1][c-1]
|
||||||
|
bottomRight := grid[r+1][c+1]
|
||||||
|
|
||||||
|
if center == 'A' && ((topLeft == 'S' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'M') ||
|
||||||
|
(topLeft == 'S' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'M') ||
|
||||||
|
(topLeft == 'M' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'S') ||
|
||||||
|
(topLeft == 'M' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'S')) {
|
||||||
|
total++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
35
2024/gareth/day04/day04_test.go
Normal file
35
2024/gareth/day04/day04_test.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX`)
|
||||||
|
assert.Equal(t, 18, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX`)
|
||||||
|
assert.Equal(t, 9, r)
|
||||||
|
}
|
||||||
140
2024/gareth/day04/input.txt
Normal file
140
2024/gareth/day04/input.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
XASXMAXXMSXXSMMSXMMSMXSMXMSSMSSSMMSMAMXMXSMMMMAXAMXSASXSSMMSSMXAMXMSAMXMMXAXXXSAMXXXXXMMXSXMXXSMASAMXMXAXXMASAMXXXMAMMMSXSXMXMMMSAASXSMSSMMS
|
||||||
|
XASAMSSMAMMMAMAAAMASMAMAAXMASAAASAAMAMAMAAAAASMSSSSMAXAAAXASASMMMMMMXMASXMAMXXXXSMSMSXSAAXAMXMASMXMMSMSAXSXMMSXSMMAAMXAMAAMMAAAAXMXSAAAAXAAM
|
||||||
|
MXSXMAAMXAAAXMMSSMAXMASXSSSSMMSMMSXSASMSMSSMMMAAAXXXXMMMMMXXAMMAAAASMMAAAXMASMXXXAAASAMMXSASASMMMAMXSASASASMAXXMAMSSSMSSMMAXSMMSXMMMMMMMXAMX
|
||||||
|
SAMMMSSMMXXSXXXAAMSMSASXAAXMXXAAXXXMAXAAAXXMASMMMMMMXMXXXXSMXMSSMSASASMMXMMXMAAMASMSMSMAASXSAAAASAXAMAMXAAXMASMSSMXAMMMAMXSAMAMAASXMMSSMSAMX
|
||||||
|
MASAAAAMSMMMMMMSMMMAMAXMMMMMXMSSMMXMSMMMMMAMXASAXAASXMMASAAXAXAXMXMXMXAASXMAMSXSAMMXMMMMMSAMXMSMSMSMMAMSMXMMASAMXAMMSASAMMXASAMSXMAMXAAXSAMA
|
||||||
|
SSMXMSMAAMAAXXAMXASMMSMAMXSXSAMXXMAAAAXSXSAMXMASMSXMASXAMSAMXMMMSASMXMXMMAMSMXAMASXMXAASXMMMMXMMXAAXXAMXXAAMAMAMXXXASXSASXMMSAMMASXMMMMMMMMS
|
||||||
|
XXXXMAMMMSSSMXSXSASXAXSXMASAMXSMXMASMSMSXMASXXMMXMXSAMMXMAXAMAXXSXSAASMASXMXAMXMMMAASMXXAMXMMAXMXMSMSAMSSMSMMSSSSMMMSXMXMASXSMMXAXAXSSSMXAAX
|
||||||
|
MMXSSXSMXAMAMAAAMSXMXMMXMASXMMSAMXXAAMXSASAMMXXSXMXMASXSSSMXSSMXXMXMMSAXMASMMMSMASAMXMASXSAMSSMSMAAAMAMAXAMAMAMXAXAXSAMXMXAXMMSMMSXMAAAMSAMX
|
||||||
|
AXMXMASMMASAMXSXMMXSAMAAMXMMMAXMMSMMXMASAMXSXMXMAAMAMSAMAAAMSAMMSXMXSXMXAXMASAMXAXMASXMAMMAMAAASMMMSSSMSSMXSAMXSMSMXXAMXSSMASAMAMMASMMMASMMM
|
||||||
|
XMAMSXSASASASMXXMAMMAASXSAAAMMXAAXXAMMMMSMSMXMAXMXMAMXAMSMMMSAMASAMXSAMMMMXMMAMMSXXAMAXXAMSMMSMMAXXXMAAAAMAMAXXAMXXSMSAXAAXAMMMAMSXMAXXMSASX
|
||||||
|
MSSMXASAMXSMMMAXASMSMMAXMAMSASXMAXMMSAXSASAAASMXMASMSSMMMAAXSAMMSAMAMAMMSAMSSSMSAMMSSSMSMXMAXXASXMMMMMMMSMASASXSXMASAXXMSSMMXMXMMMMSAMMXSAMX
|
||||||
|
MAMMMMMMMMMASAMMMXAAXXMASAAXASMMSXMAXMXSMSMSMSXAMMXXAMXASXMXXAMASAMSSXAAMAMAAMXMASAAAAAAXSSSMMAMASASXXXXMMXSASAXXAAMAMAXXMXSASASAMASAMXAMAMX
|
||||||
|
MASXAXAMXXSAMMAAXMSMMXMAMXXMMMAAMMMSXMMSXMXAAXXMSAMMSSMMSMMMMAMASAMAXMASXMMMSXAXXMMMSMMMAXAAXXSSMSASMMSAMXXMAMAMXSSMSMSMAMAXXSXSASXMSSMXSAMM
|
||||||
|
SXMXMSSSMMMASMSMSMAAMASXMMXSASMMXXAMXXASASMMXMAMAAXAMAMAXAASXMMXMMSMXXAXMSXMAXXSSSXAXAAXMMMMMMXAXMMMXAAMAMMMXMAMAMXAMAXAAMASAMASAMXMAMMXSASA
|
||||||
|
MMMXMXXAXAMAMMAAAMSMMAXAASASAXXXSMSSSMAMXMAMXXASXSMMSMMXSMMXAXSXMAXAMMMXXMAMSAMXAAMSSSMMXAAAAXSAMXXAASMXAASMASXMSSMAMAMMXSAAAMAMAMSMAXSAXAMM
|
||||||
|
SASASMXMMSXSXSMSMMXSMXXXMMASAXSXMAXAAMMMSSMMMXASXMXMAAXMXMMMXMSAMXSXSASMASAMMSSMMMMAAAXMSSSSMXXAMXMAXXXMSMSAAMAMAMAMMMMXXMMSSMMXAMXXAXMASXSM
|
||||||
|
MASMMAMSAMMMMAMMXSAMXSMSAMXMMMAAMAMXMAMAMAAAAMSMXSASMXMAAAXSAMXAMAAMSAMSAMXSAMMASAMXSSMMMAMMXXMSMMXMSSMMXAMMXSAMMSAAAAMXAAMAXASXSMSMMSMAMAAX
|
||||||
|
MMMMMSMMAMXAAMMAAMMXAMMAAAXAXSSXMAMXMAMASMMMXMAAXSASAMSSMSASASXMMMSXMAMXXMMMMXMAMAXAMXAXXSAAASAAAXXXAAMAMAMAAXAMXSASMXSASXMSSMMAMASAMSMMMSXM
|
||||||
|
SAAMAMAMAMSSSXMMXSSMSSSSSMSSXAAMSXSXSASASAMAMSMSMMMMXAAXAXMSAMASXSMMXSMSMSXSSSMMXMMXSSSMAXMXSXMMAMXMSXMASMMMXSAMAXAXMASMMMMASAMXMAMAMXAXAMXA
|
||||||
|
SSSMASXMMXMAMXMMAMXAAAAMMAAXAASMSXAAXAMASMMAXAMAAMSAMMMMSMMMXSAMXMAAMXAMAAXMAAXAAMMXMAMMAMMXXAXMAXSAAXSXSXXAASAMAMSMMMXXMXMMSMMSMXSXMSXMXMMS
|
||||||
|
XAMMAMAMXMMSMMSMAXMMMSMMSMMXMAMAXXMSMSMMMXXMMSSSSMMXMAAAMAXXMMMSXMMMSMAMSMMMSMMSXXASMAMMASMMMAMSSMASMXSAXXMMMXXXMXMXXAMMSASMMMAXMXMXAMXSAMXA
|
||||||
|
MMXMXSAMMXAXAXMSMSXXAAAAAMSMMXMAMXXAAMASMSXSAAXXAAMAMSSSSSMSXAAXMSMXAMXMAMAMXAMASXXMMMSMMMAMMSMMAMMAXAMAMSXSSMSSMMMASAXASMXAAMXSXAMXMAMXASMS
|
||||||
|
AXMSMSXXAMXSMMMMXAMMMSMMMSAASAMMMSSMSSXMAAAMXSMXSSMAMMAMMAASXMMSAAXSXSSSSSSMMAMASXAXXASXSSMXAMAXAMXAMMMSMMASXAAXAASAMXMMXXSSMMSMMXSAMSMSMMMA
|
||||||
|
SMAAAMASXMMSMMXMMMMXAAXASMMMMASXAAAXAXAMSMMMAAAXXAMXXMAMSMMMAXSMMMMMSAAAAAXAXSMMSMMMSAMAXXXMSSMSSSMMSAAXAMSMMMMXSMSASXXSXMMXAXMAAXXASMAAXASM
|
||||||
|
XMSMSMAMAAAMMSASAAAMSSSXSAMXSAMMMSSMMSMMAMAXSXSXSAMAXSAMXMMSSMXAAXASMMMMMSMMXMAXMASASAMSMMSAMXXMXAAASMSSMMASAAXAXASAMAMMASMXSMSMMSSMMMSMSMSX
|
||||||
|
MXXMAXASMMSSXMASMMMAMXMAMXMAMAMXAAXMMAAXMSAXMSMASMMSASAXSMAAXAMXMSXXSMXSAAMMAMAMXMMXSAMXMAXMASMSMMMMSMXAMAMXSMSXMAMXMXASMMSAAAMXAXXASAMXAASA
|
||||||
|
MMSXMMMXMAAXMMXMMMSSMMMAMSMSMSMMSSSSSSMMXSXSMAMAMXAXASMMSMMSSSMSMAXMXSAMXSASASXSSXMASMMSXMMSMMAMXSAXXMXMAXXMAXSAMAMMAMXXSAMXMMMMMSSMMAXSMMMS
|
||||||
|
MASMSASXMMMSSMAAAAMAAXSSMSAAAAXXAAMAAAMSXMASMXMASMMMMMAAMAMMXXMASMAMAMMSMXAMAMAAXXSASAXMASMASMMMASXXAXMSMSSSMAXMXSMSAXMAMXMSMSXXMAMASXMASAAX
|
||||||
|
MXXAXAXMXAAMASXXMSSSMMMMAXSMSMSAMXMMMMMSAMAMAMAMXXAASAMXXAMMSSSMSXAMAMXAAMXMSMMMMXMAMXMSXASAMXSMAMMSSMXAAMAAXAXSAMXSASMSMAXAAMSAXASMMASAMMSM
|
||||||
|
MAMSMSMSXMXSAMXASMMMAMAMMMMXXXAMXAMAMAXSAMASAMSSSSSSSMAMSMSAAAAAMXMSASXMSMSAXXXXMAMXXSMXSXMMSMSMSXMAMASMSMSMMSAMXSXMAMAMSSXMXMXXMAXXXAMASAXM
|
||||||
|
MASAAMAAXSAMXSSXMASMMMAMXAMAXMMMSMXAMSXSAMAXAMXAAAXMXMAXAMXMMMMMMSXXMAXMMMSASXSMSMMMMSAMAXMAAAXAAMMMXMXXAMXMAXXMASAMMMXMAXXMSSMMASXMMSSXMASX
|
||||||
|
MXSMMMMMXMASAXAMSAMAASMMSASXSAXAAAMSXMASMMSMSSMMMMMMXSSSXSMMSSMXXSAMXMSMAAMAMAXAAMSSMXAMMSASMSMSMAASMSMMSSSMMSAMXXAMXSSMAMXSASAMXXAXAAMAMAXA
|
||||||
|
XMXMAXXAXSAMMXSAMAMXMMAAXAAASMMSXSXXAMAMXXMAAAMSAMASMAXAMMMXAAMSAXSAMXSMMSSSMMMSMAAAMSMMXMAXAXAXMSMMAAAXMAXAXSXXAMSMMAAMMMXXAXMMAMSMMMSAMASM
|
||||||
|
MAASXXMMXMAXSXMXMASMMMMMMXMAMMAXXMAMSMXMAAMMMSXMASAXMMMMMAAMSSMSAXXXMXMAXAAMXAAMXMMSMAAASMMMSMAMAXAMSSSMMMMSMMMSMMXAMSXMASMMSMAMXSXXXXSXXAXX
|
||||||
|
AMXMSXAMMMSMXMSMSASAXAXXMMMMSMMSSMAMMMMSMSXAAMMSMMXSAAASXXXXAAXMMMSMMASAMMSMMMMXAMAMXMXMMAAAMMXMAMXMXAMXMXMAAAAXXASXMAMSXSAAAMAMXAXXSAMXMXSM
|
||||||
|
XXAAMSSMAAMXAAAAMXSMMSAMXAAXAAASASXMAAMAAAXMMSAXAAAXXMSSMAXMSSMSAMXASMSMSMMMSMMMSMAXAXSASXMSSXSMMSXSXMSAMSSSSMMXMXSAXXAMAMMSSSMMSMSMSXSASAAX
|
||||||
|
MSMSMAMXMSSSXSMSSMMXMMXMSSSSMSMSAMXSSXSMSMMXAMXSMMSXXXAXMSMMXMASMSSXMAXMAMAAAAMAXMMMAXMAMAAAMXMAXXMMAXSASMMMXMXSAAXMMMSMAMXAXAMMAAAASAAASXSM
|
||||||
|
XAAXMMSXMAXXAXMAMAMMMXMXAXMXAMXMAMXAMXSXXXSAMXMXMAMMAMMMXAMMAMAMXXXASXMSMSMXSXMXSAXMSMMASMMMSMSSMMMSXMSSMASMMAAMMSMMSAAMSSMASMMSMSMSMSMAMAXX
|
||||||
|
MMMMAAMMXSMMSMMASAMAAASMMSSMXMMMAMXAXXSASAMXMASASASAAMAAXMMSASMXSAMMMAAXMAMXMXSXMAMSAMSAXAXMAXAMSAMMAMXXSAMAMMXSAXXAMXXSAMAAMXAXAMMXXXXAMMMS
|
||||||
|
MASMMMMXAXMAMASASXSMSXSAMAMXMMMSSMSMMXMAMMMSSMSAMXSXMMXSSXASXSMMMMSSSMMXXAMASAMXMAMMAXMXSSMMSMMSMSXMAMMMMXSXMAMMMXMSXSXMMSSMMXSSXMASMSMMMXAX
|
||||||
|
MAXAMXSMAXMAMMAMXASAMXSXMAMSXSAAAMAAXAMXMXAAAMMXMMMAMSAMXMMMAXAXSAMMAXAMSSXSAMXASXSMXMXAXAAAAAXXAAMASXMAMXSXMASAMSAXASXAXAXAXXMXMMXMASASMMMS
|
||||||
|
MSSMMAMMMMSSSMASMMMAMXXASMMSAMMXSASMMMSSSMMSSMAXMASAMMXMXMMSMSMMMASXSMXXAMXXAMXXSASAASMSSSMMSMMMMMSAMASASMXASXXAXSAMAMSSMMSXMSSSMMAMSMAMAAXX
|
||||||
|
XAAXMASASMMAAXSMMSMSMMSMMSAMXMAMAAAAAASMXMMMAMASMMMMSAMXMAAAXAAXSAMAXAXMMMAMAMMSMAMSMMAXAXXMAMMAMXMASXSAAASAMMMSMMAMMMMXXXMASAAAXMASMMASXMMM
|
||||||
|
ASMMSXSXMAMSMMMAMXSAAMASMMMSXXAMMMMSMMSAASASXMASMASAXMASMMSXSXSMMXMSMSMMXMMSMMMXMAMXXMSMXMASMMXSMMSAMMMMMMMAMAXXASXMSAMXMMMXMMSMMMXXAXAXAMXM
|
||||||
|
MXXAXXMASMMXSASAMXSSXSASXAXMASXSXMMXXSMMMSASAMAMXAMXSSXXAAXASAMXSAMAXAASMXXAMAMASMSMSXXAMAMAAMAXAMSAMXAMXMSSMMSSMMMMSASMSASXSAMAMSMMSMSSMMAM
|
||||||
|
MSSMMXSASAASMMSSMAMAXMAXMMSXXMXAAMAAMXXAXMAMXMSSMXSAMXMSMMMAMAMXSASMSSSMAMSASASMXMAASAMSASXSAMAMAMMASMASMXAXAAXASAAXSAMXMMAMMXXAMASAXAMXXSAS
|
||||||
|
XAAAAAMXSMMSSXXMMXSXMASMSXMASMMSSMMSSMSSSSXSAXXMXAMXXAMASAMXMAMMSAMXMMAMSXXASAMXSMMMMAMXSMAXAMMSMMSAMMXMAMXSMSSMMSAMMMSXSAASXMSSMMMXSAMAASAS
|
||||||
|
MSSMMSSMXXAMAXMXXAXAMXXAXASMAAXAMMXAAAMAXAASMMSMXMMSSMSASMMMSMSAMMSXMSAMXMMXMXMXAAXAMXMXXXAMASAAAMMASXMMSAMXXAAAXMXSXAXMASXSXAMAAXXAXAMXMMAM
|
||||||
|
AXAXMXAXSMSSMSMMMMSMMMXXSAMSMMMSSSSSMMMMMMMMXAAXXAAAAAMXMAMAAMMXMAMAXXMXAMAXMASXSMMSSMMXSMSSXMXSMMMAMAAAMXXXASXMMMAMMSMMAMMMASMAMMMMSSMMXSAS
|
||||||
|
SMSMSXMMMAMXXSAMAAAXAMSAMXAXXMAMXMAAMXAXXSAMMSSMSMMSMMMXSAMMXSAMXAXMMSMSAMXAXXMAMAAMAAAXXAXMASAMMSMMSMMSSSMMMMSAAMAMAMAMASASAMXXMAXAAAAAXSAM
|
||||||
|
XAXASASAMSMMMSAMSSXSAMASXMAXXMAXSMSMMSMSXSASAMAMXXXAXAXXMAXMAMASXMSAAAXMMMXSMXMAMMMSSSMXMSMMMMXSAAAXXXXAAAXSAAMMSMMXXXAMAXAMXXMXSXXMSXMMXMAM
|
||||||
|
MAMAMSMXSAAAASAMAMAMMSMXXXMASMXSAAAXXMASXXXMMSXMSMMXSSSSSSSMMSXMAAAMMMSSSSMAAASASAXXAAXAXXMASMMMXSSMMMMMSMMSMXSXMMSAXXSMXMXXXAXAASXXAMMMASXM
|
||||||
|
MXMAMASXSXXMXSAMAMXMXAMMASMMSASAMSMSSSMXASXSAMXMASAMXAAAAAAMAMXSMMMSXXAAAASMSMSSSXSMMXSXMAXASXAXXMAMAXAXAAXXMASAMAMMSAXAMSAMMAMSAMXMMASMXMMM
|
||||||
|
MSSXSASXMAXSXSXMAMXXXAXSASAAMMMMMAXSAAMAMAAMAMXXAMMAMMMMMMMMAXXSAMAMXSXMSAMXXMXMMMXAMAMAMSMMSMSMAMSXMXSXXAMXXAMAMXAAMXMAAMASAXMMMSXASAMXAAAX
|
||||||
|
MXXXMAMAMAXSAMXSXXMXSSMMASMMXAMXSXMMSMMAXMSXMMSMSXSSXXAAXSASXSASXMXSAMXXMASMSMAXAAXMMAXAAAAXXAASMMAASAMASMXMMXSAMSMXSXMAMSAMMSSXMAXMMMSSSMMA
|
||||||
|
XMXMASMMMXMMAMXXAASXXXAMAMAMSMSMMAAMMXXXMXXAMXAAAASAMSMSSMAMAAMMXMMMXSMXSAMAXMASXSSSSSSMXSSMMSMAMMXAMAMMASAXXMXMAMXASASAXMASAXAMAMMXAMXAAASX
|
||||||
|
SAXASXAXMAASXMMMXMMAAXXMMXXMAXAAMXSMMSSSMASMMSMSMMMAMAMMMMAMAMXMAMSSXAAAMMMSMMAMAAAAAAAAAXAMAAMMXSAMSMMSAMMMSAMXSAMXMAMMXMMMXMXXAMXXMMSMSMMA
|
||||||
|
XXAXAMXMSSXMASAMASXMMMSAMSSMSSSXSAMAMXASMAMMASAXMASXMASMASASAXXSAAAMSMXMXSXMXMSSMMMMMMMMMXAASXSAAMAMXMAMAMAAMAMAMAAMMSMMASAAMSASXXSAXAXXAAXS
|
||||||
|
MMSSSMSXAXAMASASMMAMMXMAMAAAAAMXMXSAMMMMMSSMAMMMMXAXSAXMAMXSXMXAMMXXXMAXXAASXXXAMXMASXMASMMMMASAMSSMMMAXSAMXSMMSXSMSAXAMAAMMSAASAASXMAXXXMXM
|
||||||
|
SXAAAAAMSSMMAXMMMSAMMXSMMSSMMMMXSXSXMAXMXMAMMSMXMAMXMAMMMMXSAMXXXMXMASXSMMMMMSSMMXMASASMMASMMAMAMAMAAXASAXXXMASMAMSMASXMXSXXXMMMMMMXMASMAMAS
|
||||||
|
AMMSMXMAMAXMXMSAMMXMMAMMMMAMXXSMMASMSSSMASXMAMXAXSXMSXSAXSAMAMASMMMXAMXMXAMAAAAXAAMMSXMXSMMMMSXXMAMSMSSMMMSMSXMMAMAMMXMXAMXMMXXSXAXMAAAMAMAS
|
||||||
|
MXXXMAXMMAMXSXMASMSMMASAXSAMXAMAMAMMAAAXAMMMASMMXXAMAASAMMASAMAXAAAMSSMMXSSMMSMMSASASXMXSAMAAMXSMMXAMXAAXAXAXMAMSSMMMAMMSSMAAXXMAMXSMXXMXMXS
|
||||||
|
XXSASXSSMSSXMXSAMXAASASXXAMXXMSSMMSMMMMMMXASAMMMAMMMMXMMMSAMAMSSMMMSAAAASMXXMAXAAMMMMAMAXAXMMSXMASXMSSSMMXMAMAXMAMAAMXSAMAASMMSMXAAXMAXMAAAX
|
||||||
|
MMSASAAAAAXMSAMASXXMMAXMXMSASXAXAAMASXXMASMMMSSMMSSMMSAAAMASXMAAMMSMMXMMSXAXSSMMMXAAMMMAXSMSASAMAMAAXMAMSAMXSMXMAXMMSAMXSXMAAASXAMASXAAAXMMS
|
||||||
|
MAMXMMSMMMSAMXSAMAMSSSXSAAAMAMXSAMXASXXMASAAAAMAAAAAAXXMXSAMMSXMMXAAXSAMXMAMMXMAXMSSSSMMMMAMASAMASMMMXSASXSAXMASMXSAMASXMMMMMMMAMSAAMMSXSAXX
|
||||||
|
MXSXSXAXAMAXXXMAXAAXAAAAMSMMMSXMAAMXSXXMASXMMSSMMSMMMSMMMMASASAXXSXSMAMSSMMXSAMMXMAAMMASAMXMMMXMMXXMASMMMXMMMSMSAXXAMSXMAAXAXXSMMMXSXAAAMAMX
|
||||||
|
AMAXMXMSSSMSMMMSXSSMMMMMXAASXMASMMSXMMMSAMAAXXXXXMAXMAMAAXMMASAMXMMXMXMAXMAMXASAXXMXMMASMSMSMMXSMSSSSXXAMMXSAMMMXMSAMXASMMSXMXSXSXMAAMMSMMXX
|
||||||
|
MMMXSAXMAAAAAAMMAMXMXXSXSSSMASMMMAMAAAMMMSXMAMMAMSMMSSSSSSMMAMMMAAAAMAMXSMMSSMMMSSXAXMAXXMAAXXAASAAXMAXAMSAMXSXMXAMXMSAMXASXSMMMMXXMXXAMASMA
|
||||||
|
XAAAXMMMMMSMSSSMSMASMASXXXAXAMXAMAXMXMMAMAAMXAAMXSAAAXMXMAMMAXAXXMMAMSXXSAAXAXAMXMASXSMMMMSMSMXSMMSMMMMMAMXSAMAMMMSAMXSMMXXMAAAAMXSXMAXSSMAX
|
||||||
|
SMMSMXAAXMAXXXXAMXAMMAMXASXMSMSSSSSXSXSMSSXMASXSXSMMSXSMSAMSMMSAMXXSAMXASAMXMSXSAMXMAXAASXMAXXMMXSAMXASAAXASASASAAMASAMXMMMAXSMSAAMASMXMXASX
|
||||||
|
XAXMASXSMAMMSMMXMMSMMASXMMSMMAAAAAMAXMMMAXXMXXASAMXXMAMAMSMXMAXXMAMXASAMXAXXXAMMAMAMXMSASAMMMSSSSSXMMASMSMMMMAAMMSMASXSAAAAMXAMXMXXMAMAMXSMX
|
||||||
|
MAMMMMAAMXAXAAXAXAMASMAXMASMMMMSMMMMSASMMSSMAMSMSMAXMAMXAMMAMAMXXSAMXMXMXMMAMMMSAMXXXMMMSMMMXMAMAMMSMXMAMAXAAMXXXXMAMAMXSXSXMMMMMSMSASAXSAMX
|
||||||
|
MMSXMMSMMSASMSSSMASXMAAXMASMAMXXAXAAMXMAXAAXXMMAMSMSSXMMSXSAMASMMMXMXMASXXSMMSASASMSMXAAXXASXMAMAXAAMAMXXMSSXXAASMMAAAXXXAMMAMXAXAAMAMAXSASM
|
||||||
|
XMAAXAMAMXMSXAAXMXMAAMMSMSMMAMSSMMMSSMSXMXSMXMMMMAXAMXXAAAXMSASAAAAMAMXSMAMMAMASAMXAMSAMASXSASXSMSSMASXMXMAXAMXMMXSXSASAMAMXXASMSMSMSMSMSAMA
|
||||||
|
XAMMMAXAMAAMMMMMSXSMMMAXXAMMSMMAAMAMAXMAMAXAMXAAMXMSSMMMXSXXMMSMSMMXASAMMMMMASMMMMSSXXAXXMASAMMXMAXXXMASXMAXXSAMSAMXMASMSAMASXXMAAAXMXXAMXMX
|
||||||
|
MMSSXMSMMSMMASXMXASMSMXSMXXAXMXSMMAXSMSAMMXXAMXXSSMAAXMAAXMSMASAMASMMMASXMAXMXAXXXAXMXMXXXXMASAAMSSSMSXMMMMXASAXXAXXMXMXSXSMMMASMSMXSAMXMMAM
|
||||||
|
XAAMAXAMAAASASAXMXMASAXAAMMSSMAMASXMXAMASAAXSSXXAMMSMMMMXSAMMASASASASXMMASMSSSMMMMXMXXMASXMSXAAXMXAAASMAMASMAMMMMAMXSXMXMASAASAMXAAAAASAMXAM
|
||||||
|
MMMSXMAMSMMMASAMSMMXMXMMSMAAAMASAMXASMMAMMSMMAMMAMAMAAXAAMAMXAXXMASMMAAMMMAAAAXAXMASMMMAMXAAXMASXMMMMMAXMAMMMMSMASXMAXMASXMMMMASMMXMSAAXXMMS
|
||||||
|
XMXMAMXMXXMMXMAMAASAMXSXMMSSSMAMAXMMMSMXMMAAMAMSAMASAMXMSXMMMSMMMAMMSSMMSMMMMMXSASMMAAMMSMMMSXXMXMXMMMSXMAXSAAAAMXAXMMXASASXXSAMXMMXXXMSMSMS
|
||||||
|
MXAMSMAXMAMXSSXMSSMAMAAAMAAMXMSSMMSMAXSXXXSMMSXSXSXAXMAXXAASAMAAMMAAXXMAMMXMAXXMAXXSSMSMAAMSXMAMMXMSAAAXSAAMMMXXXXMMXSMMMAAAMMXMAXMAXMXAAAAX
|
||||||
|
SSMSMMSASAMXMAMMXMMSSMMSMSMMSXMAMAMMMMMMSMAAXXAMXMAXAASASXMMSSSMSSMXSMMASXSMMMSMAMMXMASMMSSMAMAMAAASMSSMMMSXSASMSMXMASAMMSMMMSMXMAMXXAXMSMSM
|
||||||
|
XASAMXMAAASXMSSSSMMXAAXAAXXMXASAMXMAAAMAAMSMMMAMMMMSSSMAAXMXXMAAAMMMMXMSAMXAAAAMMXMAMMMAMMMMSMAMSSXXMAAMXAAAMAMAAXXSASAMAAAXSAAASXSAASXMMXAA
|
||||||
|
SMMMSAMMMMAAXMAXAASXSMMMMMAMMAMXSXSSSSSSSXXXASAMAXXAXXMXMSMSSMMMMXASAAXAAASXMSMMXAMMSXMAMMAAMXAMXXMAMSMMMSSXMAMMMMXMMMAMSMSXSMXMSASAMMAASMSS
|
||||||
|
AXAASASAAMSMMMMSSMMAXAAXASAMXSMASAMXAMAAMASMMSASXSMMXSAAXAMAMXSASAMXASMSAMXXXXXSSMMMAMSMSMMMSMSMSASXMXAMAMXAMMSAAAMSXSAMMXXAMXSAMMMASXMMMAAM
|
||||||
|
MMMMXXMXXMASAXXAMAMSMSASMXSMMXAXMASMMMMMMAMXMXXMMXASASMSXSMSXMMASAXXXMAMXSMXSAXMASAMAXAMMMMSXAAAXAMMAMAMSSSXMAXXMXAAXMASXMMAMSAXMASAMXASMMMX
|
||||||
|
XMSMSSSMMSASMSMMSSMAAMMMXMAXAMMMSSXMXAMXASXMMSXMXSXMASAMAXAMXSMMMMMSSSMSAMXMMMMSAMXMMXMXAAMXMMMSMMAXMSSMXAXMXMSAMMMSAAAMAXMAMXMXSXXAMXMXAXAS
|
||||||
|
XSAAXAAAAMMMMXAXAASMSMSAASXMMMAMXMASXXSAAMAAASAMAMXMXMASXMAMAXAAAXXAAAAMMMAMAMXMASAMSASXSSSMAMMXAMAXMAAXMMMSAMAMXXMAMMAMAMSMMXXMMMSMMMMSSMAM
|
||||||
|
MSMSMSMMMSSMSMSMSXMXXAMSMSXAASMSMSAMXAMXXMXMAXAMSSSMXMXMASAMXSXMSSMMXMMMMMMMAMASXMAXAAMAMAMMAMXMAMAXMMSMASAMASMSAMSAMSXMXXAXMSSMAAAMMXAAXMAM
|
||||||
|
AMAMAXXXAAAMAAAAXXMSMMMMMSMSMSAAXMASMSMAMSMMXSAMXMAMMSMMMMMSMMMAMMMSAAAXSASXXMAMMXSXMSMAMAMMXSSXSMSXXXMMMMASAMXMAMSAMAASXSXMAAAMXSSSXMMSXSSS
|
||||||
|
MMAMXMMMMMSMMMMMMMMXAMXAASMMAMMMMMSMXMAMMAXAMXXMASAMMASAMMAMAAAXXSAMMMMXMASAMMSMMAXAMMMXSXSMSMMAMAMXMASAMSXMXSAMAMSAMSMXAMAMMSSMMMMAXMAMASMM
|
||||||
|
XSMSSSMMSAMXXXSSMMSSSMSMMSAMSMXSAMXMXMAMSSMMMAMSAXAMSASMXSASMMSMXMXXASMMSAMAMAXAMASXMAMXMMAXMAMAMAMXAMMXMXAAMSASAMSXMMAMSSMMAAMMAAXMAMMSXMAS
|
||||||
|
AXAMXXAAMAMSSXMAAAAXAAAXAMAMMMMMAMAMMMMMXXAAMAMMXXAMMAMMASAXXMAMXSSSMSAAMXMXMAXAMXSAMASAMSMMMAMXSXMMSSMASXMMMSAMMXMAMMAMAAXMMSSSSSSXSAASASAM
|
||||||
|
MMMMMSMMXAMXXASXMMXMMMMMXSMMMAASASASMSASASMMSASXSAMSMSMMXSAMSSMSAMXAMSMMSMMSMSSMSAMXSMSXMAMASASXAAAAAAMMMMSAMMAMXAXMASASMMMMSXAAAXAAMMXXAMMS
|
||||||
|
MAAAAAMMMSSMSXMXXXSMSAXXAAAASMMSASAMASASXAXASASAMSMAAAAXAMAMXAAMMSSSMSAAXAXSAXAAAMMMMAMMSXSAAMAMMMMMMSAMSASASXMAMMMSXSASMMMXAXMMSSMXMSSMAXMX
|
||||||
|
SSMSSSXSAAAAXMSAMXAXAASMMSSMSMMMMMMMMMAMMMSXSAMXMAMMMMXMMSAMXMMMAMAAASMMSSMMAMMMMXAMSMSASAMXXSAMXAMMMMASMASXMASMXSASMMAMAASMMXSAAAXSXAXMMMMM
|
||||||
|
MMAAXAAMMSMMMXSXAXMASMMMXAXXXXMAMAAMMMMMAXMAMMMXSSMSASAAMMASXMXMMSMMMMMAMAXMAXSSXMXXAAMXMXXSMMAMSASAAMSMMMMMMMMAAMAMXMSMSMSAXAMMXMMMMXXAMAAA
|
||||||
|
AMXMSMMMXAXAXAXXXAXAMAAXMASXMMSMSSSMXAMMSAMSMMMAMAASASMSMMMMAAXSMMXXAXMASMSSSSXXAMAMMSMSAMXMASAMXAXMMSXMAMXSASMMMMAMAAXAXMSAMXSAASMMAMSXSASX
|
||||||
|
XXAXAMXXSMMMMMSMSMMMSMMMMMMXMAAMMMAASAMAXXXAAAMXSMMMAMMMMASMMMMSAMASMXSASAAAXAMXAMAAMMMMAAAXMMAMMSMSMXMSMSAXAXSAMXXASAMXMASASAMMXMAMMXAAXAAM
|
||||||
|
MSMMMSXMXXMSAMAMAXMASXMAXAXXMSSSMMMMMAMMSMSSSMXASMSMXMAMSAXAAMAXAMMSMAMAMAMXMAASXSSSMAASXSMSXSSMAAAXMAMAAMMSMSAMXASXMXSASAMXMASMSSMMSMMMMXMA
|
||||||
|
MAXXAMMMAAXASXSSSMMASASMSMXSAAAAXSMXSXMXMAXMAMMASAAMXSAMMSSSMMSSXMXXMAMSMSMAAXAAAXMAXMMSXAMAMAXMSMMMMMMMMMXAXMAMXMMXMMXMASXMMXXAAMAXSAMXSAXM
|
||||||
|
SASMAMSMMSMXMMMAXXMAXMMAAASMMMSMMSMAXSMAMSMXAXMAMXAMAMXXAAMASAMAMSXSMMSAAAMMSSMMXMSAMMMMXXMASMMMMAAAXAXMASXMMSASAMXAXAMSAMSAXAMMMSSMSAMAXAMX
|
||||||
|
MASXMAAXAAMASMMAMXMSSMMMMMMAAMAXAMMMXMMASAMMAMMXSSSMXSAMMMSAMXMAMMAAASXMSMSMXMASMAMASMAMXXXAMMAAMMSMSXSAAXAAAXXXXMXAXSMSAAASMXSMAAAMSXMXSMSS
|
||||||
|
XMXAMSSSSMSASAMMXAAAAASMSMSMMSAMXSASASMMSAMSSMSSMAMMAXMXSXMXSAMMXMMMMMAMAAAMMXMSAMSAMMAMMSMSSSSXSAAXXAAMASMMMSSXSMSSXXASMXSXMAXMMSMMMMSXAAAX
|
||||||
|
MMMXMXAAMXMXXMSASMMMSMMAMAAXXMASXSASASAXMMMMAAXAMAMMMSMXSAMAXMASMMSAXXSMMSXMXSXXMAMXSSMSAAAXAAAMMMMSMXMMASAXMXMAMAAXAMAXAXXAMSMMXMXSAAXSMMMS
|
||||||
|
AXMASMMXMMSSMXXMAMXAAAMSMMMXXXAMXSXMAMMSAXSSMMMASXSXMSAAMAMXSXAAAASXSMXXXMAMSMSAMXAAXAMMXSMMMMXMASXSXMXSASMMSAMAMMMSXMSMMMXAMAAXAMASMSXMMAMA
|
||||||
|
XSMMXXMMMXAASAMXMMSSSMMAMXSAMSSXMSAMXMXMXMXXAMSXSAAAMXMASXMMMXAMMMMASMXMXMAMAAAMXSXMMXMAXMAASASMAXXXAXXMASMASAMXMAAMAMMAMASXMSMMXSAXMMAMXMXA
|
||||||
|
MSASMMXAXMSMMXMAXXAAMASXSAMAMAMMMSAMXSASAMXSXMMAMMMSXMXMAMAASASMXMMXMMAXASASMSMMAAAXXSMSSSMMSASMMXSSMMMMAMMMSAMSSMMSAMMXMMMAAAMAMMMXMSAMMSMX
|
||||||
|
ASAMXAXSSXMASMSSSMMSMAMAMMMAMASXAXXMASASASAXAMMXMSAMASXMAMXMAAXAAXSMMSSMXSASAMAMXSAMAAAMXXXAMAMAAAXXSASMAMXAMAMAAAASMSMSMSSMSMMMSAMAAXAMXAAM
|
||||||
|
XMAMMSMAAMSAMAAAAXXXMAMMMXSXSASMMSXSAMXMAMXMMMAAAMAXAMXMASMXMAMSXMSAMAAAMMXMMSAMAXAMXMXMASMMMSSMMMSASXSSXSAXSMMSSMMMXAMXAMAXMAMMSASXSMMSSMSX
|
||||||
|
MSAMAAMMMMMSSSMSMMMMSXSAMAAAMASAAAMMXSSSSXSXMAXMSSSMSSXMMSAASXMMMXSSMMMMSAAXAMMSMXXMAMXMMSAMXXAXAXMXMAXAMMMMXMMAMMXSSMSMMMMXMAMXMXMAAAXAAMAX
|
||||||
|
XSAMSXSAXSAAXAAXXSAAXASMSSSXMASMMSMXMAXAAAMASMSMAAMAMXMXMSMMXAAMXAMXSXAAXXMSMSMXMAMXASXMASMMMMMMMMMAMSMMMAMSAXMXXSAMMAXMXSXSXXXAXMMSSMMSSMAS
|
||||||
|
ASAMXXXASMMXSXMMASAMSAMXAMAXMASMAAASMMMMMMMAMAAMMMMAMMMSMMXXSSMAMMSAMSMSMMMXXAMAMAMSAMAMASXMAAXAXXXAXASMMAMMXXMXMMASMMXMASXSAXSMSAMAMAAXXMAS
|
||||||
|
MMXXXMSMMAAMMXXMAMAXMMMMSSMSMMSMMXAXAAAXAAMASXSMXSSSMSAXAXSAXASAAXMAXXMAMAMXSAXAXAMXAMXMASAMSXSAASMMSAMSMSMMSSXMASAMAXAMAXAMXMAAXAMXMSMMAMAS
|
||||||
|
XAXSMAAMMXMAAASMXSAMXSAMXAXSAMXMAXSSMSAMMXMMXAAAAAAXAMMSXMMMSAMMSAXMMXXAXMSAMMSSSSMSSMXSASMXAAMXMXAAMMMSMXAMXAASXMMSAAXMMSXSASMMMSXMAMASXMAS
|
||||||
|
MMSMASMXXAXMXMXAAXASASASXSMSAMAMMSMAXMASMSSSMSMMMSMMSMXXMAAAAXXAAAASASXSSMMASAAAAAAXMAXMASXMMMMAXMMMMXXMASXMMSMMAMMXMASMXAMMASMMMAASASAMXMAX
|
||||||
|
MXAXMAMXSMSAMXMMMSMMASAMXXAXAMXAMMXMMMMAAAAXMAMXXXXAAMXSAXASMSASMXMMASMMAMSAMXSMXMMMASXMAMMXAASXSXAXMXXMXMXSXAXSXMAAXMAMMXSMAMAAMMAMAMXMXMMM
|
||||||
|
SSSSXSXMAAAMAAMAXXAMAMMMMMAMSMSSSMASASASMMMMSMSSXAMSSSMMSXAAAXMAMAXMAMASAMXXMAXXXSSSMAMSXSAMSXMAMXMMSMASAXXXXMMMMSSSSMAMXSXMASMMSXAMXMAMAAAA
|
||||||
|
XAXMAMSAMXMSSXSAXXMMXSMMASAMAAAXAXMSASAXMSSMSXAMAMXMAMAAXMMMXMXXXMMMMAMXXMASMASXAMAAXMMMAMXXMAMXMMSAAAMSASXSMSAAAMAAXXASXMAMAAAXMMMMAMAMXXAS
|
||||||
|
MAMAASAMXSXAMAMXSMMAXAASASAXXMMXSMMMMMXMASAASMAXAMXXAMSMMAXAMSMSASMSMSXSAMXXMASXMMXMMXAMAXMXMAAXMAMMXSAMAMXSASMMSSMSMSMSAMAMSSMASXMSSSSSMSAA
|
||||||
|
MXASXSASAXMASMAMAAMMSSMMXSMMSASXAMSSSMSAXSMMMSASMXSMXXAASAMXSAAMAMAAAAXAMXSXMXSASXSSXSASAMXMSASMMSSMSXMMAMXMAMAXAAXMASAMXSMMAAAAAAAAXAAAAXAM
|
||||||
|
MXMMASAMXMAXAAAAXXMAAAMMMXMASAMSMMAAAAMSXMXXAMXXAASAMSSMMSMXMMSMSMXMMMSXMASMMAMAMAAXMMAMXAMXMSAAXMAMSAXSXSASASAMSSMSSXAXAAXMSMMMSMMMSMMMMXAX
|
||||||
|
XMMMMMMMAASAMSSSSMMMSXXXXXMXMAMMXMMSMMMMMMAMXSSMMMMAMMAMAAXXMXAXMASXXAAAMAMAMXMSMMMMXAAMXSAMXMXSMSSMSXMXMSMSAMMXXMAXMMMMMSSXXXMAXXXXAXMMSSMM
|
||||||
|
MAXSSXMSXSMMXMAAAXXXMMSMSMXXSAMXXMXMAXXAAMXSAAMMXXMSMMAMMSMMSMSMSMAMMMSXMSMSAMXXAXMSSMXSAMXMXSAMXMXAMMXAMMAMMMSXXMSMSMMAXAXAMXMMSMMXMMMAAAAX
|
||||||
|
ASMXSAAXMXMASMMSMMXMAXAAMSAXMXMASXMXMASMMSAMMSMMXSXXASMMXAXMAAAAAAAXAXMMMXAAMMMSMMSAMAMMXMAXAMMXXMMSMMSSSMAMAXXAXXAAXMASXXMSMXSAAAASMSMMSSSM
|
||||||
|
MXMMSMMSXSMAMSAXAMXMSSMMMXXSMAMAMAMSSMSAAMXMMMAMASMAMMAASAXMAXMSMSMSMXMAAMXMMAXAAXMAMSMAAMMMMSSMSMAAAXSAMXMMAMXMMSMSMMAXAMXAXAMSSSMMAAMAMAMA
|
||||||
|
ASAMXMASMMMSSMSSSSSMAAMSMMMAMAMAMAMMAXXMXMMMAXXMAMMAMAXMMASXSMAXAAAAASXSMSMSSXSMSXSXMAMSMSASAAAXXMSSSMMAMXXMMSAXMXXAAMXSAMXMMMMMXAMMXMMMMMMA
|
||||||
|
XSAMAMAXAXMMAAASAAAMSSMAAAAMSAXSXSMXMSMSAMSSMXAMXSMXMXSMXXMAMXAMSMSMSMAAXMAMXAXXMASMSXMAXMAMMSMSAMAAMASXMASXMSASXMMSSMMAMMAXAAAMSMMSMMMXASXS
|
||||||
|
ASAMXMAXSMMSMMMMMSMMMAXSSMMXMAXXAMSMXAMXASXAAASXAMASXMMAXMAMXAXAXMXXMMSMMMMMXXSSMMMXMXAMMMSMMAXSAMMSMXAMMAXMAMAMXAAAAAXXMSXMXXXXAMXAAXASXSAM
|
||||||
|
XSAMXMMMMAXSXSSXXAMAMXAMXAASMMSMAMASMASXMMXMMMXAMMAMAASMXXMMXSSSXMMXMAMXMSAMXXMAMSXMAMXAMMXASMXSAMXXMMMAMASXXMMMSMMSSSMMASXSASXMSAMMSMMXMMAM
|
||||||
|
MSAMMAMASXMXAAMXMSMMSMMSMSMSAAXMXMAMXAMXMAMXAXAMXMSSSMMMMSMMAMAMAAAAMXSAASASMXSAMMAMAASXSMSMMXMSXMXXAAXXSASMASMAMAMAMXAXAXAMASMAAMAMMXMAAMXM
|
||||||
|
ASMMAXSASAMMSMMSMASAAXXAAAASMMMSMMMSAMXAMASMMMMMXSAMXMAXAAAMXSMSXMSXXAMXMMXAAXAASAMXMXMAAASMSMMMAMASMMSXMAMMAMMAMMMSMMSMMSMMAMMSMXSXMASXMXAX
|
||||||
|
XXMASXMXSAMMAXAAXMASMSAMXMXMASXMAXAXAMSSXXXAMASAMXMXASMMSSSMAMXMMMAAMSAMXMSSSMMXMAMXSAMXMAMAXXASAMXXAAMAMAMMXSXMXSAMAAXMXSXAMXAXXAMMSMMAMSXM
|
||||||
|
AAXXAMMASXSSMMSSXSAAXMAXXXAAXMASAMSSSMAMMSSXMASAASXMXSAAAMAMSMAMAMMXMAAAXAAAXMXSSMMASASAMSMXMSXSMXSXMMMXMAMMMSAAXMASMMXSAMASXMASMXXMAMMAXMAM
|
||||||
|
SXMASAMASAMAAAAAAMSMSAMXSSMXSXXMAMMAMMXMAMAXMMSMMSAXMSMMMSXMAAMMSSXASXMMMMXSMMAAAAMMSAMXSXSAASAMMASMAAXXMXSAAXMMMMMMAMSMMSAMAMSXMAXSMXSMXMAA
|
||||||
|
XMAAAXMASMSSMMMMMMMXSAMXAXMASMSSSMMAMSMMSSMXXMXMXSAMAMXMASASMMXAAMXXMAAXXMAMAMXSSMMMMMMXMASMAMAMMASASMSMSASMSSXMASASAMAAAMASXMXAMSXMXXAMXSXM
|
||||||
|
MAMXXXSXSXMMXAMASXMASAMXMXSAXAMAAXMAMMMAMAXSMMMMMMSAMXAXMXXAXAMSSSSSSSMMAMAMSMMXMASAAAMAMXMMASAMMMSAXAXXMAMAAXMXMSASXSMMMSAMXSMMMXAMASASMMSM
|
||||||
|
ASMMSASAMMMMSXSASAXXXMAXXMMAMSMSMSSSMSMSXMMMAAXMAAAMMXMSMSMMMMMAAMAXAXMSASXSAMMASXMMSMSMSMXSASASXXMAMXMMMSMMMSSMMMXMAXXAXMASAXXXAMAMXSAMMAAX
|
||||||
|
MXAASAMAMAAXMXMASMMMSAMXMSSSMAMMAMAMASAMASMSSMSSMXMMSAAXAASAAMMMSMMMASXMASXAAXMASAXAMXAAMAXMMSAMXAMMMASAAXASAMXASXSMSMSMSSMMMMXMSSSMXMAMMSSX
|
||||||
|
XSMMMASMMSSXSAMXMAAMASXXMAAASXMMSMAMMMASAMXAASAXXXSASMMMSMSMSSXXAMXMXMASXMASMMMASXMASXMMMXSAAMAMSMAAAASMXSAMSSSMMASAAAAMMAXMAMXAXAAMAMAMXAXX
|
||||||
|
AXXXSXMAXXMXSSSMSSMSXMSSMMSMMMXXXAMXSMXMXMMSSMSMSAMXSAMXXXXMMMMAMXXXSSXMXSAMXXMXMXAXXMASXMSMMSMMSXSAMMSXMMMSXMAXMAMXMSMXSAMSXSXSMSMMXSASMASX
|
||||||
134
2024/gareth/day05/day05.go
Normal file
134
2024/gareth/day05/day05.go
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
package day05
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Rule struct {
|
||||||
|
X, Y int
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) ([]Rule, [][]int) {
|
||||||
|
sections := strings.Split(input, "\n\n")
|
||||||
|
|
||||||
|
ruleLines := strings.Split(strings.TrimSpace(sections[0]), "\n")
|
||||||
|
var rules []Rule
|
||||||
|
for _, ruleLine := range ruleLines {
|
||||||
|
parts := strings.Split(ruleLine, "|")
|
||||||
|
x, _ := strconv.Atoi(parts[0])
|
||||||
|
y, _ := strconv.Atoi(parts[1])
|
||||||
|
rules = append(rules, Rule{X: x, Y: y})
|
||||||
|
}
|
||||||
|
|
||||||
|
updateLines := strings.Split(strings.TrimSpace(sections[1]), "\n")
|
||||||
|
var updates [][]int
|
||||||
|
for _, updateLine := range updateLines {
|
||||||
|
parts := strings.Split(updateLine, ",")
|
||||||
|
var update []int
|
||||||
|
for _, part := range parts {
|
||||||
|
page, _ := strconv.Atoi(part)
|
||||||
|
update = append(update, page)
|
||||||
|
}
|
||||||
|
updates = append(updates, update)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rules, updates
|
||||||
|
}
|
||||||
|
|
||||||
|
func ValidateUpdate(update []int, rules []Rule) bool {
|
||||||
|
indexMap := make(map[int]int)
|
||||||
|
for i, page := range update {
|
||||||
|
indexMap[page] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rule := range rules {
|
||||||
|
pageX, indexX := indexMap[rule.X]
|
||||||
|
pageY, indexY := indexMap[rule.Y]
|
||||||
|
if indexX && indexY && pageX > pageY {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindMiddle(update []int) int {
|
||||||
|
n := len(update)
|
||||||
|
return update[n/2]
|
||||||
|
}
|
||||||
|
|
||||||
|
func SortUpdate(update []int, rules []Rule) []int {
|
||||||
|
depen := make(map[int][]int)
|
||||||
|
for _, rule := range rules {
|
||||||
|
depen[rule.Y] = append(depen[rule.Y], rule.X)
|
||||||
|
}
|
||||||
|
|
||||||
|
visited := make(map[int]bool)
|
||||||
|
var sorted []int
|
||||||
|
|
||||||
|
for _, page := range update {
|
||||||
|
if !visited[page] {
|
||||||
|
sorted = Visit(page, depen, visited, update, sorted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
|
||||||
|
func Visit(page int, depen map[int][]int, visited map[int]bool, update []int, sorted []int) []int {
|
||||||
|
if visited[page] {
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
visited[page] = true
|
||||||
|
|
||||||
|
for _, d := range depen[page] {
|
||||||
|
if contains(update, d) {
|
||||||
|
sorted = Visit(d, depen, visited, update, sorted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sorted = append(sorted, page)
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
|
||||||
|
func contains(slice []int, element int) bool {
|
||||||
|
for _, item := range slice {
|
||||||
|
if item == element {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
rules, updates := ParseInput(input)
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for _, update := range updates {
|
||||||
|
if ValidateUpdate(update, rules) {
|
||||||
|
total += FindMiddle(update)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
rules, updates := ParseInput(input)
|
||||||
|
var invalidUpdates [][]int
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for _, update := range updates {
|
||||||
|
if !ValidateUpdate(update, rules) {
|
||||||
|
invalidUpdates = append(invalidUpdates, update)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, update := range invalidUpdates {
|
||||||
|
sortedUpdate := SortUpdate(update, rules)
|
||||||
|
total += FindMiddle(sortedUpdate)
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
71
2024/gareth/day05/day05_test.go
Normal file
71
2024/gareth/day05/day05_test.go
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package day05
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`47|53
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|47
|
||||||
|
75|29
|
||||||
|
61|13
|
||||||
|
75|53
|
||||||
|
29|13
|
||||||
|
97|29
|
||||||
|
53|29
|
||||||
|
61|53
|
||||||
|
97|53
|
||||||
|
61|29
|
||||||
|
47|13
|
||||||
|
75|47
|
||||||
|
97|75
|
||||||
|
47|61
|
||||||
|
75|61
|
||||||
|
47|29
|
||||||
|
75|13
|
||||||
|
53|13
|
||||||
|
|
||||||
|
75,47,61,53,29
|
||||||
|
97,61,53,29,13
|
||||||
|
75,29,13
|
||||||
|
75,97,47,61,53
|
||||||
|
61,13,29
|
||||||
|
97,13,75,29,47`)
|
||||||
|
assert.Equal(t, 143, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`47|53
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|47
|
||||||
|
75|29
|
||||||
|
61|13
|
||||||
|
75|53
|
||||||
|
29|13
|
||||||
|
97|29
|
||||||
|
53|29
|
||||||
|
61|53
|
||||||
|
97|53
|
||||||
|
61|29
|
||||||
|
47|13
|
||||||
|
75|47
|
||||||
|
97|75
|
||||||
|
47|61
|
||||||
|
75|61
|
||||||
|
47|29
|
||||||
|
75|13
|
||||||
|
53|13
|
||||||
|
|
||||||
|
75,47,61,53,29
|
||||||
|
97,61,53,29,13
|
||||||
|
75,29,13
|
||||||
|
75,97,47,61,53
|
||||||
|
61,13,29
|
||||||
|
97,13,75,29,47`)
|
||||||
|
assert.Equal(t, 123, r)
|
||||||
|
}
|
||||||
1377
2024/gareth/day05/input.txt
Normal file
1377
2024/gareth/day05/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
142
2024/gareth/day06/day06.go
Normal file
142
2024/gareth/day06/day06.go
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
package day06
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Point struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
direction int
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
Up = 0
|
||||||
|
Right = 1
|
||||||
|
Down = 2
|
||||||
|
Left = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
var rows, cols int
|
||||||
|
|
||||||
|
var moves = []Point{
|
||||||
|
{-1, 0, Up},
|
||||||
|
{0, 1, Up},
|
||||||
|
{1, 0, Up},
|
||||||
|
{0, -1, Up},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid, start, direction := ParseInput(input)
|
||||||
|
total := PredictPath(grid, start, direction)
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid, start, direction := ParseInput(input)
|
||||||
|
total := FindLoopingPositions(grid, start, direction)
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) ([][]rune, Point, int) {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
rows = len(lines)
|
||||||
|
cols = len(lines[0])
|
||||||
|
grid := make([][]rune, rows)
|
||||||
|
|
||||||
|
var start Point
|
||||||
|
var direction int
|
||||||
|
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
grid[i] = []rune(lines[i])
|
||||||
|
for j, char := range lines[i] {
|
||||||
|
if char == '^' {
|
||||||
|
start = Point{i, j, Up}
|
||||||
|
direction = Up
|
||||||
|
} else if char == '>' {
|
||||||
|
start = Point{i, j, Right}
|
||||||
|
direction = Right
|
||||||
|
} else if char == 'v' {
|
||||||
|
start = Point{i, j, Down}
|
||||||
|
direction = Down
|
||||||
|
} else if char == '<' {
|
||||||
|
start = Point{i, j, Left}
|
||||||
|
direction = Left
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid, start, direction
|
||||||
|
}
|
||||||
|
|
||||||
|
func PredictPath(grid [][]rune, start Point, direction int) int {
|
||||||
|
visited := make(map[Point]bool)
|
||||||
|
current := start
|
||||||
|
|
||||||
|
visited[current] = true
|
||||||
|
|
||||||
|
// do while
|
||||||
|
for {
|
||||||
|
next := Point{current.x + moves[direction].x, current.y + moves[direction].y, Up}
|
||||||
|
|
||||||
|
if next.x < 0 || next.x >= rows || next.y < 0 || next.y >= cols {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[next.x][next.y] == '#' {
|
||||||
|
direction = (direction + 1) % 4
|
||||||
|
} else {
|
||||||
|
current = next
|
||||||
|
visited[current] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(visited)
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindLoopingPositions(grid [][]rune, start Point, direction int) int {
|
||||||
|
possiblePositions := 0
|
||||||
|
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if grid[i][j] != '.' || (i == start.x && j == start.y) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
grid[i][j] = '#'
|
||||||
|
if IsLooping(grid, start, direction) {
|
||||||
|
possiblePositions++
|
||||||
|
}
|
||||||
|
grid[i][j] = '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return possiblePositions
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsLooping(grid [][]rune, start Point, direction int) bool {
|
||||||
|
visited := make(map[Point]int)
|
||||||
|
current := start
|
||||||
|
|
||||||
|
step := 0
|
||||||
|
for {
|
||||||
|
step++
|
||||||
|
next := Point{current.x + moves[direction].x, current.y + moves[direction].y, direction}
|
||||||
|
|
||||||
|
if next.x < 0 || next.x >= rows || next.y < 0 || next.y >= cols {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[next.x][next.y] == '#' {
|
||||||
|
direction = (direction + 1) % 4
|
||||||
|
} else {
|
||||||
|
current = next
|
||||||
|
|
||||||
|
if visitStep, ok := visited[current]; ok && step-visitStep > 4 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[current] = step
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
2024/gareth/day06/day06_test.go
Normal file
35
2024/gareth/day06/day06_test.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day06
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`....#.....
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
..#.......
|
||||||
|
.......#..
|
||||||
|
..........
|
||||||
|
.#..^.....
|
||||||
|
........#.
|
||||||
|
#.........
|
||||||
|
......#...`)
|
||||||
|
assert.Equal(t, 41, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`....#.....
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
..#.......
|
||||||
|
.......#..
|
||||||
|
..........
|
||||||
|
.#..^.....
|
||||||
|
........#.
|
||||||
|
#.........
|
||||||
|
......#...`)
|
||||||
|
assert.Equal(t, 6, r)
|
||||||
|
}
|
||||||
130
2024/gareth/day06/input.txt
Normal file
130
2024/gareth/day06/input.txt
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
#.............#.#...........................................................#..........#...........................#..........#...
|
||||||
|
............#......................#.......#..#.........#...................##....................................................
|
||||||
|
..............#...........#..#.......#.........#.#...........................#................................#......#............
|
||||||
|
.....#......................................#......#..#...................#....................#......................#...........
|
||||||
|
...#............................#................................#................................................................
|
||||||
|
..........#..................#.....#......................................................#.......................................
|
||||||
|
..#........#.......#.#...............................................................#......#.................................#...
|
||||||
|
.#....#................#................#.....#...................#...............................................#..#............
|
||||||
|
.......................................................................................#...#.#....#........##......#........#.#.##
|
||||||
|
............................................#.................#.....................#..........................#..................
|
||||||
|
....#..........##......................#.................................................................................#........
|
||||||
|
......#.............##.........#.......#.........#.......#.............#...#.......#..............................................
|
||||||
|
.#............................................................................#..........#....#...................................
|
||||||
|
...#..#....#..............................#...........................................................................#...........
|
||||||
|
.............#....................................................................................................................
|
||||||
|
................................#..................##...................................#...............................#......#..
|
||||||
|
..........#.........#.................#..........###...........................................#............#...#.................
|
||||||
|
.............#....................................#.......#.#.#............#............................................#.........
|
||||||
|
......#.#..............................................................................................#.........................#
|
||||||
|
...#...#.........#.........#..#......#................##.................#........................................................
|
||||||
|
.................................#......................#........#................#........................#......................
|
||||||
|
.......................##..............#................#................#..............................#.........................
|
||||||
|
.......#...#.....#.....##........................#..................##.....#......................................................
|
||||||
|
.............................................#...........................#..........................................#.....#.......
|
||||||
|
.........................#...............#....#..............#.......#...............#.#.................#.................#......
|
||||||
|
...........................................................#....#..................................#..............................
|
||||||
|
..........................#.................................................#............................##....#..................
|
||||||
|
.................#...#.........................................................#........................#.....#..#................
|
||||||
|
.........................#....#................................................#...#.....................#....#...........#.......
|
||||||
|
................................................##.......#.#....................................#.......##........................
|
||||||
|
..........##...#.......................#....#..#....................#........................#....................................
|
||||||
|
#......#.......................#............#.....................................................................#...............
|
||||||
|
.......#.......#...#..#..........#.......................................#.............#......#...................................
|
||||||
|
...............#............#..................#.................................................................................#
|
||||||
|
.......#...........#.......................##.....#.........#...........#...................#......#.........#.............##....#
|
||||||
|
...................#.........................#......#..........................................#..........#.........#......#......
|
||||||
|
.....#............#..............#...#......#....................#.............#..................................................
|
||||||
|
................................................#........#.....#...................#.....................................#.....#..
|
||||||
|
......................#.#...##......................##...............................................#.................#..........
|
||||||
|
#...................#.........................#...........#.....#................#.....................#...................#......
|
||||||
|
....#................#.....#.............#.....................................#....#...#.................................#.......
|
||||||
|
.........#.....................................................................................................#.#.......#........
|
||||||
|
.........#..........##..............................#............................#.#.............................#................
|
||||||
|
#....#.#..............................................##...#...#...............#.............#....................................
|
||||||
|
........#..#.#...................#.......................................................................#.............#..#.#...#.
|
||||||
|
.................................................................................................................#.......#........
|
||||||
|
............................................#..#...............##........#..........#.......................................#....#
|
||||||
|
........#...........................#............................#.....#........................#..........#...#..........#.......
|
||||||
|
.#...........#...................................................#...........................................#................#.#.
|
||||||
|
............#...............................#........#...........#..........#...........#.#..............#........................
|
||||||
|
...............................................................................##.#................#..............................
|
||||||
|
.#.......................#.#...........#..................................#.......................................................
|
||||||
|
..#..............................................##................#.......#....#..............#.....................#...#........
|
||||||
|
...................#.....#................................................#..........#.........#.........#.....................#..
|
||||||
|
........#................#................................................................................#......#................
|
||||||
|
...................#...#....#.........................#.........................#....................#..........................#.
|
||||||
|
.................#.......................................................#................................................#.......
|
||||||
|
..#...........................##.#.............#..#............................................#.......................#.#........
|
||||||
|
..#......#.........................................................................#.......................#......................
|
||||||
|
...........................................................................................................#............#......#..
|
||||||
|
............................................................^..........................................#..........#...............
|
||||||
|
..#.........#....................#..........................................#........#.........................................#..
|
||||||
|
........#...............#....#.............#......#.........................................................................#.....
|
||||||
|
.........#......#.....#..............#...........................................................#..............#.................
|
||||||
|
.........#...................................................#...###...........#.......#.##.......................................
|
||||||
|
.....................##.................#.........##.....................#................#................#.........#............
|
||||||
|
.......................................................................#..............#..............#.................#..........
|
||||||
|
.##.........#..........................................................................#....................................#.....
|
||||||
|
.........................#.............................#........................................................................#.
|
||||||
|
........#.............................................#......#....#.....................................#....................#....
|
||||||
|
........#...#..............................................................................#.........#............................
|
||||||
|
..............................#................................#..........#..............#..................................#.....
|
||||||
|
........##..#...................................#................................#.................#.........#......#..#........#.
|
||||||
|
..................#......#...................................................................#....................................
|
||||||
|
..........#.............#..............#........#............#...............#..#..........#..............#.#...#............#....
|
||||||
|
............................##....#..............#......................................................................#.........
|
||||||
|
...............................................#.....#...........#.....##...............#..#......................................
|
||||||
|
.........................#.......#...............................#...........#.........#...........#....#.........................
|
||||||
|
.#............#...#...............#..............................................................#..........................#....#
|
||||||
|
#...........#......................................................#.............................#......#.........................
|
||||||
|
..................................................#....#...............#.........................#................................
|
||||||
|
................................................#..........................#.......#..............................#....##.......#.
|
||||||
|
........#......#..#............#................#............................#......#.##.........#....................#..#........
|
||||||
|
.......................................................#..#.#....................#..#......................................#......
|
||||||
|
.....................#.......................................................................#............#.......................
|
||||||
|
.....................##........................#...................#.....................#........................................
|
||||||
|
..........................#...........................................................................................#...........
|
||||||
|
..#..........#...................#..............##..#.....................#...................#..............#...........#........
|
||||||
|
#................................#....##......#.............#..............#.......................#.........#...........#........
|
||||||
|
..................#................#...............................#.....#..........#................#..............#.............
|
||||||
|
................#.#.........#.....##...............................................................#..............#...............
|
||||||
|
..#...............................................................................................#...............................
|
||||||
|
..........#.................#...........#.......#.........................#...#.......#...........................................
|
||||||
|
..##....#......................................#.#.......................................#.................#......................
|
||||||
|
.......................#..#...#.##......................................................................#.........#...#...........
|
||||||
|
...............#.........#..............#.....................................................#...................#...............
|
||||||
|
......#.................#............#......#...................#..#.........................#........................#........#..
|
||||||
|
......................................................................#...........................#........#......................
|
||||||
|
..........#..........#........................#.............##....................................................................
|
||||||
|
....#................................................#.......................#................#...............#...................
|
||||||
|
.................#....................................................#......#....................................................
|
||||||
|
.#........#.......................................................................................................................
|
||||||
|
......##..................#....#......#.................#....................#.....................#..#...........#...............
|
||||||
|
#...#...#...#..............#........#.......................#.#..........#...............................#......#.................
|
||||||
|
#...#...................#.............#........#..........#...............................................................#...#...
|
||||||
|
..#................................#...#.........................#...................#......#.....................................
|
||||||
|
...#...###..........#............#...............................................................#..........#.....................
|
||||||
|
............#..............#.......#.....#..........#.....#.........................................................#............#
|
||||||
|
..#......................#..#...#................................#......#.......#.....#..................#.........#..............
|
||||||
|
....##......#.......................................................#..............................................#..............
|
||||||
|
...............................#.....#....#.................................................#.......#............#................
|
||||||
|
..........#....#......................#........#..........................#......#................................................
|
||||||
|
......#.............................#...........#..................#...........................#................................#.
|
||||||
|
...........................##..........................................#.....#.#.....................#................#...........
|
||||||
|
..#..............#.........................................................#........................#.........#.................#.
|
||||||
|
#.....#.....#......................#....................#........................................#...........#...........#......#.
|
||||||
|
.......................................#..#................................#.........#.......#..#.....#..........................#
|
||||||
|
..........#..............##...............#..........................................................#......#......#......#....#..
|
||||||
|
.............#..............#..#......#........#..#......##.......................#...........#.......#...........................
|
||||||
|
......................#.......................................#.......#..#.....................................#.........#...##...
|
||||||
|
...........................#...........................#......#....#.............................#.............................#..
|
||||||
|
..................#............................#....#........##.........................#..............#.............#............
|
||||||
|
.......#....................#.....#........#.......#.#...#...............#.....#.#.........................#.......#.#............
|
||||||
|
.....#.........#.......#..........#.................#..#...#..................................................##..................
|
||||||
|
................#........................................................#........................................................
|
||||||
|
....##......#........#..................#.........................#...................................#...#...................#...
|
||||||
|
..............#....................#.......#.......................#.............#......#..............#..........................
|
||||||
|
...........................#..............#.....#............#.....................#........#....#.......................#........
|
||||||
|
........#..##................#.....#.#..............#..............................#........................#.........#...........
|
||||||
|
.........................................................#...........................##..........#........#.##....................
|
||||||
90
2024/gareth/day07/day07.go
Normal file
90
2024/gareth/day07/day07.go
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
package day07
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
total := 0
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
|
||||||
|
for i := 0; i < len(lines); i++ {
|
||||||
|
target, numbers := parseLine(lines[i])
|
||||||
|
if validLinePart1(numbers, 1, numbers[0], target) {
|
||||||
|
total += target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
total := 0
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
|
||||||
|
for i := 0; i < len(lines); i++ {
|
||||||
|
target, numbers := parseLine(lines[i])
|
||||||
|
if validLinePart2(numbers, 1, numbers[0], target) {
|
||||||
|
total += target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseLine(line string) (int, []int) {
|
||||||
|
parts := strings.Split(line, ":")
|
||||||
|
target, _ := strconv.Atoi(strings.TrimSpace(parts[0]))
|
||||||
|
numberStrings := strings.Fields(parts[1])
|
||||||
|
|
||||||
|
numbers := make([]int, len(numberStrings))
|
||||||
|
for i := 0; i < len(numberStrings); i++ {
|
||||||
|
numbers[i], _ = strconv.Atoi(strings.TrimSpace(numberStrings[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
return target, numbers
|
||||||
|
}
|
||||||
|
|
||||||
|
func validLinePart1(numbers []int, index int, currentValue int, target int) bool {
|
||||||
|
if index == len(numbers) {
|
||||||
|
return currentValue == target
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := currentValue + numbers[index]
|
||||||
|
if validLinePart1(numbers, index+1, sum, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
product := currentValue * numbers[index]
|
||||||
|
if validLinePart1(numbers, index+1, product, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func validLinePart2(numbers []int, index int, currentValue int, target int) bool {
|
||||||
|
if index == len(numbers) {
|
||||||
|
return currentValue == target
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := currentValue + numbers[index]
|
||||||
|
if validLinePart2(numbers, index+1, sum, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
product := currentValue * numbers[index]
|
||||||
|
if validLinePart2(numbers, index+1, product, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Turns 12 || 34 into 1234
|
||||||
|
concatenated, _ := strconv.Atoi(strings.TrimSpace(fmt.Sprintf("%d%d", currentValue, numbers[index])))
|
||||||
|
if validLinePart2(numbers, index+1, concatenated, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
33
2024/gareth/day07/day07_test.go
Normal file
33
2024/gareth/day07/day07_test.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package day07
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`190: 10 19
|
||||||
|
3267: 81 40 27
|
||||||
|
83: 17 5
|
||||||
|
156: 15 6
|
||||||
|
7290: 6 8 6 15
|
||||||
|
161011: 16 10 13
|
||||||
|
192: 17 8 14
|
||||||
|
21037: 9 7 18 13
|
||||||
|
292: 11 6 16 20`)
|
||||||
|
assert.Equal(t, 3749, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`190: 10 19
|
||||||
|
3267: 81 40 27
|
||||||
|
83: 17 5
|
||||||
|
156: 15 6
|
||||||
|
7290: 6 8 6 15
|
||||||
|
161011: 16 10 13
|
||||||
|
192: 17 8 14
|
||||||
|
21037: 9 7 18 13
|
||||||
|
292: 11 6 16 20`)
|
||||||
|
assert.Equal(t, 11387, r)
|
||||||
|
}
|
||||||
850
2024/gareth/day07/input.txt
Normal file
850
2024/gareth/day07/input.txt
Normal file
@@ -0,0 +1,850 @@
|
|||||||
|
31084: 8 67 8 735 38
|
||||||
|
40541461584: 5 81 9 4 32 43 283 228
|
||||||
|
6208: 915 6 2 539 148 29
|
||||||
|
306501986: 6 3 630 45 536 64 6
|
||||||
|
21276000: 8 5 5 91 6 5 8 6 8 985 2 8
|
||||||
|
1432991: 3 403 4 821 591 2 236
|
||||||
|
17115994: 69 321 254 764 3 99
|
||||||
|
19961295: 5 311 84 6 63
|
||||||
|
22953531: 22 95 35 2 8
|
||||||
|
18894343830: 90 5 3 2 65 7 159 2 91 1
|
||||||
|
4312695565: 158 8 716 615 95 59
|
||||||
|
391: 1 326 64
|
||||||
|
25202: 8 5 62 1 401
|
||||||
|
5324514: 6 8 466 59 169
|
||||||
|
658234: 3 83 592 97 57 4
|
||||||
|
26804472776473: 7 61 1 447 29 496 71 9
|
||||||
|
1503368: 653 23 18 824 625
|
||||||
|
24803314445: 5 2 4 4 417 1 987 4 447
|
||||||
|
1021069871: 7 3 2 7 9 37 2 2 8 5 58
|
||||||
|
1614: 63 645 4 3 31 868
|
||||||
|
4258805: 68 532 78 91 5
|
||||||
|
4495130022: 583 78 275 37 77
|
||||||
|
45111648: 47 98 45 855 998 46 6
|
||||||
|
2964501691711: 9 672 76 9 754 7 4 65
|
||||||
|
90685578359: 906 855 782 33 126
|
||||||
|
13608006: 3 5 7 7 3 602 7 4 7 720 6
|
||||||
|
4645623: 66 863 5 615 8
|
||||||
|
2569495: 443 74 7 71 5
|
||||||
|
134484: 68 55 4 77 9 2 327 4
|
||||||
|
1143450000: 24 750 35 264 5 1
|
||||||
|
5449: 4 2 907 7
|
||||||
|
23061783: 854 9 5 6 1 1 7 3 2 76 5
|
||||||
|
2930: 18 6 7 555 5
|
||||||
|
2115475: 9 194 8 54 42 5 31
|
||||||
|
19449: 6 1 9 4 4 769 8 1 79 905
|
||||||
|
4595553: 298 3 4 257 5 3 345 45
|
||||||
|
208314087: 7 3 877 815 9 9 3 2 6 51
|
||||||
|
2905504: 46 58 514 626 763
|
||||||
|
963368: 48 425 484 6 370
|
||||||
|
9980664: 1 98 80 5 98 68
|
||||||
|
652568: 7 197 871 290 68
|
||||||
|
45827: 15 3 665 9 154
|
||||||
|
722: 2 21 337 5 357
|
||||||
|
27652464029930: 7 829 9 700 7 9 3 7 4 1 8
|
||||||
|
6868809: 45 2 9 848 9
|
||||||
|
1175: 7 5 98
|
||||||
|
2133: 17 2 5 36 5
|
||||||
|
528: 55 1 5 8 9 31
|
||||||
|
8206806: 1 4 9 4 99 6 24 97 2 5 6 5
|
||||||
|
37530658373: 1 2 8 5 8 4 5 7 3 946 373
|
||||||
|
65484738025: 47 5 4 43 8 6 43 7 7 26 5
|
||||||
|
2157: 8 2 1 93 8 568
|
||||||
|
23082508: 7 5 3 3 2 5 8 477 2 3 1 1
|
||||||
|
29090880: 45 28 37 8 78
|
||||||
|
1262763: 1 1 27 729 93 16 2 75
|
||||||
|
1409848204234: 7 87 622 84 820 42 34
|
||||||
|
3304: 6 55 4
|
||||||
|
1196013120: 8 340 179 35 192
|
||||||
|
124278235: 4 4 69 225 78 235
|
||||||
|
2735190615: 273 2 3 1 906 1 5
|
||||||
|
52192: 104 89 6 45 10 72
|
||||||
|
573777850: 680 31 807 8 50
|
||||||
|
35694425: 82 38 921 61 871 84 2
|
||||||
|
658877085778: 7 86 55 156 10 977 8
|
||||||
|
20860682976: 546 3 7 930 7 954 42 6
|
||||||
|
224616: 441 46 8 36 73 8 3 45 7
|
||||||
|
358087: 7 236 9 45 2 9 3 9 6 4 2 5
|
||||||
|
6354432: 55 792 7 153 639 7
|
||||||
|
1923524: 177 175 9 3 3 528 21
|
||||||
|
117340: 9 82 159
|
||||||
|
1234059: 64 357 9 45 6
|
||||||
|
2651349895: 8 526 4 7 9 1 6 42 9 89 5
|
||||||
|
3884759: 737 251 3 5 7
|
||||||
|
633925731: 346 4 3 5 472 9 7 9 4 8 9
|
||||||
|
43555: 37 4 60 25 53 77
|
||||||
|
4230519: 2 2 12 8 9 9 91 41 2 5 2 3
|
||||||
|
5489: 69 8 9 515 6
|
||||||
|
82630872: 33 1 2 19 81 9 4 5 6 6 33
|
||||||
|
203340489: 181 55 1 4 112 9
|
||||||
|
72068: 7 197 4 5 9
|
||||||
|
168389664: 1 683 84 5 667
|
||||||
|
30367442: 2 657 6 4 384 5 673 49
|
||||||
|
2846739576: 4 8 743 9 3 9 829 719 6
|
||||||
|
78401: 77 4 9 93 5
|
||||||
|
627886555182: 1 61 78 8 65 4 57 94 82
|
||||||
|
53361: 85 3 592 1 63
|
||||||
|
154268: 48 43 3 892 4 8 3 8 1
|
||||||
|
525075263: 656 34 4 8 6 6
|
||||||
|
248294606: 6 896 24 1 83 9 4 1 7 75
|
||||||
|
9082152: 182 66 9 8 6 7 7 2 195 2
|
||||||
|
1657909631: 8 5 76 7 5 95 2 9 22 544
|
||||||
|
484430: 2 5 64 7 49 961 83 3
|
||||||
|
11192683920: 6 26 7 8 5 8 6 3 8 372 1 1
|
||||||
|
52887178: 4 863 61 118 60
|
||||||
|
896861: 88 9 7 671 4 187
|
||||||
|
721710054179: 135 891 60 541 81
|
||||||
|
12403134: 92 6 34 58 6 5 7 9 6 6
|
||||||
|
33615296: 312 44 55 9 3 1 572
|
||||||
|
183192: 35 8 5 5 612 28 71 3 4 8
|
||||||
|
1244794661146: 6 4 9 6 1 6 4 57 7 685 8 6
|
||||||
|
362827266: 86 643 395 8 738 813
|
||||||
|
1477891785: 86 6 2 8 13 2 91 7 1 8 8
|
||||||
|
5983: 3 888 5 291 2 57 6
|
||||||
|
73739569: 668 6 687 89 6 69
|
||||||
|
902757501: 855 24 627 1 63 26 9
|
||||||
|
177442819: 6 9 401 2 4 52 256 4 3
|
||||||
|
87403263: 95 920 3 191 7 65
|
||||||
|
223398085: 57 3 1 8 11 50 45 8 9 85
|
||||||
|
76471: 81 472 2 1 6
|
||||||
|
102739: 1 284 1 8 9 1
|
||||||
|
98723250300: 79 119 1 1 2 143 5 7 21
|
||||||
|
37813543: 28 4 5 813 540
|
||||||
|
21449386021: 185 4 9 9 3 6 4 46 7 1 3 8
|
||||||
|
355140846: 39 4 6 90 845
|
||||||
|
25511824797: 3 7 4 746 48 55 3 15
|
||||||
|
11681963: 5 76 9 67 1 35 3 8 50 3 2
|
||||||
|
10812636790: 3 778 3 954 790
|
||||||
|
144: 90 14 40
|
||||||
|
2954988: 6 3 3 16 4 95 2 1 7 3 9 3
|
||||||
|
1666626: 282 573 74 39 1 46
|
||||||
|
380854191760: 2 7 24 5 54 177 5 5 664
|
||||||
|
20485976: 47 155 643 323 3 8
|
||||||
|
562264400: 8 1 3 1 5 74 3 67 309 88
|
||||||
|
5054: 67 3 55 599 604
|
||||||
|
5790: 8 6 4 3 7 43 1 9 8 4 17 6
|
||||||
|
1423: 232 6 23 2 6
|
||||||
|
2214885600: 1 5 2 1 3 50 183 41 82 3
|
||||||
|
586061: 507 69 31 975 3
|
||||||
|
68594249: 2 9 373 9 50 340 3 32 6
|
||||||
|
380980: 95 4 980
|
||||||
|
7510: 5 4 825 4 71 9
|
||||||
|
451918: 90 50 18 11 106
|
||||||
|
16294: 29 134 8 65 4 1 455 3
|
||||||
|
10536237: 6 6 3 9 1 1 4 724 4 5 1 97
|
||||||
|
24566372: 1 34 8 3 90 592 85 87
|
||||||
|
284990: 5 5 5 91 7 5 88 5
|
||||||
|
1108832032: 80 93 29 3 727 88
|
||||||
|
215422984: 63 82 417 8 70 1
|
||||||
|
37636247: 3 875 3 39 615 6 73 5 2
|
||||||
|
511718662: 3 505 3 718 23 42 9
|
||||||
|
172674894: 6 76 9 6 7 5 6 6 7 7 22 2
|
||||||
|
2494298: 21 8 468 606 6
|
||||||
|
1164891: 12 97 891
|
||||||
|
1303421387: 8 604 17 5 6 48 95 87
|
||||||
|
113169: 242 889 55 7 6
|
||||||
|
28083319654: 7 1 6 2 780 4 8 9 9 3 8 7
|
||||||
|
689769: 2 479 72 6
|
||||||
|
664006: 603 60 997 9
|
||||||
|
383810: 312 123 4 7
|
||||||
|
278838736: 254 851 15 86 76
|
||||||
|
35266920: 4 8 65 481 94
|
||||||
|
2342060: 5 55 2 43 99 710
|
||||||
|
61499384: 760 4 83 423 2 4
|
||||||
|
1337677: 769 562 5 67 3 9 13
|
||||||
|
20708670: 1 7 8 1 9 9 6 70 6 1 3 57
|
||||||
|
22607703347: 23 6 7 6 7 67 80 39 44
|
||||||
|
422584: 1 6 185 2 95 23 1 878
|
||||||
|
16961283369: 7 614 720 9 609 1 9
|
||||||
|
7743900: 12 80 8 38 33 75 525
|
||||||
|
5198: 5 14 5 5 3
|
||||||
|
7706: 5 765 6
|
||||||
|
60799047884: 9 6 5 331 7 2 2 6 3 3 5 87
|
||||||
|
373279812855: 74 65 5 946 16 571 5
|
||||||
|
273426612: 519 24 87 2 656 3 958
|
||||||
|
449: 250 94 8 9 88
|
||||||
|
69949442: 8 92 4 1 15 33 8 3 1 2 2
|
||||||
|
2540247614: 578 3 346 73 29 5 5 9 2
|
||||||
|
72710790952: 99 4 87 255 85 7 4
|
||||||
|
43727113667: 3 1 333 66 106 71 2 4 7
|
||||||
|
74125836117: 4 5 52 6 25 35 9 3 521
|
||||||
|
527906: 54 9 9 931 29
|
||||||
|
139782: 11 33 6 526 918
|
||||||
|
19218: 704 402 9 522 284 8
|
||||||
|
8668810: 40 8 6 3 6 2 84 2 2 75 7 3
|
||||||
|
1487663526: 9 9 517 70 2 6 2 5 94 8 4
|
||||||
|
20610: 1 152 3 2 45
|
||||||
|
359112: 323 5 47 54 7 6 3 8 4 2 4
|
||||||
|
3198: 1 7 8 8 24 7 1 4 41 7 27
|
||||||
|
41189: 13 9 3 624 5
|
||||||
|
4720776758223: 47 20 776 758 222
|
||||||
|
195264: 4 2 339 36 2
|
||||||
|
16012371600: 6 9 6 3 6 3 95 3 76 4 185
|
||||||
|
3864074: 3 4 426 84 73
|
||||||
|
45674415: 42 4 9 7 82 410 5
|
||||||
|
1175718380: 6 340 5 911 746
|
||||||
|
51156: 3 4 4 540 87
|
||||||
|
4831584: 2 43 8 2 55 5 7 5 69 96
|
||||||
|
874516400: 874 5 16 368 32
|
||||||
|
220190: 7 974 32 38 1 7 4 172 4
|
||||||
|
429894584: 1 9 5 7 5 98 94 9 6 9 58 4
|
||||||
|
114640: 3 7 31 52 7 6 1 772 299
|
||||||
|
10759: 23 1 6 12 7 2 1 4 81 28 7
|
||||||
|
360390945715: 2 431 696 27 213 20 5
|
||||||
|
3140056: 783 9 5 1 43 9 8 864
|
||||||
|
15606936: 96 6 40 639 172
|
||||||
|
1134226: 9 824 46 152 2
|
||||||
|
640: 5 32 2 2
|
||||||
|
46339061240: 7 20 9 987 5 715 618
|
||||||
|
35646030: 42 1 885 137 7
|
||||||
|
271367519: 7 45 964 127 96 893
|
||||||
|
495104: 1 960 8 56 64
|
||||||
|
3480: 7 1 12 3 1 40
|
||||||
|
2608290: 91 95 46 3 3 30
|
||||||
|
55890251: 1 65 7 9 4 81 454 3 582
|
||||||
|
541872: 774 7 46 2 27
|
||||||
|
309960637: 8 43 4 90 640
|
||||||
|
14270: 44 8 875 1 9 6 1 8 3 5 5
|
||||||
|
2461824: 1 4 1 9 7 12 61 71 1 4 1 8
|
||||||
|
53575: 6 73 9 7 118 3
|
||||||
|
3128658: 93 9 2 2 20 8 94 331 7
|
||||||
|
223592: 5 43 381 5 9 4 5 884 8
|
||||||
|
12112807054: 870 119 7 61 15 274 4
|
||||||
|
27775914: 6 1 781 1 9 18 4 3 5 889
|
||||||
|
279477744: 33 3 9 411 87 763
|
||||||
|
9896932013: 647 3 331 353 343 46
|
||||||
|
8127207475: 8 1 2 720 3 4 29 9 4 91 3
|
||||||
|
3683665: 981 751 5 5 8
|
||||||
|
7203976: 3 51 7 5 629 3 5 9 9 8 5 4
|
||||||
|
12182439609: 5 57 9 9 9 7 9 8 4 320 3 3
|
||||||
|
6547981: 9 727 2 47 84
|
||||||
|
269451007: 9 262 62 4 992
|
||||||
|
1760418: 99 34 1 5 99 96 4 27 6
|
||||||
|
4881246: 5 3 46 2 4 67 57 8
|
||||||
|
104401: 68 69 8 72 1
|
||||||
|
57612060: 6 270 53 61 11
|
||||||
|
65336211: 92 71 912 169 540 1
|
||||||
|
1056886344323: 8 990 3 9 1 6 18 695 64
|
||||||
|
431112: 3 19 108 92 69
|
||||||
|
1497953467: 1 640 5 8 6 9 38 65
|
||||||
|
20122455: 24 76 903 9
|
||||||
|
112719469: 32 80 7 13 6 456 4 6
|
||||||
|
1178483161: 18 8 6 29 75 754 4 3 4
|
||||||
|
119908723232: 48 39 7 5 3 73 8 64 30
|
||||||
|
21106565: 350 1 37 4 966 2 1 7 2 2
|
||||||
|
70193: 4 53 9 2 7 701 59 746 4
|
||||||
|
3034: 21 45 68 816 3
|
||||||
|
3005: 2 89 24 92 7 58
|
||||||
|
81430304: 124 4 989 2 83
|
||||||
|
22260548: 7 15 212 54 7
|
||||||
|
494808: 87 6 665 6 8
|
||||||
|
6723: 4 81 13 457 13
|
||||||
|
463069864051: 995 8 4 91 7 465 10
|
||||||
|
913887: 3 6 7 2 752 9 5 1 36 5 2 1
|
||||||
|
824408862: 82 43 9 86 8 94 6 5
|
||||||
|
3431928092169: 5 3 67 76 755 15 362 6
|
||||||
|
502132176: 9 109 624 964 702
|
||||||
|
83412526: 1 4 7 2 27 405 3 1 721 8
|
||||||
|
407094: 27 7 60 433 7 5
|
||||||
|
701412: 2 5 84 648 97 836 8
|
||||||
|
25707842242: 311 3 2 3 711 8 8 2 2 42
|
||||||
|
505119: 1 44 41 7 40
|
||||||
|
295936440: 9 27 963 89 272 4 38
|
||||||
|
59813: 595 97 657 457 984
|
||||||
|
297534: 348 61 1 1 2 7 296 46
|
||||||
|
143500: 618 32 8 31 19 1 82 7
|
||||||
|
138312966147: 5 29 5 3 2 2 7 50 4 8 96 2
|
||||||
|
311740: 5 76 5 37 1 1 597 3 20
|
||||||
|
4908292: 9 785 31 59 5
|
||||||
|
6141663: 204 7 25 3 5 1 7 2 9 6 2 2
|
||||||
|
746258: 1 3 61 6 48 21 4 11 81 5
|
||||||
|
310680: 6 7 59 782 9 45 8
|
||||||
|
170615594: 447 3 7 74 35 7 7 6 6 6 2
|
||||||
|
160656040: 75 78 105 603 7
|
||||||
|
5577322182: 47 49 942 2 24 5 7 1 2 7
|
||||||
|
48328: 3 7 4 7 9 149 9 456 7 3 7
|
||||||
|
155259452737: 56 746 874 2 8 342
|
||||||
|
35341: 5 76 93 1
|
||||||
|
22236341: 3 381 88 641 5 1
|
||||||
|
44989863673: 96 6 5 6 71 2 3 381 7 3 3
|
||||||
|
606: 4 80 50 4 70
|
||||||
|
12733: 65 9 2 86 5
|
||||||
|
22463298: 24 88 3 5 80 1 4 89 8
|
||||||
|
377019478: 6 748 5 1 3 4 1 9 7 2 3 8
|
||||||
|
19642752: 696 5 7 544 51
|
||||||
|
702511961: 887 792 1 7 961
|
||||||
|
6024648: 8 86 75 47 168
|
||||||
|
104509650: 5 1 482 62 72 597 7 70
|
||||||
|
1135227: 2 218 25 27 45 5 5
|
||||||
|
224: 2 4 6 2 86 100
|
||||||
|
173902: 99 277 462 89 4 99
|
||||||
|
823929: 9 9 8 5 929
|
||||||
|
25781529: 60 9 8 4 7 65 9 2 4 213 9
|
||||||
|
15984006: 38 6 5 9 727 7 6 4 96 1 5
|
||||||
|
911: 7 6 1 868 1
|
||||||
|
1319338035: 7 6 1 7 6 438 1 448 5 87
|
||||||
|
281978: 561 4 9 5 5 56 1 4 1 9 5 3
|
||||||
|
26739745316256: 3 772 8 21 75 45 5 75 5
|
||||||
|
804636: 50 6 26 542 927
|
||||||
|
4368: 9 87 1 8 42
|
||||||
|
1339970241787: 2 6 8 17 4 82 9 29 4 95 2
|
||||||
|
27896197888: 8 8 849 619 66 521
|
||||||
|
1624907806241: 9 270 3 9 649 18 9 44 1
|
||||||
|
804053256: 531 30 7 9 25 91 6
|
||||||
|
19887: 394 48 682 27 264
|
||||||
|
576579196: 34 7 5 75 6 8 1 5 5 5 91 9
|
||||||
|
4075638918: 886 5 23 97 1 5 4 7 48
|
||||||
|
1242184922: 7 4 5 7 88 9 393 4 925
|
||||||
|
816: 5 2 5 6 45 6
|
||||||
|
16640: 34 60 177
|
||||||
|
55047199922: 5 674 9 97 58 8 985 7 1
|
||||||
|
202: 1 57 3 8 1 4 28 2
|
||||||
|
128584480: 34 6 835 650 94 8
|
||||||
|
14447: 166 3 28 420 83
|
||||||
|
302594: 5 6 2 511 83
|
||||||
|
100153: 4 389 35 70 60 43 450
|
||||||
|
2185551: 38 3 43 19 3
|
||||||
|
6746: 4 6 583 93 784 39
|
||||||
|
3486469538: 8 47 3 40 786 7 9 1 19
|
||||||
|
2105210: 7 4 8 2 6 9 8 31 7 56 3 2
|
||||||
|
47524069: 6 4 610 811 106 4 85 8
|
||||||
|
24206: 25 599 13 2 19
|
||||||
|
83444222: 309 3 9 96 1 8 38 21
|
||||||
|
1157600: 383 930 42 92 800
|
||||||
|
135424: 274 494 29 6 33
|
||||||
|
41759168088: 63 4 91 3 77 2 33 9 94
|
||||||
|
912: 6 1 9 58 1 838
|
||||||
|
1483426560: 4 6 1 69 801 406 692 6
|
||||||
|
1291767304: 41 475 889 4 88 65 8
|
||||||
|
4740630: 941 32 56 2 87
|
||||||
|
145255683: 6 928 2 270 96 3 3
|
||||||
|
2804256: 2 563 36 41 6 91 8
|
||||||
|
3662: 592 6 91 11 8
|
||||||
|
2070609492: 9 460 7 1 66 352 9 8 5
|
||||||
|
58896: 73 2 5 17 5 15 8
|
||||||
|
161664199: 5 9 8 9 746 32 2 1 9 8
|
||||||
|
28767133: 6 69 10 43 37 96
|
||||||
|
321150750: 6 3 33 7 6 191 1 74 355
|
||||||
|
32221373185: 931 4 3 78 56 33 8
|
||||||
|
125188150: 1 84 8 299 7 6 3 623 38
|
||||||
|
529: 1 2 63 54 350
|
||||||
|
371329981: 53 730 8 78 760 4 57 1
|
||||||
|
8636010413: 34 6 1 516 8 4 4 82 1 1 1
|
||||||
|
16436: 8 8 36 7 70
|
||||||
|
2610384: 6 74 93 329 8 42
|
||||||
|
2511598: 21 497 80 7 10 12 5
|
||||||
|
2051303: 68 6 53 523 6 91
|
||||||
|
3583491: 58 3 3 8 852 79 4 5 5 46
|
||||||
|
2567: 5 3 32 4 3
|
||||||
|
37412197: 63 94 238 46 197
|
||||||
|
660996: 61 61 7 43 18
|
||||||
|
772595115: 1 7 2 25 4 2 314 72 5 8 6
|
||||||
|
1125072: 6 82 64 2 3 7 444 2 3 48
|
||||||
|
40030036: 9 68 7 66 646
|
||||||
|
26483808: 5 6 9 862 16 33 96
|
||||||
|
89503594: 2 91 80 112 72 61
|
||||||
|
34849136: 7 14 6 1 9 857 68 88
|
||||||
|
1052469452651: 5 94 9 5 5 5 9 870 8 8 3 8
|
||||||
|
2333026: 2 9 1 8 36 9 5 5 75 1 7 9
|
||||||
|
2142047: 55 2 6 1 60 3 9 40 6 5
|
||||||
|
18329059: 1 7 398 2 523 11 1
|
||||||
|
1515: 1 5 216 3 1 214
|
||||||
|
636751072: 65 7 58 3 967 7 759 9 4
|
||||||
|
65121: 3 648 21
|
||||||
|
1203384: 855 2 9 12 7
|
||||||
|
1231: 567 1 29 21 1 612
|
||||||
|
5830477499: 416 2 925 357 7
|
||||||
|
39904736: 2 2 987 58 51 2 1 8
|
||||||
|
7192: 4 881 3 11 8
|
||||||
|
984797352: 86 84 99 3 1 459
|
||||||
|
4330380: 444 3 8 3 797 7 6 9 1 5 6
|
||||||
|
174675: 8 41 206 75 824 530
|
||||||
|
644000: 2 4 89 4 17 7 92 14 1 4
|
||||||
|
275310: 6 11 31 58 888 4 2 9 2
|
||||||
|
2980025: 29 72 7 96 4 61
|
||||||
|
1100140: 3 8 9 91 3 9 466 5 6 8 3 9
|
||||||
|
26416153: 5 3 64 9 4 764 7 7 5 4 6 7
|
||||||
|
392307: 644 22 589 2 30
|
||||||
|
1703108: 23 789 9 532 7 8
|
||||||
|
84496967641: 9 8 7 71 696 158 605 9
|
||||||
|
4926: 5 47 3 5 2 6 60
|
||||||
|
1238: 7 20 5 8 75
|
||||||
|
4166368: 4 8 393 74 22 7
|
||||||
|
264286: 5 5 2 6 11 26 80 115 8 6
|
||||||
|
5390070: 38 5 77 813 35 3 54 8 6
|
||||||
|
7109213251: 798 2 5 88 89 50
|
||||||
|
11479038526: 245 1 5 7 333 456 3 7 9
|
||||||
|
35577532: 71 155 500 25 5
|
||||||
|
516: 7 4 6 4 1 70 9 66 1 5 39 2
|
||||||
|
12159: 9 6 1 225 9
|
||||||
|
593081: 1 92 6 4 343 2 6 8 3 41
|
||||||
|
52698: 89 592 7
|
||||||
|
36739952992513: 9 4 779 4 627 92 4 8 3 7
|
||||||
|
2006: 22 8 90 75 5 8
|
||||||
|
83601: 68 30 8 5 1 56 3 1 3 7
|
||||||
|
478266: 1 4 8 6 3 724 612 8 286
|
||||||
|
297000: 49 50 820 9 90 6 88
|
||||||
|
1229910807: 262 102 46 6 600 807
|
||||||
|
185356128: 44 5 401 7 82 115 48
|
||||||
|
246521: 787 6 4 6 307
|
||||||
|
86285202: 25 96 42 856 402
|
||||||
|
23586: 70 1 3 52 9 5
|
||||||
|
18086584: 46 6 144 8 27 534 7
|
||||||
|
33690: 4 69 4 56 89
|
||||||
|
46311716: 12 3 41 18 619 6
|
||||||
|
214023: 5 793 66 7 53 9
|
||||||
|
6755: 270 2 799 12 5
|
||||||
|
14223284: 9 9 7 5 7 8 2 111 1 45 4 8
|
||||||
|
2291081: 3 2 632 725 81
|
||||||
|
284789717303: 605 3 9 3 960 30 47 49
|
||||||
|
17262: 105 4 3 1 3 9 3 240 2 7 1
|
||||||
|
157051: 9 7 6 181 6 9 3 3 451 81
|
||||||
|
1349805670: 59 4 874 26 71
|
||||||
|
2361910101: 5 623 7 3 38 6 8 1 3 1 8 2
|
||||||
|
45459840: 8 42 71 1 3 8 4 9 8 9 384
|
||||||
|
644841302: 7 658 2 70 62 68 2
|
||||||
|
196349: 69 6 192 81 2 4
|
||||||
|
25233495: 14 6 1 3 34 83 14
|
||||||
|
2502364627: 9 73 7 1 76 4 7 95 8 5 27
|
||||||
|
891841251: 79 62 560 2 63 6 51
|
||||||
|
526: 95 9 4 1 417
|
||||||
|
46610701: 46 605 5 697 4
|
||||||
|
101160: 5 5 6 5 9 4 873 8 4 3 3 63
|
||||||
|
74700: 86 2 765 47 83
|
||||||
|
487499: 9 52 6 6 85 502
|
||||||
|
12930315: 4 77 3 9 48 9 1 5
|
||||||
|
818480: 3 4 8 966 10 3 7 1 4 5 4 1
|
||||||
|
8956575: 6 8 827 5 676 864 35
|
||||||
|
6467920693: 5 8 5 48 652 1 8 8 1 3 8 5
|
||||||
|
877: 71 10 689 32 75
|
||||||
|
53325209060: 554 965 941 2 53
|
||||||
|
23291024284082: 9 42 193 47 6 9 515 48
|
||||||
|
929424926: 3 6 29 42 492 5
|
||||||
|
17829266: 6 56 4 53 63
|
||||||
|
12276: 2 5 55 3 66
|
||||||
|
181712606: 595 74 75 412 6
|
||||||
|
8831966: 2 56 30 2 2 39 65 2 9 8 7
|
||||||
|
661454663997: 231 3 453 350 8 10 78
|
||||||
|
237094: 3 3 311 50 646 12
|
||||||
|
5707220457: 71 82 86 966 4 920 55
|
||||||
|
152255376595: 76 17 40 820 65 163
|
||||||
|
1347305: 9 4 8 65 664 3 4 3 701 9
|
||||||
|
70155: 91 2 88 257 706 58 1
|
||||||
|
60468016: 640 1 23 5 27 726 812
|
||||||
|
408075824: 40 74 6 758 22
|
||||||
|
149767280436: 1 221 860 788 436
|
||||||
|
1581985302: 83 9 258 3 8 38 72 3 6
|
||||||
|
157694208: 94 8 52 3 5 15 56 1 3 8
|
||||||
|
3814512: 5 6 4 8 8 5 6 5 5 37 9
|
||||||
|
4548610: 66 9 3 3 7 57 50 1 9
|
||||||
|
21119484: 38 822 28 29 876
|
||||||
|
5946398: 661 589 67 71 91 57
|
||||||
|
151648362: 894 75 5 9 93 54 317
|
||||||
|
10321152: 99 807 712 2 8
|
||||||
|
114489: 6 5 4 8 31 84 37 9
|
||||||
|
145909: 75 70 909
|
||||||
|
106820010: 722 269 10 2 55
|
||||||
|
1480075: 44 2 198 9 3 71 691 6 7
|
||||||
|
28827: 19 1 5 7 6 9 78 1 8 849 3
|
||||||
|
7566: 7 244 8 141 62 23 5 83
|
||||||
|
5508361: 495 4 214 13 1
|
||||||
|
4988516: 5 33 55 12 568 66 2 97
|
||||||
|
184373: 1 9 7 9 5 1 1 33 9 11 20
|
||||||
|
199283931852: 3 5 8 4 158 6 3 539 855
|
||||||
|
1666857472580: 77 654 23 180 331
|
||||||
|
14487733: 557 891 68 9 9 5 828
|
||||||
|
1198391800: 231 965 8 84 2 93 1 4 2
|
||||||
|
126143604: 86 2 6 463 88 55 5 3
|
||||||
|
153392452209: 6 482 7 3 939 11 5 4 9 7
|
||||||
|
12681: 5 7 2 9 4 7 44 2 5 65 4 9
|
||||||
|
989: 1 9 99
|
||||||
|
93840: 98 38 46 15
|
||||||
|
217780: 419 3 516 23 5
|
||||||
|
33264: 447 87 973 5 22
|
||||||
|
7178025: 995 9 5 2 87 7 527 20 5
|
||||||
|
9028: 3 83 7 5 3
|
||||||
|
12935: 711 5 6 3 47
|
||||||
|
3659499181: 365 925 6 229 9 5 181
|
||||||
|
701521: 9 4 3 64 7 61 8 26 67 53
|
||||||
|
340704429: 52 78 84 319 7 7 99
|
||||||
|
62241150: 7 176 842 8 77 6
|
||||||
|
112424: 5 1 8 936 82 8 183 92
|
||||||
|
723672: 347 67 1 2 874
|
||||||
|
3066: 51 5 8 8 8 898
|
||||||
|
1274880: 23 52 542 9 87
|
||||||
|
2517506958: 37 68 780 726 9 59
|
||||||
|
110283391: 3 52 3 53 8 3 8 6 3 903 1
|
||||||
|
4536: 83 5 81 9 747 2
|
||||||
|
87466: 19 46 6 3
|
||||||
|
605783111392: 404 91 601 37 741 4
|
||||||
|
58853775: 4 485 79 4 384 399
|
||||||
|
47889063: 516 64 89 984 999 29
|
||||||
|
23241016: 7 3 5 5 6 1 3 819 27 9 9 1
|
||||||
|
27260572330: 9 9 7 9 28 57 2 3 8 2 5 5
|
||||||
|
233756964: 61 958 6 5 1 5 26 8 314
|
||||||
|
781268: 376 6 743 4 692 1
|
||||||
|
69945120: 7 4 539 5 113 5 6 4 7 73
|
||||||
|
267715242: 92 8 663 9 4 3 632 3 1 2
|
||||||
|
1896465174: 976 920 1 4 651 72
|
||||||
|
2800123: 203 8 17 9 384 23
|
||||||
|
206464: 3 7 3 186 1
|
||||||
|
127766017: 74 12 9 35 714 1 24 1
|
||||||
|
24: 7 5 1 9 3
|
||||||
|
10510918116: 59 46 109 181 15
|
||||||
|
3621981: 2 248 954 2 1 3 9 78
|
||||||
|
7258534: 70 96 523 840 898
|
||||||
|
12932425: 928 6 43 57 8 54 1 3 9 7
|
||||||
|
40426441: 6 8 7 7 3 8 1 2 1 18 509 9
|
||||||
|
258400: 70 120 34 40
|
||||||
|
895: 81 303 38 2 51
|
||||||
|
80809920: 932 69 727 47 995
|
||||||
|
21779938: 9 411 92 64 226
|
||||||
|
1613: 4 401 4 7
|
||||||
|
43158803498: 36 222 9 7 26 39 6 9 9 1
|
||||||
|
4366703135: 57 7 93 7 2 70 982 8 6
|
||||||
|
167694750: 9 89 350 76 598
|
||||||
|
1913663802: 64 299 63 6 2 10 2
|
||||||
|
1444191: 556 9 11 4 6 5 1 41 83 7
|
||||||
|
1003880435: 19 82 746 977 863
|
||||||
|
4155: 72 810 13 4 575
|
||||||
|
96614034: 15 6 361 72 6 2 3 6 59
|
||||||
|
1688: 5 9 1 5 3 8 8
|
||||||
|
41338714328: 41 338 639 75 328
|
||||||
|
9197318140: 2 59 6 1 690 8 1 5 227 4
|
||||||
|
46479360: 61 7 4 2 9 7 39 272 6 5 8
|
||||||
|
404048233: 951 7 8 576 2 4 235
|
||||||
|
11494468882: 3 187 5 9 1 3 24 2 6 7 5 7
|
||||||
|
1922: 6 233 457 6 61
|
||||||
|
6955: 9 7 8 4 5 7 4 2 4 5 202 5
|
||||||
|
31285182: 23 136 506 7 63 52
|
||||||
|
8117862: 437 1 6 921 2 381 46 6
|
||||||
|
47589: 9 94 374 39 7
|
||||||
|
2256037: 60 376 39
|
||||||
|
2527024499: 4 3 1 7 8 10 3 1 6 51 91
|
||||||
|
37690: 3 720 52 6 1 88 1
|
||||||
|
4175256007: 4 8 5 39 20 2 34 2 23
|
||||||
|
380247474471: 2 4 2 45 497 88 5 7 2 7 1
|
||||||
|
21474: 9 9 9 1 17 4 784 8 4 39 9
|
||||||
|
3277745: 18 2 5 4 414 89 271
|
||||||
|
20611117618: 3 3 2 4 8 1 4 9 39 76 19
|
||||||
|
6706090709: 799 2 3 1 8 9 8 4 7 872
|
||||||
|
5792: 618 29 68 8 3 69
|
||||||
|
410827821: 4 927 73 453 16 409
|
||||||
|
233173828: 3 74 634 6 896 3 4 7 5 6
|
||||||
|
187959: 119 32 2 556 23
|
||||||
|
486043544: 3 230 57 52 54 74 62 7
|
||||||
|
2347696: 4 1 35 40 19 769 8
|
||||||
|
4278588041013: 44 7 29 4 7 456 7 4 684
|
||||||
|
5637600: 58 9 54 25 8
|
||||||
|
4977330: 9 7 6 79 3 9 8 838 3 4 7 6
|
||||||
|
22497: 82 79 983 1 1 3 9 102
|
||||||
|
35382699154: 77 617 2 14 2 46 554
|
||||||
|
16502056: 8 6 58 319 488 5 819
|
||||||
|
756793: 88 3 3 944 192 3 1 72
|
||||||
|
4214: 6 697 1 5 27
|
||||||
|
12450094: 2 2 2 6 3 629 9 857 5 9 4
|
||||||
|
1618088: 76 4 6 1 7 7 62 90 5 1 8
|
||||||
|
1060491: 3 361 14 906 66 1
|
||||||
|
266689086: 3 2 17 83 5 6 8 42 6 5 3 3
|
||||||
|
68560832: 3 1 82 6 8 5 3 308 2 1 2
|
||||||
|
1326: 423 846 4 1 8 44
|
||||||
|
68085: 674 6 78 7
|
||||||
|
1840707: 85 9 62 6 804 4 3
|
||||||
|
13403416: 2 1 3 5 4 65 7 8 7 3 933
|
||||||
|
2093: 56 6 868 26 614 9 8
|
||||||
|
12213922: 73 703 14 1 17
|
||||||
|
224283: 640 7 4 5 8 4
|
||||||
|
97770: 1 214 7 27 1 8 378
|
||||||
|
25990: 6 5 5 87 2 7 767 6 92 4
|
||||||
|
299184551: 325 2 92 544 7
|
||||||
|
63062194: 70 9 605 7 46 123 825
|
||||||
|
68322843482: 28 244 28 434 82
|
||||||
|
37380255: 80 1 935 87 493 4 5
|
||||||
|
305472677: 509 6 7 267 7
|
||||||
|
46: 1 45 2
|
||||||
|
2250: 29 1 75 6 69
|
||||||
|
191773: 19 176 5 8
|
||||||
|
91083792: 4 7 236 878 7 5 6 4 3 1 1
|
||||||
|
335524376: 8 53 51 68 668 158
|
||||||
|
29640281671: 7 8 4 6 3 5 7 44 7 8 8 90
|
||||||
|
497340: 9 3 762 7 3 6 3 5 6
|
||||||
|
279527: 402 67 149 4 1 3
|
||||||
|
279694: 1 935 96 765 97
|
||||||
|
224785469: 2 1 9 5 68 10 2 3 9 3 7 23
|
||||||
|
10732502: 15 5 477 5 60
|
||||||
|
7497250: 8 936 1 9 249
|
||||||
|
56971: 4 76 9 79 91
|
||||||
|
41393070: 2 53 5 781 70
|
||||||
|
12168228431496: 64 3 8 2 161 9 7 831 3
|
||||||
|
117142318737: 3 6 6 9 2 60 436 3 9 6 9 3
|
||||||
|
158260: 9 45 5 4 78
|
||||||
|
2363212870: 2 363 212 4 52 420
|
||||||
|
447325: 463 2 795 355 25
|
||||||
|
4751: 11 48 9
|
||||||
|
841: 81 9 97 2 13
|
||||||
|
3346211520: 3 9 858 11 522
|
||||||
|
697352492: 67 1 4 4 18 3 455 69 9 5
|
||||||
|
7319280640: 61 45 7 709 7 656 80
|
||||||
|
27260: 7 9 344 79 5
|
||||||
|
10737320581: 7 8 5 5 55 7 8 6 294 70
|
||||||
|
17943: 9 839 921 18 6 9 4
|
||||||
|
35412: 6 724 1 9 8 580
|
||||||
|
6453: 161 1 475 81 9
|
||||||
|
840798: 975 287 52 3 647 517
|
||||||
|
17854: 3 32 69 42 7 655
|
||||||
|
1735468803: 3 86 8 5 9 91 68 3 26 80
|
||||||
|
1955340326: 54 8 292 2 54 5 327
|
||||||
|
7614444: 86 7 718 824 7 88 7 19
|
||||||
|
108369902185: 3 9 115 814 7 9 5 7 1 8 6
|
||||||
|
139223: 8 3 53 2 77 38 6 3 2 7 4
|
||||||
|
2142640: 49 43 35 566 72
|
||||||
|
266228026: 3 80 51 8 597 5 62 24
|
||||||
|
68870224: 6 62 870 22 4
|
||||||
|
393281: 5 4 109 9 32 77 2 22 9
|
||||||
|
22257035: 29 25 685 5 6 3 597 3 5
|
||||||
|
1480: 679 67 130 537 9 58
|
||||||
|
11720991: 1 8 23 7 364 5 5 5 59 7
|
||||||
|
156699: 663 9 301 5 5
|
||||||
|
1292069: 17 760 21 42 6
|
||||||
|
83229203: 100 1 4 7 1 808 321 9 2
|
||||||
|
15899250: 986 375 43
|
||||||
|
80808: 40 4 521 212 104
|
||||||
|
10465625002: 9 77 71 47 50 1 425 2
|
||||||
|
819408192: 31 68 991 7 3 87
|
||||||
|
667: 8 8 2 7
|
||||||
|
26860: 200 45 23 56 4
|
||||||
|
49480468: 43 29 90 127
|
||||||
|
5186813940000: 504 967 5 825 5 86 2 3
|
||||||
|
19174057: 6 7 652 7 51 7
|
||||||
|
72691616664: 991 7 733 662 6 38
|
||||||
|
18573243: 343 360 489 9 900 6
|
||||||
|
3883810560: 6 88 2 8 4 438 8 980 6
|
||||||
|
19738: 5 2 508 38 54
|
||||||
|
703764: 13 8 48 495 20 77 23 6
|
||||||
|
273920: 7 629 987 89 8 20
|
||||||
|
911: 7 5 9 4 592
|
||||||
|
33029: 50 644 822 7
|
||||||
|
524702: 7 153 24 79 7 3 95 17
|
||||||
|
109342: 84 130 3 3 2 2 80
|
||||||
|
35742400: 8 1 706 7 51 174 6 6 9 7
|
||||||
|
1483641: 2 64 70 737 153
|
||||||
|
7397: 364 5 8 4 85
|
||||||
|
10622451329: 5 80 3 7 1 4 7 879 3 1 2
|
||||||
|
1513454743: 69 31 8 732 963 91
|
||||||
|
87816030: 47 1 7 80 3 8 1 6 417 1
|
||||||
|
2957777379: 30 265 7 777 379
|
||||||
|
279602: 759 1 23 4 4 274 9 7
|
||||||
|
2793723: 2 10 66 1 6 24 2 723
|
||||||
|
13426560: 36 37 180 8 7
|
||||||
|
72281484: 8 25 758 6 17 9 36
|
||||||
|
15157818475: 26 124 1 5 7 818 475
|
||||||
|
1726473: 857 5 41 9 819 2
|
||||||
|
69102877793: 9 997 2 91 7 17 711 7 5
|
||||||
|
1182849: 2 249 31 38 4 129 8
|
||||||
|
81125766: 7 2 670 17 308 3 789
|
||||||
|
20198: 8 6 3 396 2
|
||||||
|
130416799: 10 27 483 6 7 9 6 4
|
||||||
|
29969: 7 62 38 7 91 5 4 907
|
||||||
|
4071: 3 10 4 7 23
|
||||||
|
3447616557: 858 111 362 9 54
|
||||||
|
31720: 38 59 43 63 4 2
|
||||||
|
10386966: 1 3 8 612 2 96 5 7 8 4 6 3
|
||||||
|
2515969: 2 768 9 906 8
|
||||||
|
2085272: 18 65 114 297 25
|
||||||
|
245966149: 96 3 146 5 6 4 2 2 3 731
|
||||||
|
936628: 57 38 19 887 90 88
|
||||||
|
434515299: 905 64 9 8 56 99
|
||||||
|
7751781085279: 8 7 900 819 9 389 11
|
||||||
|
6523: 4 61 26 151 28
|
||||||
|
507242778: 6 822 69 44 4 459 1 6 7
|
||||||
|
4557: 2 48 3 9 169 3
|
||||||
|
6172533: 37 9 207 43 7 9 7 7 12 9
|
||||||
|
4528512: 7 27 871 689 5 6 63
|
||||||
|
35178: 1 682 81 46 80
|
||||||
|
40198: 67 4 25 6
|
||||||
|
12418780: 54 7 6 8 351 6 164 11
|
||||||
|
37440: 24 9 8 12 870 247 32
|
||||||
|
7303307255: 35 695 324 6 64 8 52
|
||||||
|
42929: 9 124 38 5 516
|
||||||
|
101311: 2 99 31 1 3
|
||||||
|
3786723: 1 685 92 6 3 3
|
||||||
|
757762: 76 997 1 3 38
|
||||||
|
728: 567 6 23 42 90
|
||||||
|
19126995: 593 1 70 65 59 58 458
|
||||||
|
83647: 8 828 47
|
||||||
|
1250549: 24 939 1 71 50
|
||||||
|
9778: 9 173 39 15 5 3 39 262
|
||||||
|
18714: 89 265 5 13 4 43 1 3
|
||||||
|
10446534727248: 61 465 74 62 990 8 6
|
||||||
|
4136: 12 289 668
|
||||||
|
986: 919 65 2
|
||||||
|
382284584: 655 1 7 1 144 578 7 1
|
||||||
|
2087668: 521 7 75 94 48 4
|
||||||
|
13551: 62 69 8 36 9
|
||||||
|
54736659: 504 52 8 38 17 261
|
||||||
|
46609728: 5 9 6 5 78 8 818 9 3 1 5 6
|
||||||
|
8001: 55 7 6 9 7 3
|
||||||
|
2164: 20 62 3 7 8 8 76
|
||||||
|
34288954: 174 227 512 141 854
|
||||||
|
149143039: 568 157 839 4 4 8 745
|
||||||
|
858002: 715 600 1 2 2
|
||||||
|
355275: 3 550 5 22 6
|
||||||
|
1161901609: 9 3 7 1 9 5 8 2 99 9 492 4
|
||||||
|
14265505: 7 4 77 237 684
|
||||||
|
93906: 1 23 457 4 78
|
||||||
|
280258704: 396 16 217 528 81
|
||||||
|
2447: 237 9 217 9 88
|
||||||
|
21103892: 688 2 139 4 3 64 55 7
|
||||||
|
572320: 571 889 7 8 7
|
||||||
|
22940: 74 1 31 10
|
||||||
|
453933144: 884 1 7 2 8 75 164 94 9
|
||||||
|
9387402762: 447 7 134 3 70 3 57 2
|
||||||
|
628: 2 96 5 6 10
|
||||||
|
58729373: 53 4 53 29 373
|
||||||
|
16162243: 2 3 90 75 92 139 927
|
||||||
|
1806271: 4 319 283 5 13 718
|
||||||
|
1908: 72 26 16 8 9
|
||||||
|
87108518916: 8 349 61 129 729 4
|
||||||
|
1120226562: 81 8 1 54 7 89 8 5 2 32
|
||||||
|
5619463232: 7 860 2 3 9 3 24 29
|
||||||
|
28275666: 4 35 65 440 227
|
||||||
|
57418552: 8 96 4 18 9 6 4 142
|
||||||
|
337848089754: 893 778 54 82 7 9 5
|
||||||
|
101244761: 2 8 4 1 222 8 1 631 6 4 5
|
||||||
|
31091: 2 94 6 323 9 4 4 53 8 3
|
||||||
|
9551142: 2 7 4 4 92 9 87 2 54
|
||||||
|
431798: 2 827 32 904 554 96
|
||||||
|
368064: 62 5 31 10 568 6
|
||||||
|
641856: 80 23 1 2 8
|
||||||
|
356332: 848 13 8 38 853 4
|
||||||
|
1530148: 107 13 11 13 33
|
||||||
|
10595: 4 93 3 71 524
|
||||||
|
13825: 37 88 128 73 4
|
||||||
|
485809: 9 597 19 6 996 5
|
||||||
|
6598799: 541 2 674 617 6 5 3 1 1
|
||||||
|
15595884486: 6 36 560 69 8 961
|
||||||
|
655845: 5 5 2 512 8 298 7 115
|
||||||
|
167578404: 716 3 162 9 916 19
|
||||||
|
539849: 3 7 1 594 25
|
||||||
|
3430232: 9 15 29 9 2 700 7 56 4 8
|
||||||
|
4196: 951 77 9 8 4 4
|
||||||
|
24625387: 9 6 8 6 9 37 846 38 3 8 8
|
||||||
|
4318272002: 10 7 2 3 80 6 5 2 7 306 2
|
||||||
|
49392736: 80 63 4 72 34 2 944 2
|
||||||
|
97244751876: 3 45 6 3 7 293 8 5 9 2 3 1
|
||||||
|
2827209446: 384 6 35 4 9 6 7 3 441 5
|
||||||
|
773376516: 7 73 37 651 5
|
||||||
|
466781: 21 76 5 364 782
|
||||||
|
314242938: 77 30 223 22 610 218
|
||||||
|
654638167: 14 95 6 631 7 169
|
||||||
|
11952: 76 23 69 7 50 439 18
|
||||||
|
7579925: 860 37 435 47 5
|
||||||
|
1618: 80 4 7 711 59
|
||||||
|
33287: 1 822 40 354 48 2 3
|
||||||
|
126232779: 6 3 841 9 5 4 77 8 34 9 3
|
||||||
|
155627: 1 6 99 989 54 95 13 99
|
||||||
|
713339897: 9 7 5 8 9 30 430
|
||||||
|
131670050047: 231 19 75 12 5 1 4 8
|
||||||
|
7727322: 2 795 9 753 513
|
||||||
|
349733: 615 8 637 271 4 6 28
|
||||||
|
2481710424: 1 58 9 49 1 3 96 5 9 3 8 3
|
||||||
|
261963659: 9 7 4 7 2 308 655 650 9
|
||||||
|
51571974: 7 5 579 7 848 1 1 3
|
||||||
|
20290: 3 85 3 467 36 1 1 6 196
|
||||||
|
2626: 2 6 96 545 2
|
||||||
|
22878: 2 2 80 275 4 21 3 9
|
||||||
|
575535: 54 4 14 18 10 8 73 6 3
|
||||||
|
477517: 43 3 4 5 8 46 7 50
|
||||||
|
1384703: 4 401 6 7 738 51
|
||||||
|
891003337: 86 6 12 4 825 3 3 39
|
||||||
|
90028742465: 608 3 1 37 4 3 4 2 4 6 2 1
|
||||||
|
231588050: 35 3 1 586 1 2 8 1 3 65 5
|
||||||
|
1072: 7 9 995 9 5
|
||||||
|
11381395: 73 4 974 2 36 2 435 7
|
||||||
|
3841: 847 4 87 358 8
|
||||||
|
88734868: 3 6 9 8 9 2 7 5 4 838 725
|
||||||
|
280240227: 2 981 23 1 48 94
|
||||||
|
343965: 6 35 67 885 23
|
||||||
|
14417393: 9 4 7 2 63 6 38 35 90
|
||||||
|
227912: 8 183 31 19 3 72 9 8 1
|
||||||
|
2511501082: 1 946 88 2 430 3 7 6 2 4
|
||||||
|
9770975: 2 207 7 58 9 4 36 33 5
|
||||||
|
181098129983: 36 3 6 1 3 399 7 9 8 1 8 6
|
||||||
|
5511886: 749 92 63 2 9 4 104 94
|
||||||
|
11912: 3 167 581 43 15
|
||||||
|
54194003: 24 5 7 50 632
|
||||||
|
40135618285: 5 5 5 4 8 7 7 38 182 8 3 5
|
||||||
|
8817032: 460 2 2 6 4 4 7 2 57 728
|
||||||
|
236071: 566 414 610 196 941
|
||||||
|
1699: 874 26 799
|
||||||
|
9082: 59 85 7 9 10
|
||||||
|
14399715: 7 6 5 84 32 1 9 9 8 756 7
|
||||||
|
957922: 5 76 282 265 853
|
||||||
|
519850: 854 1 1 608 8
|
||||||
|
494598: 8 8 8 9 1 2 4 1 3 4 17 78
|
||||||
|
717301: 769 92 138 844 1
|
||||||
|
79732051: 8 1 7 80 45 5 221 629 8
|
||||||
|
193315: 5 329 577 536 60
|
||||||
|
443120: 71 7 62 5 764 4
|
||||||
|
799531202: 320 693 332 72 50 2
|
||||||
|
25055194: 241 48 900 7 194
|
||||||
|
148742749564: 341 93 73 435 240 65
|
||||||
|
2975722: 802 811 6 919 2
|
||||||
|
69614316: 3 9 65 34 9 9 6 3 1 96 59
|
||||||
|
9211672: 92 116 51 20
|
||||||
|
1384: 5 687 2
|
||||||
|
2227754259: 312 1 75 78 952
|
||||||
|
1980: 6 46 5 70 6
|
||||||
|
1051: 74 41 921 7 8
|
||||||
|
7224: 69 9 6 405 7
|
||||||
|
100058717: 58 44 628 7 145 31 9 8
|
||||||
|
13325842: 86 4 981 7 534 49 5 9
|
||||||
|
135606016: 86 1 1 7 2 4 8 877 96 8
|
||||||
|
188416: 4 8 735 32 8
|
||||||
|
13081748: 306 58 2 737
|
||||||
|
3408461: 654 396 4 34 348 94 9
|
||||||
|
19518: 2 1 8 9 1 54 9 25 9 616 2
|
||||||
|
31719: 65 6 9 78 597
|
||||||
|
246572: 26 98 9 4 393 9 81 2 8
|
||||||
|
127805458: 40 71 9 1 5 457
|
||||||
|
7811: 198 16 5 7 31 1 4 794 6
|
||||||
|
1168319105: 5 2 1 2 4 44 8 93 9 12 8 8
|
||||||
|
7211685: 411 5 7 562 8 554 93 5
|
||||||
|
4028985022: 77 86 48 505 604
|
||||||
|
127755655140: 73 70 5 3 8 31 5 140
|
||||||
|
208269903: 3 75 267 990 3
|
||||||
|
956027222: 455 20 5 10 4 3 5 7
|
||||||
|
332644: 63 1 8 660 4
|
||||||
|
739903: 8 744 1 67 3 630 9 1 5
|
||||||
|
449841: 8 6 3 1 9 9 4 9 608 73 88
|
||||||
|
3162: 88 4 6 9 7 3 53 7 9 17
|
||||||
|
123780: 961 528 514 51 9 60
|
||||||
|
397: 88 299 1 1 9
|
||||||
|
20327221321: 10 40 83 98 1 460 7 6
|
||||||
|
22759444: 366 7 6 3 241 6
|
||||||
|
1397068088398: 419 2 5 161 5 6 4 414 1
|
||||||
|
5172: 6 431 2
|
||||||
|
7637: 251 9 85 746 7
|
||||||
|
1812: 908 35 789 3 77
|
||||||
|
1120: 7 9 1 68 9 2 4
|
||||||
|
770138283: 11 6 57 1 3 8 947 9 1 3 3
|
||||||
|
163644: 610 32 344 63 156
|
||||||
|
6168: 137 5 9
|
||||||
|
507: 41 9 2 76 60
|
||||||
|
593693: 77 77 16 765 9
|
||||||
|
1214074355: 9 4 5 3 9 73 5 7 8 4 855 8
|
||||||
|
607244471: 6 3 7 3 1 83 2 510 2 4 6 8
|
||||||
|
275: 26 2 9 2 2
|
||||||
|
250040507: 24 9 455 585 504
|
||||||
|
5137920095731: 44 7 438 78 3 23 573 2
|
||||||
|
282926819: 6 4 827 26 812 42 3 32
|
||||||
|
80952: 37 2 6 948 2
|
||||||
|
8890436: 635 2 7 43 8
|
||||||
|
10600: 2 1 8 8 6 6 8 3 91 541 6 5
|
||||||
|
23840: 5 86 1 9 4 1 7 511 57 5
|
||||||
|
283368: 3 8 8 322 8
|
||||||
|
1123947090: 49 3 877 8 1 323 9 342
|
||||||
|
25775616: 8 8 6 97 692
|
||||||
|
243687944: 650 5 815 32 92
|
||||||
|
2855764: 2 1 912 730 1
|
||||||
|
2736185924: 835 66 2 53 8 3 31 3 2 2
|
||||||
80
2024/gareth/day08/day08.go
Normal file
80
2024/gareth/day08/day08.go
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Coordinate struct {
|
||||||
|
Row int
|
||||||
|
Col int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid, antennaMap := parseInput(input)
|
||||||
|
result := findAntinodes(grid, antennaMap, true)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid, antennaMap := parseInput(input)
|
||||||
|
result := findAntinodes(grid, antennaMap, false)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([][]rune, map[rune][]Coordinate) {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
rowCount := len(lines)
|
||||||
|
colCount := len(lines[0])
|
||||||
|
grid := make([][]rune, rowCount)
|
||||||
|
antennaMap := make(map[rune][]Coordinate)
|
||||||
|
|
||||||
|
for row := 0; row < rowCount; row++ {
|
||||||
|
grid[row] = []rune(lines[row])
|
||||||
|
for col := 0; col < colCount; col++ {
|
||||||
|
frequency := grid[row][col]
|
||||||
|
if frequency != '.' {
|
||||||
|
antennaMap[frequency] = append(antennaMap[frequency], Coordinate{Row: row, Col: col})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid, antennaMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func findAntinodes(grid [][]rune, antennaMap map[rune][]Coordinate, onlySpecial bool) int {
|
||||||
|
rowCount := len(grid)
|
||||||
|
colCount := len(grid[0])
|
||||||
|
uniqueAntinodes := make(map[Coordinate]struct{})
|
||||||
|
|
||||||
|
for row := 0; row < rowCount; row++ {
|
||||||
|
for col := 0; col < colCount; col++ {
|
||||||
|
for _, antennaPositions := range antennaMap {
|
||||||
|
for i, firstAntenna := range antennaPositions {
|
||||||
|
for j, secondAntenna := range antennaPositions {
|
||||||
|
//I know I know thats too many for loops
|
||||||
|
if i != j {
|
||||||
|
distance1 := int(math.Abs(float64(row-firstAntenna.Row)) + math.Abs(float64(col-firstAntenna.Col)))
|
||||||
|
distance2 := int(math.Abs(float64(row-secondAntenna.Row)) + math.Abs(float64(col-secondAntenna.Col)))
|
||||||
|
|
||||||
|
rowDiff1 := row - firstAntenna.Row
|
||||||
|
rowDiff2 := row - secondAntenna.Row
|
||||||
|
colDiff1 := col - firstAntenna.Col
|
||||||
|
colDiff2 := col - secondAntenna.Col
|
||||||
|
|
||||||
|
if rowDiff1*colDiff2 == rowDiff2*colDiff1 {
|
||||||
|
if (distance1 == 2*distance2 || distance1*2 == distance2) && onlySpecial {
|
||||||
|
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||||
|
} else if !onlySpecial {
|
||||||
|
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(uniqueAntinodes)
|
||||||
|
}
|
||||||
39
2024/gareth/day08/day08_test.go
Normal file
39
2024/gareth/day08/day08_test.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............`)
|
||||||
|
assert.Equal(t, 14, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............`)
|
||||||
|
assert.Equal(t, 11387, r)
|
||||||
|
}
|
||||||
50
2024/gareth/day08/input.txt
Normal file
50
2024/gareth/day08/input.txt
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
........................E...j......W..........L...
|
||||||
|
............................O........E.........L..
|
||||||
|
..q......O...........l....................K.......
|
||||||
|
............q...................HM......W.........
|
||||||
|
................................1..H...........IW.
|
||||||
|
....................5.............................
|
||||||
|
..........k........M...wl............6............
|
||||||
|
.....O.......w...k.....5.8..l......K.........o.6..
|
||||||
|
.......k....w.........5.........R.....o........K..
|
||||||
|
.....q..X..............j........E...I.........K...
|
||||||
|
............O..........E........................H.
|
||||||
|
................Mn.h2.w.p....................H....
|
||||||
|
..................p.......a............j.....L....
|
||||||
|
.....X...l.p.....................m.........W..6...
|
||||||
|
..Xq................A..................R..m.......
|
||||||
|
.........................i..........a..........R..
|
||||||
|
...........u.....................a........I.....2.
|
||||||
|
k..............A..n.........R.................o...
|
||||||
|
................n.................Qo..............
|
||||||
|
..........u.A.........h........2..................
|
||||||
|
...5.......Y.....p...............iN...............
|
||||||
|
1...x.....................i.......................
|
||||||
|
........M..............2.....Qi...................
|
||||||
|
...............................I..e...............
|
||||||
|
......u......A...........m..........h.............
|
||||||
|
.......1...........U.............Qm.......j.......
|
||||||
|
.......X.......................................9..
|
||||||
|
.....u........U.......Y...........................
|
||||||
|
.............................h.e..................
|
||||||
|
..................4....e......Q.....L....N........
|
||||||
|
.1..................4.......................y8....
|
||||||
|
.........Y................................8.N.....
|
||||||
|
............P.0J...........3..........8y..........
|
||||||
|
....V3P..........J................................
|
||||||
|
............U..P...7x...........e.................
|
||||||
|
....................J...............r...9.........
|
||||||
|
.........0.V......Y...............................
|
||||||
|
...............V.4................................
|
||||||
|
..........V..........................n............
|
||||||
|
..............v........7..........................
|
||||||
|
...........U..........J.......7...................
|
||||||
|
.....v........7..........................a........
|
||||||
|
.......................................r..........
|
||||||
|
...........0.......x................y.............
|
||||||
|
............6..v.x.....................N..........
|
||||||
|
...........P......................................
|
||||||
|
........3.......................r......4..........
|
||||||
|
..............3......................y............
|
||||||
|
................................................9.
|
||||||
|
.................................................9
|
||||||
104
2024/gareth/day09/day09.go
Normal file
104
2024/gareth/day09/day09.go
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
files, gaps, lengthOfFinalFile := parseInput(input)
|
||||||
|
checksum := compactFiles(files, gaps, lengthOfFinalFile)
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
files, freeSpaces := parseInputPart2(input)
|
||||||
|
checksum := calculateChecksum(files, freeSpaces)
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([]int, []int, int) {
|
||||||
|
var files []int
|
||||||
|
var gaps []int
|
||||||
|
lengthOfFinalFile := 0
|
||||||
|
for i, char := range input {
|
||||||
|
if i%2 == 0 {
|
||||||
|
files = append(files, int(char-'0'))
|
||||||
|
lengthOfFinalFile += int(char - '0')
|
||||||
|
} else {
|
||||||
|
gaps = append(gaps, int(char-'0'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return files, gaps, lengthOfFinalFile
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInputPart2(input string) ([][]int, [][]int) {
|
||||||
|
files, freeSpaces, position := [][]int{}, [][]int{}, 0
|
||||||
|
for index, char := range input {
|
||||||
|
length := int(char - '0')
|
||||||
|
if index%2 == 0 {
|
||||||
|
files = append(files, generateRange(position, position+length))
|
||||||
|
} else {
|
||||||
|
freeSpaces = append(freeSpaces, generateRange(position, position+length))
|
||||||
|
}
|
||||||
|
position += length
|
||||||
|
}
|
||||||
|
return files, freeSpaces
|
||||||
|
}
|
||||||
|
|
||||||
|
func compactFiles(files []int, gaps []int, lengthOfFinalFile int) int {
|
||||||
|
fileIndex := len(files) - 1
|
||||||
|
gapIndex := 0
|
||||||
|
position := files[0]
|
||||||
|
checksum := 0
|
||||||
|
fileID := files[0]
|
||||||
|
|
||||||
|
for lengthOfFinalFile != position {
|
||||||
|
// If there's a gap and a file to move then move the file
|
||||||
|
if gaps[gapIndex] > 0 && files[fileIndex] > 0 {
|
||||||
|
files[fileIndex]--
|
||||||
|
gaps[gapIndex]--
|
||||||
|
checksum += fileIndex * position
|
||||||
|
position++
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this file is fully moved go to next file
|
||||||
|
if files[fileIndex] == 0 {
|
||||||
|
fileIndex--
|
||||||
|
fileID++
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update gapIndex if this gap is filled
|
||||||
|
if gaps[gapIndex] == 0 {
|
||||||
|
gapIndex++
|
||||||
|
for f := 0; f < files[gapIndex]; f++ {
|
||||||
|
checksum += gapIndex * position
|
||||||
|
position++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateRange(start, end int) []int {
|
||||||
|
rangeList := make([]int, end-start)
|
||||||
|
for i := range rangeList {
|
||||||
|
rangeList[i] = start + i
|
||||||
|
}
|
||||||
|
return rangeList
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculateChecksum(files, freeSpaces [][]int) int {
|
||||||
|
checksum := 0
|
||||||
|
for fileIndex := len(files) - 1; fileIndex >= 0; fileIndex-- {
|
||||||
|
for spaceIndex := 0; spaceIndex < len(freeSpaces); spaceIndex++ {
|
||||||
|
if len(freeSpaces[spaceIndex]) >= len(files[fileIndex]) && files[fileIndex][0] > freeSpaces[spaceIndex][0] {
|
||||||
|
files[fileIndex] = freeSpaces[spaceIndex][:len(files[fileIndex])]
|
||||||
|
freeSpaces[spaceIndex] = freeSpaces[spaceIndex][len(files[fileIndex]):]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for fileID, file := range files {
|
||||||
|
for _, block := range file {
|
||||||
|
checksum += fileID * block
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
22
2024/gareth/day09/day09_test.go
Normal file
22
2024/gareth/day09/day09_test.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`12345`)
|
||||||
|
assert.Equal(t, 60, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart1Long(t *testing.T) {
|
||||||
|
r := Part1(`2333133121414131402`)
|
||||||
|
assert.Equal(t, 1928, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`2333133121414131402`)
|
||||||
|
assert.Equal(t, 2858, r)
|
||||||
|
}
|
||||||
1
2024/gareth/day09/input.txt
Normal file
1
2024/gareth/day09/input.txt
Normal file
File diff suppressed because one or more lines are too long
141
2024/gareth/day10/day10.go
Normal file
141
2024/gareth/day10/day10.go
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var directions = [][2]int{
|
||||||
|
{-1, 0},
|
||||||
|
{1, 0},
|
||||||
|
{0, -1},
|
||||||
|
{0, 1},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := ParseInput(input)
|
||||||
|
return CalculateTotalTrailheadScore(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := ParseInput(input)
|
||||||
|
return CalculateTotalTrailheadRating(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) [][]int {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
grid := make([][]int, len(lines))
|
||||||
|
for i, line := range lines {
|
||||||
|
grid[i] = make([]int, len(line))
|
||||||
|
for j, char := range line {
|
||||||
|
grid[i][j] = int(char - '0')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return grid
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsValidPosition(x, y, rows, cols int) bool {
|
||||||
|
return x >= 0 && x < rows && y >= 0 && y < cols
|
||||||
|
}
|
||||||
|
|
||||||
|
func DFS(grid [][]int, x, y, prevHeight int, visited [][]bool, reached9 map[[2]int]bool) {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[x][y] == 9 {
|
||||||
|
reached9[[2]int{x, y}] = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[x][y] = true
|
||||||
|
for _, dir := range directions {
|
||||||
|
nx, ny := x+dir[0], y+dir[1]
|
||||||
|
DFS(grid, nx, ny, grid[x][y], visited, reached9)
|
||||||
|
}
|
||||||
|
visited[x][y] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTrailheadScore(grid [][]int, x, y int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
visited := make([][]bool, rows)
|
||||||
|
for i := range visited {
|
||||||
|
visited[i] = make([]bool, cols)
|
||||||
|
}
|
||||||
|
|
||||||
|
reached9 := make(map[[2]int]bool)
|
||||||
|
DFS(grid, x, y, -1, visited, reached9)
|
||||||
|
return len(reached9)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DFSForRatings(grid [][]int, x, y, prevHeight int, visited [][]bool, trailCache map[[3]int]int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[x][y] == 9 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
cacheKey := [3]int{x, y, grid[x][y]}
|
||||||
|
if count, exists := trailCache[cacheKey]; exists {
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[x][y] = true
|
||||||
|
totalTrails := 0
|
||||||
|
for _, dir := range directions {
|
||||||
|
nx, ny := x+dir[0], y+dir[1]
|
||||||
|
totalTrails += DFSForRatings(grid, nx, ny, grid[x][y], visited, trailCache)
|
||||||
|
}
|
||||||
|
visited[x][y] = false
|
||||||
|
|
||||||
|
trailCache[cacheKey] = totalTrails
|
||||||
|
return totalTrails
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTrailheadRating(grid [][]int, x, y int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
visited := make([][]bool, rows)
|
||||||
|
for i := range visited {
|
||||||
|
visited[i] = make([]bool, cols)
|
||||||
|
}
|
||||||
|
|
||||||
|
trailCache := make(map[[3]int]int)
|
||||||
|
return DFSForRatings(grid, x, y, -1, visited, trailCache)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTotalTrailheadScore(grid [][]int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
totalScore := 0
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if grid[i][j] == 0 {
|
||||||
|
score := CalculateTrailheadScore(grid, i, j)
|
||||||
|
totalScore += score
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalScore
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTotalTrailheadRating(grid [][]int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
totalRating := 0
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if grid[i][j] == 0 {
|
||||||
|
rating := CalculateTrailheadRating(grid, i, j)
|
||||||
|
totalRating += rating
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalRating
|
||||||
|
}
|
||||||
31
2024/gareth/day10/day10_test.go
Normal file
31
2024/gareth/day10/day10_test.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`89010123
|
||||||
|
78121874
|
||||||
|
87430965
|
||||||
|
96549874
|
||||||
|
45678903
|
||||||
|
32019012
|
||||||
|
01329801
|
||||||
|
10456732`)
|
||||||
|
assert.Equal(t, 36, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`89010123
|
||||||
|
78121874
|
||||||
|
87430965
|
||||||
|
96549874
|
||||||
|
45678903
|
||||||
|
32019012
|
||||||
|
01329801
|
||||||
|
10456732`)
|
||||||
|
assert.Equal(t, 81, r)
|
||||||
|
}
|
||||||
45
2024/gareth/day10/input.txt
Normal file
45
2024/gareth/day10/input.txt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
987123434330121232101001234730123456781067632
|
||||||
|
876076576521010345692340349823212347892398701
|
||||||
|
945087689432105676787659856714503210987445610
|
||||||
|
332196576587654989801456787609654502376530923
|
||||||
|
211543210298923215432321098128778901430121894
|
||||||
|
300692340147210106523543210039569876589836765
|
||||||
|
456781678236103267015693016543410231276745650
|
||||||
|
576890549345234178106782187612320140345654321
|
||||||
|
985098432100125089235493498109876056034765012
|
||||||
|
834127102345456978340362569018765487123876678
|
||||||
|
123236221976347869651251078729034398101985589
|
||||||
|
014545340889298958707867897430120987012834432
|
||||||
|
105965456770107843216950956541231276543124501
|
||||||
|
896872378761016930345441019876501345678023670
|
||||||
|
787901069654325321210332398545432330589012981
|
||||||
|
107821543213034321089206787638901421432103210
|
||||||
|
215430694102123475670115896129876548901210349
|
||||||
|
126989780210014984308924925014578037654321458
|
||||||
|
037878921001235675217833210123669123109452367
|
||||||
|
549865438901045102346542106548754321278501476
|
||||||
|
678954987432696201256430087239689870347699985
|
||||||
|
230143006501787349961021298101236787656788014
|
||||||
|
123272112981010458872787034010345691875107623
|
||||||
|
054387623472129867763698125676210010961234510
|
||||||
|
565694502561036789854567012980387121250129878
|
||||||
|
676783411051045672343218763901296030343278569
|
||||||
|
989872123432345891050109654812345145467303450
|
||||||
|
012763094321056700891760345765432256958912341
|
||||||
|
103450185789763211709851236876301967843211032
|
||||||
|
814321276656854345612345654954101878701208983
|
||||||
|
923434434565956745678036783063210989870345674
|
||||||
|
874532345410345832989123192178981876781456564
|
||||||
|
265101654323234901808765013265432185692387565
|
||||||
|
103216765432101267814554323476501094501893474
|
||||||
|
232109856321011876923601098789678923432102985
|
||||||
|
343898707896540945498712367765672310567891078
|
||||||
|
456789010987231234321203456894581455454986569
|
||||||
|
556776125670102343100157654503490166303890432
|
||||||
|
543895434894321765212348983212321876212761201
|
||||||
|
432104898765010894301054581200110955211654300
|
||||||
|
301256567656987105498765690341034567300563212
|
||||||
|
434567430547896234787654785652123498456767843
|
||||||
|
321798121032345375696543098743096567877854952
|
||||||
|
210899021121036789781232143456787656928923761
|
||||||
|
326765430110145678710123232109876543210010890
|
||||||
89
2024/gareth/day11/day11.go
Normal file
89
2024/gareth/day11/day11.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package day11
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
stones := ParseInput(input)
|
||||||
|
return len(blinkTimes(stones, 25))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
stones := ParseInput(input)
|
||||||
|
return getNumStones(stones, 75)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) []int {
|
||||||
|
strStones := strings.Split(strings.TrimSpace(input), " ")
|
||||||
|
stones := make([]int, 0, len(strStones))
|
||||||
|
for _, s := range strStones {
|
||||||
|
num, _ := strconv.Atoi(s)
|
||||||
|
stones = append(stones, num)
|
||||||
|
}
|
||||||
|
return stones
|
||||||
|
}
|
||||||
|
|
||||||
|
// Part 1 initial thought of recursion
|
||||||
|
func blinkTimes(stones []int, times int) []int {
|
||||||
|
if times <= 0 {
|
||||||
|
return stones
|
||||||
|
}
|
||||||
|
result := blink(stones)
|
||||||
|
return blinkTimes(result, times-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func blink(stones []int) []int {
|
||||||
|
result := make([]int, 0)
|
||||||
|
for _, stone := range stones {
|
||||||
|
strStone := strconv.Itoa(stone)
|
||||||
|
if stone == 0 {
|
||||||
|
result = append(result, 1)
|
||||||
|
} else if len(strStone)%2 == 0 {
|
||||||
|
mid := len(strStone) / 2
|
||||||
|
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
||||||
|
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
||||||
|
result = append(result, firstHalf, secondHalf)
|
||||||
|
} else {
|
||||||
|
result = append(result, stone*2024)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Part 2 with maps since blinkTimes(75) would set my computer on fire
|
||||||
|
func getNumStones(s []int, times int) int {
|
||||||
|
stoneMap := make(map[int]int)
|
||||||
|
for _, stone := range s {
|
||||||
|
stoneMap[stone] = stoneMap[stone] + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < times; i++ {
|
||||||
|
stoneMap2 := make(map[int]int)
|
||||||
|
for stone, count := range stoneMap {
|
||||||
|
stones := make([]int, 0)
|
||||||
|
strStone := strconv.Itoa(stone)
|
||||||
|
if stone == 0 {
|
||||||
|
stones = append(stones, 1)
|
||||||
|
} else if len(strStone)%2 == 0 {
|
||||||
|
mid := len(strStone) / 2
|
||||||
|
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
||||||
|
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
||||||
|
stones = append(stones, firstHalf, secondHalf)
|
||||||
|
} else {
|
||||||
|
stones = append(stones, stone*2024)
|
||||||
|
}
|
||||||
|
for _, newStone := range stones {
|
||||||
|
stoneMap2[newStone] = stoneMap2[newStone] + count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stoneMap = stoneMap2
|
||||||
|
}
|
||||||
|
|
||||||
|
result := 0
|
||||||
|
for _, count := range stoneMap {
|
||||||
|
result += count
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
12
2024/gareth/day11/day11_test.go
Normal file
12
2024/gareth/day11/day11_test.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package day11
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`125 17`)
|
||||||
|
assert.Equal(t, 55312, r)
|
||||||
|
}
|
||||||
1
2024/gareth/day11/input.txt
Normal file
1
2024/gareth/day11/input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
965842 9159 3372473 311 0 6 86213 48
|
||||||
76
2024/gareth/day13/day13.go
Normal file
76
2024/gareth/day13/day13.go
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ClawMachine struct {
|
||||||
|
Ax, Ay int
|
||||||
|
Bx, By int
|
||||||
|
Px, Py int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
clawMachines := parseInput(input)
|
||||||
|
total := 0
|
||||||
|
for _, c := range clawMachines {
|
||||||
|
x, y := solveSimEquations(c.Ax, c.Bx, c.Px, c.Ay, c.By, c.Py)
|
||||||
|
total += x*3 + y
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
clawMachines := parseInput(input)
|
||||||
|
total := 0
|
||||||
|
for _, c := range clawMachines {
|
||||||
|
prizeX, prizeY := c.Px+10000000000000, c.Py+10000000000000
|
||||||
|
det, x, y := c.Ax*c.By-c.Bx*c.Ay, prizeX*c.By-c.Bx*prizeY, c.Ax*prizeY-prizeX*c.Ay
|
||||||
|
if det != 0 && x == (x/det)*det && y == (y/det)*det {
|
||||||
|
total += (x/det)*3 + (y / det)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []ClawMachine {
|
||||||
|
clawMachines := strings.Split(strings.TrimSpace(input), "\n\n")
|
||||||
|
output := make([]ClawMachine, 0, len(clawMachines))
|
||||||
|
for _, c := range clawMachines {
|
||||||
|
var clawMachine ClawMachine
|
||||||
|
line := strings.Split(strings.TrimSpace(c), "\n")
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`X\+(\d+), Y\+(\d+)`)
|
||||||
|
matches := re.FindStringSubmatch(line[0])
|
||||||
|
clawMachine.Ax, _ = strconv.Atoi(matches[1])
|
||||||
|
clawMachine.Ay, _ = strconv.Atoi(matches[2])
|
||||||
|
|
||||||
|
matches = re.FindStringSubmatch(line[1])
|
||||||
|
clawMachine.Bx, _ = strconv.Atoi(matches[1])
|
||||||
|
clawMachine.By, _ = strconv.Atoi(matches[2])
|
||||||
|
|
||||||
|
re = regexp.MustCompile(`X=(\d+), Y=(\d+)`)
|
||||||
|
matches = re.FindStringSubmatch(line[2])
|
||||||
|
clawMachine.Px, _ = strconv.Atoi(matches[1])
|
||||||
|
clawMachine.Py, _ = strconv.Atoi(matches[2])
|
||||||
|
|
||||||
|
output = append(output, clawMachine)
|
||||||
|
}
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
|
func solveSimEquations(a1, b1, c1, a2, b2, c2 int) (int, int) {
|
||||||
|
det := a1*b2 - a2*b1
|
||||||
|
if det == 0 || (c1*b2-c2*b1)%det != 0 || (a1*c2-a2*c1)%det != 0 {
|
||||||
|
return 0, 0
|
||||||
|
}
|
||||||
|
x := (c1*b2 - c2*b1) / det
|
||||||
|
y := (a1*c2 - a2*c1) / det
|
||||||
|
if x < 0 || x > 100 || y < 0 || y > 100 {
|
||||||
|
return 0, 0
|
||||||
|
}
|
||||||
|
return x, y
|
||||||
|
}
|
||||||
45
2024/gareth/day13/day13_test.go
Normal file
45
2024/gareth/day13/day13_test.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`Button A: X+94, Y+34
|
||||||
|
Button B: X+22, Y+67
|
||||||
|
Prize: X=8400, Y=5400
|
||||||
|
|
||||||
|
Button A: X+26, Y+66
|
||||||
|
Button B: X+67, Y+21
|
||||||
|
Prize: X=12748, Y=12176
|
||||||
|
|
||||||
|
Button A: X+17, Y+86
|
||||||
|
Button B: X+84, Y+37
|
||||||
|
Prize: X=7870, Y=6450
|
||||||
|
|
||||||
|
Button A: X+69, Y+23
|
||||||
|
Button B: X+27, Y+71
|
||||||
|
Prize: X=18641, Y=10279`)
|
||||||
|
assert.Equal(t, 480, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`Button A: X+94, Y+34
|
||||||
|
Button B: X+22, Y+67
|
||||||
|
Prize: X=8400, Y=5400
|
||||||
|
|
||||||
|
Button A: X+26, Y+66
|
||||||
|
Button B: X+67, Y+21
|
||||||
|
Prize: X=12748, Y=12176
|
||||||
|
|
||||||
|
Button A: X+17, Y+86
|
||||||
|
Button B: X+84, Y+37
|
||||||
|
Prize: X=7870, Y=6450
|
||||||
|
|
||||||
|
Button A: X+69, Y+23
|
||||||
|
Button B: X+27, Y+71
|
||||||
|
Prize: X=18641, Y=10279`)
|
||||||
|
assert.Equal(t, 0, r)
|
||||||
|
}
|
||||||
1279
2024/gareth/day13/input.txt
Normal file
1279
2024/gareth/day13/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
172
2024/gareth/day14/day14.go
Normal file
172
2024/gareth/day14/day14.go
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
package day14
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Robot struct {
|
||||||
|
px, py int // position
|
||||||
|
vx, vy int // velocity
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
// Parse the input
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
var robots []Robot
|
||||||
|
for _, line := range lines {
|
||||||
|
robot := ParseRobot(line)
|
||||||
|
robots = append(robots, robot)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define grid size
|
||||||
|
gridWidth := 101
|
||||||
|
gridHeight := 103
|
||||||
|
|
||||||
|
// Update robot positions for 100 seconds
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
for j := range robots {
|
||||||
|
robots[j].UpdatePosition(gridWidth, gridHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count the robots in each quadrant
|
||||||
|
q1, q2, q3, q4 := CountRobotsInQuadrants(robots, gridWidth, gridHeight)
|
||||||
|
fmt.Printf("Quadrant counts: Q1=%d, Q2=%d, Q3=%d, Q4=%d\n", q1, q2, q3, q4)
|
||||||
|
|
||||||
|
// Calculate the safety factor
|
||||||
|
safetyFactor := CalculateSafetyFactor(q1, q2, q3, q4)
|
||||||
|
fmt.Printf("Safety Factor: %d\n", safetyFactor)
|
||||||
|
return safetyFactor
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
// Parse the input
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
var robots []Robot
|
||||||
|
for _, line := range lines {
|
||||||
|
robot := ParseRobot(line)
|
||||||
|
robots = append(robots, robot)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define grid size
|
||||||
|
gridWidth := 101
|
||||||
|
gridHeight := 103
|
||||||
|
|
||||||
|
// Update robot positions for 100 seconds
|
||||||
|
for i := 0; i < 6285; i++ {
|
||||||
|
for j := range robots {
|
||||||
|
robots[j].UpdatePosition(gridWidth, gridHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplayGrid(robots, gridWidth, gridHeight)
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseRobot takes a line of input and converts it to a Robot struct
|
||||||
|
func ParseRobot(line string) Robot {
|
||||||
|
parts := strings.Split(line, " ")
|
||||||
|
posParts := strings.Split(parts[0][2:], ",") // Extract p=x,y and split
|
||||||
|
velParts := strings.Split(parts[1][2:], ",") // Extract v=x,y and split
|
||||||
|
|
||||||
|
px, _ := strconv.Atoi(posParts[0])
|
||||||
|
py, _ := strconv.Atoi(posParts[1])
|
||||||
|
vx, _ := strconv.Atoi(velParts[0])
|
||||||
|
vy, _ := strconv.Atoi(velParts[1])
|
||||||
|
|
||||||
|
return Robot{px, py, vx, vy}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdatePosition updates the position of a robot, considering the wrap-around
|
||||||
|
func (r *Robot) UpdatePosition(gridWidth, gridHeight int) {
|
||||||
|
r.px = (r.px + r.vx + gridWidth) % gridWidth
|
||||||
|
r.py = (r.py + r.vy + gridHeight) % gridHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
// CountRobotsInQuadrants counts the number of robots in each of the four quadrants
|
||||||
|
func CountRobotsInQuadrants(robots []Robot, width, height int) (int, int, int, int) {
|
||||||
|
midX := width / 2
|
||||||
|
midY := height / 2
|
||||||
|
|
||||||
|
q1, q2, q3, q4 := 0, 0, 0, 0
|
||||||
|
|
||||||
|
for _, r := range robots {
|
||||||
|
if r.px == midX || r.py == midY {
|
||||||
|
// Skip robots on the middle line
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if r.px < midX && r.py < midY {
|
||||||
|
q1++ // Top-left quadrant
|
||||||
|
} else if r.px > midX && r.py < midY {
|
||||||
|
q2++ // Top-right quadrant
|
||||||
|
} else if r.px < midX && r.py > midY {
|
||||||
|
q3++ // Bottom-left quadrant
|
||||||
|
} else if r.px > midX && r.py > midY {
|
||||||
|
q4++ // Bottom-right quadrant
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return q1, q2, q3, q4
|
||||||
|
}
|
||||||
|
|
||||||
|
// CalculateSafetyFactor multiplies the number of robots in each quadrant
|
||||||
|
func CalculateSafetyFactor(q1, q2, q3, q4 int) int {
|
||||||
|
return q1 * q2 * q3 * q4
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisplayGrid displays the current state of the grid
|
||||||
|
func DisplayGrid(robots []Robot, width, height int) {
|
||||||
|
grid := make([][]rune, height)
|
||||||
|
for i := range grid {
|
||||||
|
grid[i] = make([]rune, width)
|
||||||
|
for j := range grid[i] {
|
||||||
|
grid[i][j] = '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, r := range robots {
|
||||||
|
grid[r.py][r.px] = '#'
|
||||||
|
}
|
||||||
|
for _, row := range grid {
|
||||||
|
fmt.Println(string(row))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindEasterEgg determines the fewest number of seconds that must elapse for the robots to display the Easter egg
|
||||||
|
func FindEasterEgg(robots []Robot, width, height int) int {
|
||||||
|
smallestArea := width * height
|
||||||
|
bestTime := 0
|
||||||
|
for t := 6285; t < 6286; t++ { // Large upper limit to search
|
||||||
|
// Update robot positions
|
||||||
|
for i := range robots {
|
||||||
|
robots[i].UpdatePosition(width, height)
|
||||||
|
}
|
||||||
|
// Calculate the bounding box of all robot positions
|
||||||
|
minX, minY := width, height
|
||||||
|
maxX, maxY := 0, 0
|
||||||
|
for _, r := range robots {
|
||||||
|
if r.px < minX {
|
||||||
|
minX = r.px
|
||||||
|
}
|
||||||
|
if r.px > maxX {
|
||||||
|
maxX = r.px
|
||||||
|
}
|
||||||
|
if r.py < minY {
|
||||||
|
minY = r.py
|
||||||
|
}
|
||||||
|
if r.py > maxY {
|
||||||
|
maxY = r.py
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
area := (maxX - minX + 1) * (maxY - minY + 1)
|
||||||
|
if area < smallestArea {
|
||||||
|
smallestArea = area
|
||||||
|
bestTime = t + 1
|
||||||
|
fmt.Printf("Time: %d\n", bestTime)
|
||||||
|
DisplayGrid(robots, width, height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bestTime
|
||||||
|
}
|
||||||
23
2024/gareth/day14/day14_test.go
Normal file
23
2024/gareth/day14/day14_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package day14
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`p=0,4 v=3,-3
|
||||||
|
p=6,3 v=-1,-3
|
||||||
|
p=10,3 v=-1,2
|
||||||
|
p=2,0 v=2,-1
|
||||||
|
p=0,0 v=1,3
|
||||||
|
p=3,0 v=-2,-2
|
||||||
|
p=7,6 v=-1,-3
|
||||||
|
p=3,0 v=-1,-2
|
||||||
|
p=9,3 v=2,3
|
||||||
|
p=7,3 v=-1,2
|
||||||
|
p=2,4 v=2,-3
|
||||||
|
p=9,5 v=-3,-3`)
|
||||||
|
assert.Equal(t, 12, r)
|
||||||
|
}
|
||||||
500
2024/gareth/day14/input.txt
Normal file
500
2024/gareth/day14/input.txt
Normal file
@@ -0,0 +1,500 @@
|
|||||||
|
p=38,76 v=-61,88
|
||||||
|
p=28,22 v=-43,-40
|
||||||
|
p=76,78 v=-98,87
|
||||||
|
p=39,56 v=10,96
|
||||||
|
p=38,0 v=79,-15
|
||||||
|
p=6,44 v=-88,53
|
||||||
|
p=40,80 v=-83,31
|
||||||
|
p=11,2 v=28,-31
|
||||||
|
p=41,91 v=-86,-48
|
||||||
|
p=8,55 v=-81,95
|
||||||
|
p=77,19 v=3,-90
|
||||||
|
p=94,73 v=-59,42
|
||||||
|
p=51,53 v=35,48
|
||||||
|
p=12,52 v=72,6
|
||||||
|
p=62,61 v=96,47
|
||||||
|
p=78,62 v=47,-57
|
||||||
|
p=39,54 v=53,50
|
||||||
|
p=1,43 v=-64,-46
|
||||||
|
p=9,21 v=28,-36
|
||||||
|
p=92,79 v=67,-47
|
||||||
|
p=6,15 v=-58,-48
|
||||||
|
p=54,67 v=99,-38
|
||||||
|
p=96,99 v=-55,30
|
||||||
|
p=90,44 v=-10,-8
|
||||||
|
p=23,84 v=20,77
|
||||||
|
p=5,84 v=28,88
|
||||||
|
p=55,20 v=-31,-36
|
||||||
|
p=84,43 v=-37,-41
|
||||||
|
p=12,75 v=-38,30
|
||||||
|
p=39,2 v=-12,-29
|
||||||
|
p=74,14 v=56,-81
|
||||||
|
p=63,53 v=22,-53
|
||||||
|
p=51,28 v=9,-90
|
||||||
|
p=53,72 v=48,-61
|
||||||
|
p=33,42 v=-43,23
|
||||||
|
p=75,18 v=-89,-37
|
||||||
|
p=38,83 v=27,38
|
||||||
|
p=69,31 v=61,80
|
||||||
|
p=73,3 v=-45,74
|
||||||
|
p=39,29 v=92,17
|
||||||
|
p=78,45 v=-23,-47
|
||||||
|
p=48,59 v=-57,38
|
||||||
|
p=2,41 v=-71,-93
|
||||||
|
p=30,13 v=36,-82
|
||||||
|
p=37,57 v=25,13
|
||||||
|
p=51,73 v=56,-98
|
||||||
|
p=76,78 v=38,91
|
||||||
|
p=56,49 v=22,55
|
||||||
|
p=34,47 v=10,84
|
||||||
|
p=83,93 v=81,-16
|
||||||
|
p=14,70 v=71,-50
|
||||||
|
p=97,74 v=-4,70
|
||||||
|
p=33,8 v=93,-35
|
||||||
|
p=39,70 v=-2,19
|
||||||
|
p=94,63 v=20,44
|
||||||
|
p=86,4 v=-33,19
|
||||||
|
p=17,67 v=26,44
|
||||||
|
p=39,2 v=-70,-25
|
||||||
|
p=47,56 v=-79,-55
|
||||||
|
p=5,98 v=86,-75
|
||||||
|
p=53,21 v=79,-89
|
||||||
|
p=53,85 v=61,73
|
||||||
|
p=46,32 v=66,54
|
||||||
|
p=30,75 v=49,-73
|
||||||
|
p=44,81 v=-61,-69
|
||||||
|
p=82,66 v=-72,-6
|
||||||
|
p=89,76 v=-13,98
|
||||||
|
p=57,87 v=30,36
|
||||||
|
p=12,41 v=59,-40
|
||||||
|
p=36,56 v=10,-61
|
||||||
|
p=60,80 v=48,39
|
||||||
|
p=50,75 v=-44,42
|
||||||
|
p=66,56 v=-93,-1
|
||||||
|
p=57,96 v=83,-79
|
||||||
|
p=98,88 v=-15,-16
|
||||||
|
p=0,63 v=59,44
|
||||||
|
p=90,27 v=29,-40
|
||||||
|
p=21,60 v=-86,2
|
||||||
|
p=85,13 v=11,61
|
||||||
|
p=92,77 v=24,-34
|
||||||
|
p=16,24 v=80,4
|
||||||
|
p=47,8 v=-79,-49
|
||||||
|
p=1,28 v=-82,-48
|
||||||
|
p=80,55 v=6,-72
|
||||||
|
p=60,94 v=-67,-15
|
||||||
|
p=83,90 v=-98,78
|
||||||
|
p=3,75 v=46,-66
|
||||||
|
p=93,40 v=15,11
|
||||||
|
p=52,37 v=48,7
|
||||||
|
p=23,4 v=-47,25
|
||||||
|
p=46,43 v=57,-98
|
||||||
|
p=23,12 v=-98,-36
|
||||||
|
p=11,42 v=-83,50
|
||||||
|
p=80,33 v=25,54
|
||||||
|
p=59,95 v=-1,36
|
||||||
|
p=55,67 v=-44,-60
|
||||||
|
p=90,80 v=83,-39
|
||||||
|
p=57,61 v=-1,96
|
||||||
|
p=51,79 v=31,39
|
||||||
|
p=28,89 v=85,35
|
||||||
|
p=12,98 v=28,-80
|
||||||
|
p=25,61 v=-95,-50
|
||||||
|
p=77,84 v=-37,78
|
||||||
|
p=50,80 v=66,89
|
||||||
|
p=93,32 v=-15,-45
|
||||||
|
p=30,4 v=-96,-29
|
||||||
|
p=81,95 v=14,-66
|
||||||
|
p=23,3 v=42,-16
|
||||||
|
p=33,69 v=-96,-10
|
||||||
|
p=28,23 v=-43,68
|
||||||
|
p=77,25 v=-45,-41
|
||||||
|
p=27,96 v=-69,-32
|
||||||
|
p=41,15 v=-53,-35
|
||||||
|
p=66,81 v=-22,5
|
||||||
|
p=5,15 v=13,-95
|
||||||
|
p=88,1 v=-59,-26
|
||||||
|
p=48,41 v=16,-19
|
||||||
|
p=88,75 v=33,46
|
||||||
|
p=21,9 v=-64,-86
|
||||||
|
p=36,4 v=-16,-95
|
||||||
|
p=68,22 v=-5,65
|
||||||
|
p=8,43 v=-34,46
|
||||||
|
p=71,68 v=-49,-59
|
||||||
|
p=37,92 v=-48,-18
|
||||||
|
p=59,43 v=-21,-10
|
||||||
|
p=69,31 v=30,58
|
||||||
|
p=90,77 v=46,-74
|
||||||
|
p=42,42 v=-76,20
|
||||||
|
p=58,34 v=78,55
|
||||||
|
p=18,10 v=33,2
|
||||||
|
p=23,92 v=45,-69
|
||||||
|
p=23,45 v=-32,27
|
||||||
|
p=63,50 v=39,-96
|
||||||
|
p=8,72 v=-34,85
|
||||||
|
p=22,102 v=-69,26
|
||||||
|
p=73,14 v=-45,-38
|
||||||
|
p=65,54 v=-51,68
|
||||||
|
p=99,29 v=-16,67
|
||||||
|
p=29,60 v=15,-19
|
||||||
|
p=85,76 v=-54,80
|
||||||
|
p=21,23 v=-3,-47
|
||||||
|
p=9,37 v=94,-44
|
||||||
|
p=99,77 v=48,80
|
||||||
|
p=48,47 v=18,56
|
||||||
|
p=26,61 v=36,-57
|
||||||
|
p=80,58 v=56,90
|
||||||
|
p=37,6 v=53,-90
|
||||||
|
p=47,15 v=53,60
|
||||||
|
p=4,79 v=70,52
|
||||||
|
p=35,8 v=31,12
|
||||||
|
p=18,8 v=25,-30
|
||||||
|
p=80,38 v=33,45
|
||||||
|
p=23,26 v=-69,61
|
||||||
|
p=10,35 v=-78,-96
|
||||||
|
p=53,17 v=48,-34
|
||||||
|
p=24,45 v=72,-2
|
||||||
|
p=65,75 v=-1,-38
|
||||||
|
p=5,72 v=-49,39
|
||||||
|
p=63,87 v=-27,-16
|
||||||
|
p=0,46 v=-34,73
|
||||||
|
p=14,46 v=55,-15
|
||||||
|
p=28,70 v=45,92
|
||||||
|
p=29,30 v=89,10
|
||||||
|
p=98,31 v=-46,-89
|
||||||
|
p=1,85 v=-77,82
|
||||||
|
p=30,79 v=-43,28
|
||||||
|
p=29,70 v=-81,65
|
||||||
|
p=51,97 v=13,-25
|
||||||
|
p=76,19 v=-23,18
|
||||||
|
p=36,83 v=-17,91
|
||||||
|
p=52,34 v=-39,-98
|
||||||
|
p=35,46 v=-43,55
|
||||||
|
p=97,13 v=-99,-26
|
||||||
|
p=40,26 v=27,13
|
||||||
|
p=18,38 v=89,57
|
||||||
|
p=45,57 v=-79,-52
|
||||||
|
p=86,76 v=-54,-64
|
||||||
|
p=12,38 v=28,55
|
||||||
|
p=6,56 v=-86,97
|
||||||
|
p=85,100 v=-41,-22
|
||||||
|
p=4,34 v=28,-95
|
||||||
|
p=89,33 v=-4,-73
|
||||||
|
p=82,20 v=-33,-15
|
||||||
|
p=98,5 v=31,43
|
||||||
|
p=85,81 v=73,88
|
||||||
|
p=13,42 v=-90,-49
|
||||||
|
p=93,60 v=-91,-64
|
||||||
|
p=56,7 v=-5,64
|
||||||
|
p=9,5 v=45,76
|
||||||
|
p=61,4 v=74,86
|
||||||
|
p=23,53 v=-7,3
|
||||||
|
p=89,21 v=-38,-74
|
||||||
|
p=13,44 v=-86,10
|
||||||
|
p=96,62 v=-11,96
|
||||||
|
p=5,98 v=-22,3
|
||||||
|
p=26,26 v=-73,-93
|
||||||
|
p=52,95 v=-5,42
|
||||||
|
p=62,50 v=-57,-7
|
||||||
|
p=11,2 v=41,-77
|
||||||
|
p=23,73 v=-2,-97
|
||||||
|
p=34,77 v=-47,-71
|
||||||
|
p=91,58 v=99,43
|
||||||
|
p=41,74 v=-53,42
|
||||||
|
p=75,102 v=55,-81
|
||||||
|
p=89,95 v=30,8
|
||||||
|
p=76,28 v=-80,12
|
||||||
|
p=82,27 v=-43,77
|
||||||
|
p=62,63 v=-97,21
|
||||||
|
p=94,73 v=-58,14
|
||||||
|
p=13,35 v=-47,-46
|
||||||
|
p=56,0 v=61,25
|
||||||
|
p=94,39 v=11,8
|
||||||
|
p=96,53 v=77,-53
|
||||||
|
p=23,78 v=-43,-7
|
||||||
|
p=24,51 v=-74,-86
|
||||||
|
p=77,33 v=60,8
|
||||||
|
p=84,71 v=-76,19
|
||||||
|
p=78,96 v=82,3
|
||||||
|
p=61,92 v=-58,-30
|
||||||
|
p=9,75 v=94,-34
|
||||||
|
p=89,13 v=7,-26
|
||||||
|
p=16,67 v=-25,96
|
||||||
|
p=95,43 v=-25,-54
|
||||||
|
p=39,62 v=18,-40
|
||||||
|
p=41,36 v=17,-65
|
||||||
|
p=2,42 v=86,-10
|
||||||
|
p=29,54 v=55,-2
|
||||||
|
p=51,74 v=-44,92
|
||||||
|
p=75,40 v=-36,-96
|
||||||
|
p=60,15 v=-93,-84
|
||||||
|
p=44,33 v=44,8
|
||||||
|
p=88,51 v=85,-94
|
||||||
|
p=26,60 v=43,62
|
||||||
|
p=94,22 v=-81,-98
|
||||||
|
p=4,50 v=-94,-96
|
||||||
|
p=87,47 v=-55,3
|
||||||
|
p=15,80 v=33,-14
|
||||||
|
p=4,48 v=-24,-48
|
||||||
|
p=57,36 v=-18,-98
|
||||||
|
p=87,12 v=76,63
|
||||||
|
p=53,17 v=-91,-81
|
||||||
|
p=17,96 v=53,6
|
||||||
|
p=91,40 v=95,-46
|
||||||
|
p=23,28 v=-55,55
|
||||||
|
p=81,7 v=-54,16
|
||||||
|
p=62,102 v=-97,-77
|
||||||
|
p=42,31 v=80,-41
|
||||||
|
p=99,53 v=-72,57
|
||||||
|
p=17,29 v=98,58
|
||||||
|
p=24,57 v=84,-48
|
||||||
|
p=98,101 v=-33,-30
|
||||||
|
p=77,82 v=-36,-25
|
||||||
|
p=44,8 v=83,18
|
||||||
|
p=27,35 v=-27,16
|
||||||
|
p=95,58 v=-29,52
|
||||||
|
p=87,40 v=60,-91
|
||||||
|
p=66,1 v=17,24
|
||||||
|
p=17,11 v=63,21
|
||||||
|
p=67,77 v=-23,-11
|
||||||
|
p=91,30 v=-59,64
|
||||||
|
p=22,34 v=7,84
|
||||||
|
p=55,90 v=48,29
|
||||||
|
p=45,45 v=31,50
|
||||||
|
p=12,34 v=65,-86
|
||||||
|
p=40,48 v=18,-1
|
||||||
|
p=39,42 v=75,11
|
||||||
|
p=28,27 v=63,-49
|
||||||
|
p=93,44 v=-81,3
|
||||||
|
p=8,78 v=-51,-15
|
||||||
|
p=6,37 v=-51,-42
|
||||||
|
p=73,89 v=-45,23
|
||||||
|
p=2,80 v=-23,50
|
||||||
|
p=93,37 v=55,-44
|
||||||
|
p=16,52 v=-54,35
|
||||||
|
p=15,17 v=-33,74
|
||||||
|
p=84,37 v=-6,-48
|
||||||
|
p=13,47 v=50,-48
|
||||||
|
p=88,34 v=-79,-39
|
||||||
|
p=16,68 v=50,94
|
||||||
|
p=20,78 v=-99,29
|
||||||
|
p=100,20 v=77,64
|
||||||
|
p=79,2 v=-91,30
|
||||||
|
p=52,0 v=-95,-86
|
||||||
|
p=4,84 v=79,35
|
||||||
|
p=13,74 v=19,-66
|
||||||
|
p=57,55 v=-9,-63
|
||||||
|
p=21,30 v=19,-94
|
||||||
|
p=50,37 v=-66,4
|
||||||
|
p=9,56 v=94,95
|
||||||
|
p=91,59 v=55,-65
|
||||||
|
p=77,15 v=34,-33
|
||||||
|
p=5,100 v=81,-26
|
||||||
|
p=26,96 v=-34,83
|
||||||
|
p=36,64 v=-44,94
|
||||||
|
p=37,65 v=-70,51
|
||||||
|
p=74,6 v=25,-93
|
||||||
|
p=33,78 v=-17,-48
|
||||||
|
p=0,33 v=-6,-39
|
||||||
|
p=3,55 v=-11,96
|
||||||
|
p=32,19 v=-8,-33
|
||||||
|
p=60,53 v=-5,-55
|
||||||
|
p=75,62 v=56,45
|
||||||
|
p=74,71 v=12,-66
|
||||||
|
p=50,74 v=-53,91
|
||||||
|
p=24,90 v=-19,-57
|
||||||
|
p=58,53 v=31,5
|
||||||
|
p=13,95 v=-33,20
|
||||||
|
p=30,98 v=41,-70
|
||||||
|
p=54,78 v=71,-43
|
||||||
|
p=78,73 v=26,53
|
||||||
|
p=66,30 v=-49,60
|
||||||
|
p=81,87 v=-24,-15
|
||||||
|
p=28,27 v=-31,11
|
||||||
|
p=75,18 v=-89,10
|
||||||
|
p=76,82 v=-89,-66
|
||||||
|
p=44,65 v=-17,98
|
||||||
|
p=17,42 v=-7,-5
|
||||||
|
p=75,92 v=-54,32
|
||||||
|
p=95,10 v=-28,-76
|
||||||
|
p=20,36 v=-22,-62
|
||||||
|
p=100,0 v=11,21
|
||||||
|
p=37,39 v=5,-46
|
||||||
|
p=80,50 v=-63,7
|
||||||
|
p=77,28 v=-98,2
|
||||||
|
p=61,41 v=-1,-40
|
||||||
|
p=88,78 v=95,-17
|
||||||
|
p=83,1 v=47,-30
|
||||||
|
p=47,67 v=-30,-9
|
||||||
|
p=14,81 v=-38,82
|
||||||
|
p=40,97 v=-31,76
|
||||||
|
p=76,27 v=37,-70
|
||||||
|
p=25,73 v=80,35
|
||||||
|
p=88,84 v=-33,77
|
||||||
|
p=60,71 v=83,35
|
||||||
|
p=14,93 v=-3,-25
|
||||||
|
p=40,45 v=-35,4
|
||||||
|
p=34,35 v=15,19
|
||||||
|
p=87,100 v=90,-66
|
||||||
|
p=20,90 v=-42,-68
|
||||||
|
p=90,44 v=50,-52
|
||||||
|
p=43,77 v=31,89
|
||||||
|
p=99,81 v=33,-12
|
||||||
|
p=28,35 v=58,-37
|
||||||
|
p=37,52 v=57,6
|
||||||
|
p=48,65 v=-66,23
|
||||||
|
p=63,21 v=39,-35
|
||||||
|
p=91,77 v=-15,-70
|
||||||
|
p=27,28 v=93,-94
|
||||||
|
p=18,61 v=-99,38
|
||||||
|
p=56,36 v=-98,81
|
||||||
|
p=90,75 v=-72,-67
|
||||||
|
p=86,21 v=-13,-46
|
||||||
|
p=20,88 v=89,-74
|
||||||
|
p=17,41 v=-82,-98
|
||||||
|
p=28,65 v=45,-72
|
||||||
|
p=85,15 v=35,41
|
||||||
|
p=39,43 v=-2,-36
|
||||||
|
p=93,72 v=-94,91
|
||||||
|
p=90,73 v=-64,77
|
||||||
|
p=83,43 v=-94,-99
|
||||||
|
p=50,59 v=-49,51
|
||||||
|
p=58,25 v=13,-36
|
||||||
|
p=25,102 v=-44,-54
|
||||||
|
p=100,86 v=16,-23
|
||||||
|
p=45,42 v=21,-90
|
||||||
|
p=9,29 v=-13,18
|
||||||
|
p=24,41 v=1,-47
|
||||||
|
p=69,33 v=-58,55
|
||||||
|
p=80,52 v=52,-2
|
||||||
|
p=82,77 v=82,-11
|
||||||
|
p=86,78 v=-41,-69
|
||||||
|
p=89,58 v=69,-13
|
||||||
|
p=12,91 v=-55,-65
|
||||||
|
p=69,40 v=-93,59
|
||||||
|
p=8,26 v=2,19
|
||||||
|
p=21,47 v=19,3
|
||||||
|
p=38,20 v=25,-83
|
||||||
|
p=20,99 v=54,31
|
||||||
|
p=20,74 v=-14,-30
|
||||||
|
p=51,83 v=-40,24
|
||||||
|
p=61,30 v=-27,-94
|
||||||
|
p=84,19 v=-28,69
|
||||||
|
p=28,33 v=-65,3
|
||||||
|
p=58,91 v=-93,-18
|
||||||
|
p=33,78 v=22,92
|
||||||
|
p=86,53 v=63,-43
|
||||||
|
p=53,79 v=-26,-42
|
||||||
|
p=83,16 v=94,56
|
||||||
|
p=21,0 v=-64,-35
|
||||||
|
p=48,80 v=-97,79
|
||||||
|
p=62,18 v=29,71
|
||||||
|
p=17,13 v=-69,-36
|
||||||
|
p=1,93 v=19,75
|
||||||
|
p=7,75 v=41,93
|
||||||
|
p=65,61 v=-45,65
|
||||||
|
p=56,71 v=92,-63
|
||||||
|
p=71,102 v=-53,-21
|
||||||
|
p=64,79 v=96,49
|
||||||
|
p=40,13 v=-74,-84
|
||||||
|
p=28,71 v=93,91
|
||||||
|
p=43,68 v=-39,-6
|
||||||
|
p=10,40 v=63,55
|
||||||
|
p=73,0 v=-97,-82
|
||||||
|
p=26,38 v=85,-27
|
||||||
|
p=27,94 v=36,-79
|
||||||
|
p=1,99 v=-82,-30
|
||||||
|
p=66,96 v=-23,31
|
||||||
|
p=78,21 v=96,16
|
||||||
|
p=10,93 v=-51,-76
|
||||||
|
p=76,87 v=78,80
|
||||||
|
p=13,20 v=-38,68
|
||||||
|
p=31,42 v=-43,5
|
||||||
|
p=56,10 v=-53,-33
|
||||||
|
p=76,61 v=34,-4
|
||||||
|
p=73,2 v=-36,74
|
||||||
|
p=93,83 v=15,-19
|
||||||
|
p=76,50 v=20,-51
|
||||||
|
p=27,53 v=36,-51
|
||||||
|
p=93,97 v=50,72
|
||||||
|
p=59,22 v=87,21
|
||||||
|
p=95,22 v=-29,66
|
||||||
|
p=56,35 v=79,10
|
||||||
|
p=60,38 v=17,-94
|
||||||
|
p=67,41 v=-5,6
|
||||||
|
p=97,71 v=-73,35
|
||||||
|
p=26,10 v=-73,74
|
||||||
|
p=74,71 v=5,64
|
||||||
|
p=36,91 v=84,-17
|
||||||
|
p=38,91 v=67,33
|
||||||
|
p=19,64 v=41,-9
|
||||||
|
p=89,15 v=-59,66
|
||||||
|
p=5,94 v=94,-27
|
||||||
|
p=92,21 v=7,-87
|
||||||
|
p=87,64 v=-28,-5
|
||||||
|
p=22,6 v=-95,25
|
||||||
|
p=59,42 v=-51,-7
|
||||||
|
p=50,95 v=88,29
|
||||||
|
p=59,91 v=73,-21
|
||||||
|
p=52,42 v=-75,56
|
||||||
|
p=10,39 v=-30,7
|
||||||
|
p=88,79 v=29,-62
|
||||||
|
p=31,89 v=-21,-82
|
||||||
|
p=43,60 v=4,52
|
||||||
|
p=2,76 v=-68,-15
|
||||||
|
p=13,71 v=-38,97
|
||||||
|
p=93,38 v=1,-95
|
||||||
|
p=53,99 v=10,16
|
||||||
|
p=94,72 v=-98,30
|
||||||
|
p=1,3 v=37,-82
|
||||||
|
p=68,78 v=55,18
|
||||||
|
p=1,78 v=42,-7
|
||||||
|
p=80,84 v=52,-26
|
||||||
|
p=75,46 v=-87,-20
|
||||||
|
p=71,27 v=95,-39
|
||||||
|
p=90,18 v=73,11
|
||||||
|
p=99,3 v=62,52
|
||||||
|
p=39,88 v=-80,-93
|
||||||
|
p=85,32 v=69,-40
|
||||||
|
p=72,23 v=-28,-75
|
||||||
|
p=22,59 v=98,-7
|
||||||
|
p=69,76 v=12,93
|
||||||
|
p=56,59 v=30,50
|
||||||
|
p=80,92 v=-49,-80
|
||||||
|
p=4,40 v=-77,-50
|
||||||
|
p=90,60 v=40,-28
|
||||||
|
p=6,79 v=9,56
|
||||||
|
p=63,47 v=57,-59
|
||||||
|
p=33,62 v=22,37
|
||||||
|
p=74,27 v=78,70
|
||||||
|
p=26,101 v=-43,-49
|
||||||
|
p=1,24 v=-29,-38
|
||||||
|
p=73,90 v=56,79
|
||||||
|
p=5,90 v=-20,-75
|
||||||
|
p=16,35 v=94,8
|
||||||
|
p=96,93 v=4,58
|
||||||
|
p=61,43 v=4,4
|
||||||
|
p=13,68 v=76,94
|
||||||
|
p=5,29 v=86,-95
|
||||||
|
p=32,81 v=39,-85
|
||||||
|
p=94,42 v=-37,55
|
||||||
|
p=80,20 v=60,22
|
||||||
|
p=43,94 v=57,-19
|
||||||
|
p=93,4 v=51,-26
|
||||||
|
p=12,4 v=62,-58
|
||||||
|
p=87,74 v=-98,-64
|
||||||
|
p=81,41 v=-26,69
|
||||||
|
p=30,54 v=-30,-13
|
||||||
|
p=73,4 v=21,-30
|
||||||
|
p=68,35 v=-49,-44
|
||||||
|
p=47,2 v=19,-70
|
||||||
|
p=92,100 v=33,79
|
||||||
|
p=81,11 v=73,-83
|
||||||
|
p=46,75 v=-62,-69
|
||||||
|
p=48,56 v=-13,-56
|
||||||
|
p=7,84 v=15,30
|
||||||
|
p=92,10 v=28,69
|
||||||
|
p=15,31 v=-87,61
|
||||||
|
p=95,0 v=33,79
|
||||||
|
p=3,61 v=-37,-50
|
||||||
|
p=73,95 v=96,20
|
||||||
156
2024/gareth/day18/day18.go
Normal file
156
2024/gareth/day18/day18.go
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
package day18
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/heap"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Point struct {
|
||||||
|
x, y int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Item represents a node in the priority queue.
|
||||||
|
type Item struct {
|
||||||
|
point Point
|
||||||
|
distance int
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := parseInput(input, 1024)
|
||||||
|
_, distance := dijkstra(grid)
|
||||||
|
return distance
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
numLines := len(lines)
|
||||||
|
for i := 1; i <= numLines; i++ {
|
||||||
|
grid := parseInput(input, i)
|
||||||
|
_, distance := dijkstra(grid)
|
||||||
|
if distance == -1 {
|
||||||
|
println(lines[i-1])
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string, upToLine int) [][]rune {
|
||||||
|
grid := make([][]rune, 71)
|
||||||
|
for i := range grid {
|
||||||
|
grid[i] = make([]rune, 71)
|
||||||
|
for j := range grid[i] {
|
||||||
|
grid[i][j] = '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
|
||||||
|
for index, line := range lines {
|
||||||
|
if index == upToLine {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
cords := strings.Split(strings.TrimSpace(line), ",")
|
||||||
|
x, _ := strconv.Atoi(cords[0])
|
||||||
|
y, _ := strconv.Atoi(cords[1])
|
||||||
|
grid[x][y] = '#'
|
||||||
|
}
|
||||||
|
return grid
|
||||||
|
}
|
||||||
|
|
||||||
|
// PriorityQueue implements a priority queue for Dijkstra's algorithm.
|
||||||
|
type PriorityQueue []*Item
|
||||||
|
|
||||||
|
func (pq PriorityQueue) Len() int { return len(pq) }
|
||||||
|
func (pq PriorityQueue) Less(i, j int) bool {
|
||||||
|
return pq[i].distance < pq[j].distance
|
||||||
|
}
|
||||||
|
func (pq PriorityQueue) Swap(i, j int) {
|
||||||
|
pq[i], pq[j] = pq[j], pq[i]
|
||||||
|
pq[i].index = i
|
||||||
|
pq[j].index = j
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Push(x interface{}) {
|
||||||
|
n := len(*pq)
|
||||||
|
item := x.(*Item)
|
||||||
|
item.index = n
|
||||||
|
*pq = append(*pq, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Pop() interface{} {
|
||||||
|
old := *pq
|
||||||
|
n := len(old)
|
||||||
|
item := old[n-1]
|
||||||
|
item.index = -1
|
||||||
|
*pq = old[0 : n-1]
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
|
||||||
|
func isValid(grid [][]rune, x, y int) bool {
|
||||||
|
return x >= 0 && x < len(grid) && y >= 0 && y < len(grid[0]) && grid[x][y] == '.'
|
||||||
|
}
|
||||||
|
|
||||||
|
func dijkstra(grid [][]rune) ([][]rune, int) {
|
||||||
|
directions := []Point{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
|
||||||
|
rows, cols := len(grid), len(grid[0])
|
||||||
|
|
||||||
|
// Validate start and end points
|
||||||
|
if grid[0][0] != '.' || grid[rows-1][cols-1] != '.' {
|
||||||
|
return grid, -1 // No path if start or end is not valid
|
||||||
|
}
|
||||||
|
|
||||||
|
dist := make([][]int, rows)
|
||||||
|
for i := range dist {
|
||||||
|
dist[i] = make([]int, cols)
|
||||||
|
for j := range dist[i] {
|
||||||
|
dist[i][j] = 1 << 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pq := &PriorityQueue{}
|
||||||
|
heap.Init(pq)
|
||||||
|
heap.Push(pq, &Item{point: Point{0, 0}, distance: 0})
|
||||||
|
dist[0][0] = 0
|
||||||
|
|
||||||
|
path := make([][]Point, rows)
|
||||||
|
for i := range path {
|
||||||
|
path[i] = make([]Point, cols)
|
||||||
|
}
|
||||||
|
|
||||||
|
for pq.Len() > 0 {
|
||||||
|
item := heap.Pop(pq).(*Item)
|
||||||
|
x, y := item.point.x, item.point.y
|
||||||
|
if x == rows-1 && y == cols-1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
for _, dir := range directions {
|
||||||
|
nx, ny := x+dir.x, y+dir.y
|
||||||
|
if isValid(grid, nx, ny) {
|
||||||
|
newDist := dist[x][y] + 1
|
||||||
|
if newDist < dist[nx][ny] {
|
||||||
|
dist[nx][ny] = newDist
|
||||||
|
heap.Push(pq, &Item{point: Point{nx, ny}, distance: newDist})
|
||||||
|
path[nx][ny] = Point{x, y}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if no path exists
|
||||||
|
if dist[rows-1][cols-1] == 1<<30 {
|
||||||
|
return grid, -1 // No path found
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reconstruct the path
|
||||||
|
x, y := rows-1, cols-1
|
||||||
|
for x != 0 || y != 0 {
|
||||||
|
grid[x][y] = 'O'
|
||||||
|
x, y = path[x][y].x, path[x][y].y
|
||||||
|
}
|
||||||
|
grid[0][0] = 'O'
|
||||||
|
|
||||||
|
return grid, dist[rows-1][cols-1]
|
||||||
|
}
|
||||||
65
2024/gareth/day18/day18_test.go
Normal file
65
2024/gareth/day18/day18_test.go
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
package day18
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`5,4
|
||||||
|
4,2
|
||||||
|
4,5
|
||||||
|
3,0
|
||||||
|
2,1
|
||||||
|
6,3
|
||||||
|
2,4
|
||||||
|
1,5
|
||||||
|
0,6
|
||||||
|
3,3
|
||||||
|
2,6
|
||||||
|
5,1
|
||||||
|
1,2
|
||||||
|
5,5
|
||||||
|
2,5
|
||||||
|
6,5
|
||||||
|
1,4
|
||||||
|
0,4
|
||||||
|
6,4
|
||||||
|
1,1
|
||||||
|
6,1
|
||||||
|
1,0
|
||||||
|
0,5
|
||||||
|
1,6
|
||||||
|
2,0`)
|
||||||
|
assert.Equal(t, 22, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`5,4
|
||||||
|
4,2
|
||||||
|
4,5
|
||||||
|
3,0
|
||||||
|
2,1
|
||||||
|
6,3
|
||||||
|
2,4
|
||||||
|
1,5
|
||||||
|
0,6
|
||||||
|
3,3
|
||||||
|
2,6
|
||||||
|
5,1
|
||||||
|
1,2
|
||||||
|
5,5
|
||||||
|
2,5
|
||||||
|
6,5
|
||||||
|
1,4
|
||||||
|
0,4
|
||||||
|
6,4
|
||||||
|
1,1
|
||||||
|
6,1
|
||||||
|
1,0
|
||||||
|
0,5
|
||||||
|
1,6
|
||||||
|
2,0`)
|
||||||
|
assert.Equal(t, 0, r)
|
||||||
|
}
|
||||||
3450
2024/gareth/day18/input.txt
Normal file
3450
2024/gareth/day18/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
90
2024/gareth/day19/day19.go
Normal file
90
2024/gareth/day19/day19.go
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
package day19
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
towelPatterns, designs := parseInput(input)
|
||||||
|
result := countPossibleDesigns(towelPatterns, designs)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
towelPatterns, designs := parseInput(input)
|
||||||
|
result := totalArrangements(towelPatterns, designs)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([]string, []string) {
|
||||||
|
parts := strings.SplitN(input, "\n\n", 2)
|
||||||
|
towels := strings.Split(strings.ReplaceAll(parts[0], " ", ""), ",")
|
||||||
|
patterns := strings.Split(strings.TrimSpace(parts[1]), "\n")
|
||||||
|
return towels, patterns
|
||||||
|
}
|
||||||
|
|
||||||
|
func countPossibleDesigns(towelPatterns []string, designs []string) int {
|
||||||
|
memo := make(map[string]bool)
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
for _, design := range designs {
|
||||||
|
if canConstruct(design, towelPatterns, memo) {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func canConstruct(design string, patterns []string, memo map[string]bool) bool {
|
||||||
|
if design == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if val, found := memo[design]; found {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pattern := range patterns {
|
||||||
|
if strings.HasPrefix(design, pattern) {
|
||||||
|
remaining := design[len(pattern):]
|
||||||
|
if canConstruct(remaining, patterns, memo) {
|
||||||
|
memo[design] = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memo[design] = false
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func totalArrangements(towelPatterns []string, designs []string) int {
|
||||||
|
memo := make(map[string]int)
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for _, design := range designs {
|
||||||
|
total += countWays(design, towelPatterns, memo)
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func countWays(design string, patterns []string, memo map[string]int) int {
|
||||||
|
if design == "" {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
if val, found := memo[design]; found {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
totalWays := 0
|
||||||
|
for _, pattern := range patterns {
|
||||||
|
if strings.HasPrefix(design, pattern) {
|
||||||
|
remaining := design[len(pattern):]
|
||||||
|
totalWays += countWays(remaining, patterns, memo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memo[design] = totalWays
|
||||||
|
return totalWays
|
||||||
|
}
|
||||||
35
2024/gareth/day19/day19_test.go
Normal file
35
2024/gareth/day19/day19_test.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day19
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`r, wr, b, g, bwu, rb, gb, br
|
||||||
|
|
||||||
|
brwrr
|
||||||
|
bggr
|
||||||
|
gbbr
|
||||||
|
rrbgbr
|
||||||
|
ubwu
|
||||||
|
bwurrg
|
||||||
|
brgr
|
||||||
|
bbrgwb`)
|
||||||
|
assert.Equal(t, 6, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`r, wr, b, g, bwu, rb, gb, br
|
||||||
|
|
||||||
|
brwrr
|
||||||
|
bggr
|
||||||
|
gbbr
|
||||||
|
rrbgbr
|
||||||
|
ubwu
|
||||||
|
bwurrg
|
||||||
|
brgr
|
||||||
|
bbrgwb`)
|
||||||
|
assert.Equal(t, 16, r)
|
||||||
|
}
|
||||||
402
2024/gareth/day19/input.txt
Normal file
402
2024/gareth/day19/input.txt
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
rrgbg, rgguubg, rbru, rb, rrrw, wbu, gbgb, uururg, ubru, rugb, bbru, b, rggurg, wgru, bgrwb, rrgubg, ubrrbg, wgurru, rrrrw, rbrwu, wubwb, wrbbr, bgbu, brrww, brg, gbwu, wrubuur, gur, grbr, gruwrrbg, bgwr, wgugbgb, rwbru, wuwr, rrg, ruwg, rgwgr, ubu, wbr, bwg, gbu, bgrwrb, wwrw, bb, gr, rug, grr, ubwb, rbruwbu, guggug, ugu, rwbuu, bbur, wbrww, wubw, br, gruu, gwr, wrrwwu, wug, bgu, bgb, wugb, grb, rbbg, grgbwgb, rwu, bwrbb, uwrbbru, bbu, wrg, rwg, ggbgbg, wbwru, wrgrw, bburr, bgr, rgbg, bwwwugrb, uwu, rwuwrg, gguburu, uwubwu, wb, wgguug, ugrbw, rbgu, rwwu, ggbbgb, gw, wgg, rrw, uurg, uubg, bgurgb, uwgbr, wbrwu, rrbb, rww, bwgb, uugru, ggrbub, wubgw, rwwugr, uuwur, burbrg, bbr, ggb, wgr, gwbgw, rrbu, wuwwrwb, rbbr, uubw, buuu, ubbwggu, brr, urguww, uggwwgw, ugw, ug, rub, grrrwu, wurburgg, wwww, ruu, wrb, rrur, urggr, bwbwwwrg, wwbu, bbg, uwb, ggugu, gbbr, rbrgw, bg, bbuu, uwrgrg, ggbwrgw, wwgwugr, wgbwuwb, gbrwg, bbw, wwrgu, rgrwrbwb, wwwg, gugbgbg, bwrwub, rw, gbb, ggw, rrb, urrbbwb, urbu, grg, rbugggb, bruwg, uubgwgw, bw, uubgu, rru, rwww, gu, wrbrg, guu, wgu, ruuru, wubrrg, brugrg, uuggb, wrurg, rgb, rbu, urg, buw, grwbg, gwuw, grbbg, wuwu, gbgbbw, uugrwrww, wbguub, grrgbug, u, uug, uwr, wrwb, gbg, bru, wwg, bbwur, bbbbbbbw, bugbb, rwurrgr, wwb, ugbbw, bug, grgg, bgwgrrb, uggu, rurguru, wwr, rbw, ubwwgw, wrrw, rrbg, g, rgrbub, gruggw, bur, ubgb, bgg, uwur, ur, bbbwb, gwbu, wuww, uruuuubb, wbru, ugggg, gbuu, rgg, wwwug, gbrwgg, guwgr, urw, wbur, bu, rur, rrubr, ugb, ubrgrb, rbbgg, rbwrg, rggw, rguug, wwu, uur, wrrguggu, brbb, bwwwbr, guw, gugw, wgubwu, rrr, ub, ru, brrbbruw, bwwgrrbb, rubgu, uggwwg, wbb, rwr, r, ruuu, wbggg, wwwu, grbrb, rrrrr, ruwb, wuuw, rbbb, ugg, wbg, rguwr, wbw, wbuwg, ubbgrbb, urugu, rbubw, wrgwuuwu, grw, ubbbu, bwurb, rwuu, rgbbwur, urbuu, uww, wuw, bwurgu, wur, wuwwrbur, wwuu, wbgw, grbbbw, wuub, urb, wuuguuwg, wg, gwrgr, gbug, gbrbw, rwgg, brbbu, bwww, wrbbbu, wwgbggb, burug, gww, ubgrrb, bgw, rgbb, brb, wbuu, brw, ggrbrbwg, uwruw, wrgurrbb, guwrgu, rr, ugggrbr, bgrgg, urgbrbrb, wrw, wwubggu, ugurwg, grrg, bwrb, rrgwuuw, rrru, wurg, bgurwu, rgurbb, uuub, uuwb, rrrg, wrgrrrww, uwg, bgbguu, wrgwb, wwwru, rg, rrurwur, urrbb, bww, rrwwbbb, ubr, wgrbu, gru, ubg, gb, ggr, gbwbwru, uuw, rbb, gugwrg, gwb, bbb, rgrggw, uw, wggbbg, rwgubgb, gwbw, brrr, gugbwu, rwrr, uuuwbb, ugrrr, rgu, wubrwr, wrr, bwb, bwbgurb, rrrub, wub, rwgrug, rurb, gwrgrbr, rbrwbb, wwrgbg, urr, bwu, bwgu, rbuuw, bbub, wbbwubu, ggg, wbwwgwb, buwbg, wwwuru, rbg, gubugg, gbwb, www, rbr, ubur, grbbw, wgw, gbw, wgrw, rguuuu, rwb, gbrw, bbbb, gururbb, rbggwu, bub, bgbr, gurb, rrbgrb, rurwb, ugr, wgwrg, ruw, bgrr, gwu, gbr, uwugwru, wru, wr, ugbruw, grbubb, gwg, gwggurg, gugbr, ugubbgb, uwrw, uru, bwr, rgr, rbgrwg, buuw, ugbur, urgub, wurrrgww, rgguuwru, burr, rgw, rbruw, rwbwbbr, bwguw, uub, wgb, rgur, ubb, urwg, rwgww, wgub, rwwrgu, gg, rgug, gub, bggr, uuu, uu, rbug
|
||||||
|
|
||||||
|
bubrbbwggggbuuwbbrwwbbgbwrruugwbwgbwugbugrgu
|
||||||
|
wugwgwggbgubuuwugugrugwbrrwrbwwguburbbbggw
|
||||||
|
wbbrrwwbgwbgrrbwuuwrbbrwuwburgbwgwwuruwgbggubwug
|
||||||
|
ubrwbrbrggrwgbwbwwuwwguurbubwrbgwwrubbrwuwururwrr
|
||||||
|
gggrwbgwbwuwrubrguwggruubrggwgbrbguwrbrgwuurbwggrggrwwwrb
|
||||||
|
wuurugububruuwuggwuuwgbwwbrbwgrrrubwbuuwu
|
||||||
|
grrrwrwgwuwrburruuwwubgubwwwrrrwbwwbggrbrgr
|
||||||
|
gugrrubugrgrwgggggrbrbrwgguurrwurgrbuggrrbbwgwwwbuu
|
||||||
|
wubuwgwuwrrubbwuwwrburrwbrrubgurbggbbubrwrguwururgww
|
||||||
|
ubbrgurrbgbrbwguggugwrrrurwwwugbgrwwbuwrbggrgwwrgwbrwwuugb
|
||||||
|
bgwbwwwrrgugwwwugruwrbgrbrwbwbrwurbgruwgrggwruururb
|
||||||
|
guwurburwrguurwbggrrwwugurguwbubbrggrggrubrbbbrwwbgw
|
||||||
|
wgwuurwrgubguugbbgrrwbwgrwbwrwgbwrwburggrgbbuuw
|
||||||
|
grbgrruuwrgwwuburwggbubbbgwwrgrbubggwrwbuurwwbuubuwrgwb
|
||||||
|
bbwuubwuuwwubrwrwgbbrgwwurwbbwwburwuwwwubwrubguubggruwbbg
|
||||||
|
rrugrwurbugrrbggburwurbbgbuugwwrgbwrbrwbgbgrbwbuuww
|
||||||
|
gubwuubuwrrwgbuwbwguubuwwbwwrrwgbwbuwgguguwuwbwu
|
||||||
|
rrbbubrrrwubrrwwbrrbwrbwugbrbrggwbgrwgugwuugg
|
||||||
|
uurwrgruuwbwuubbrwubrwuuwwgubwgrwbbwgbwwwrbgugrbwururgurb
|
||||||
|
rbwbbrguggubguurrrrburuwrrubgbgrwrbugrrrgruburwb
|
||||||
|
grggbggwrubwwwwgrurwgbwuubguwrrrbgubruguub
|
||||||
|
rrbgbggwbwbrbrrwwgbbggrruwgggurgbrbrwubwuurrbbbwgrbrgrurr
|
||||||
|
gububbuuguwgbgrwgwgruburwrgwgbbrbrruururrrubrgggwwrbgb
|
||||||
|
ruurrgggbwbrggwggrurgrwgwbgburwwuwgubggubru
|
||||||
|
rbrrwgrgrrwrbwbrbggbwrwwuwrbwuwuuwbgbrwrgrwwgbuugbugg
|
||||||
|
wwbwrrbrrruuwrrwgggruwbubrrwrwuwwurwurbrbrrrw
|
||||||
|
wbguwwwwwguuuwuubrwgrgwguugrbrruwwrwgugbbb
|
||||||
|
rrggwbububgbgbguggwwgurbgbwuwwrwrgwuuwruggu
|
||||||
|
rbguubrrbrgwwgwbgrwrbrggwuwguuuwbwbwwbuwgr
|
||||||
|
wgbrrguuurgggrwgwgbrbguugrururubruugrrrrgbrgugbg
|
||||||
|
bgurwgugurwwbuugwurrgurwwrgwgubgrrgururubguuuwugbg
|
||||||
|
rwbbuwuwbgwbbwurbubwwugbgrbugrbuurbwwbrrwruwrrrwww
|
||||||
|
rbrburwwbwugrggwrrrruwwgbrgurbwwrrburbbggugbwbu
|
||||||
|
burgwubggburuuguuwrwbbgbuguguwwburububwrrgw
|
||||||
|
gggubgbgbwgrggrbrbrgguruurwbrrwubbrbruwgwbu
|
||||||
|
wggruwwgbwgguwgbgbggrbggbbbwbwwwrgrwwggwrgguuwwgwubgru
|
||||||
|
bbrwwruugwwbbbwububuuwruburbwbbgrwbburrgbbrub
|
||||||
|
gwggggwgguuburrgrgugrwgwrbbggggurgugugrgrgwwbr
|
||||||
|
gggbbugwgbwgwugrrgbwrrwurrgugburrggrruugurbrugrbbbg
|
||||||
|
gbwrwggbuggurrgubuguubrbgwbrubgwgrbrwubbgrr
|
||||||
|
bwuwgurrrgwwgguubggwwuurbbrbbwgwggwuwgbbwrwrburgr
|
||||||
|
wgrwwubbbwbbrggrgugwggbubwwburubwwuwgbbubbrrrrguubguwbuuu
|
||||||
|
rguuurgbrbrbuubgbuuggrwrwgrwugwrwgbwbbwbbgg
|
||||||
|
uugbgwguuggwgwrrggggwrbrgbguuguwrbrgwgbwwuubgugwwug
|
||||||
|
rbuuwwwrrrurgrgbrbbbrrbbwwwgwgwuwgbwggrbbwbruwwwwbg
|
||||||
|
wwgwuurrurrbbgwuwwbgrbbrbruugwwgugbrbrgguuwrugwuguurbgwrru
|
||||||
|
wrgwrrbrgugrrwguuguwburwuguuggguwwgbguwrbrbgubrg
|
||||||
|
wbrugwbubuggrruggbruwrgrwgugwgbwugugbwguwwuubbrwwubggw
|
||||||
|
grbgrrbrwggurbbrwugrwbbrurwrwbruuggwrggrrgrgwwbuwbgurb
|
||||||
|
gwwurrbwrgrgurwuugwbwrgrrrwwwrwguwbrbrrurwbwbuggrwb
|
||||||
|
wubguubgbbwuwbwgwwrrrgbuggwbwwwugrbbgrwubbrgurbuwwrgbur
|
||||||
|
uurgwruubgrbgubbwrubbggrububgrwwrubwwbrgbbu
|
||||||
|
uruuwrrbwbbugbbbrwguwbwuguurbwrurugwuwwguwbgb
|
||||||
|
wurbgrggbggbwwgwwbbgbbrurrrwggrwwrbrbrwrbg
|
||||||
|
ggwwrrbbwgubrgrgrgwuububrbrggbwwbubgbbgwubrgwrbururu
|
||||||
|
grrgubuwgwuwuururwwrbgwrgrurrbbrwbgruggrbggbwubrb
|
||||||
|
grbbrwbrgwgrgubuwbuwbrwuwugrbwuwwguwrbwbwwbuurgbwgw
|
||||||
|
uuguwrwggruurrggurrbgurbwgggugbgrrguugggwurgrrgubugbugugg
|
||||||
|
wrwugwwuwwbrubwwuruuwuwrugugbwwgugrrbuuguwggbrguuugwgwbw
|
||||||
|
uuggwbgurgurbgruruwwrrgubbuwwruruwrurbwugguwbwbgrgg
|
||||||
|
urwbggurwbwguurugbrbwbrbgwrgrbbrubrubburuwrburww
|
||||||
|
wbbrbwwwwrbruubggwrurgugbgbbuwgrrrrwugbwwwr
|
||||||
|
ubugrwubbgbrrrrgguugurgbubwgruuwrrgrbguuuw
|
||||||
|
rrruwrgwrggwburgugwbwwwbggubuwbwuuurrggwwbwrgwgwggbguubw
|
||||||
|
rgrgbrguruguwrggbrgruwrrbgbbbwugbrbgrbrrrggrubwuubwwbguw
|
||||||
|
rbggwgugrbwbrbwurbrugrwbbbwuuuwrwgbbbrwbuwgbwrgggurbwug
|
||||||
|
rgbuuwurbrwwuwbrugbggwbgbrrwguguwbubrubwguubbubgrgrwu
|
||||||
|
gwwwgbrguruuwggwugguuwwrbwgbgwuwuuwrgruguwrbugurrwruw
|
||||||
|
ubbgwurbrwrwggwubggugrgugwurwwbbbrbwbwgubw
|
||||||
|
wurggrrwbwgbwuguurgwgurgugwbguuurrubuwwggwgggwg
|
||||||
|
ugbrrwbgurbugwwwbggggggrugububwbguurruggrgrubuuwgurrwbbu
|
||||||
|
rbrurrwuuugbwwgubugbuugruwwurwrbrrbrbgwurwuuu
|
||||||
|
rrurrrwrwrrrbbbwguuwrruwguwuggbgguurrbbgggbwruurugurgb
|
||||||
|
rurwwgugrrrrwbwurugwrugbgwwbuwrbwuwuguggub
|
||||||
|
ubbgbrgggbuwggwgrgbgrgwbwggrrwbrggwgubuwgrwrbwrg
|
||||||
|
wggruuggrwbwrwrugwgbuwggwbgrbuggrgguggubbrbruuu
|
||||||
|
ggurbuwwbbubrguuubgwugugrgrguwrwbrubrgbwwrg
|
||||||
|
rgrgbbbbwwruubwuwguwgububwgruwgruggbgggbuggwwgwuwwgu
|
||||||
|
guwugugbrrbrruggwrbwbbgbburubwuuurbugubwrrug
|
||||||
|
grurwuuwrbguuwgruubwwbuubwbuurgugrgrwbggggwugbgruuurww
|
||||||
|
wuugguggwrrgruwgbbrrgbwbruubgrbbrburgugurgwggwgggrrur
|
||||||
|
grgbbrwuwwrrgggwwwuubuggwrbgrgbwrwwrrwrwguwggw
|
||||||
|
bwuuguwwrbbgrwubbbrwwwrrururbwgbrrrrwbrbgrbgbbu
|
||||||
|
urggrwbggwubgggrwwgwgbwbggwggrwrrrbgwrruwbbrbguuwrw
|
||||||
|
bubruuwrrbbruwbbugwuuwbwwbwbbuwubgrububwwrgwubgrggrruwggg
|
||||||
|
rurgwubgbwrrwuwuuggrrrwwgwrgburbggwwrubuwwuwgwruwurugw
|
||||||
|
wgbgururuggrbrugbwrguruugguubrgwrgguwgwruwbgrrr
|
||||||
|
uubwrbrgggrugurgbrwuugrwrwwwrgbrgwwugbwubwgrr
|
||||||
|
bggugwwurguwbgbwbwbuwwbrruubbgbbrbwbburugrr
|
||||||
|
wrwbrbgbbrwugrwbbwgbgggbrwurgrwubuggwurrrugu
|
||||||
|
grrwbgubrrwruubuugguurrrbrbubbrwgrbbguguub
|
||||||
|
uburuugrwbrurguwgrgwbrrrgrbbgbrbuwrrbugrgbrbbug
|
||||||
|
wgbuwuuwuruwuwuuwuwgggrbugburubggbgubwgbuuggbur
|
||||||
|
wuugrbbwuguwuwwuuruwrwbgurrbbwbwwrwuugbwgbuugbgwwrwwwgw
|
||||||
|
uruburbbbrwbuwrrbrbguuggbguruwwrruburwgwggr
|
||||||
|
rurbbururbwuwuwrrrbbbwbuuwwwuwrrggurgrrurgruggwuubwrww
|
||||||
|
wrbrwwggubwbugrrrgbugubgruggurwwrwuwwwrgbrrugbbbubwgwb
|
||||||
|
gwruggbrbbrwubgbuwwwrugwbubgugwuuugggurwuuwrururugg
|
||||||
|
bwgububwrrgruwubrrubwwubrwrbgrurwgrrrwbrwbubggw
|
||||||
|
urwrbwwrubbuwrbbwgugrbrburrgbbuugbbubbbugb
|
||||||
|
buggwggugwuwwwugggbrrrbbggwwuguguubugbrugu
|
||||||
|
wbrwwbwuwbwgrubbuurbuurgwubrwwwuruwuurbrubbugwuw
|
||||||
|
bbrbggbgwuguburwrgrbgrbrbugrgwbwubgwwuwbwbwrbwrwbgb
|
||||||
|
wuugrubwgggbugrbwgwgurgwuubuubrbrrbbruwbwrwgguwrrrwbwgbbw
|
||||||
|
wuugwgbwrrgugguwwgbwgbbwgbbgbgwuugbbuuwgrburuuurwbggwgrugu
|
||||||
|
wgrrwwugbugbbrrrrburgwbgrgubbguuwbbwwrbbbwuurrwbruruugrg
|
||||||
|
uwwgbwbuuwgwbbbggbwrrbwugwbruruwbbwrrwurwgbgw
|
||||||
|
gruwuruuuuuurwurwgbbggrubrubbgbrwubrbuwbruwgb
|
||||||
|
wuugrbubwrbrgwubrggugwbrgbggbbgwurrwgwrwu
|
||||||
|
grurbbbgbbubgurrrbrrrwwgggguuubuwgbwgwrguwu
|
||||||
|
ggwgbrwwwgrwgrgubrbugwuwwrbgwwgwwgurrbgburuwrgg
|
||||||
|
urwbwbbbuurubwgwrwbgrgruugwuuubgbbwwrurwwrbgugwgwbwggrbgub
|
||||||
|
wwwguggbrbrubgwggbrbbrgbuuuwubbwrbugbbbgruwbwwurggg
|
||||||
|
wuuurrguggwugbggggwbwbrrwurrbgwgwgbuwubgwubuuwbugwbwbwwwrguw
|
||||||
|
uwrgubwbrbbbgrwruwgrggbgbrwgubguuuuugwuwgwuubbgrgbgub
|
||||||
|
uuggugwuwrwgbrwwgrwgwggrbuuwruuwgbrbwrbugururuww
|
||||||
|
rwwrwurbrgwubbgwgggugbwwrubuggrgggurbrgwrwrwrrbwrwuu
|
||||||
|
rwbubuwrrgwggrrgrbwwgrgbgurrbrbrggrbuwwbrggwwrwgubrwgub
|
||||||
|
gurbbwuubbrrgbrurbwrggwuwwbrbuurwbubwwwrubggbwwgbwbrg
|
||||||
|
uwbuurrwbrgrgrurggwbwgrrwgwrbuwwwuburugugbugwuwwbrrubwu
|
||||||
|
rbbrwgwrrbbgwbgrwbrrrwwuuugrwbggrugrbburgbugburggbw
|
||||||
|
uggbgrgruubgggwbrugrgrbbbbwbwbgrbrrgrwbwrgguuwruwrwr
|
||||||
|
uwbbbuurggrbrurwgubrrrbuwgrgrrrrbwubrwrbbg
|
||||||
|
wuuurrbwrgwrguuwgrrgbuwggrbbwbuwbgugrwubwugwbrbg
|
||||||
|
gbrggbbwgurgrrbrugwrbuwgbrwbbbubgwggrurgurrw
|
||||||
|
rruwuwuuuuugwwbwbrrbbggrruwbgwuuuwgugwurwrg
|
||||||
|
gugrrbwrbrubuubgggbwbwwugugwrgwguurugbwbwwggrggbgrgrrbrw
|
||||||
|
ubbubwbuwrugrguggwwrwbbwbrbwrgwwbguwuwgwwwbwwbggbrwb
|
||||||
|
bbruguwgwbggbuubbgwugubrwbuwuwbgrgwwguwwwggruwgbb
|
||||||
|
grbugrrgwgbrgbuwrwbbgwbrrbrubrgwurbwwrwruugg
|
||||||
|
ruuruwbubugrgrbggrgubggbgrwrgwgrgbbubuwwwurbgguwr
|
||||||
|
rrwbbugbrurwgwbwwbgurgurwwwguugguwrwguwuggwgwb
|
||||||
|
wwuwgwgburubbbwggrrbbbbwbgbubguwrgbrrwubguurwwgrbgurg
|
||||||
|
urwbbbruggrwwgbuguuwubgubrbgwubwgwwrwwgubggwwrgbww
|
||||||
|
gbuurrwrgggwurrwuggbruwurrugrwrrbuwrggbwgugrwrwurwruwu
|
||||||
|
buuwrwuuuwgwwggbrbgbguuuruuuubbguwgbbbwgwgbuuwrrgbr
|
||||||
|
ggrrburrbbwrrwbwwubuugrgbugubwubrugbgwugrgu
|
||||||
|
uuubbwrbrwgrwugugbbgbgwwrrbuguuuburgrruugbwbbrwrbrbbwbrb
|
||||||
|
uuuuwrubrruguuwbwwugrrruwwburgbbggrgrgwbggubuuwu
|
||||||
|
wwgrubrrubrwrbgwrwgbguwgbbrgrrubbwbubbburbwgrrrub
|
||||||
|
bgwrgbrbbbuguugguguuubuugwbrwwurwuubrguwrruuuw
|
||||||
|
wuugbbbwuuguuwgrrwrwgwwwwwrbwgwrbwguwbrbgugubr
|
||||||
|
rgruurbggrbubwwbuwwuwuwwrbbgbgbguwrbbrwubgwrbr
|
||||||
|
uuurrubugrwwuuguwrwwwggubbbrbbbuwbbrggwuggru
|
||||||
|
wuuuurwgrwggwrruuuwubwubggrbrbwgbrwbgbwwurgbrwu
|
||||||
|
wuurggrwwbgwuwwrburuwrwrruruubgggbrugwwrwgbuwrbwgbur
|
||||||
|
ggrubgbbwruggbuuuwgrbwruwgurbwbubwuurubugbwg
|
||||||
|
rwwggbubrwurgwrbrwuwugbrrwwubuwrwbgguuuuwuwgwurgbwguw
|
||||||
|
wwbubuubgwwrrgbruubgggrrbuuwrugwbubrwgwbggbgwu
|
||||||
|
bwwgrrbbubbwrwwwguwbuuwgbbwgbbubrguwbbbgrugubrwg
|
||||||
|
wgubbgguwgbrbrgrggubrrwwgrrrwugruggrurrbubuugwbgwuuwwwwgr
|
||||||
|
wwbgwuwggugubgbggwuwgwggrrurrbbrrrrbbbgurwrrbuggg
|
||||||
|
rubguwgwuwwbuguguggurgwrwgbrbwubgugrurbwwwwbbuwu
|
||||||
|
rrwrgrwggubrwgwrwwuugrgbbrgrubgwrwuugrgbbgugbgrburrrrrugwu
|
||||||
|
bbgwugrgwbggrwwwrgbwburrwrwurbwgugwgwgrbuugwwuuwgburggggg
|
||||||
|
uuwbwguuwrbbuggbwggbgrbuwbgugwuurrurrgbrbuurwbwurrr
|
||||||
|
wurbwrgrgrrbgbwbwwuuggwuwuwbbwwuwgwgrwggubbgrwggbrrggur
|
||||||
|
wugrrubbggwurburggurrgggwuwwuguugrggurrgburrbrbrwgwbuwbg
|
||||||
|
wrugrbrwuwrugrbwurgwruggwrgwuwrgwuuwbwwggwubbgrwggwguwww
|
||||||
|
grbwguwbbbrwuwggbgurgbgbbwbgwwbwrrwbubrgubbgubgwwurggwbrbg
|
||||||
|
uubrubgurbgrgruwbwwugbuwgugburuubwuubbbrbbgbuggbbu
|
||||||
|
bbgbrwbwrwgbwrwwbbbrrugrwgbwbbruugurgggbbrgrguwurubgwbw
|
||||||
|
wwugrubrwrwburubwwuubbuubgburbbrrrruugbbwwgwbrrbubgbgbuwu
|
||||||
|
bwugrruubwwrbwbrrrbrrrbbgwrruwwbrgubugrgbwgbbrbgrwgwwwggr
|
||||||
|
wgugrrbbubgbgrrbbrwguwgbbgbwggwuuurrwgwbwrgwwuuw
|
||||||
|
wururbruwwwwurwgurwbwbuburrgruuwrbuguggwgubrgrruwwgwbbg
|
||||||
|
ugrwrrrwguwgrgwruwurbrrgruwubbubrwbwuwwrbbwbbggggr
|
||||||
|
rwuuguburgwruwrgbbuwggugbwrwuubrugrrruuwgggubbuwbrugrwuu
|
||||||
|
bgwubwuurwurbgugbuugbgrrugwrbwgrwrrwbgwwwgrguwwububuwbg
|
||||||
|
urbgbbgrrbuwrrguwrwuwrbbwgubwurugguwugururwruuubbgurrbg
|
||||||
|
grruugrurgwwbbrgugbburrwrrgwwrggwwrbwwbbwururwrbgguu
|
||||||
|
uubrwgwuubgbbgwgwuggbuggwguggwgrguwbugwwuubwwb
|
||||||
|
bbgubwurgurgguwrwrbbubbggwubwgbbwggwuuwugbg
|
||||||
|
guwbbwguurgwurbrgugwbwwbgugbgwwugubbggwugwrwgrb
|
||||||
|
wrruwbubwgwgbrwrbbbwuuuuurbwrbgwubrrugubwwrugb
|
||||||
|
gbuwwbubrrbggrrbugrgruwbrruurrburrgbggwbgwgbbggwggggbgrg
|
||||||
|
rwrbbbwbggrubuwgrugggbrbgbuwgrbrrbrrbwgwgrbuubgw
|
||||||
|
burbgruuwbbwuburbgrbuuuuurbuwbububgwwgwbrguubrguugwbbwbw
|
||||||
|
ubrrrgubrgrgbuuwgrrrwwbruuugbrrwbgbrwgrgww
|
||||||
|
uuuubwwwuwwbguwwbwgbwrwuwrwgrggrbgrbugbwgbrggwgruwrw
|
||||||
|
grwgruggbrrwuwrwbggwwgbrrwrwruuggbrurrbubur
|
||||||
|
uggbrrggwbwbrbwgurbbbrbbgwbrgbgwrbwubrurgw
|
||||||
|
ururbbrwrrwwbgubrbbuurguuwwgruwgruuurwbbwruurggru
|
||||||
|
grbwbrubbrgrwgbwubgbuwwuuwwrubruugwwwugguwrgurgrgu
|
||||||
|
wbwwugggwwurwrbugbbbrrgbgbuwggrggbbgrburbguurb
|
||||||
|
brwbbgwbgbrbbgwbrruwugwbguurubgwwgurubgrwuwrbguwuwrrgbwubu
|
||||||
|
rwugwrbgguwuggwgwgrbwbwwgwbwrrgrbbbwubgwggwrwurgwrwb
|
||||||
|
urrbwwgrruwwwrbrbwrgbrggwbggwrbbwwrggrgbbg
|
||||||
|
wurwwgwuurbwwgrrbbubbbbgugwwurrggrurbwrbuurbbbb
|
||||||
|
wggwrgurburuurwgrrurgrbubgrrgbbbwwrgwrurwrwwrgubuugwur
|
||||||
|
wrgubgbbwbbwruwrrgwgbrruubwgrurgwgrbugbgbggguwbrwuu
|
||||||
|
bgrwuwbggwwgrwbbugwuuwwwbrgugbbrubgugwbgugrbuwgrrbbubbwrrr
|
||||||
|
bwuwgwgugggrbwgruugbwruruwwbguggrbgggrggggwwuuuwugbuwuwgu
|
||||||
|
ruuugrurrrbrrbwuwbubrugwrrbgugbrwuurruwuwrbrbrwubwbwgur
|
||||||
|
rwugrbuwgwrwrbubggwugbrrgwwubbguuwbgbwuggrrrrggwrbrr
|
||||||
|
wbbrrruwuwubrgbrgbggrbgbburbugbwrrrubbbbggrurrrwb
|
||||||
|
ggruwrgubbururbrggurburuwrrwubwbuwwruruwbwuubwbrwwwrwr
|
||||||
|
wwuurwuwrwbwguuwwrbwgbuurgbbrgrbgwgwggwrgwgwwuuwgrwbuwrgbu
|
||||||
|
wuburbrwbgwrruurbrrrgwgbgrwgbwwwbbgrugubbrwuwububbrgbw
|
||||||
|
gwbwwwgrubwrguugbrbrbggguguuuugggwrbgwguwbrwwuuwggw
|
||||||
|
ubrbruwbururrrgwurrrbrrubbgbwrrggubbuburgwruwggurbrwb
|
||||||
|
rbrbrwwgwwurburubwgugwwbwuubuwbrwrrgugguwrbrrgbrrbrbw
|
||||||
|
grgubrrwbbwwwbrbbwbwwbgbbwrwrggbrrrbwwbwgbrgugguwuwubub
|
||||||
|
rurbrbrggruurgwguugugrrwrbuuwbwrubbbuburrwgruubu
|
||||||
|
ubrwguwgruuwwbbuwbrubugrgrurwrbwbwgbwrbubrgg
|
||||||
|
uuwgubuugwrbggbrrwurbbuwrurbubbbruwgrrrbrbwwwg
|
||||||
|
ububuuwuwwrugrrwrrbgurbrrrggwuwrubbgwwwurbb
|
||||||
|
bwugrrrgwurwgrbrwurbbbwbrurrwwgwwugbgbwgwuu
|
||||||
|
bbwgugurwurwbugugrgwburggurwrbbbbgwwbuubububurwuurggwubg
|
||||||
|
wuugbgbbwuubbbrrgbgubbgrrrbrgugrbwguuwgburrwrguuwgrbg
|
||||||
|
urbguwwwuugbgwwubwurubrrwbruwwugrgwwburrugugwbwbbu
|
||||||
|
uguugwgrgwburrrugbwuwgwrbwurgbbbbbwurbbgubwr
|
||||||
|
wuwrrrwwwwbwburbuburrrbgwuuubbwggrbwuwwgbrbrbwrw
|
||||||
|
wwbwbuwggbrgbrbwrwgguggwbugggrbwgwrgrgbgrrgbuurwubbr
|
||||||
|
rugbgwgugrgrugwwgwruurwbrwuwggbbrbrrggwwgwbubbug
|
||||||
|
wwrgubrgbwbbbrbuubuurbwbgbuugbwgguwrwbugbwrbwuwwrgb
|
||||||
|
bbrrwurbggbguwgwggrwbbgguubuuurbruwwrwuburbrrg
|
||||||
|
wuurugrubwrrbbrbbwbubbgburrrbugwuwwrgrrrwwbwg
|
||||||
|
uwgbugbuugrrwrwwuuuwwwrrgbubwugruubrwburgbbbbruwwgubrugb
|
||||||
|
wrwwuuwguruwrgrwgurwgrurwggubugrrugwggrbgbuu
|
||||||
|
guguugwrruwurugwgrbbwrbwwurwgggubugrugruuwrubbbgggwuubgrrr
|
||||||
|
gwuggrwbrgwuuurrbgbwbwrbrggguuwbubbrbrurwwuwugrubrwrwubwgw
|
||||||
|
ggrrwwrrggwuguuwgbgbgrbbbbgbwrrgguwgwggurubbugbgw
|
||||||
|
rbggurrgrrgrrbrbrgrbuggwubwwburrrrgbbwuuuuuwrbwbbgbrbwbwwb
|
||||||
|
bwugwbwububgbgwrbuuuwrruwgubbgruggburwburbrrwg
|
||||||
|
urrrbrwbguugwgbwrubguwwrruuguuwrbgwgwrbugwbrggbgrbuguubb
|
||||||
|
ururrgbbruuuwuubugubugbgwgwbruwgwwgwbrbgbubgwwgurgwb
|
||||||
|
wbwbrbgwurbgwbuwwbbbrrbbbuwrrgbwgurwugwburrrruwrgb
|
||||||
|
bbrrbgrrwbwuuuwwruwurwwuwgrwbgwugbgwrrwwwuubggrgrgrgrbwbrb
|
||||||
|
guguguwguwbggubbgurbugrwruguururuuuuggbrgrwguwubbwww
|
||||||
|
gwgurbrwguubuuuggwgwrurruwbuwrgwuuwugrrgrgrwrwurubuuuwgwg
|
||||||
|
rbuguuubrgwwugurgugbuugrrgwbbgubuuurguurruwrurbrrgwgrurrw
|
||||||
|
bgbbgrbgggwggbwwuggbrrbbgguurgrwuwurwrgwgugwbwwgrgubbb
|
||||||
|
rrrurgbggwgrrugurbrubbgwwrwuugwuurgrwurwrwbuugwuurgggwbrww
|
||||||
|
bburbwwrrwuuwuwuwubbwurwbwwrbwrubwugruruguwbu
|
||||||
|
rwbrwugruuruuwgugbbrrgwurrrburwrbugrubbbrg
|
||||||
|
rurugubuggrugbwrwwuwrggbrwruuggurrrgwgbgbwugrgbrurr
|
||||||
|
rrbuuruwrgubbubbgbruubgrrgwrrwwwgubwbuuburwurgurruwwrbbrw
|
||||||
|
gbggubwgrwwgwbgugbwrwgbwgubbbugggwwwrrbbggbwbwr
|
||||||
|
uruuugbubwuwrubwgbbrggrwwbguurgwgugbuwrgwbbwru
|
||||||
|
wuurrrwburwbbugubwwrgruwrrbgrwrrwwbwbbrruggbwuug
|
||||||
|
bggrwbgbwbbbbwwrurgwbrwuuuubwwbbububrbrgwgrwbrrrbrugrrrgrw
|
||||||
|
bguguurrgbugrrrwugrgggrbguwgruuwbuwubrurrrgb
|
||||||
|
ggwgrgbwrrrwuugbwbgbwgbbbburbrwbrwbrrrwggurbwrrrbbbgrbwuu
|
||||||
|
uugggwruuuururgrggbrwuggruwbgbuguuwwubrbbgwbrgubrgubrgbbww
|
||||||
|
uubwuuwrgbbrbwrbrbbugbbrbgwwrwwgwggbubwwgwuguwububgbu
|
||||||
|
gugbwwrwuuwrwrgrubwrwgbrgrguburwbrwwrbbgwuuggwggu
|
||||||
|
wwwwubbgrbubbwuwgbrgbgwubwubwgrrurwgrrggbgubburwgurgwb
|
||||||
|
grrrrwugwurbgrgwubbgrwrwbbuwguwgbbggbwuuguuwggrubwwuwggg
|
||||||
|
rrugggwburrwgbrbwbgwgwuwbubugwwrrwugwrrrwwbub
|
||||||
|
rbrbgwuwbggggwrbgwgwbgburwgurguguurbguguguwguuwggwgwr
|
||||||
|
wbbgrwbrrrrrbrurgrbugbuwrubwuwrgrwgurbgruuggurrrw
|
||||||
|
wrgrgbggrwgugbggrrgwuurrwbgrwgbubrbwrrubrggbrbgrrwuu
|
||||||
|
wuurbbrgubwrgurrugbwubbrbubruwbugrrbrwuwbbbbbbbwuwuw
|
||||||
|
wwrggrbbrgbuwgrrgwbugrubguuggugurgwbuuwgbguurgrr
|
||||||
|
wbwrgugurrwuuwbrrguwbgwurwwbbbgbgrgrwgbbuuwurburrbub
|
||||||
|
ggrbgwuubgrbgwbbbubugwruubuwwwrbgbwrggggggbubgrbwrw
|
||||||
|
bugrwrrgbwgugrgbrwburgrgbwbbrrwbgguwrbgwug
|
||||||
|
wwbrbbrruuwbgwrurgwrrguugwgrbbgbgguugubuwbgwubuwgbruuburw
|
||||||
|
gbugbuggrggbuwruuwbwbbrggrbubwbbwrrrbwgrguburrbwguwugu
|
||||||
|
ubgwggubbgguugguruubbugwuuwrbwgugbuuruwgwgwubugr
|
||||||
|
rguwbrgwbubwggbuubrrwgggggruwuuggwbbrwbgwg
|
||||||
|
ggbugubrbbrbwbruwwrguwbgruruuuwruugwbuwgwrgwurgwugwwbggub
|
||||||
|
gwuwburguwwgbrgbguguwwrbwgwurbbgruuuubwuubbwubgbu
|
||||||
|
bguwwrugrgbbuguwbwrbubbrwbbubuggwbgbbwwwrugbrgwrbwggu
|
||||||
|
wwwrbuuwuwgwrbwruwuggubrgbgwbuwwrrgguugbruuubrwg
|
||||||
|
wuuuugrgugugguwwrgurwurbbbrwbwwrgwuuwubgwru
|
||||||
|
uruuwrwrugrwwwwwrgbbwgbgbrwrwgrwrbbbrggurrrw
|
||||||
|
bggbbggbrbbrrgrgwurggrwbggrgggwbrbwwuguugb
|
||||||
|
bbrugbgrurwugwbgbbgrwggbrgbuwubgbrrwbbubwbrb
|
||||||
|
uruwbbugbwrrrgggbwbrrwgrrbwrgwgbgurrbbgwrrgwbuwgw
|
||||||
|
wrrrrugwbrgrgwbguwrbbubrwubwbwwwwwwbburbuwgwwbubrugbwguug
|
||||||
|
wuugrwrwwrwbbgwgugugurrwbbwwwwugwwbuuurbwgwrbbggugwwwwbgur
|
||||||
|
uuubbrbrrubwgbwbugguwrwbgwrubwbgbbubgrwugbgrwurubgrgbwrr
|
||||||
|
rbuguwurbrgwbubwwuwggrwuwgrbgburgubrggrgrbwwwbwbu
|
||||||
|
grrbgwgrbwbrwwbbwgbgbbgrbguurbrwwwgugrgubububbwwbuwugrbbr
|
||||||
|
wggguwwbwrrburbuwbwgbwbugbwgrurrrbrgubwbwug
|
||||||
|
uuwugrrwwbguuugrbrrrbuwuubrguwwgrggwrgubbb
|
||||||
|
ugrbwwgruwbrwbbbrwrruwbwgggugbrrbwwurbggwururgrgurwuw
|
||||||
|
rwgurbrbgwgugwuuuuwbggwwbbgrwrgrbgwuruuubgu
|
||||||
|
bgbrwuuuwrrgbbuuwuwwrgrgbrbrubbbbbrwubbwrbgbuuurbrubuwuurb
|
||||||
|
bwgrbrugwggubgrrgbbrugwbbubwwbwwgwrbgwgrurrrbugwguruwu
|
||||||
|
ugbggrbwrrwwbbrwuurbgwwbuggwggbugbgrrgwbrurrguwwubgwrgw
|
||||||
|
uruuwuwwugubwgrugurbggwgrwuuugrgwrrwuwgrrbwrg
|
||||||
|
wbgwuwbgbwuburguwbugwgggrrurgbgugggrrbwugugrrbbbwuguuuurbg
|
||||||
|
wgurrbuwuruguurgwgwbgugbruruwwggubwrwuuubgwrwwww
|
||||||
|
wguwuwugurbrwwuwrgurrbbrwggrrrbruuwbgrwbgwgubuwuwg
|
||||||
|
gbgugrbgruuwgbgwbgwwbwruwgbrgbggrrgrwrbubrgrbgbr
|
||||||
|
wuurbbwggrbbgwrgurbwwbuwggrurgrwrbwbrrbwbugubw
|
||||||
|
wburgrurggrugrbuuggrrbgwrgwbgububgrwbrbugggwrwrgr
|
||||||
|
ubwwgrubrrrbbwwrgrrubggubrrbgggwwrrrguggbugubrubburubw
|
||||||
|
uwwururrbubugbwugwrbuwruwwwrwurbrbwrrgguubgguubww
|
||||||
|
urbrrruwwrrrwgbwwuwubuuwuuwgubbguubwubgurwwgg
|
||||||
|
gbrbgbbrrrbgbgbgwbbgwgggbwbrwbbuugrgrbuuuwubrgbggrrgwuubw
|
||||||
|
gububrggbugrrrwrbguggwwwbwuurwggrrbgbgwwru
|
||||||
|
bbgbbgbuwrwrrubrrurgguwurbwurrbugbwbrrugrwgwbrwrggbbrwww
|
||||||
|
wuugrbgguuuuubruurgbrbrbubuuwwguwguwurrbbgruubburwwbbrb
|
||||||
|
grgrgrruwbuuubrurwwwugrrggbbrugwrwgruugburu
|
||||||
|
rrbbbbrguwrwgrwgwgrbwurgwrrwwbbgbgburbgwgggwb
|
||||||
|
rwgwbrwwgwbguguwurgwurbwwbrbgrbgbruuwbuwwrgug
|
||||||
|
wuugwwuubrwrubrbgbrwururuuburwggrurrgbwubwuggubbwbruuuwrwg
|
||||||
|
ubbgwbugrwwbuwrggrgwgrrwrwwgggurrrgbrwgrwubrwrur
|
||||||
|
bwububgwwbuugrwrggggrruguwrugwrgbguwrrbgbbbwburruwrgwrurg
|
||||||
|
rruwguuwwgrgburwrbrbubwgbugwggrurgrwbubrguwuwbbwgrbuww
|
||||||
|
rrbbrwwbrgwwuwrbwggbubbuwwwwwrbrwbrggrubwg
|
||||||
|
wrwbwwrbuubwwuubwrwrrbruuwwbwubbbgbgwguwburwuubbg
|
||||||
|
ururgrwggrgugugbwrbggwgugbrbugrwwgubugbrgburrurbrggg
|
||||||
|
gwwuwuurwrbbwuubrururruggrgrgwurrrgbrbrbguwrr
|
||||||
|
rgwwwrwbwrggruuburuugbruuugbgbgwgugwbugubuwwgrrrru
|
||||||
|
wwrgrbwugurbgrgwgruwrbwuubbwgwggrrggubbwugbwwrrrgbbwuu
|
||||||
|
gbwurggwgrrguurgwwgrggggbbbwgburwbgrgwwwwbr
|
||||||
|
ggbbgrbbwbbgwburgggwgwububrbwbguuurggbubuuuwbwggugu
|
||||||
|
bwbrwuwuuggbubggrwgguwugbgbubuurubwrugubwrurrugguuwrbr
|
||||||
|
ubrrgrbbrrugubuuubbwuwrwbggrbrbwgrrubbuubwg
|
||||||
|
uurbbubwuugwguwrbrgwrbbrrruwwgbwwubrgrwubguugrgwuwrg
|
||||||
|
wugbrwbrgbwugubwrrgurrrgurgwguubwgrwrbggurrbgg
|
||||||
|
wubwgrugruuuwuugwwrugwgbbgwwruuwuggurwwbrruw
|
||||||
|
bwrgruurugbwwwwbwrbrrrbrggwbburrwwugrruurbbwwggurbbbr
|
||||||
|
burrrgurrwrggbuwruwgrwwbwbgugwwwggwwurrbuwbuubbrrrwr
|
||||||
|
wrrrgrwgwwwrwgrbgrrwuuuwgwrguwwurrrubguwurgbrb
|
||||||
|
uwgwurwrwgwgbuwbgrrbubwwbrbuurubbrbbrrurubwb
|
||||||
|
wbrggubgbwbbwgrrurwwburbwruuruwugrbguwrwbuwuwbwwbuwbu
|
||||||
|
rgurgrwrurbwbwbrruuwgbwrwwbgwuubgwrugwbrwwbwbguwwbgrgrugw
|
||||||
|
rbggubugwbbggguugrwwbrwgwbgburggrgrbruubwbrbrbrbugguwwrgb
|
||||||
|
wruuggrbwgwwrgrwggugburwwgwgbrurwwgbgwuubrwbrgugubrwgbwgu
|
||||||
|
bggwurruuwwrggwbgwuburrwbrwrbwwrrggwuggrburgwguu
|
||||||
|
uwrrguugbwburwubwbuwbwrwgbgbwurguubbwbubbwbgrrrruub
|
||||||
|
rugguugbgrgbwrruurrbwbrbrgururrrwguurgrbrwgwu
|
||||||
|
bggbgrwgruwbugwrugwbwbubbwgubgubwbwwwwbgwrwrgwrwruwgwbuw
|
||||||
|
gurururrwguwuwbggbggbbrbbwbwgububrrubbrggrwgu
|
||||||
|
uugwubgugburrgrwurrrgwwgwwwrwubgbgurwrwuwuggbbguwrgugbgu
|
||||||
|
urbwgbbugrbrruwwwrwgbbbwggrwbbuugurwgwguug
|
||||||
|
rbrwwwrbrgwrbwbbugwugbguuggbbgbrgbuwwrgbugr
|
||||||
|
rbrubgwbwbubbgbubwwwrbgrwggbbguugwuguwwgwbbbbu
|
||||||
|
bwbgurbrbgugwrrbgbuggbrrbwwbrrgbwggrrwubbwbrgwg
|
||||||
|
grwuggugggurrbwbuuwrrwbgggwbruwwrbwugrrwrgguwwwrbgbu
|
||||||
|
rguwbbbrgbgrgbbuwurwuwbbgwburuwbugubrwgubrrbbruwbrr
|
||||||
|
uruwrbruruwbubbrgwwrruwrurbgwrurwwgwrruggrbguwurggggg
|
||||||
|
bbgbwwbwgbrggrgbgggrgrrwgwgggwgggwuuugrbwrrwbwb
|
||||||
|
grbrbbgubgbgwuwwgwrbgguuwugbrurwbbugrrbwrru
|
||||||
|
wgwwgbwgrurgwgruwugrbbbbrgbgbbugwgubwubgwwwur
|
||||||
|
wgurubbgbbguuwggwgrwbrgwbruwggrbrrwwuugbgwgwbbgggwg
|
||||||
|
uubbwggugwrwurbwwwuubgrwbbbbwbguwbgbbuwgrrburrwguguuwuuu
|
||||||
|
urwrgbrgubwwubwurwwrrbwwwgbwwrbuguuguuugrubwbbwwwubr
|
||||||
|
wwgwuurbburbwbwwwugrbwggugrrwgwugbugubububuurur
|
||||||
|
rugbwwgwwuwbbwbrguguggugrruubbwrwbrurwwwgwubbrrwwb
|
||||||
|
wuuuwrgbwruwwurrrgwwrgugwwbubgbbgbggrbrgg
|
||||||
|
wugbuwgbugwrrrgbbbgrbuuwwuugrbgbgwrgubugggrgrbugbggggwrr
|
||||||
|
wurwwwgwgbuwggbggwrwbwuwuwuguwwbgggwgrbgwbbbbg
|
||||||
|
gugrrrrrbrgwubwruwrgbruwwwbbguruggbubrwugwbwwbugbuwww
|
||||||
|
bbwgrbrggbuburgrwrbwbbbgbwurrruguggurbwbgrwwrr
|
||||||
|
uguwbbgwugbguggrruggbbrrubuugurgugwuubwbwwr
|
||||||
|
rwgbuwwbwuwwwbguwgugwgrbbuggubgwrurgrbwgbuugbrwr
|
||||||
|
wurbubbrgburwguwrrwuggwbrrrugbwbuuruubrrgrguuwwuururwrbww
|
||||||
|
rbubgwuubrrruubrbwbwuugugurrwugurwgwbwrurb
|
||||||
|
bbgrwuwwubruuwbwwgrwrbrgruruuwubuguwugbgrbgrwugrwrgbugburu
|
||||||
|
wuuuwwgrgurbgbwbwbgrrugbrwggrbrrubgwurwurgrbbrbu
|
||||||
|
rwbbuugrbbwubwubwrurggwwuurbbwggbwuurubrburuguwrrrrw
|
||||||
|
bgbgugwwubguuuwbuugrbbgwwwgbuwurbrgrgbuwug
|
||||||
|
wuugwbwgwwubwuuuwuwgwurburggbwwbrwwrwguuruwubwbguuwgw
|
||||||
|
grrbgrbbugwguwbrburrbrrwgbbrgrruwwurubbuwbgubbwgruwbgbb
|
||||||
|
bwuuwwururgugbrruugrrrugrgugugbggbbgbbguurrg
|
||||||
|
rgurgugrwurgbwwbuuwubruwgrwbububuuwruwggwrbbbbbbbwwbb
|
||||||
|
wuugrbgwwwgburbwrwgugrrgbbbgrgbrwwrgurrbbwbwuugugrgbubbrrrrg
|
||||||
|
ubrbgrwbuugrgwuurgrwbbbbrurubgurrgwubruubggwwgg
|
||||||
|
rwwubuuwrrrrwwwbruruuwbuwurwbubrbgrruuuwrwrwg
|
||||||
|
rggbgubbrgbgrrbgwwwrgwubrubwruugbwrwbbgguugubrubuwg
|
||||||
|
gbwbwwgubuubgurruwwwuwrrbuurgggurbbbbubbrbgw
|
||||||
|
gubggbgrbgwbbuwguggwuwgbwrrwwgbrwrrrgwwbgug
|
||||||
|
wuuruwgubbwuugbbburrugbggwwuruuuubbgruwbrr
|
||||||
|
gwgwruugwuurubburrrwrbgrurrwrwbbbbbwuuwbugrw
|
||||||
|
bgbwuwururguwuwbuubwbubugbwbuurwurbwbwgrgbwwwgwbuwubru
|
||||||
|
bruuwbugbbgrgubrggbggbgwuwbwwwrbwuwwwuuwgwgugrgwbbuwubbguu
|
||||||
|
wurrbbwuguuugrgurwwbwbgwbbbwbbuuwbbgurwrrbubwbbbbwubb
|
||||||
|
bwuubrguububbgrubbrgbgwwbgbbbgwbrrgwggwgggurgbwwwwuur
|
||||||
|
wgwuwbgrrurbwgwugwruwbubwgrrrwbbgrbuwubgbgw
|
||||||
|
rrbbrrbbwbbubbwrwgwrbrwwbbbbgwbguwgburwgbggr
|
||||||
|
wuugbbuguruwugwrgwbbuggbwbwwbbuwwuuugwbguwugbwggrbrr
|
||||||
|
gwgbburbguwuurrrgwbuwrurrbuwugwrgbgwrgwwwwurubbgbwr
|
||||||
|
wubugurgrbrbbbwrrwurwuuugwuwrbbbwwbrgbbrurrg
|
||||||
|
wrwugbwwbbbrguwuwugbwwuwgwubbbgrrbrwguuububbggbwwbwwrwbg
|
||||||
|
bugwuwrwuwwggwwuwrwrbruggrurgwwurrguwugwrwg
|
||||||
|
rbrgrwbwrurwbubrugwwgguwrrgwgwuwwbrrgrbrgwruwgbgbrbbru
|
||||||
|
rwwwrwruruuubwgwbgubrbgbgrwwuugruurugbrwbwuuwgbwubggugg
|
||||||
|
uuwugbbwrwbgrgwubgwwgrubbwrbbwwwbbwbbrbwrrugrgggw
|
||||||
|
wggubrrbgrggrwgguwggubwwrbrbgbgrrgugbggbgg
|
||||||
|
uwbuwrrgwguwurbwbbgbrbbrgguuggrrugrwrwbgrrurru
|
||||||
|
grrrgurgwububbuguwrguuuwrwwurbbwrwwguwwwrggbrbr
|
||||||
|
wubbgwbwbrbrgbggurgbrwgrubrurbrrrwrurgbbrwurgrrgugbwurrbg
|
||||||
|
wruwwrwgwrbwubrbwubbbrbuurwwwugwugubuubwgbbbubgrrgbrgbw
|
||||||
|
rwrrbgwurrgrbgrrrguugwwbgwwugbbgwwwuuuwgugwuwuwuubuw
|
||||||
|
rgwwugwwurgubwgrbwbwwgbbbubbrggbgrugguuubuuuugbgbgug
|
||||||
|
gruuruwbwbuururbwrwrgrwuububgwgruggwbwrgwbub
|
||||||
|
gbbwrurugbbwrurwwbgrruwgbrbrbrrgrwrbbgbgwbgwgwuwrwgrgu
|
||||||
|
wugwwgrwbgugurwurbggbrwruwuuwurwrbrwgruuubuurur
|
||||||
|
wgbuwbrbwrgrbwuwggugggguuwgbrbwgrgwrurrurbrgugrgwrb
|
||||||
|
ggwubgbwwwgrwwbbggwwrrggwguubuggubggguuwbwuwgwuuugrgbuubbb
|
||||||
|
rguuugwbrbrbwbgrggbubwrwwrrrubwwuugugwgrbuu
|
||||||
|
ggugbrggwbuwrwgrgwugurrbgruurruwwgrbwwubbuubr
|
||||||
|
ubgwwggbwbuwbbbbbbggbwrgrbgrgugurwggrubburrubrwrrggrgg
|
||||||
191
2024/gareth/day20/day20.go
Normal file
191
2024/gareth/day20/day20.go
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
package day20
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/heap"
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var directions = [][]int{
|
||||||
|
{0, 1}, // Right
|
||||||
|
{1, 0}, // Down
|
||||||
|
{0, -1}, // Left
|
||||||
|
{-1, 0}, // Up
|
||||||
|
}
|
||||||
|
|
||||||
|
type State struct {
|
||||||
|
row, col, dir, score int
|
||||||
|
path []string
|
||||||
|
//Would rather use tuple as key but cant get to work
|
||||||
|
costMap map[[2]int]int
|
||||||
|
}
|
||||||
|
|
||||||
|
type PriorityQueue []State
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
maze := parseInput(input)
|
||||||
|
_, path, costMap := solveMaze(maze)
|
||||||
|
cheats := findCheats(path, costMap)
|
||||||
|
return cheats
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
maze := parseInput(input)
|
||||||
|
_, path, costMap := solveMaze(maze)
|
||||||
|
cheats := findCheatsPart2(path, costMap)
|
||||||
|
return cheats
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []string {
|
||||||
|
parts := strings.Split(input, "\n")
|
||||||
|
maze := []string{}
|
||||||
|
maze = append(maze, parts...)
|
||||||
|
|
||||||
|
return maze
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq PriorityQueue) Len() int { return len(pq) }
|
||||||
|
func (pq PriorityQueue) Less(i, j int) bool {
|
||||||
|
return pq[i].score < pq[j].score
|
||||||
|
}
|
||||||
|
func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Push(x interface{}) {
|
||||||
|
*pq = append(*pq, x.(State))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Pop() interface{} {
|
||||||
|
old := *pq
|
||||||
|
n := len(old)
|
||||||
|
item := old[n-1]
|
||||||
|
*pq = old[0 : n-1]
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
|
||||||
|
func solveMaze(maze []string) (int, []string, map[[2]int]int) {
|
||||||
|
rows := len(maze)
|
||||||
|
cols := len(maze[0])
|
||||||
|
|
||||||
|
// Locate start and end points
|
||||||
|
var startRow, startCol, endRow, endCol int
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if maze[i][j] == 'S' {
|
||||||
|
startRow, startCol = i, j
|
||||||
|
} else if maze[i][j] == 'E' {
|
||||||
|
endRow, endCol = i, j
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Priority queue and visited set
|
||||||
|
pq := &PriorityQueue{}
|
||||||
|
heap.Init(pq)
|
||||||
|
startPath := []string{fmt.Sprintf("(%d,%d)", startRow, startCol)}
|
||||||
|
startCostMap := map[[2]int]int{
|
||||||
|
{startRow, startCol}: 0,
|
||||||
|
}
|
||||||
|
heap.Push(pq, State{startRow, startCol, 0, 0, startPath, startCostMap})
|
||||||
|
visited := make(map[[3]int]bool)
|
||||||
|
|
||||||
|
for pq.Len() > 0 {
|
||||||
|
cur := heap.Pop(pq).(State)
|
||||||
|
|
||||||
|
// If reached the end point, return the score and path
|
||||||
|
if cur.row == endRow && cur.col == endCol {
|
||||||
|
return cur.score, cur.path, cur.costMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark as visited
|
||||||
|
key := [3]int{cur.row, cur.col, cur.dir}
|
||||||
|
if visited[key] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
visited[key] = true
|
||||||
|
|
||||||
|
// Explore moves
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
// Compute new direction
|
||||||
|
newDir := (cur.dir + i) % 4
|
||||||
|
|
||||||
|
// Compute new position
|
||||||
|
newRow := cur.row + directions[newDir][0]
|
||||||
|
newCol := cur.col + directions[newDir][1]
|
||||||
|
|
||||||
|
// Check bounds and wall
|
||||||
|
if newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols && maze[newRow][newCol] != '#' {
|
||||||
|
newCost := cur.score + 1
|
||||||
|
if oldCost, exists := cur.costMap[[2]int{newRow, newCol}]; !exists || newCost < oldCost {
|
||||||
|
// Update cost map
|
||||||
|
newCostMap := make(map[[2]int]int)
|
||||||
|
for k, v := range cur.costMap {
|
||||||
|
newCostMap[k] = v
|
||||||
|
}
|
||||||
|
newCostMap[[2]int{newRow, newCol}] = newCost
|
||||||
|
|
||||||
|
// Update path
|
||||||
|
newPath := append([]string{}, cur.path...)
|
||||||
|
newPath = append(newPath, fmt.Sprintf("(%d,%d)", newRow, newCol))
|
||||||
|
|
||||||
|
heap.Push(pq, State{
|
||||||
|
newRow,
|
||||||
|
newCol,
|
||||||
|
newDir,
|
||||||
|
newCost,
|
||||||
|
newPath,
|
||||||
|
newCostMap,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1, nil, nil // No path found
|
||||||
|
}
|
||||||
|
|
||||||
|
func findCheats(path []string, costLookup map[[2]int]int) int {
|
||||||
|
|
||||||
|
totalCheats := 0
|
||||||
|
for index, position := range path {
|
||||||
|
|
||||||
|
var row, col int
|
||||||
|
//Should be a better way to do this
|
||||||
|
fmt.Sscanf(position, "(%d,%d)", &row, &col)
|
||||||
|
|
||||||
|
for _, dir := range directions {
|
||||||
|
newRow := row + (dir[0] * 2)
|
||||||
|
newCol := col + (dir[1] * 2)
|
||||||
|
|
||||||
|
if cost, exists := costLookup[[2]int{newRow, newCol}]; exists {
|
||||||
|
if cost > index && (cost-index-2) >= 100 {
|
||||||
|
totalCheats++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalCheats
|
||||||
|
}
|
||||||
|
|
||||||
|
func findCheatsPart2(path []string, costLookup map[[2]int]int) int {
|
||||||
|
totalCheats := 0
|
||||||
|
|
||||||
|
for index, position := range path {
|
||||||
|
var row, col int
|
||||||
|
//Should be a better way to do this
|
||||||
|
fmt.Sscanf(position, "(%d,%d)", &row, &col)
|
||||||
|
|
||||||
|
for x1 := row - 20; x1 <= row+20; x1++ {
|
||||||
|
for y1 := col - 20 + int(math.Abs(float64(row-x1))); y1 <= col+20-int(math.Abs(float64(row-x1))); y1++ {
|
||||||
|
if cost, exists := costLookup[[2]int{x1, y1}]; exists && cost != -1 {
|
||||||
|
diff := cost - index - int(math.Abs(float64(row-x1))) - int(math.Abs(float64(col-y1)))
|
||||||
|
if cost > index && diff >= 100 {
|
||||||
|
totalCheats++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalCheats
|
||||||
|
}
|
||||||
45
2024/gareth/day20/day20_test.go
Normal file
45
2024/gareth/day20/day20_test.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package day20
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############`)
|
||||||
|
assert.Equal(t, 44, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############`)
|
||||||
|
assert.Equal(t, 285, r)
|
||||||
|
}
|
||||||
141
2024/gareth/day20/input.txt
Normal file
141
2024/gareth/day20/input.txt
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#...###...#.......###...........###...#...#####...#...#...###...#...#.........###...#.......#...#.....#.........#...........#...............#
|
||||||
|
#.#.###.#.#.#####.###.#########.###.#.#.#.#####.#.#.#.#.#.###.#.#.#.#.#######.###.#.#.#####.#.#.#.###.#.#######.#.#########.#.#############.#
|
||||||
|
#.#.#...#.#.#...#...#.#.........#...#.#.#...#...#.#.#...#.....#.#.#.#.....#...#...#.#...#...#.#.#.#...#.....#...#.#.........#.....#.........#
|
||||||
|
#.#.#.###.#.#.#.###.#.#.#########.###.#.###.#.###.#.###########.#.#.#####.#.###.###.###.#.###.#.#.#.#######.#.###.#.#############.#.#########
|
||||||
|
#.#.#.#...#...#...#...#.#...#.....#...#...#...#...#.#...........#.#.###...#.....#...#...#.....#...#.#...#...#.#...#.###...#...#...#.#...#...#
|
||||||
|
#.#.#.#.#########.#####.#.#.#.#####.#####.#####.###.#.###########.#.###.#########.###.#############.#.#.#.###.#.###.###.#.#.#.#.###.#.#.#.#.#
|
||||||
|
#.#...#...#...###.....#.#.#.#.#.....#...#.....#.#...#.#...#...#...#.#...#.........###.#.............#.#.#...#.#...#.....#...#.#.#...#.#.#.#.#
|
||||||
|
#.#######.#.#.#######.#.#.#.#.#.#####.#.#####.#.#.###.#.#.#.#.#.###.#.###.###########.#.#############.#.###.#.###.###########.#.#.###.#.#.#.#
|
||||||
|
#.#.....#...#.#.....#.#.#.#...#...#...#.....#.#.#.#...#.#...#.#...#...#...#...###...#.#.........#...#.#.#...#.#...#...#.......#.#.#...#...#.#
|
||||||
|
#.#.###.#####.#.###.#.#.#.#######.#.#######.#.#.#.#.###.#####.###.#####.###.#.###.#.#.#########.#.#.#.#.#.###.#.###.#.#.#######.#.#.#######.#
|
||||||
|
#.#.#...#.....#.#...#.#.#...#...#.#.......#.#.#.#.#.....#...#.###.....#.#...#.#...#...#.........#.#...#...#...#.#...#...###.....#.#.#.......#
|
||||||
|
#.#.#.###.#####.#.###.#.###.#.#.#.#######.#.#.#.#.#######.#.#.#######.#.#.###.#.#######.#########.#########.###.#.#########.#####.#.#.#######
|
||||||
|
#...#...#.....#.#.#...#.....#.#.#.#...#...#...#.#.#.....#.#...#...###.#...#...#.......#.....#...#.....#.....#...#.###.....#.....#...#.......#
|
||||||
|
#######.#####.#.#.#.#########.#.#.#.#.#.#######.#.#.###.#.#####.#.###.#####.#########.#####.#.#.#####.#.#####.###.###.###.#####.###########.#
|
||||||
|
###...#...#...#.#...#.......#.#...#.#.#...#...#...#...#.#.#.....#.....#.....#.....#...#.....#.#.#.....#.....#...#...#...#.###...#...........#
|
||||||
|
###.#.###.#.###.#####.#####.#.#####.#.###.#.#.#######.#.#.#.###########.#####.###.#.###.#####.#.#.#########.###.###.###.#.###.###.###########
|
||||||
|
#...#.....#...#.....#.#...#.#...#...#...#...#...#.....#...#...........#.###...#...#...#.#...#.#.#.#.......#.###...#...#.#.#...#...#.....#...#
|
||||||
|
#.###########.#####.#.#.#.#.###.#.#####.#######.#.###################.#.###.###.#####.#.#.#.#.#.#.#.#####.#.#####.###.#.#.#.###.###.###.#.#.#
|
||||||
|
#...........#.#...#...#.#.#.#...#.....#...#...#.#...#...#...#...#...#.#.#...#...#...#.#.#.#.#.#.#.#.#...#...#...#.#...#.#...#...###...#...#.#
|
||||||
|
###########.#.#.#.#####.#.#.#.#######.###.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.#####.#######.#####.#
|
||||||
|
#...###.....#...#.#...#.#...#.#.......#...#.#.#...#.#.#.#.#.#.#.#.#...#...#...###.#.#.#.#.#.#.#.#.#.#.#...###.#.#.#.#...#.....#.....#.#.....#
|
||||||
|
#.#.###.#########.#.#.#.#####.#.#######.###.#.###.#.#.#.#.#.#.#.#.#########.#####.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####
|
||||||
|
#.#.#...#.......#...#.#.#...#.#...#.....#...#.###.#.#.#.#.#.#.#.#.#.......#.#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.#.#...#.....#...#.#.#.....#
|
||||||
|
#.#.#.###.#####.#####.#.#.#.#.###.#.#####.###.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#####.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####.#
|
||||||
|
#.#...#...#.....#...#.#...#.#.###.#.#...#...#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.....#.#.#.#.#.#.#.#...#...#.#...#.....#.....#...#...#...#.#
|
||||||
|
#.#####.###.#####.#.#.#####.#.###.#.#.#.###.###.#.#####.#.#.#.#.#.#.#.#.#####.#.#####.#.#.#.#.#.#.#.#.###.###.###########.#####.#######.#.#.#
|
||||||
|
#.#...#...#...#...#.#.......#...#.#...#.....#...#.....#.#.#.#.#.#.#...#.....#.#...#...#.#.#.#.#.#.#.#.#...###.#.........#.......#.......#...#
|
||||||
|
#.#.#.###.###.#.###.###########.#.###########.#######.#.#.#.#.#.#.#########.#.###.#.###.#.#.#.#.#.#.#.#.#####.#.#######.#########.###########
|
||||||
|
#.#.#.#...#...#.###...........#.#...#.........#...#...#...#...#.#...#.....#.#.#...#...#.#.#.#.#.#.#.#.#.#...#.#.#...###.....#...#...........#
|
||||||
|
#.#.#.#.###.###.#############.#.###.#.#########.#.#.###########.###.#.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.###########.#
|
||||||
|
#.#.#.#.###.....#.............#.....#.#...#.....#.#.....#.......###.#...#...#.#.#...#.#.#.#.#.#.#.#...#.#.#...#...#...#...#...#.#.....#...#.#
|
||||||
|
#.#.#.#.#########.###################.#.#.#.#####.#####.#.#########.###.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###########.#.#.#####.#.###.#.#.#.#
|
||||||
|
#...#...#.........#...#.....#.......#.#.#.#...#...#...#.#.#...#...#.#...#...#.#.#.#.#.#.#.#.#.#.#...#...#.#...........#.#.....#...###...#.#.#
|
||||||
|
#########.#########.#.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.###########.#####.###########.#.#
|
||||||
|
###...###...#.......#.#...#...#.....#.#.#.#...#...#.#...#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.......#...#.#.....#.........#.#.#
|
||||||
|
###.#.#####.#.#######.###.#####.#####.#.#.#.#####.#.#####.#.#####.#.#.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.#.#.#.#####.#######.#.#.#
|
||||||
|
#...#.#...#...###...#.#...#.....#...#...#...#...#.#.....#.#.....#.#.#.#.###...#.#.#...#...#.#...#.#.#.#.#.......#...#...#...###.#.......#...#
|
||||||
|
#.###.#.#.#######.#.#.#.###.#####.#.#########.#.#.#####.#.#####.#.#.#.#.#######.#.#########.###.#.#.#.#.#.#####.###########.###.#.###########
|
||||||
|
#...#...#.........#...#.###.......#.........#.#...#.....#.#...#.#...#.#.#.......#.......#...#...#...#.#.#.#...#.#...........#...#...........#
|
||||||
|
###.###################.###################.#.#####.#####.#.#.#.#####.#.#.#############.#.###.#######.#.#.#.#.#.#.###########.#############.#
|
||||||
|
###...................#.#.....#...#.........#.....#.....#...#.#.....#...#.#.....#.......#...#...#...#...#...#.#.#.....#.......#...#.........#
|
||||||
|
#####################.#.#.###.#.#.#.#############.#####.#####.#####.#####.#.###.#.#########.###.#.#.#########.#.#####.#.#######.#.#.#########
|
||||||
|
#...#.......#...#...#...#...#.#.#.#.........#.....#...#...#...#...#.#.....#.###.#.......###.....#.#.#...#...#.#.......#.#.......#...#...#...#
|
||||||
|
#.#.#.#####.#.#.#.#.#######.#.#.#.#########.#.#####.#.###.#.###.#.#.#.#####.###.#######.#########.#.#.#.#.#.#.#########.#.###########.#.#.#.#
|
||||||
|
#.#.#.....#...#...#.........#...#...........#.#...#.#...#.#...#.#...#...#...#...#...#...#.........#.#.#.#.#.#...........#.............#.#.#.#
|
||||||
|
#.#.#####.###################################.#.#.#.###.#.###.#.#######.#.###.###.#.#.###.#########.#.#.#.#.###########################.#.#.#
|
||||||
|
#.#.#...#...#...#...#.....#......S###########.#.#.#...#...###.#.......#.#...#...#.#...###...#.....#...#...#.#.........#...#...#.........#.#.#
|
||||||
|
#.#.#.#.###.#.#.#.#.#.###.#.#################.#.#.###.#######.#######.#.###.###.#.#########.#.###.#########.#.#######.#.#.#.#.#.#########.#.#
|
||||||
|
#.#...#.#...#.#...#...###...#################.#.#...#.......#.#.......#.....#...#.........#.#.###.........#...#.....#...#.#.#.#.....#.....#.#
|
||||||
|
#.#####.#.###.###############################.#.###.#######.#.#.#############.###########.#.#.###########.#####.###.#####.#.#.#####.#.#####.#
|
||||||
|
#...#...#.....#.....#...#####################...#...#...#...#.#...#...........#...#.....#.#...#...........#...#.#...#...#.#.#.#...#...#...#.#
|
||||||
|
###.#.#########.###.#.#.#########################.###.#.#.###.###.#.###########.#.#.###.#.#####.###########.#.#.#.###.#.#.#.#.#.#.#####.#.#.#
|
||||||
|
#...#.#...#...#...#.#.#...#####################...#...#...###...#.#.........#...#.#.###.#.#...#.......#...#.#.#.#.....#.#.#.#.#.#.#.....#...#
|
||||||
|
#.###.#.#.#.#.###.#.#.###.#####################.###.###########.#.#########.#.###.#.###.#.#.#.#######.#.#.#.#.#.#######.#.#.#.#.#.#.#########
|
||||||
|
#...#...#...#...#.#.#...#.#...#################...#.........#...#.#.........#.#...#...#...#.#.###...#...#...#...#.......#...#...#.#...#...###
|
||||||
|
###.###########.#.#.###.#.#.#.###################.#########.#.###.#.#########.#.#####.#####.#.###.#.#############.###############.###.#.#.###
|
||||||
|
###...#...#...#...#.....#.#.#.#...###############.#...#.....#.....#.......#...#.....#...#...#.....#.........#...#...........#...#...#...#...#
|
||||||
|
#####.#.#.#.#.###########.#.#.#.#.###############.#.#.#.#################.#.#######.###.#.#################.#.#.###########.#.#.###.#######.#
|
||||||
|
#####...#.#.#...........#.#.#.#.#.........#######...#.#.....#...#...#...#.#.###.....#...#.#.....#...#.....#...#.............#.#...#.........#
|
||||||
|
#########.#.###########.#.#.#.#.#########.###########.#####.#.#.#.#.#.#.#.#.###.#####.###.#.###.#.#.#.###.###################.###.###########
|
||||||
|
###.......#.###.........#...#.#.........#......E#...#.......#.#...#...#...#...#.#...#.#...#...#...#...###.....#...#...#...###.#...#.....#...#
|
||||||
|
###.#######.###.#############.#########.#########.#.#########.###############.#.#.#.#.#.#####.###############.#.#.#.#.#.#.###.#.###.###.#.#.#
|
||||||
|
#...#.....#.#...#...#...#...#.........#...###...#.#.#...#...#.......#.....#...#.#.#...#.#.....###...#.........#.#...#...#...#.#...#...#...#.#
|
||||||
|
#.###.###.#.#.###.#.#.#.#.#.#########.###.###.#.#.#.#.#.#.#.#######.#.###.#.###.#.#####.#.#######.#.#.#########.###########.#.###.###.#####.#
|
||||||
|
#...#.###...#.....#.#.#.#.#.#...#...#...#.....#...#...#...#.....#...#...#.#...#.#.#.....#.#.......#.#...........#.....#.....#...#.....#...#.#
|
||||||
|
###.#.#############.#.#.#.#.#.#.#.#.###.#######################.#.#####.#.###.#.#.#.#####.#.#######.#############.###.#.#######.#######.#.#.#
|
||||||
|
###.#...#.........#...#...#.#.#.#.#...#.#.......#.....#.........#...#...#...#.#.#.#.......#...#...#...........#...###...#.......#.......#...#
|
||||||
|
###.###.#.#######.#########.#.#.#.###.#.#.#####.#.###.#.###########.#.#####.#.#.#.###########.#.#.###########.#.#########.#######.###########
|
||||||
|
#...#...#...#...#...........#.#...#...#.#.....#...#...#.......#.....#...#...#.#...###...#...#...#.........###...#.........#.....#.......#...#
|
||||||
|
#.###.#####.#.#.#############.#####.###.#####.#####.#########.#.#######.#.###.#######.#.#.#.#############.#######.#########.###.#######.#.#.#
|
||||||
|
#.#...#.....#.#...#.....#...#.#...#...#.....#.....#...#.......#.........#.....###...#.#...#...#.....#...#.........#...#.....###...#...#...#.#
|
||||||
|
#.#.###.#####.###.#.###.#.#.#.#.#.###.#####.#####.###.#.#########################.#.#.#######.#.###.#.#.###########.#.#.#########.#.#.#####.#
|
||||||
|
#.#...#.#...#.###...###...#...#.#.....#...#.......#...#...#...#.....#...#...#.....#.#.......#.#...#...#.......#.....#.#.....#...#...#...#...#
|
||||||
|
#.###.#.#.#.#.#################.#######.#.#########.#####.#.#.#.###.#.#.#.#.#.#####.#######.#.###.###########.#.#####.#####.#.#.#######.#.###
|
||||||
|
#...#.#.#.#...#...............#.........#.........#...#...#.#.#.#...#.#...#.#.....#.#.......#...#...#.....#...#.....#.......#.#.......#.#...#
|
||||||
|
###.#.#.#.#####.#############.###################.###.#.###.#.#.#.###.#####.#####.#.#.#########.###.#.###.#.#######.#########.#######.#.###.#
|
||||||
|
#...#.#...#...#.............#...#...............#.#...#...#.#...#.....#...#.#.....#.#.........#.....#.###.#.........#...#...#.#.......#.....#
|
||||||
|
#.###.#####.#.#############.###.#.#############.#.#.#####.#.###########.#.#.#.#####.#########.#######.###.###########.#.#.#.#.#.#############
|
||||||
|
#.....#.....#.....#...#.....#...#.......#.....#...#.......#.........#...#...#.....#...........#.....#...#.#...#...###.#...#...#.#...#.......#
|
||||||
|
#######.#########.#.#.#.#####.#########.#.###.#####################.#.###########.#############.###.###.#.#.#.#.#.###.#########.#.#.#.#####.#
|
||||||
|
###...#.........#.#.#.#.....#.#...#...#...#...#...###...###...#.....#.#...#...#...#.........#...###.....#...#...#.....#.......#...#...#.....#
|
||||||
|
###.#.#########.#.#.#.#####.#.#.#.#.#.#####.###.#.###.#.###.#.#.#####.#.#.#.#.#.###.#######.#.#########################.#####.#########.#####
|
||||||
|
#...#...........#...#.#...#.#...#...#.......###.#.#...#...#.#.#.....#...#.#.#.#.....#...###...###...#...#...............#...#.....#...#.....#
|
||||||
|
#.###################.#.#.#.###################.#.#.#####.#.#.#####.#####.#.#.#######.#.#########.#.#.#.#.###############.#.#####.#.#.#####.#
|
||||||
|
#...#...#...#...#...#...#...#...............#...#.#...#...#.#.###...#.....#.#.###.....#...........#...#.#.................#...###...#.#.....#
|
||||||
|
###.#.#.#.#.#.#.#.#.#########.#############.#.###.###.#.###.#.###.###.#####.#.###.#####################.#####################.#######.#.#####
|
||||||
|
###...#...#...#...#.....#...#.#.............#.#...#...#...#.#...#...#.###...#...#.......#.....#...#...#...........#.........#.......#.#...###
|
||||||
|
#######################.#.#.#.#.#############.#.###.#####.#.###.###.#.###.#####.#######.#.###.#.#.#.#.###########.#.#######.#######.#.###.###
|
||||||
|
#.................###...#.#...#...........#...#.###...#...#...#.#...#...#.....#.....###...#...#.#...#...........#...###...#...#.....#...#...#
|
||||||
|
#.###############.###.###.###############.#.###.#####.#.#####.#.#.#####.#####.#####.#######.###.###############.#######.#.###.#.#######.###.#
|
||||||
|
#.............#...#...#...#...............#.#...#...#.#.#...#.#.#...#...#...#.#.....#.....#.....###...#.........###.....#...#...#...###.....#
|
||||||
|
#############.#.###.###.###.###############.#.###.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.###.#########.#.#.###########.#######.#####.#.#########
|
||||||
|
#.....#.......#.#...#...#...#...#...........#...#.#...#.#.#...#.....#.....#.#.#.#...#...#.....#.....#.#...........#.#.....#...#...#...#.....#
|
||||||
|
#.###.#.#######.#.###.###.###.#.#.#############.#.#####.#.#################.#.#.#.#.###.#####.#.#####.###########.#.#.###.###.#.#####.#.###.#
|
||||||
|
#...#.#.......#.#.....###.....#...#.............#.....#.#.............#...#...#...#.#...#...#.#.#...#...#...#.....#.#...#...#.#.#...#...#...#
|
||||||
|
###.#.#######.#.###################.#################.#.#############.#.#.#########.#.###.#.#.#.#.#.###.#.#.#.#####.###.###.#.#.#.#.#####.###
|
||||||
|
###.#.#...#...#...###...#...#.......#.......#...#...#.#...#...###...#...#.#.........#.#...#...#...#...#...#.#.......#...#...#...#.#.#...#...#
|
||||||
|
###.#.#.#.#.#####.###.#.#.#.#.#######.#####.#.#.#.#.#.###.#.#.###.#.#####.#.#########.#.#############.#####.#########.###.#######.#.#.#.###.#
|
||||||
|
#...#...#...#...#.....#...#.#.........#.....#.#.#.#.#...#.#.#.#...#...###.#.#.....###.#.###...###...#.....#.#...#.....#...#...#...#...#...#.#
|
||||||
|
#.###########.#.###########.###########.#####.#.#.#.###.#.#.#.#.#####.###.#.#.###.###.#.###.#.###.#.#####.#.#.#.#.#####.###.#.#.#########.#.#
|
||||||
|
#.#.......#...#...#...#...#.#...#.......#.....#.#.#.#...#.#.#.#.....#...#.#.#.#...#...#...#.#.#...#.....#.#...#...#...#.....#...#...#...#...#
|
||||||
|
#.#.#####.#.#####.#.#.#.#.#.#.#.#.#######.#####.#.#.#.###.#.#.#####.###.#.#.#.#.###.#####.#.#.#.#######.#.#########.#.###########.#.#.#.#####
|
||||||
|
#.#.#.....#...#...#.#...#.#.#.#.#...#...#.....#.#.#.#.#...#.#.#...#...#.#.#.#.#.###...#...#.#.#.......#.#...###.....#.............#...#.....#
|
||||||
|
#.#.#.#######.#.###.#####.#.#.#.###.#.#.#####.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.#####.#.###.#.#######.#.###.###.###########################.#
|
||||||
|
#...#.#...#...#.....###...#...#.....#.#.#...#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#...#...#.#...#.#...#...#...#.....#...#...#...#...#...#.......#
|
||||||
|
#####.#.#.#.###########.#############.#.#.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.###.#.###.#.###.#.#.#.#####.#######.#.#.#.#.#.#.#.#.#.#.#######
|
||||||
|
#.....#.#.#.#.....#...#.....#.........#.#.#.#.#.#.#.#...#...#.#.#...#.#.#.#.#...#...###.#.###...#.#...#...#.......#...#.#.#...#...#.#...#...#
|
||||||
|
#.#####.#.#.#.###.#.#.#####.#.#########.#.#.#.#.#.#.###.#####.#.#.###.#.#.#.###.#######.#.#######.###.#.###.###########.#.#########.###.#.#.#
|
||||||
|
#.#.....#...#...#...#.......#.###.......#.#...#.#.#...#.###...#.#.....#...#.#...#.......#.......#...#.#.#...###.......#.#.....#...#...#...#.#
|
||||||
|
#.#.###########.#############.###.#######.#####.#.###.#.###.###.###########.#.###.#############.###.#.#.#.#####.#####.#.#####.#.#.###.#####.#
|
||||||
|
#.#.#...........#...#...#...#...#...#...#...#...#.#...#...#...#.....#.......#.###.....#.....#...###.#.#.#.......#.....#.......#.#.###.......#
|
||||||
|
#.#.#.###########.#.#.#.#.#.###.###.#.#.###.#.###.#.#####.###.#####.#.#######.#######.#.###.#.#####.#.#.#########.#############.#.###########
|
||||||
|
#...#.............#...#.#.#...#...#...#.#...#.#...#.#...#.#...#.....#...#...#.#.....#.#.#...#.....#...#.#.......#.....###...###.#...........#
|
||||||
|
#######################.#.###.###.#####.#.###.#.###.#.#.#.#.###.#######.#.#.#.#.###.#.#.#.#######.#####.#.#####.#####.###.#.###.###########.#
|
||||||
|
#...............#.....#...#...#...###...#...#.#...#.#.#.#.#.#...#...###...#.#.#...#...#.#.....#...###...#...###.....#.....#.....#...#.......#
|
||||||
|
#.#############.#.###.#####.###.#####.#####.#.###.#.#.#.#.#.#.###.#.#######.#.###.#####.#####.#.#####.#####.#######.#############.#.#.#######
|
||||||
|
#.............#.#...#.....#...#.#.....#...#.#.#...#.#.#.#.#.#.....#.......#.#...#...#...#.....#.....#.#...#.....#...#...#.....#...#.#.......#
|
||||||
|
#############.#.###.#####.###.#.#.#####.#.#.#.#.###.#.#.#.#.#############.#.###.###.#.###.#########.#.#.#.#####.#.###.#.#.###.#.###.#######.#
|
||||||
|
#...#...###...#.....#...#.....#.#.....#.#...#.#.###.#.#.#.#...#...#.....#.#.#...###.#.###...#...#...#...#.#.....#.#...#.#...#.#...#.........#
|
||||||
|
#.#.#.#.###.#########.#.#######.#####.#.#####.#.###.#.#.#.###.#.#.#.###.#.#.#.#####.#.#####.#.#.#.#######.#.#####.#.###.###.#.###.###########
|
||||||
|
#.#...#...#...........#.....#...#.....#.#.....#...#...#.#.###.#.#.#.#...#.#.#.#.....#.#.....#.#.#.#.......#.....#.#.#...#...#.....#...#...###
|
||||||
|
#.#######.#################.#.###.#####.#.#######.#####.#.###.#.#.#.#.###.#.#.#.#####.#.#####.#.#.#.###########.#.#.#.###.#########.#.#.#.###
|
||||||
|
#.......#.#.................#.#...#...#.#...#...#.....#.#.#...#.#.#.#.#...#.#.#...#...#.#...#.#.#.#.......#.....#...#...#...........#...#...#
|
||||||
|
#######.#.#.#################.#.###.#.#.###.#.#.#####.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#.#.#.#######.#.###########.###################.#
|
||||||
|
#.......#.#...#.....#...#...#.#.#...#...###.#.#...#...#...#.#...#.#.#.#.#...#.#...#.###...#.#.#.#.#.......#.......#...#.#.....#...#...#...#.#
|
||||||
|
#.#######.###.#.###.#.#.#.#.#.#.#.#########.#.###.#.#######.#.###.#.#.#.#.###.#.###.#######.#.#.#.#.#############.#.#.#.#.###.#.#.#.#.#.#.#.#
|
||||||
|
#...#...#...#...#...#.#.#.#...#.#.#...#...#.#.###.#.###.....#...#...#.#.#.....#...#.......#.#.#.#.#.#...#...#...#.#.#.#...###.#.#.#.#...#.#.#
|
||||||
|
###.#.#.###.#####.###.#.#.#####.#.#.#.#.#.#.#.###.#.###.#######.#####.#.#########.#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.#.#####.#.#
|
||||||
|
###...#...#.......#...#.#.#...#...#.#...#...#...#.#...#...#.....#.....#.#.........#.......#...#.#.#...#.#.#...#.#...#.......#.#.#.#...###.#.#
|
||||||
|
#########.#########.###.#.#.#.#####.###########.#.###.###.#.#####.#####.#.#########.###########.#.#####.#.#####.###########.#.#.#.###.###.#.#
|
||||||
|
#.........#.....#...#...#...#.....#.........#...#.#...###.#.#...#...#...#.#...#...#...#.......#...###...#.....#...#...#.....#...#...#...#.#.#
|
||||||
|
#.#########.###.#.###.###########.#########.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.###.#.#####.#######.#######.###.#.#.#.###########.###.#.#.#
|
||||||
|
#...#...#...###...#...#...#.......#.........#.###...#.....#...#.#...#.#...#.#.#.#...#...#...#.#.......#.......###...#.#.......#.....#...#...#
|
||||||
|
###.#.#.#.#########.###.#.#.#######.#########.#######.#########.#.###.#.###.#.#.###.#####.#.#.#.#######.#############.#######.#.#####.#######
|
||||||
|
#...#.#.#.#.........#...#.#.###...#...#.....#.......#.....#.....#...#.#...#.#.#...#...#...#...#.......#.#...#...#...#.#.......#.......###...#
|
||||||
|
#.###.#.#.#.#########.###.#.###.#.###.#.###.#######.#####.#.#######.#.###.#.#.###.###.#.#############.#.#.#.#.#.#.#.#.#.#################.#.#
|
||||||
|
#...#.#.#.#.#...#...#...#.#.#...#.....#.#...#.....#.....#.#...#.....#.#...#.#...#.#...#.....#.........#...#...#...#.#.#...................#.#
|
||||||
|
###.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.###.###.#####.#.###.#.#####.#.###.###.#.#.#######.#.#####################.#.#####################.#
|
||||||
|
###...#...#...#...#.....#...#...........#.....###.......#.....#.......#.....###...#.........#.......................#.......................#
|
||||||
|
#############################################################################################################################################
|
||||||
125
2024/gareth/day21/day21.go
Normal file
125
2024/gareth/day21/day21.go
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
package day21
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type coordinate struct {
|
||||||
|
row, col int
|
||||||
|
}
|
||||||
|
|
||||||
|
var numberPad = map[string]coordinate{
|
||||||
|
"7": {0, 0}, "8": {0, 1}, "9": {0, 2},
|
||||||
|
"4": {1, 0}, "5": {1, 1}, "6": {1, 2},
|
||||||
|
"1": {2, 0}, "2": {2, 1}, "3": {2, 2},
|
||||||
|
"0": {3, 1}, "A": {3, 2},
|
||||||
|
}
|
||||||
|
|
||||||
|
var robotPad = map[string]coordinate{
|
||||||
|
"^": {0, 1}, "A": {0, 2},
|
||||||
|
"<": {1, 0}, "v": {1, 1}, ">": {1, 2},
|
||||||
|
}
|
||||||
|
|
||||||
|
type cacheKey struct {
|
||||||
|
sequence string
|
||||||
|
iterations int
|
||||||
|
}
|
||||||
|
|
||||||
|
var memo = make(map[cacheKey]int)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
codes := parseInput(input)
|
||||||
|
|
||||||
|
numpadGraph := createGraph(numberPad, coordinate{3, 0})
|
||||||
|
dirpadGraph := createGraph(robotPad, coordinate{0, 0})
|
||||||
|
|
||||||
|
total := 0
|
||||||
|
for _, code := range codes {
|
||||||
|
codeInt, _ := strconv.Atoi(code[:len(code)-1])
|
||||||
|
total += codeInt * getLength(code, 3, true, numpadGraph, dirpadGraph)
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
codes := parseInput(input)
|
||||||
|
|
||||||
|
numpadGraph := createGraph(numberPad, coordinate{3, 0})
|
||||||
|
dirpadGraph := createGraph(robotPad, coordinate{0, 0})
|
||||||
|
|
||||||
|
total := 0
|
||||||
|
for _, code := range codes {
|
||||||
|
codeInt, _ := strconv.Atoi(code[:len(code)-1])
|
||||||
|
total += codeInt * getLength(code, 26, true, numpadGraph, dirpadGraph)
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []string {
|
||||||
|
parts := strings.Split(input, "\n")
|
||||||
|
codes := []string{}
|
||||||
|
codes = append(codes, parts...)
|
||||||
|
return codes
|
||||||
|
}
|
||||||
|
|
||||||
|
func createGraph(keypad map[string]coordinate, invalidCoords coordinate) map[string]string {
|
||||||
|
graph := make(map[string]string)
|
||||||
|
|
||||||
|
for a, coordA := range keypad {
|
||||||
|
for b, coordB := range keypad {
|
||||||
|
x1, y1 := coordA.row, coordA.col
|
||||||
|
x2, y2 := coordB.row, coordB.col
|
||||||
|
|
||||||
|
path := strings.Repeat("<", max(0, y1-y2)) +
|
||||||
|
strings.Repeat("v", max(0, x2-x1)) +
|
||||||
|
strings.Repeat("^", max(0, x1-x2)) +
|
||||||
|
strings.Repeat(">", max(0, y2-y1))
|
||||||
|
|
||||||
|
if invalidCoords == (coordinate{x1, y2}) || invalidCoords == (coordinate{x2, y1}) {
|
||||||
|
path = reverseString(path)
|
||||||
|
}
|
||||||
|
graph[a+"->"+b] = path + "A"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return graph
|
||||||
|
}
|
||||||
|
|
||||||
|
func reverseString(s string) string {
|
||||||
|
runes := []rune(s)
|
||||||
|
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
runes[i], runes[j] = runes[j], runes[i]
|
||||||
|
}
|
||||||
|
return string(runes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLength(sequence string, iterations int, firstIter bool, numpadGraph map[string]string, dirpadGraph map[string]string) int {
|
||||||
|
|
||||||
|
if iterations == 0 {
|
||||||
|
return len(sequence)
|
||||||
|
}
|
||||||
|
|
||||||
|
key := cacheKey{sequence: sequence, iterations: iterations}
|
||||||
|
if cachedResult, exists := memo[key]; exists {
|
||||||
|
return cachedResult
|
||||||
|
}
|
||||||
|
|
||||||
|
graph := numpadGraph
|
||||||
|
if !firstIter {
|
||||||
|
graph = dirpadGraph
|
||||||
|
}
|
||||||
|
|
||||||
|
totalLength := 0
|
||||||
|
prev := "A"
|
||||||
|
for _, char := range sequence {
|
||||||
|
graphKey := prev + "->" + string(char)
|
||||||
|
if subSequence, exists := graph[graphKey]; exists {
|
||||||
|
totalLength += getLength(subSequence, iterations-1, false, numpadGraph, dirpadGraph)
|
||||||
|
}
|
||||||
|
prev = string(char)
|
||||||
|
}
|
||||||
|
|
||||||
|
memo[key] = totalLength
|
||||||
|
return totalLength
|
||||||
|
}
|
||||||
25
2024/gareth/day21/day21_test.go
Normal file
25
2024/gareth/day21/day21_test.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package day21
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`029A
|
||||||
|
980A
|
||||||
|
179A
|
||||||
|
456A
|
||||||
|
379A`)
|
||||||
|
assert.Equal(t, 126384, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`029A
|
||||||
|
980A
|
||||||
|
179A
|
||||||
|
456A
|
||||||
|
379A`)
|
||||||
|
assert.Equal(t, 126384, r)
|
||||||
|
}
|
||||||
5
2024/gareth/day21/input.txt
Normal file
5
2024/gareth/day21/input.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
985A
|
||||||
|
540A
|
||||||
|
463A
|
||||||
|
671A
|
||||||
|
382A
|
||||||
112
2024/gareth/day22/day22.go
Normal file
112
2024/gareth/day22/day22.go
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
package day22
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Queue struct {
|
||||||
|
data []int
|
||||||
|
size int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewQueue(size int) *Queue {
|
||||||
|
return &Queue{
|
||||||
|
data: make([]int, 0, size),
|
||||||
|
size: size,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (queue *Queue) Push(value int) {
|
||||||
|
if len(queue.data) == queue.size {
|
||||||
|
queue.data = queue.data[1:]
|
||||||
|
}
|
||||||
|
queue.data = append(queue.data, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (queue *Queue) Get() []int {
|
||||||
|
return queue.data
|
||||||
|
}
|
||||||
|
|
||||||
|
func (queue *Queue) String() string {
|
||||||
|
strs := make([]string, len(queue.data))
|
||||||
|
for i, val := range queue.data {
|
||||||
|
strs[i] = fmt.Sprintf("%d", val)
|
||||||
|
}
|
||||||
|
return strings.Join(strs, ", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
secretNumbers := parseInput(input)
|
||||||
|
|
||||||
|
total := 0
|
||||||
|
for _, number := range secretNumbers {
|
||||||
|
for i := 0; i < 2000; i++ {
|
||||||
|
number = getNextNumber(number)
|
||||||
|
}
|
||||||
|
total += number
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
secretNumbers := parseInput(input)
|
||||||
|
memo := make(map[string]int)
|
||||||
|
|
||||||
|
for _, number := range secretNumbers {
|
||||||
|
seen := make(map[string]bool)
|
||||||
|
queue := NewQueue(4)
|
||||||
|
prevNumber := secretNumbers[0] % 10
|
||||||
|
|
||||||
|
for i := 0; i < 2000; i++ {
|
||||||
|
singleNumber := number % 10
|
||||||
|
cost := singleNumber - prevNumber
|
||||||
|
queue.Push(cost)
|
||||||
|
if i > 3 {
|
||||||
|
if _, ok := seen[queue.String()]; !ok {
|
||||||
|
memo[queue.String()] += singleNumber
|
||||||
|
seen[queue.String()] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prevNumber = singleNumber
|
||||||
|
number = getNextNumber(number)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxMapValue(memo)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []int {
|
||||||
|
parts := strings.Split(input, "\n")
|
||||||
|
secretNumbers := []int{}
|
||||||
|
for _, part := range parts {
|
||||||
|
num, _ := strconv.Atoi(part)
|
||||||
|
secretNumbers = append(secretNumbers, num)
|
||||||
|
}
|
||||||
|
|
||||||
|
return secretNumbers
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNextNumber(number int) int {
|
||||||
|
step1 := (number * 64) ^ number
|
||||||
|
step1 = step1 % 16777216
|
||||||
|
|
||||||
|
step2 := (step1 / 32) ^ step1
|
||||||
|
step2 = step2 % 16777216
|
||||||
|
|
||||||
|
step3 := (step2 * 2048) ^ step2
|
||||||
|
step3 = step3 % 16777216
|
||||||
|
|
||||||
|
return step3
|
||||||
|
}
|
||||||
|
|
||||||
|
func maxMapValue(memo map[string]int) int {
|
||||||
|
maxValue := 0
|
||||||
|
|
||||||
|
for _, value := range memo {
|
||||||
|
if value > maxValue {
|
||||||
|
maxValue = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxValue
|
||||||
|
}
|
||||||
23
2024/gareth/day22/day22_test.go
Normal file
23
2024/gareth/day22/day22_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package day22
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`1
|
||||||
|
10
|
||||||
|
100
|
||||||
|
2024`)
|
||||||
|
assert.Equal(t, 37327623, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
2024`)
|
||||||
|
assert.Equal(t, 23, r)
|
||||||
|
}
|
||||||
1629
2024/gareth/day22/input.txt
Normal file
1629
2024/gareth/day22/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
11
2024/gareth/go.mod
Normal file
11
2024/gareth/go.mod
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
module aoc2024
|
||||||
|
|
||||||
|
go 1.23.2
|
||||||
|
|
||||||
|
require github.com/stretchr/testify v1.10.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user