Compare commits

...

24 Commits

Author SHA1 Message Date
bcd7daea9e day02 2025-12-04 11:56:36 +00:00
9c2e2c68dd day04 2025-12-04 11:53:17 +00:00
Gareth
90083f28e5 Day02 2025-12-02 06:54:15 +00:00
Gareth
7f6c31c003 Day03 2025-12-03 20:03:14 +00:00
Gareth
015607cde3 Day01 2025-12-01 18:11:11 +00:00
358249e78a day1 2025-12-01 14:04:11 +00:00
d730d3c444 after pull 2025-02-14 15:16:07 +00:00
759b9c9544 work 2025-02-14 15:14:46 +00:00
Gareth
a529516bab Day22 2025-01-22 22:31:04 +00:00
Gareth
ba588cbc77 Day21 2025-01-20 17:32:23 +00:00
Gareth
225d74acf9 Day20 2025-01-14 15:21:34 +00:00
3e69c5b463 Merge pull request 'Merge alan onto master' (#1) from alan into master
Reviewed-on: #1
2025-01-14 12:23:46 +00:00
6ab021face move to alan branch 2025-01-14 12:14:43 +00:00
1ee00e8d45 Merge branch 'tmp' 2025-01-13 23:57:55 +00:00
952def48a0 Revert "fix missing"
This reverts commit 08b38c2bd3.
2025-01-13 23:51:28 +00:00
08b38c2bd3 fix missing 2025-01-13 23:48:55 +00:00
29387606b0 updates 2025-01-13 18:48:07 +00:00
f8c29be7ef day9 2024-12-09 16:46:10 +00:00
19c4afdc98 days 2024-12-08 20:51:22 +00:00
Gareth
616618c7e2 Day04 2024-12-04 14:00:00 +00:00
Gareth
360ae5edbd Day06 2024-12-06 16:56:58 +00:00
Gareth
88938a8627 Day05 2024-12-05 13:39:33 +00:00
235999524b day4 2024-12-04 09:03:29 +00:00
Gareth
f6f5a10270 Day 03 2024-12-03 11:15:43 +00:00
123 changed files with 43039 additions and 20 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
2024
2023/*

191
2024/gareth/day20/day20.go Normal file
View 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
}

View 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
View File

@@ -0,0 +1,141 @@
#############################################################################################################################################
#...###...#.......###...........###...#...#####...#...#...###...#...#.........###...#.......#...#.....#.........#...........#...............#
#.#.###.#.#.#####.###.#########.###.#.#.#.#####.#.#.#.#.#.###.#.#.#.#.#######.###.#.#.#####.#.#.#.###.#.#######.#.#########.#.#############.#
#.#.#...#.#.#...#...#.#.........#...#.#.#...#...#.#.#...#.....#.#.#.#.....#...#...#.#...#...#.#.#.#...#.....#...#.#.........#.....#.........#
#.#.#.###.#.#.#.###.#.#.#########.###.#.###.#.###.#.###########.#.#.#####.#.###.###.###.#.###.#.#.#.#######.#.###.#.#############.#.#########
#.#.#.#...#...#...#...#.#...#.....#...#...#...#...#.#...........#.#.###...#.....#...#...#.....#...#.#...#...#.#...#.###...#...#...#.#...#...#
#.#.#.#.#########.#####.#.#.#.#####.#####.#####.###.#.###########.#.###.#########.###.#############.#.#.#.###.#.###.###.#.#.#.#.###.#.#.#.#.#
#.#...#...#...###.....#.#.#.#.#.....#...#.....#.#...#.#...#...#...#.#...#.........###.#.............#.#.#...#.#...#.....#...#.#.#...#.#.#.#.#
#.#######.#.#.#######.#.#.#.#.#.#####.#.#####.#.#.###.#.#.#.#.#.###.#.###.###########.#.#############.#.###.#.###.###########.#.#.###.#.#.#.#
#.#.....#...#.#.....#.#.#.#...#...#...#.....#.#.#.#...#.#...#.#...#...#...#...###...#.#.........#...#.#.#...#.#...#...#.......#.#.#...#...#.#
#.#.###.#####.#.###.#.#.#.#######.#.#######.#.#.#.#.###.#####.###.#####.###.#.###.#.#.#########.#.#.#.#.#.###.#.###.#.#.#######.#.#.#######.#
#.#.#...#.....#.#...#.#.#...#...#.#.......#.#.#.#.#.....#...#.###.....#.#...#.#...#...#.........#.#...#...#...#.#...#...###.....#.#.#.......#
#.#.#.###.#####.#.###.#.###.#.#.#.#######.#.#.#.#.#######.#.#.#######.#.#.###.#.#######.#########.#########.###.#.#########.#####.#.#.#######
#...#...#.....#.#.#...#.....#.#.#.#...#...#...#.#.#.....#.#...#...###.#...#...#.......#.....#...#.....#.....#...#.###.....#.....#...#.......#
#######.#####.#.#.#.#########.#.#.#.#.#.#######.#.#.###.#.#####.#.###.#####.#########.#####.#.#.#####.#.#####.###.###.###.#####.###########.#
###...#...#...#.#...#.......#.#...#.#.#...#...#...#...#.#.#.....#.....#.....#.....#...#.....#.#.#.....#.....#...#...#...#.###...#...........#
###.#.###.#.###.#####.#####.#.#####.#.###.#.#.#######.#.#.#.###########.#####.###.#.###.#####.#.#.#########.###.###.###.#.###.###.###########
#...#.....#...#.....#.#...#.#...#...#...#...#...#.....#...#...........#.###...#...#...#.#...#.#.#.#.......#.###...#...#.#.#...#...#.....#...#
#.###########.#####.#.#.#.#.###.#.#####.#######.#.###################.#.###.###.#####.#.#.#.#.#.#.#.#####.#.#####.###.#.#.#.###.###.###.#.#.#
#...........#.#...#...#.#.#.#...#.....#...#...#.#...#...#...#...#...#.#.#...#...#...#.#.#.#.#.#.#.#.#...#...#...#.#...#.#...#...###...#...#.#
###########.#.#.#.#####.#.#.#.#######.###.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.#####.#######.#####.#
#...###.....#...#.#...#.#...#.#.......#...#.#.#...#.#.#.#.#.#.#.#.#...#...#...###.#.#.#.#.#.#.#.#.#.#.#...###.#.#.#.#...#.....#.....#.#.....#
#.#.###.#########.#.#.#.#####.#.#######.###.#.###.#.#.#.#.#.#.#.#.#########.#####.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####
#.#.#...#.......#...#.#.#...#.#...#.....#...#.###.#.#.#.#.#.#.#.#.#.......#.#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.#.#...#.....#...#.#.#.....#
#.#.#.###.#####.#####.#.#.#.#.###.#.#####.###.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#####.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####.#
#.#...#...#.....#...#.#...#.#.###.#.#...#...#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.....#.#.#.#.#.#.#.#...#...#.#...#.....#.....#...#...#...#.#
#.#####.###.#####.#.#.#####.#.###.#.#.#.###.###.#.#####.#.#.#.#.#.#.#.#.#####.#.#####.#.#.#.#.#.#.#.#.###.###.###########.#####.#######.#.#.#
#.#...#...#...#...#.#.......#...#.#...#.....#...#.....#.#.#.#.#.#.#...#.....#.#...#...#.#.#.#.#.#.#.#.#...###.#.........#.......#.......#...#
#.#.#.###.###.#.###.###########.#.###########.#######.#.#.#.#.#.#.#########.#.###.#.###.#.#.#.#.#.#.#.#.#####.#.#######.#########.###########
#.#.#.#...#...#.###...........#.#...#.........#...#...#...#...#.#...#.....#.#.#...#...#.#.#.#.#.#.#.#.#.#...#.#.#...###.....#...#...........#
#.#.#.#.###.###.#############.#.###.#.#########.#.#.###########.###.#.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.###########.#
#.#.#.#.###.....#.............#.....#.#...#.....#.#.....#.......###.#...#...#.#.#...#.#.#.#.#.#.#.#...#.#.#...#...#...#...#...#.#.....#...#.#
#.#.#.#.#########.###################.#.#.#.#####.#####.#.#########.###.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###########.#.#.#####.#.###.#.#.#.#
#...#...#.........#...#.....#.......#.#.#.#...#...#...#.#.#...#...#.#...#...#.#.#.#.#.#.#.#.#.#.#...#...#.#...........#.#.....#...###...#.#.#
#########.#########.#.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.###########.#####.###########.#.#
###...###...#.......#.#...#...#.....#.#.#.#...#...#.#...#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.......#...#.#.....#.........#.#.#
###.#.#####.#.#######.###.#####.#####.#.#.#.#####.#.#####.#.#####.#.#.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.#.#.#.#####.#######.#.#.#
#...#.#...#...###...#.#...#.....#...#...#...#...#.#.....#.#.....#.#.#.#.###...#.#.#...#...#.#...#.#.#.#.#.......#...#...#...###.#.......#...#
#.###.#.#.#######.#.#.#.###.#####.#.#########.#.#.#####.#.#####.#.#.#.#.#######.#.#########.###.#.#.#.#.#.#####.###########.###.#.###########
#...#...#.........#...#.###.......#.........#.#...#.....#.#...#.#...#.#.#.......#.......#...#...#...#.#.#.#...#.#...........#...#...........#
###.###################.###################.#.#####.#####.#.#.#.#####.#.#.#############.#.###.#######.#.#.#.#.#.#.###########.#############.#
###...................#.#.....#...#.........#.....#.....#...#.#.....#...#.#.....#.......#...#...#...#...#...#.#.#.....#.......#...#.........#
#####################.#.#.###.#.#.#.#############.#####.#####.#####.#####.#.###.#.#########.###.#.#.#########.#.#####.#.#######.#.#.#########
#...#.......#...#...#...#...#.#.#.#.........#.....#...#...#...#...#.#.....#.###.#.......###.....#.#.#...#...#.#.......#.#.......#...#...#...#
#.#.#.#####.#.#.#.#.#######.#.#.#.#########.#.#####.#.###.#.###.#.#.#.#####.###.#######.#########.#.#.#.#.#.#.#########.#.###########.#.#.#.#
#.#.#.....#...#...#.........#...#...........#.#...#.#...#.#...#.#...#...#...#...#...#...#.........#.#.#.#.#.#...........#.............#.#.#.#
#.#.#####.###################################.#.#.#.###.#.###.#.#######.#.###.###.#.#.###.#########.#.#.#.#.###########################.#.#.#
#.#.#...#...#...#...#.....#......S###########.#.#.#...#...###.#.......#.#...#...#.#...###...#.....#...#...#.#.........#...#...#.........#.#.#
#.#.#.#.###.#.#.#.#.#.###.#.#################.#.#.###.#######.#######.#.###.###.#.#########.#.###.#########.#.#######.#.#.#.#.#.#########.#.#
#.#...#.#...#.#...#...###...#################.#.#...#.......#.#.......#.....#...#.........#.#.###.........#...#.....#...#.#.#.#.....#.....#.#
#.#####.#.###.###############################.#.###.#######.#.#.#############.###########.#.#.###########.#####.###.#####.#.#.#####.#.#####.#
#...#...#.....#.....#...#####################...#...#...#...#.#...#...........#...#.....#.#...#...........#...#.#...#...#.#.#.#...#...#...#.#
###.#.#########.###.#.#.#########################.###.#.#.###.###.#.###########.#.#.###.#.#####.###########.#.#.#.###.#.#.#.#.#.#.#####.#.#.#
#...#.#...#...#...#.#.#...#####################...#...#...###...#.#.........#...#.#.###.#.#...#.......#...#.#.#.#.....#.#.#.#.#.#.#.....#...#
#.###.#.#.#.#.###.#.#.###.#####################.###.###########.#.#########.#.###.#.###.#.#.#.#######.#.#.#.#.#.#######.#.#.#.#.#.#.#########
#...#...#...#...#.#.#...#.#...#################...#.........#...#.#.........#.#...#...#...#.#.###...#...#...#...#.......#...#...#.#...#...###
###.###########.#.#.###.#.#.#.###################.#########.#.###.#.#########.#.#####.#####.#.###.#.#############.###############.###.#.#.###
###...#...#...#...#.....#.#.#.#...###############.#...#.....#.....#.......#...#.....#...#...#.....#.........#...#...........#...#...#...#...#
#####.#.#.#.#.###########.#.#.#.#.###############.#.#.#.#################.#.#######.###.#.#################.#.#.###########.#.#.###.#######.#
#####...#.#.#...........#.#.#.#.#.........#######...#.#.....#...#...#...#.#.###.....#...#.#.....#...#.....#...#.............#.#...#.........#
#########.#.###########.#.#.#.#.#########.###########.#####.#.#.#.#.#.#.#.#.###.#####.###.#.###.#.#.#.###.###################.###.###########
###.......#.###.........#...#.#.........#......E#...#.......#.#...#...#...#...#.#...#.#...#...#...#...###.....#...#...#...###.#...#.....#...#
###.#######.###.#############.#########.#########.#.#########.###############.#.#.#.#.#.#####.###############.#.#.#.#.#.#.###.#.###.###.#.#.#
#...#.....#.#...#...#...#...#.........#...###...#.#.#...#...#.......#.....#...#.#.#...#.#.....###...#.........#.#...#...#...#.#...#...#...#.#
#.###.###.#.#.###.#.#.#.#.#.#########.###.###.#.#.#.#.#.#.#.#######.#.###.#.###.#.#####.#.#######.#.#.#########.###########.#.###.###.#####.#
#...#.###...#.....#.#.#.#.#.#...#...#...#.....#...#...#...#.....#...#...#.#...#.#.#.....#.#.......#.#...........#.....#.....#...#.....#...#.#
###.#.#############.#.#.#.#.#.#.#.#.###.#######################.#.#####.#.###.#.#.#.#####.#.#######.#############.###.#.#######.#######.#.#.#
###.#...#.........#...#...#.#.#.#.#...#.#.......#.....#.........#...#...#...#.#.#.#.......#...#...#...........#...###...#.......#.......#...#
###.###.#.#######.#########.#.#.#.###.#.#.#####.#.###.#.###########.#.#####.#.#.#.###########.#.#.###########.#.#########.#######.###########
#...#...#...#...#...........#.#...#...#.#.....#...#...#.......#.....#...#...#.#...###...#...#...#.........###...#.........#.....#.......#...#
#.###.#####.#.#.#############.#####.###.#####.#####.#########.#.#######.#.###.#######.#.#.#.#############.#######.#########.###.#######.#.#.#
#.#...#.....#.#...#.....#...#.#...#...#.....#.....#...#.......#.........#.....###...#.#...#...#.....#...#.........#...#.....###...#...#...#.#
#.#.###.#####.###.#.###.#.#.#.#.#.###.#####.#####.###.#.#########################.#.#.#######.#.###.#.#.###########.#.#.#########.#.#.#####.#
#.#...#.#...#.###...###...#...#.#.....#...#.......#...#...#...#.....#...#...#.....#.#.......#.#...#...#.......#.....#.#.....#...#...#...#...#
#.###.#.#.#.#.#################.#######.#.#########.#####.#.#.#.###.#.#.#.#.#.#####.#######.#.###.###########.#.#####.#####.#.#.#######.#.###
#...#.#.#.#...#...............#.........#.........#...#...#.#.#.#...#.#...#.#.....#.#.......#...#...#.....#...#.....#.......#.#.......#.#...#
###.#.#.#.#####.#############.###################.###.#.###.#.#.#.###.#####.#####.#.#.#########.###.#.###.#.#######.#########.#######.#.###.#
#...#.#...#...#.............#...#...............#.#...#...#.#...#.....#...#.#.....#.#.........#.....#.###.#.........#...#...#.#.......#.....#
#.###.#####.#.#############.###.#.#############.#.#.#####.#.###########.#.#.#.#####.#########.#######.###.###########.#.#.#.#.#.#############
#.....#.....#.....#...#.....#...#.......#.....#...#.......#.........#...#...#.....#...........#.....#...#.#...#...###.#...#...#.#...#.......#
#######.#########.#.#.#.#####.#########.#.###.#####################.#.###########.#############.###.###.#.#.#.#.#.###.#########.#.#.#.#####.#
###...#.........#.#.#.#.....#.#...#...#...#...#...###...###...#.....#.#...#...#...#.........#...###.....#...#...#.....#.......#...#...#.....#
###.#.#########.#.#.#.#####.#.#.#.#.#.#####.###.#.###.#.###.#.#.#####.#.#.#.#.#.###.#######.#.#########################.#####.#########.#####
#...#...........#...#.#...#.#...#...#.......###.#.#...#...#.#.#.....#...#.#.#.#.....#...###...###...#...#...............#...#.....#...#.....#
#.###################.#.#.#.###################.#.#.#####.#.#.#####.#####.#.#.#######.#.#########.#.#.#.#.###############.#.#####.#.#.#####.#
#...#...#...#...#...#...#...#...............#...#.#...#...#.#.###...#.....#.#.###.....#...........#...#.#.................#...###...#.#.....#
###.#.#.#.#.#.#.#.#.#########.#############.#.###.###.#.###.#.###.###.#####.#.###.#####################.#####################.#######.#.#####
###...#...#...#...#.....#...#.#.............#.#...#...#...#.#...#...#.###...#...#.......#.....#...#...#...........#.........#.......#.#...###
#######################.#.#.#.#.#############.#.###.#####.#.###.###.#.###.#####.#######.#.###.#.#.#.#.###########.#.#######.#######.#.###.###
#.................###...#.#...#...........#...#.###...#...#...#.#...#...#.....#.....###...#...#.#...#...........#...###...#...#.....#...#...#
#.###############.###.###.###############.#.###.#####.#.#####.#.#.#####.#####.#####.#######.###.###############.#######.#.###.#.#######.###.#
#.............#...#...#...#...............#.#...#...#.#.#...#.#.#...#...#...#.#.....#.....#.....###...#.........###.....#...#...#...###.....#
#############.#.###.###.###.###############.#.###.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.###.#########.#.#.###########.#######.#####.#.#########
#.....#.......#.#...#...#...#...#...........#...#.#...#.#.#...#.....#.....#.#.#.#...#...#.....#.....#.#...........#.#.....#...#...#...#.....#
#.###.#.#######.#.###.###.###.#.#.#############.#.#####.#.#################.#.#.#.#.###.#####.#.#####.###########.#.#.###.###.#.#####.#.###.#
#...#.#.......#.#.....###.....#...#.............#.....#.#.............#...#...#...#.#...#...#.#.#...#...#...#.....#.#...#...#.#.#...#...#...#
###.#.#######.#.###################.#################.#.#############.#.#.#########.#.###.#.#.#.#.#.###.#.#.#.#####.###.###.#.#.#.#.#####.###
###.#.#...#...#...###...#...#.......#.......#...#...#.#...#...###...#...#.#.........#.#...#...#...#...#...#.#.......#...#...#...#.#.#...#...#
###.#.#.#.#.#####.###.#.#.#.#.#######.#####.#.#.#.#.#.###.#.#.###.#.#####.#.#########.#.#############.#####.#########.###.#######.#.#.#.###.#
#...#...#...#...#.....#...#.#.........#.....#.#.#.#.#...#.#.#.#...#...###.#.#.....###.#.###...###...#.....#.#...#.....#...#...#...#...#...#.#
#.###########.#.###########.###########.#####.#.#.#.###.#.#.#.#.#####.###.#.#.###.###.#.###.#.###.#.#####.#.#.#.#.#####.###.#.#.#########.#.#
#.#.......#...#...#...#...#.#...#.......#.....#.#.#.#...#.#.#.#.....#...#.#.#.#...#...#...#.#.#...#.....#.#...#...#...#.....#...#...#...#...#
#.#.#####.#.#####.#.#.#.#.#.#.#.#.#######.#####.#.#.#.###.#.#.#####.###.#.#.#.#.###.#####.#.#.#.#######.#.#########.#.###########.#.#.#.#####
#.#.#.....#...#...#.#...#.#.#.#.#...#...#.....#.#.#.#.#...#.#.#...#...#.#.#.#.#.###...#...#.#.#.......#.#...###.....#.............#...#.....#
#.#.#.#######.#.###.#####.#.#.#.###.#.#.#####.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.#####.#.###.#.#######.#.###.###.###########################.#
#...#.#...#...#.....###...#...#.....#.#.#...#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#...#...#.#...#.#...#...#...#.....#...#...#...#...#...#.......#
#####.#.#.#.###########.#############.#.#.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.###.#.###.#.###.#.#.#.#####.#######.#.#.#.#.#.#.#.#.#.#.#######
#.....#.#.#.#.....#...#.....#.........#.#.#.#.#.#.#.#...#...#.#.#...#.#.#.#.#...#...###.#.###...#.#...#...#.......#...#.#.#...#...#.#...#...#
#.#####.#.#.#.###.#.#.#####.#.#########.#.#.#.#.#.#.###.#####.#.#.###.#.#.#.###.#######.#.#######.###.#.###.###########.#.#########.###.#.#.#
#.#.....#...#...#...#.......#.###.......#.#...#.#.#...#.###...#.#.....#...#.#...#.......#.......#...#.#.#...###.......#.#.....#...#...#...#.#
#.#.###########.#############.###.#######.#####.#.###.#.###.###.###########.#.###.#############.###.#.#.#.#####.#####.#.#####.#.#.###.#####.#
#.#.#...........#...#...#...#...#...#...#...#...#.#...#...#...#.....#.......#.###.....#.....#...###.#.#.#.......#.....#.......#.#.###.......#
#.#.#.###########.#.#.#.#.#.###.###.#.#.###.#.###.#.#####.###.#####.#.#######.#######.#.###.#.#####.#.#.#########.#############.#.###########
#...#.............#...#.#.#...#...#...#.#...#.#...#.#...#.#...#.....#...#...#.#.....#.#.#...#.....#...#.#.......#.....###...###.#...........#
#######################.#.###.###.#####.#.###.#.###.#.#.#.#.###.#######.#.#.#.#.###.#.#.#.#######.#####.#.#####.#####.###.#.###.###########.#
#...............#.....#...#...#...###...#...#.#...#.#.#.#.#.#...#...###...#.#.#...#...#.#.....#...###...#...###.....#.....#.....#...#.......#
#.#############.#.###.#####.###.#####.#####.#.###.#.#.#.#.#.#.###.#.#######.#.###.#####.#####.#.#####.#####.#######.#############.#.#.#######
#.............#.#...#.....#...#.#.....#...#.#.#...#.#.#.#.#.#.....#.......#.#...#...#...#.....#.....#.#...#.....#...#...#.....#...#.#.......#
#############.#.###.#####.###.#.#.#####.#.#.#.#.###.#.#.#.#.#############.#.###.###.#.###.#########.#.#.#.#####.#.###.#.#.###.#.###.#######.#
#...#...###...#.....#...#.....#.#.....#.#...#.#.###.#.#.#.#...#...#.....#.#.#...###.#.###...#...#...#...#.#.....#.#...#.#...#.#...#.........#
#.#.#.#.###.#########.#.#######.#####.#.#####.#.###.#.#.#.###.#.#.#.###.#.#.#.#####.#.#####.#.#.#.#######.#.#####.#.###.###.#.###.###########
#.#...#...#...........#.....#...#.....#.#.....#...#...#.#.###.#.#.#.#...#.#.#.#.....#.#.....#.#.#.#.......#.....#.#.#...#...#.....#...#...###
#.#######.#################.#.###.#####.#.#######.#####.#.###.#.#.#.#.###.#.#.#.#####.#.#####.#.#.#.###########.#.#.#.###.#########.#.#.#.###
#.......#.#.................#.#...#...#.#...#...#.....#.#.#...#.#.#.#.#...#.#.#...#...#.#...#.#.#.#.......#.....#...#...#...........#...#...#
#######.#.#.#################.#.###.#.#.###.#.#.#####.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#.#.#.#######.#.###########.###################.#
#.......#.#...#.....#...#...#.#.#...#...###.#.#...#...#...#.#...#.#.#.#.#...#.#...#.###...#.#.#.#.#.......#.......#...#.#.....#...#...#...#.#
#.#######.###.#.###.#.#.#.#.#.#.#.#########.#.###.#.#######.#.###.#.#.#.#.###.#.###.#######.#.#.#.#.#############.#.#.#.#.###.#.#.#.#.#.#.#.#
#...#...#...#...#...#.#.#.#...#.#.#...#...#.#.###.#.###.....#...#...#.#.#.....#...#.......#.#.#.#.#.#...#...#...#.#.#.#...###.#.#.#.#...#.#.#
###.#.#.###.#####.###.#.#.#####.#.#.#.#.#.#.#.###.#.###.#######.#####.#.#########.#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.#.#####.#.#
###...#...#.......#...#.#.#...#...#.#...#...#...#.#...#...#.....#.....#.#.........#.......#...#.#.#...#.#.#...#.#...#.......#.#.#.#...###.#.#
#########.#########.###.#.#.#.#####.###########.#.###.###.#.#####.#####.#.#########.###########.#.#####.#.#####.###########.#.#.#.###.###.#.#
#.........#.....#...#...#...#.....#.........#...#.#...###.#.#...#...#...#.#...#...#...#.......#...###...#.....#...#...#.....#...#...#...#.#.#
#.#########.###.#.###.###########.#########.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.###.#.#####.#######.#######.###.#.#.#.###########.###.#.#.#
#...#...#...###...#...#...#.......#.........#.###...#.....#...#.#...#.#...#.#.#.#...#...#...#.#.......#.......###...#.#.......#.....#...#...#
###.#.#.#.#########.###.#.#.#######.#########.#######.#########.#.###.#.###.#.#.###.#####.#.#.#.#######.#############.#######.#.#####.#######
#...#.#.#.#.........#...#.#.###...#...#.....#.......#.....#.....#...#.#...#.#.#...#...#...#...#.......#.#...#...#...#.#.......#.......###...#
#.###.#.#.#.#########.###.#.###.#.###.#.###.#######.#####.#.#######.#.###.#.#.###.###.#.#############.#.#.#.#.#.#.#.#.#.#################.#.#
#...#.#.#.#.#...#...#...#.#.#...#.....#.#...#.....#.....#.#...#.....#.#...#.#...#.#...#.....#.........#...#...#...#.#.#...................#.#
###.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.###.###.#####.#.###.#.#####.#.###.###.#.#.#######.#.#####################.#.#####################.#
###...#...#...#...#.....#...#...........#.....###.......#.....#.......#.....###...#.........#.......................#.......................#
#############################################################################################################################################

125
2024/gareth/day21/day21.go Normal file
View 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
}

View 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)
}

View File

@@ -0,0 +1,5 @@
985A
540A
463A
671A
382A

112
2024/gareth/day22/day22.go Normal file
View 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
}

View 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

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
package main
import (
"aoc2024/day09"
"aoc2024/day22"
"fmt"
"os"
"time"
@@ -9,11 +9,9 @@ import (
func main() {
start := time.Now()
data, _ := os.ReadFile("day09/input.txt")
fmt.Printf("part 1: %d\n", day09.Part1(string(data)))
fmt.Printf("part 2: %d\n", day09.Part2(string(data)))
data, _ := os.ReadFile("day22/input.txt")
fmt.Printf("part 1: %d\n", day22.Part1(string(data)))
fmt.Printf("part 2: %d\n", day22.Part2(string(data)))
elapsed := time.Since(start)
fmt.Printf("Execution time: %s\n", elapsed)
}
// 6320029754031

291
2024/go/day06/day06.go Normal file
View File

@@ -0,0 +1,291 @@
package day06
import (
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
_ "strings"
)
type Direction int
const (
_ Direction = iota
Up
Down
Left
Right
)
type Pos struct {
x int
y int
}
type Loc struct {
dir Direction
pos Pos
count int
}
type Point struct {
dirs []Direction
display string
}
func (d Direction) String() string {
return [...]string{"-", "Up", "Down", "Left", "Right"}[d]
}
func (l Loc) String() string {
return fmt.Sprintf("Direction: %s, Position: %d %d", l.dir, l.pos.x, l.pos.y)
}
func Part1(input string) int {
var loc Loc
grid := inputs.ToGrid2D(input, "\n", "", "", func(c string) string { return c })
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y) == "^" {
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y) == "v" {
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y) == ">" {
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y) == "<" {
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
}
}
}
fmt.Println(grid.Matrix())
fmt.Printf("%v\n", loc)
grid.Set(loc.pos.x, loc.pos.y, "X")
loc.count = 1
move1(&loc, grid)
return loc.count
}
func Part2(input string) int {
var loc Loc
grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y).display == "^" {
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "v" {
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == ">" {
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "<" {
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
}
}
}
fmt.Println(grid.Matrix())
fmt.Printf("%v\n", loc)
point := grid.Get(loc.pos.x, loc.pos.y)
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"})
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
grid = inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
p := grid.Get(x, y)
if p.display == "." {
grid.Set(x, y, Point{dirs: p.dirs, display: "#"})
l := loc
if isLoop(&l, grid) {
loc.count++
}
grid.Set(x, y, Point{dirs: p.dirs, display: "."})
}
}
}
return loc.count
}
func isLoop(loc *Loc, grid *grid2d.Grid[Point]) bool {
for {
_, _, err := move2(loc, grid)
if err != nil { return false }
if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) {
return true
} else {
p := grid.Get(loc.pos.x, loc.pos.y)
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(p.dirs, loc.dir), display: "X"})
}
}
}
func Part2b(input string) int {
var loc Loc
grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y).display == "^" {
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "v" {
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == ">" {
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "<" {
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
}
}
}
fmt.Println(grid.Matrix())
fmt.Printf("%v\n", loc)
point := grid.Get(loc.pos.x, loc.pos.y)
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"})
loc.count = 0
for {
_, _, err := move2(&loc, grid)
if err != nil {
break
}
if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) {
loc.count++
break
}
}
return loc.count
}
func move1(loc *Loc, grid *grid2d.Grid[string]) int {
return -1
}
func move2(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) {
x, y, err := doMove(loc, grid)
if err != nil {
return x, y, err
}
if x == loc.pos.x && y == loc.pos.y {
move2(loc, grid)
}
return x, y, nil
}
func canBlock(loc *Loc, point Point) bool {
val := false
switch loc.dir {
case Up:
if contains(Right, point) {
val = true
}
case Down:
if contains(Left, point) {
val = true
}
case Left:
if contains(Up, point) {
val = true
}
case Right:
if contains(Down, point) {
val = true
}
}
return val
}
func contains(v Direction, point Point) bool {
for _, d := range point.dirs {
if d == v {
return true
}
}
return false
}
func checkMove(loc *Loc, grid *grid2d.Grid[string]) bool {
switch loc.dir {
case Down:
if loc.pos.y+1 >= grid.SizeY() {
return false
}
if grid.Get(loc.pos.x, loc.pos.y+1) == "#" {
loc.dir = Left
} else {
loc.pos.y++
}
case Up:
if loc.pos.y-1 < 0 {
return false
}
if grid.Get(loc.pos.x, loc.pos.y-1) == "#" {
loc.dir = Right
} else {
loc.pos.y--
}
case Left:
if loc.pos.x-1 < 0 {
return false
}
if grid.Get(loc.pos.x-1, loc.pos.y) == "#" {
loc.dir = Up
} else {
loc.pos.x--
}
case Right:
if loc.pos.x+1 >= grid.SizeX() {
return false
}
if grid.Get(loc.pos.x+1, loc.pos.y) == "#" {
loc.dir = Down
} else {
loc.pos.x++
}
}
return true
}
func doMove(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) {
x := loc.pos.x
y := loc.pos.y
switch loc.dir {
case Down:
if loc.pos.y+1 >= grid.SizeY() {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x, loc.pos.y+1).display == "#" {
loc.dir = Left
} else {
loc.pos.y++
}
case Up:
if loc.pos.y-1 < 0 {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x, loc.pos.y-1).display == "#" {
loc.dir = Right
} else {
loc.pos.y--
}
case Left:
if loc.pos.x-1 < 0 {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x-1, loc.pos.y).display == "#" {
loc.dir = Up
} else {
loc.pos.x--
}
case Right:
if loc.pos.x+1 >= grid.SizeX() {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x+1, loc.pos.y).display == "#" {
loc.dir = Down
} else {
loc.pos.x++
}
}
return x, y, nil
}

View File

@@ -0,0 +1,35 @@
package day06
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...`)
require.Equal(t, 41, r)
}
func TestPart2(t *testing.T) {
r := Part2(`....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...`)
require.Equal(t, 6, r)
}

130
2024/go/day06/input.txt Normal file
View File

@@ -0,0 +1,130 @@
...#..................#...................#......................#..............................#.............................#...
....#.......................#........#.#..............##...........#.....#..........#..........................#..................
.............#........................................................................#.........#.#..#..#..........#..............
..........#.......#..........#..................#........##...................#..............#....................................
....................#..........................................................#..#.....................................#.........
....#............................#..............................................#.....................#..........##....#..........
.......#.............#......................................................................#.............#.........#.............
....###......................#....#...........#.....#................................#..........................#.................
..........#..#...........#..#........................................................#.....#...........#................#.........
..#....#......#....#....#...................................................................#.....................................
....................#............#............................................#......#....#...............................#.......
..........#.......#.........#.......#.............................................................................................
.......#...#.......................................#...................#..........................................................
.......#........#............................#.....#.......#..............................................#..................#...#
.....................#.................................#................#...#...............#.....#.#..........................#..
.....#..........................................#......................#.............##..............................#........#...
.....#......#.........................#..........................#..........................................................#..#..
.#......#.............#......#.................................................#.....#...................##......#................
.............................................................................##...................................................
........................................#.......................................#........#.............................#.#.......#
...........#.....................................#.............................#......#......#..#....................#..#.........
.............................................#.......................#..................##....#.....#.............................
........................#..............................................................#..........................................
#..............#.........................#........#...#...............#..............#..................#....................##...
...#...#.............................#.......#................................................#........................#....#.....
.....#.........................#..#.......................#..........#.....................#..................#.#.....#...........
..................#........#..#.......#...................................................................................#....#..
..#...#...............................................#.#..#........................................................#....#......#.
...............#...............#..........................#............................#..........#.............#.................
............#.....#........#.........................................................#........#........#.....#........#......#....
............................#.........#....#........#.....#...#.............#.................................#...................
........#..................#....#..........................................................#.#.#..................................
....................................................................................................................#.............
#............#.............#..................#......................................................................#............
...............................#....#..........#...........##........................................................#.........#.#
................#.........................................#.................................................#........#............
..............................................#............#................#........#........................#...................
..................#.........#..........................#.............#...............#............#....................#..........
........................#...#...............................................#..............#.....#.....................#..........
...........#.......................................#..............................#..................#....#...##..................
#...............#..................#...............................#...............................#.....................#........
.............#...............................................................##...................................................
.................#.............#.......................#...#............#.#....#................................#...........#.....
#......#......#..................................##.................#.#...............................#...........................
.#...............#..........#...............................................#...#..........#..........#...........................
.....................................#............................#....#.............................................#...#........
......#...#.............#.#....................#.........#..........##.................................#..........#..........#....
.............................#..................#....#..............##.......................#.#.....#........#...................
.................................................#.#......................................................#................#......
......................................#..........................................#......#.........................................
#....................#...........................................................#..................#.............................
.....#.........#...................................................#....#.#....#.#.........#......................................
........#..........#......#.............#................................#.....#................#.................................
...........#................................#...........#..........#......#.............#........................#................
.......#...............#....................#..#................................................#.................................
.....................#.........#..#............#..........#...........#...........#...............................#...............
................#...#........#...........#..........................................................#..#...................#......
.........................................................#.....................#...#......................#.#....................#
................#......#....#.#..............#............#.......................................................................
..........#.....................................#......................................................................#..........
#......................................#.......#.....##..#.....................#.........#.......#................................
........#...#..............#....................#................................#..............................................#.
.##............................................................................#......#................................#..........
.#........................#..............#..............................................#........#.....#.......#..................
#......................................#.....................#...................................................................#
............................#.....#.....#............#...............#...#.......#.........#......................................
.#.........................#.......................#.........#.......#.................#............................#..#..........
.............................................................................................................#........##..........
...........#...#...#.#................#.....................................#........#............................................
......#.......................#..........#.......#................................................................#...............
........#....#........#..................#....##.....#............#..............................#...........#...........#..#.....
..................................#...............................................................................#...............
.....................#.#.......................#....................................#.............................................
........................................................................................#.........#.................#.........#...
..........................#..........#....#..........................................#.......................#............#.#.....
...............................................#.#....#...............................#...................#......................#
.....#...........#........#.#.......#.............................#..................#............................................
...............#.........................................................#....................#.................#.............#...
#....................................##..........#................................................................#...............
...............#.................#...#..............#......................................................#..............#.......
...................#......#.............................................#......................................................#.#
..#.............#.......#......#....#..#..#.......................................................................................
.........#....................................................#.....................................#..............#..............
..............#..............#................................................................#.......................#...........
..........................#.................#.......................................................##...................#.#......
...............#..#...................................................................................................#.......###.
...#.....................#..#........#..........#..................................................................##.............
.................#.......................................###..............#.........................#.............................
...#.....................................................#.......#..........................#................#..#.................
...................................................#..................#.........................................................#.
.....#.............#...................#...................#.....................................#................................
.....................#.........................#......#...........................................................................
...........#...............#......#.....##...#...#.............................................#........#.#...............#...#...
..............#..............##...........#.......................#..#.^..........................................................
...................#..............................................................................................................
..................#.......#..........#.......#..................#..........#...................................#..................
..............................................................................................#..................................#
......................................................#................#......................#...................................
..............#.........#..............................#.....................#......................#.............................
#................#.........#................#.............................#......................#..#...#..............#..........
.#..#........#................#...............#..................#........#.....................#............#........#...........
.....................................................#.#.........#......................#.............................#........#..
......................#.....................#..#......#..........................#............................#......#............
......................#.........................#..#..................................#.......................#..............#....
..........................#..................#.............#......................................................#...............
..........................#....#........................................#..#...#....#.................#...........................
.......#...........#.......................#............##........#....................................................#..........
#..........................................................................#...........#..........................................
............................................................#.................#..#........................................##......
..#...............................................#....#.................................................##.....#...##.....#......
...#.....##..............................#.........................................................#............#.................
.....#....##............................#....##..........#...#....................................................................
..................................................#..........................#.........##.......#.......................#.........
.........#.....#..........#........#........................#.##..#............#.......................................#..........
.....#...............#.......#..........#.#..........#.....................#.....................................#.....#..........
....#......#............................................................................................##...#.#.#.........#......
...........#........................#.....#....................#..................#.#........#....................................
....................................................#................#.#................................................#.........
..........#..............#.......................#.................#...................................#.............#.#......##..
................##......................................................#.................#.......#.#....................#........
................#......................................................#.............##...............#.....#......#.......#......
..............................#............................#..........#...........#...............................................
.......#.............#....................................................................#..............................#.#......
...#.....................#.#...............................................................#...#..#....#..........................
....#.........##......#..............................................................................#..................#.........
....#..........................................#......#...................#........##............#................................
..#.......#......#............#........#...#.#...........................#.......#................................................
..........................#...#....................#...............#...#......#.#...#...#...............#.#.#.....................
....##.#....................................................................#...#.....##........................#.##..............
.............................................#....................................................................................

140
2024/go/day07/day07.go Normal file
View File

@@ -0,0 +1,140 @@
package day07
import (
"adventofcode2024/utils"
"fmt"
"strconv"
"strings"
)
type Op int
const (
Add Op = iota
Mul
Conc
)
func Part1(input string) int {
val := 0
lines := strings.Split(input, "\n")
for _, line := range lines {
parts := strings.Split(line, ":")
result := utils.MustAtoi(parts[0])
numStrings := strings.Fields(parts[1])
var numbers []int
for _, numStr := range numStrings {
num := utils.MustAtoi(numStr)
numbers = append(numbers, num)
}
bitmask := 1 << (len(numbers) - 1)
for i := 0; i < bitmask; i++ {
calc := 0
switch isNthBitSet(i, 0) {
case true:
calc = numbers[0] + numbers[1]
case false:
calc = numbers[0] * numbers[1]
}
for n := 1; n < len(numbers)-1; n++ {
switch isNthBitSet(i, n) {
case true:
calc = calc + numbers[n+1]
case false:
calc = calc * numbers[n+1]
}
}
if calc == result {
fmt.Printf("result: %v numbers:%v count: %d\n", result, numbers, bitmask)
val += result
break
}
}
}
return val
}
func Part2(input string) int {
val := 0
lines := strings.Split(input, "\n")
for _, line := range lines {
parts := strings.Split(line, ":")
result := utils.MustAtoi(parts[0])
numStrings := strings.Fields(parts[1])
var numbers []int
for _, numStr := range numStrings {
num := utils.MustAtoi(numStr)
numbers = append(numbers, num)
}
operations := []Op{Add, Mul, Conc}
results := [][]Op{}
generatePermutations(operations, len(numbers)-1, []Op{}, &results)
for _, op := range results {
calc := 0
switch op[0] {
case Add:
calc = numbers[0] + numbers[1]
case Mul:
calc = numbers[0] * numbers[1]
case Conc:
calc = concat(numbers[0], numbers[1])
}
for n := 1; n < len(numbers)-1; n++ {
switch op[n] {
case Add:
calc = calc + numbers[n+1]
case Mul:
calc = calc * numbers[n+1]
case Conc:
calc = concat(calc, numbers[n+1])
}
}
if calc == result {
fmt.Printf("result: %v numbers:%v\n", result, numbers)
val += result
break
}
}
}
return val
}
func isNthBitSet(num, n int) bool {
return num&(1<<n) != 0
}
func getOp(row, col int) Op {
vals := []Op{Add, Mul, Conc}
// Column 0 cycles as row / 3
if col == 0 {
return vals[row/3]
}
// Column 1 cycles as row % 3
return vals[row%3]
}
// Recursive function to generate permutations
func generatePermutations(ops []Op, n int, prefix []Op, results *[][]Op) {
if n == 0 {
// Append a copy of the current prefix to the results
*results = append(*results, append([]Op{}, prefix...))
return
}
// Iterate over all operations and build the combinations
for _, op := range ops {
generatePermutations(ops, n-1, append(prefix, op), results)
}
}
func concat(a, b int) int {
aStr := strconv.Itoa(a)
bStr := strconv.Itoa(b)
concatStr := aStr + bStr
result, _ := strconv.Atoi(concatStr)
return result
}

View File

@@ -0,0 +1,47 @@
package day07
import (
"testing"
"github.com/stretchr/testify/require"
"fmt"
)
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`)
require.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`)
require.Equal(t, 11387, r)
}
func TestGetOp(t *testing.T) {
operations := []Op{Add, Mul, Conc} // Define the operations
X := 3 // Define the number of positions (columns)
// Start the recursive generation with an empty prefix
results := [][]Op{}
generatePermutations(operations, X, []Op{}, &results)
for _, op := range results {
fmt.Printf("%v\n", op)
}
r := Add
require.Equal(t, Add, r)
}

850
2024/go/day07/input.txt Normal file
View File

@@ -0,0 +1,850 @@
16183610: 62 7 96 8 6 8 52 3 3 47
408936528: 5 1 5 1 9 2 2 8 7 1 725 63
20378697464: 101 893 487 2 6 4
376576: 4 9 235 57 1 3 6 722 8
431880008: 18 66 276 5 295 4 5 7 1
379520346363: 858 95 723 8 92 7 9 2
18243750: 76 24 3 750
7302: 806 446 391 791 3
18879037: 7 75 1 94 217 37
3887037856: 805 64 71 7 9 856
120267: 3 48 937 659 3 69
757199: 86 2 69 7 7 8 80 5 8 743
5835692: 349 65 110 8 1 8 35 4
9693533: 560 33 54 523 251
1691420808: 33 720 4 76 84 66
27537: 5 2 2 4 296 73 89
3099946535: 7 330 5 245 9 4 5 3 7 3 5
2430252: 58 1 3 9 47 71 5 19 418
379232792: 789 98 6 71 6 8 535 8 2
11690268: 2 92 3 2 83 72 1 3 1 6 8 4
65091: 225 4 895 1 9 6 5 6 81
230263117372: 405 38 568 727 7 372
1071440: 6 4 614 67 30 4 7 1 229
60445800: 3 7 9 9 9 683 27 8 4 4
6834722563: 95 43 29 182 9 317
449482: 98 1 458 99 85
381868494: 74 992 18 289 78
42075: 86 3 28 14 38 18 225
105275: 13 751 755 4 91
1258023882: 4 79 534 502 61 3 3 9
766505: 7 87 21 4 4 7 83 5
4569436040: 355 7 6 3 4 7 8 753 4 29
182512: 4 1 7 1 6 66 38 8 6 112
238680: 9 42 36 65 2
81450600: 235 52 86 6 275 2
20684471: 2 989 98 2 4 237 3 7 59
79521192: 48 98 9 91 5 15 29 18
604195918: 756 74 12 2 9 52 7 8
43646875223: 62 28 8 5 6 8 730 3 2 3
24683153283: 5 12 2 2 462 2 72 24 3
13641: 21 664 2 3 655 5 61
23364264: 35 5 9 43 39 2 520 8 33
1352375279: 9 21 54 9 84 61 527
122558095823: 51 58 4 676 99 6 3 7 2 9
9153847: 912 3 1 38 47
623510: 25 63 6 30 892 86 2 5
100277100: 352 773 45 20 90 22
19779196416: 7 239 64 716 2 129
5982828: 86 3 644 9 2 271 66 4
1287462: 3 25 68 2 93 15 6 22
11178753676: 9 9 69 3 7 2 4 8 2 6 8 8
38798: 3 314 4 4 71 38
15055: 1 43 7 52 3
58769: 813 2 4 4 3 1 1 8 3 47 7 5
716958509: 2 343 612 33 69 5
1675: 1 28 41 19 467
39178: 3 873 40 3 1 9
708235: 340 13 9 2 50 385
61112: 7 52 2 107 5
9420: 2 9 5 70 4 13 2 468 8
23543454: 8 478 2 87 242
35262945144: 26 81 91 441 184
357858: 68 4 6 9 92 7 9 92 54
2718246046: 1 85 4 95 53 7 7 5 6 2 2 6
575: 519 2 49 3 2
1180: 172 18 58 44 888
1206891306: 2 9 1 67 80 9 1 2 9 8 5 3
1968096: 6 5 545 39 7 5 2 21 6 6 4
74504: 744 97 7
452256: 8 355 5 796 81 168
418262248: 541 1 482 802 2
152402250369: 4 87 8 8 6 319 65 369
123797905: 9 7 550 577 1 7 2 5 3 5 7
3129360: 73 1 7 5 62 59 20
13030160: 58 9 4 748 65
3758143: 7 80 6 44 6 7 1 4 17 9 4
1058: 521 534 3
6027582: 8 55 704 838 2
55923132: 971 9 7 137 1 6
42362711: 423 614 8 71 440
74875: 89 83 85 4 57 94
6528: 6 8 8 17
376636: 7 9 301 12 636
33983238: 77 8 38 925 422 51
9773991: 76 738 2 998 6
13324553022657: 7 4 20 5 9 5 30 22 646 9
99691578: 5 71 1 9 4 7 325 7 1 54 7
15561636: 4 3 74 7 10 9 7 6 6 3 3 1
133680: 1 59 7 1 24 5
768797: 956 3 8 375 7
2192068: 4 4 7 2 7 22 7 2 9 97 76
141515823: 4 8 51 515 449 3
102779637: 902 41 6 251 3 920
255504: 7 843 1 68 3
6334426: 8 4 42 47 132 3 439 6
1679200: 6 2 1 28 7 954 4 1 2 4 5
743869: 686 85 6 56 893
1740659638: 723 68 4 5 38 4 37 65 3
38740803516: 696 4 198 64 36 439
1445311524: 851 1 51 9 4 197 4 4 4
82489: 6 13 27 26 153 22
288151123: 5 8 95 3 4 121 6 7 5 7 7 8
33615: 41 9 2 83 249
235334584: 616 5 9 2 473 7 8
18983872: 3 58 389 84 8
966410: 117 12 622 477 3 5
31850527: 318 32 17 741 787
7766: 8 97 6
3767400: 6 4 3 9 203 2 17 7 4 30
8170454: 494 93 449 31 1
56113624133: 5 4 7 6 502 7 9 71 7 35 3
1070749: 2 60 64 3 986 4 6 4 9 1
152169288123: 3 440 2 47 3 834 878 3
23710639960: 7 7 6 2 3 4 2 395 81 2 4 4
41133: 1 1 736 6 119 3 85 2 3 3
2438060548: 872 65 66 8 16 5 308
2150: 60 975 6 34 2
42667317: 8 9 2 848 6 2 7 693
99291: 8 52 97 811 115 69
700480533: 152 24 4 995 533
2043415727134: 437 668 53 7 6 6 5 13 4
47685378032: 2 7 4 4 2 87 82 5 962 32
1623679122582: 842 679 71 4 2 58 2
13176069: 5 5 527 988 81
402209662: 4 891 26 8 4 9 38 389
62080: 86 718 329
1056230: 475 2 5 2 553
95017: 8 6 9 5 8 13 323 7 6 1 5 7
130085288174: 9 9 2 9 674 36 4 2 17 4
179095515: 2 38 6 7 6 26 9 36 8 27
520128: 9 66 438 504
110760: 3 8 4 7 4 60 71
76246863: 2 80 3 3 5 75 7 761 791
2167131616: 590 79 3 197 236 19 1
243936484: 25 10 5 8 8 857 4
88760: 305 4 30 6 2 9 1 70
6539567445: 2 673 89 206 49 53 5
802: 89 4 8 2 1 56
198163: 55 9 8 5 5 514 273
184378: 38 691 7 11 561
342819000: 82 387 8 5 2 3 5 9 8 8 27
10656324: 5 26 8 1 7 186 3 1 6 7 6
552920982: 87 69 7 92 91 9 61 2
20206: 1 63 1 86 79 535
1555253: 731 36 853 960 53
3143202608: 91 2 4 378 4 72 49 7
108617320: 7 64 27 657 8 367 1 49
1002415: 2 5 5 4 235 21 53 3 61 2
554954: 96 720 227 9 8 7 1 99
14766160525: 748 1 337 25 13 6 6 5 5
26599060: 51 610 855 1 9
313216: 70 93 6 92 8
495206630906: 624 496 4 577 25 4 6
852106300: 461 6 1 83 3 95 5 629
338693777: 3 386 93 739 38
84441: 50 93 2 18 647 45 13
19591896: 3 47 87 143 888 8
1215760: 88 32 8 7 760
303: 8 64 9 215 7
4493757702: 587 7 4 9 2 5 4 7 3 3 994
45810: 6 54 4 7 4
455911: 475 1 3 9 9 2 10 91 5 1
21250549332: 9 7 6 6 51 18 183 43 8 9
1651093: 716 6 3 3 1 4 1 8 8 52 4 5
1425: 50 4 36 6 9
240413184: 8 5 6 5 7 6 8 7 34 9 96 8
9353: 10 13 9 8 1 1 4 4 3 7 5 8
2098356329412: 6 57 264 714 1 5 7 651
1366070: 18 3 2 99 220 237
166196809: 68 59 291 20 7 284 9
40834936: 405 659 51 3 1
37929239: 5 739 66 518 39
332660900: 25 96 954 572 541
17248552687: 71 8 6 71 3 56 8 6 88
736: 2 97 58 4 6 9 5 62 6 8 7 5
1113308: 7 4 9 3 1 515 9 6 7 840 1
1047862: 99 5 552 863 1
8679: 9 6 32 5 39
17123332: 150 3 542 72 38
14301196: 810 535 6 33 446
13953852: 82 2 21 94 18 844 1
30194: 5 4 5 3 487
299623: 40 908 79 4 55
45472: 3 56 56 29 7
4534682: 9 17 6 96 6 52 92 159 2
182860020: 664 873 836 35 9
2594594: 2 7 5 20 6 8 6 594 7 1 1
5956711: 1 3 88 2 900 8 68 3 61
513431: 641 64 8 98 21
1690136: 197 191 66 66 8
50985: 32 9 59 3 3
1540800567: 15 30 4 16 535 567
393181: 3 3 3 2 6 9 295 43 4 69
152631244: 89 18 287 808 44
49366847: 9 60 5 831 99 551 2
47525635: 433 4 2 212 359 256 3
313329721: 139 788 41 18 458 4 9
48862422: 1 6 40 331 4 254 500 9
39443910: 87 42 1 849 170 237
130906800: 207 85 93 16 5
220175705: 42 3 2 654 89 35 79 95
14111: 1 6 5 8 6 8 143 510 4 9 5
409336410: 846 720 10 8 7 5 2 1 7 6
113011515265: 9 3 39 7 61 5 2 663 605
2387490: 6 9 7 5 221 80 60 70 8 5
7712: 2 7 1 155 606 2
8043: 210 91 58 790 7
146645: 4 407 30 3 122
8480556: 1 8 5 922 657
689065610: 7 141 2 698 10
2753326: 1 141 6 5 4 1 9 39 643
345873: 7 265 3 8 26 1 47
74885173: 372 7 670 8 2 85 9 8 3
136583527: 6 6 8 8 3 9 8 5 51 822 7
3089340323: 8 64 8 1 90 477 2 4 53 3
1096918: 195 6 886 9 920
5367398: 535 68 80 25 98
3976108135: 7 9 2 5 1 1 1 6 31 33 7 56
2496005: 8 19 199 55 71
2893997: 2 3 6 9 5 19 88 9 502 7
557376309: 295 7 7 1 2 623 27 699
42567659: 42 480 1 875 5 9
15723798791671: 4 926 456 7 6 791 671
91: 3 1 87
75030526368: 250 695 9 692 78 8 96
17385: 560 19 3 2 3
616920: 3 60 879 1 582
584294213: 8 346 7 7 4 213
4724: 9 416 7 467
155165: 4 11 95 2 648 4 19 125
981426041: 4 83 7 71 3 50 9 4 5
19972184: 2 5 31 7 2 231 2 4 4 62
549451: 7 6 741 734 53
5081833: 4 950 6 996 2 1 6 6 7 3 1
1988310268: 9 3 5 707 744 14 6 8 2
96053133326: 5 804 8 8 192 972 8 7 2
3528: 3 11 28 3 3
24189396: 8 3 2 171 4 4 33 28
864165: 9 4 78 73 795
26433000: 667 5 1 6 660
8858: 38 1 4 206
3200393280: 50 1 3 912 7 940 79
2445982082: 49 1 7 94 4 86 7 64 2
3488032730490: 73 5 6 8 57 7 8 938 490
10071162: 8 381 15 137 3 8 8 9 1
444: 69 6 30
28452288677408: 480 45 5 2 6 7 90 658 8
2593: 860 1 1 3 7
198443470: 7 506 8 78 72 97 94
75507: 754 2 2 85
564275: 3 3 767 4 3 6 3 515 9 5 6
1226: 58 4 1 276 887
1416: 6 3 4 25 55 36
4946042400: 9 751 929 60 65
10626120960: 5 1 280 6 7 4 8 672 235
222300: 10 494 15 1 3
15905: 39 6 13 3 27 29
89152410253: 1 27 8 2 2 6 8 8 1 518 5 3
347293: 7 6 5 61 1 64 336 1 659
397401: 7 7 5 20 9 9 43 1 3 7 1 3
38394: 6 466 2 1 81
120391: 4 9 145 4 3 7 9 8 2 6 927
110645540: 5 180 267 1 2 9 2 143 4
87614568: 2 4 63 32 73 213 591 4
4709992455381: 3 6 7 2 2 955 791 9 159
6834689: 27 6 194 8 3 689
768: 1 16 4 5 694
320720507: 39 660 890 7 2 7 9
349171872: 11 36 32 82 1 89 9 6 56
2144800: 47 79 3 5 32 25 7
4415: 1 1 2 8 3 6 1 7 799 8 4 3
77208: 2 322 34 7 96
70838: 5 209 55 6 76 52 2 88
711169603810: 9 1 9 2 20 80 74 761 1 5
6894733854: 684 60 84 6 90 3 4 21 2
5086572: 316 31 296 9 3 7 1 8 28
2928408191557: 394 991 42 5 5 4 75 7
509332682: 5 1 4 37 834 58 7 5 68 2
13102440337: 1 6 3 780 5 8 3 37
10878341: 9 90 612 170 45 41
498132911: 4 911 685 999 89
958999: 683 23 61 6 5 17 722
143343: 88 59 9 92 751 210 3
2743510584: 6 706 6 385 584
251973: 424 66 5 8 9
10183308: 169 709 9 5 3 9 67 2 46
749315: 464 4 4 68 10 2 2 203
92707239: 6 522 50 4 2 74 1 6 25 8
82155646350715: 4 87 2 84 9 463 507 15
87924480: 281 975 789 320
60415: 5 804 3 23 5
971347: 83 13 9 2 47
17037310: 7 811 3 6 310
15333: 535 78 95 99 19
23713: 3 2 39 519 877
29532875: 29 5 32 563 118 194
6455904009: 221 6 9 4 2 4 26 112 9
57785406: 96 140 7 55 186 26 6 7
48: 1 3 12
215140: 8 317 5 3 8 4 4 40 9 3 2 2
9406542: 9 5 39 9 5 653 511 219
8396187: 7 904 477 3 148 87 2
734384430: 56 485 9 1 507 4 9 130
484993118067: 81 402 993 345 6
287773: 1 783 2 814 267 7 4 7 3
36777312: 47 6 66 8 247
4740447723: 2 36 3 10 3 355 8 73 1 3
866755680: 460 3 3 991 1 5 6 6 19
290326138: 5 285 317 8 83 38
13602050748: 801 13 5 1 49 7 314 99
61360: 9 543 8 53 60
1787: 321 5 82 6 3 80 9
233760: 7 429 313 5 4 77 4 296
7665: 87 5 11 17 83
26991479: 26 1 8 6 6 6 12 7 7 3 5 76
18712: 6 74 13 974 56 1 7 9 7 3
217: 7 87 2 3 26
64867314: 2 90 9 5 8 492 1 4 1 257
318200694: 2 3 739 7 1 861 63
3282485321: 82 4 248 521 3 106
156568734: 7 2 8 6 4 36 769 7 5 1 6 9
832433113: 36 909 158 161 1
33661685163: 7 2 7 42 49 1 9 80 342 3
1924152: 5 83 51 9 677 998 8
5297870114599: 141 899 89 5 839 99
429345221: 9 471 63 7 45 2 21
656: 7 27 9 15 7 2
75577: 34 855 85 6 6
1215357: 2 922 57 28 210 29 3
1595334418735: 6 676 272 86 184 3 35
5453: 7 683 5 31 542 94
154076: 3 414 4 74 1 1 88 1 604
355: 44 8 3
33370224183: 71 470 224 122 64
39385509782: 3 2 712 454 6 442 86
69169117: 1 2 492 14 91 17
1312: 44 51 55 890 272
168008743: 8 50 42 87 34 9
487800: 48 7 19 72 48 75
13370112: 8 5 49 9 81 6 724 9 4 1 7
42823680: 5 1 6 9 9 5 96 34 32
8791740: 1 62 807 3 54
56457986: 60 9 6 32 9 49 568 221
113219: 78 200 8 409 43
54394: 8 99 89 90 5
378625170008: 77 496 8 83 125 61 1 8
278244129: 5 6 176 93 630 770 2 9
558711270: 10 9 7 7 8 2 550 97 9 9
119: 1 8 9 43 58
4219093863: 1 4 3 5 609 98 31 63 1
13341355: 42 910 954 14
10052058: 904 699 63 9 34 3 6
48462: 4 5 5 66 301
75699471: 4 34 942 942 82 4 347
4544506132: 5 3 7 5 247 1 5 9 9 1 1 32
52896: 68 279 1 76 76 1 2
258536924: 8 5 8 2 7 3 86 690 9 1 12
288662: 5 26 2 75 5 3 172 41 2 3
26390: 48 59 931 7 7
102081: 324 693 2 36 1
128487268: 38 7 83 6 39 81 97 1 4
19224: 3 9 1 8 89
81432540: 501 20 7 387 3
738: 20 9 4 2 7 435
29516544: 87 2 7 557 8 69
1296424278: 6 666 6 31 857 54
479149020: 5 6 987 261 62
1883704: 9 638 8 8 41
7480260: 4 8 7 534 9 102 2 7 8 18
1475107: 29 37 30 745 7
1693: 17 97 1 9 35
896075: 792 1 862 5 2 53 9 8 6 5
2470: 151 1 1 2 2 2 608 2 7 3 4
45069234: 82 177 29 539 6
241893540: 824 820 358 79 10 11
191130028: 685 7 8 4 25 92 5 4 3 16
8853318: 693 285 5 39 31 2 9
18827664945: 4 9 1 45 8 6 4 9 82 757 5
4116: 1 564 14 7 70
176837684: 7 5 22 10 4 73 5 4 7 83 2
1896818086: 12 931 5 409 5 2 4 1 6
105489753097: 6 17 9 841 5 4 1 7 8 29
40161623048: 352 63 98 3 55 4 7 2 4
1588: 8 21 3 27 8 4
557431350: 25 486 9 26 589 25 70
344082613: 47 8 5 8 4 9 2 2 4 802 13
54844287: 548 44 27 1 4
2009988: 293 98 7 4 4
1460: 9 5 3 9 7 9 4
531060398227: 4 37 897 9 4 398 227
370163550: 9 48 1 8 67 12 70 3 747
607921609: 5 476 7 37 30 790 9
142843: 2 27 80 33 12 271
1491: 729 646 86 24 6
710723510: 17 469 9 3 53 8 86 3 70
101165: 37 495 19 6 79
4068792: 3 7 432 8 3 13
22305981: 9 3 348 4 1 5 3 2 65 2 89
1969800068778: 500 201 196 687 78
1968: 105 7 1 51 12
60750717: 45 2 9 75 717
57464640: 1 85 651 2 8 2 81 3 2 5 2
200314094445: 4 8 7 5 7 66 8 1 880 8 9 5
8486: 2 963 1 6 7 7 1 6 2 337 2
313862603: 71 5 92 961 3
13295: 3 257 9 50 5
567600: 7 4 572 946
68737952352: 318 23 1 2 6 9 2 8 3 144
3564807348: 35 47 202 9 298 57 4
689871030: 19 95 980 3 26 6 5
94380: 1 9 71 5 66 2
2781516: 6 5 603 20 61 492 386
13274353131: 3 4 466 1 1 87 8 963 1 8
1114: 838 95 19 90 72
265690: 9 119 8 31 82
4914768: 505 5 968 48 17
20054848: 9 2 3 97 3 6 3 34 58 11 4
25408: 773 8 4 2 670
12692025489: 6 504 54 226 9 1 8 11
290762983266: 7 1 8 7 38 1 6 998 14 9 6
11062: 173 7 56 250 4 9 4 715
2047569858: 12 5 91 17 21 81 2 9
36882: 237 4 751 961 2 827 6
604145841: 3 5 9 8 4 5 823 4 634 41
3706712: 3 706 710
1958107: 1 325 6 8 6 4 4 1 1 60 6 1
310883145: 4 816 618 4 8 31 45
86120982: 4 41 221 6 66 866 7 6
2773830: 231 76 3 9 9 30
75367563264: 6 83 2 6 8 6 76 9 8 7 1
22134: 3 90 238
7551233910: 839 9 163 70 910
153182070: 50 2 1 7 6 84 30 7 5 9 31
6210421: 7 763 8 2 1
14047776281: 5 67 852 229 281
2203652320: 807 8 63 602 1 9 7
233435: 9 715 1 9 41 399 1 4 8 7
1257131: 5 94 1 16 1 95 502 629
26088: 10 8 6 466 953 9 48 9 2
35581368: 5 9 75 912 6 62 438
606056: 6 11 5 194 44
1552572: 85 761 3 2 9 6 18 4
253947: 3 2 627 81 12
5051760736: 3 786 571 469 50 8
358540: 9 64 306 28 394
561644260: 5 61 1 4 3 6 5 4 247 11 2
1778294250: 9 15 242 9 42 144 810
7710: 8 2 753 10 4 16
193140: 20 498 3 4 7 55 15 6
502578: 9 84 900 63 6
43946: 26 42 643 24 39 159
6279695: 1 6 5 4 60 57 1 9 95 6 2 3
2372052: 8 8 8 80 44 2 3 7 9 516
55286: 610 308 47 4 57 8 45
11313: 85 435 604 6 1 3
1172701075: 8 842 21 461 9 25 7
1797522636: 590 8 52 3 578 44 392
971889: 5 235 71 26 30 9
4481: 648 4 8 166 1 291 4 9
33050: 4 46 661
28350171951: 4 146 945 859 75 2 1
20126581497: 17 9 491 229 494 3
219611747: 9 421 966 60 549 758
1240: 53 6 3 7 1
1063335085: 7 505 96 3 6 7 975 1 8 5
1055: 6 52 29 2 6 11
7469925625: 5 38 2 1 7 59 6 86 20 5
35653113: 3 5 653 11 3
149744: 53 897 49 1 40 9 8 2 8
93519: 1 894 233 7 16 9 39 2 9
11332409040413: 7 8 418 7 502 4 90 413
143916476: 2 497 3 57 961
7467000: 8 14 900 388 300 19
198360845: 6 121 119 56 3 41 98
353309832209: 6 1 36 8 2 9 9 44 3 211
128: 6 6 2 50 6
50422922685: 340 92 73 61 362 605
1044844: 3 7 4 4 844
9193: 5 79 3 76 3
30090: 14 16 3 131 8 259 77 9
337279: 37 4 9 13 658 8
168780: 28 9 6 17 64 4 3 4 87 5
642: 77 6 8 7 2
7672557939275: 25 643 5 76 88 34 7 5
19552214: 702 29 2 8 9 480 374
354663185: 7 9 3 325 6 3 574 6 3 2 5
525: 4 7 460 54
599351195625: 2 38 4 45 625 573 689
1965880: 220 960 34 49
714: 13 3 3 2 6
3955502937502: 3 6 75 586 2 93 1 6 502
2814600: 2 2 6 14 4 83 23 20 74 1
5382626: 5 887 8 9 771 26
2985: 42 70 45
114040: 86 805 270 99 90 640
9758700: 3 11 8 35 2 47 5 7 150
100502: 56 9 7 82 8 4 1 9 9 305
414969404544: 4 317 8 6 41 9 7 9 64 96
1842483: 1 59 3 3 2 9 2 7 1 60 9 3
21282606: 4 21 883 518 942
127405: 1 447 285 9 1
142043: 2 84 8 804 139 400
28834136: 47 5 607 1 5 1 10 148 6
2624860: 28 4 2 9 9 2 217 85 45 7
17295642442: 994 174 406 15 3 42
446792: 76 1 5 5 58 19 2
35078400: 29 14 25 8 9 6 8
35933488: 8 927 948 537 218 1 8
2054: 2 54 1 35 59
5752100560: 729 935 27 394 20
1460: 8 78 3 36 2 1 794
2092: 92 2 6 482 2
132844416: 3 73 8 16 8 5 53 5 6 914
1040: 2 1 8 13 65 5
3776340861: 5 6 43 4 807 9 30 3 327
211646: 737 7 1 2 41 45
2478488900: 912 677 9 320 6 8 446
6346890: 79 13 64 549 21 9 3
10743769823: 2 9 9 366 2 9 213 5 7 4 3
384744: 1 7 45 9 1 53 8 9 1 2 3 92
11120158342: 94 2 3 863 118 2
489775464841: 754 909 829 862 9 4
51328938: 7 8 9 4 3 172 73 8 9 1
3792391: 50 8 89 5 11 141 193 3
1677592: 79 87 20 6 9 16 5 2 56
471: 9 14 8 7 433
1107101: 3 367 7 198 5 7 1 98 4 9
47200: 2 9 3 17 944
3348321304: 5 813 9 1 520 64 7 4 4 9
1739519: 66 19 428 57 519
22440: 8 4 9 54 4 9 165 846 17
821576: 9 31 6 5 79 1 2 8 9 7 5 56
2668212268: 193 9 6 929 17 9 2 9 70
107258248: 5 39 55 824 8
16886076: 86 798 850 2 10 9 27 6
15150915: 23 77 8 9 89 97 15
5495112: 4 9 3 27 652 3 329 8 8
3731250172: 18 923 206 765 957
712: 7 82 7 70 61
1690608385: 950 8 59 36 754 933 5
211704: 4 73 5 5 29 4
13350938: 9 13 690 26 878 70
1078: 4 75 3 58 938
63265042924: 8 6 92 1 1 530 8 2 924
133796: 88 12 6 1 31 2 1 991 2
1568: 47 9 365 578 202
8272201: 32 68 5 887 703
1577492: 46 517 38 1 28
196963074: 84 5 1 63 47 6 29 5 198
886296: 87 7 35 894 6
31327600: 175 117 765 2 847 3
253681: 8 1 40 23 775 45 3 7 7 2
17514480: 43 377 18 79 31 60
910107: 912 319 400 558 1 9
161: 3 3 4 2 83 9 21
40413945600: 405 172 56 280 37
3789: 87 2 35 650 24
27022: 4 4 32 5 600 22
197568: 257 9 3 1 36 84
328307113: 377 3 6 45 87
151439: 95 56 423 16
259661768400: 920 49 2 33 57 6 33 48
423: 1 2 5 8 4 6 1 4 62 7 35 3
46979865: 446 9 8 7 209 4 5
645844904: 913 3 32 7 921 349 9 8
2626745581: 7 4 4 96 770 9 5 581
563611272336: 84 52 5 5 4 6 98 126 6 3
2816515701: 4 305 5 13 93 8 5 7 6
7008: 3 24 43 7 6 1
3843804: 114 9 6 880 67 3 4 680
11489089: 29 882 67 32 5 14 59
532035739: 604 586 2 440 59
400471397473: 6 674 52 1 3 2 911 6 4 1
125805007: 8 4 5 2 3 2 9 7 51 5 60 7
3731005: 37 30 952 4 49
26168970: 873 7 4 1 704 26 7 33 6
18249174: 249 25 74 86 9
14153474251: 6 471 6 3 9 6 9 6 9 450 1
1685466: 4 921 82 678 466
50708: 8 546 191 67 793
1789646: 7 4 2 52 1 6 2 910 787 8
113086575: 136 85 1 323 95 75 21
763: 60 3 3 157
756109819: 1 2 7 90 258 9 1 4 621 9
99331: 610 597 94 38 9 2 437
5591282: 31 5 662 9 2 4 84
68420: 76 7 2 1 4 3 5 5 517 8 8 4
120380: 4 9 6 553 924 8
663053160: 4 2 6 14 5 4 9 5 2 6 365 2
26825461: 609 28 7 1 9 109 6 52 9
41360: 2 19 3 2 3 899 6
20393: 1 49 4 3 93
2084013: 781 26 3 9 257
1667257110288: 3 69 8 28 41 204 77 7
430950: 14 1 8 8 18 7 4 6 7 2 6 5
52577: 6 28 9 295 356 6
10006634: 7 1 25 5 6 634
262290534: 82 9 8 3 6 95 3 18 4 92 6
67866: 31 650 73 9 6
1575: 9 58 1 3 6
59124: 8 2 9 2 32 3 845 1 23 4 4
1013226: 3 588 5 3 94
223242318: 7 8 55 5 16 22 2 423 18
1156716300: 1 201 5 191 828 299 1
304170059558: 452 46 8 950 6 59 558
16721: 4 68 9 4 7 1 60 2 2 7 3 2
3270361: 8 1 110 8 638 2 7 4 85
810506452: 66 458 4 349 554 4 6 2
67695107: 955 7 8 7 2 268 87 30 7
1799821: 2 9 52 4 4 1 20 11
4416: 43 2 6 3 6
10554182: 9 2 4 84 5 8 80 58 6 38
139: 8 6 53
175460066367: 18 8 66 6 738 930 27
2080368820: 3 32 1 3 9 3 1 90 99 8 28
217175: 214 2 605 570
370333248: 9 80 559 33 928 586
47: 6 6 35
2499: 52 6 2 2 81 2 1 9
398476: 4 108 97
277326: 13 795 462 3 5 31 7
444588700: 444 17 41 86 41 59
140: 9 52 1 72 7
151004081: 4 47 3 99 341 9 65
117335040: 55 6 1 68 9 863 1 384 8
5381424859: 2 989 1 4 2 8 18 7 6 9 8
972371: 11 81 60 176 851
75170: 6 3 683 71 28 471
939123289: 51 8 43 158 93 36 289
1129468656: 975 25 47 492 94
59856: 1 7 539 2 19 57 222 43
48186761: 7 894 77 99 62
507835: 50 5 9 9 9 9 1 5 39 1
95273700: 8 574 52 16 705 29
20660493280: 7 529 32 49 70 560
6624696: 8 6 507 5 1 8 9 85 7 7 34
15010074378: 8 7 56 4 8 4 3 5 3 354 6 3
678375368: 700 20 4 597 968
29457249523: 2 9 12 6 4 3 2 72 495 23
124197303: 114 675 807 2 3
952: 5 3 7 91 31 6 749 7 1 5 7
105460: 8 15 88 950 10
2474: 87 9 99 995 597
82448: 12 4 9 58 1 34 1 1 3 2 3 4
200852169: 83 216 5 1 22 4 3 4 3 7
15804: 644 95 836 7 47
51172: 6 80 9 1 9 487 9 8 4 9 4 3
18716470110: 7 7 92 4 9 9 5 3 299 30
1104115320: 7 51 5 55 2 11 396 70
23730820: 4 6 7 468 96 2 23 450 3
1001067516: 2 6 1 1 22 218 2 1 892 9
43248548: 4 324 1 7 2 9 69 373 6 1
15903155187792: 90 16 503 18 73 2 92 6
8504979: 4 83 2 5 8 7 7 64 73 74
363303: 404 580 41 23 9
227343: 7 77 268 9 481 1 90 3 3
326565: 815 40 9 468 3 85
7695: 2 2 85 6 81
39343: 80 49 2 72 69
61878: 86 58 9 295 138 54
1863313: 4 41 68 8 7 314
81640800: 1 69 3 493 800
159012: 37 80 6 2 21
9700215: 8 5 1 446 8 2 2 61 105 1
58789: 202 628 35 6 3 2 1 671
3072485: 6 45 337 94 487 9 2
256800: 2 8 8 6 535
283078917: 5 7 733 38 30 39 3 309
34675: 47 8 3 4 5 995 4 5 4 175
15603: 4 14 832 364 263
3938405130: 1 8 715 46 1 3 2 8 5 6 51
1769660661: 7 2 5 2 2 3 103 35 7 426
1609545534: 32 2 83 7 55 37 7 5 89 6
77820294491: 6 63 2 917 1 64 17 74
11220481: 3 33 3 3 83 1 3 6 640 1
2658459: 771 1 9 71 8 2 5 59 1 8 3
1599441406: 416 6 89 8 5 900 7 8 91
156508013: 9 3 92 6 57 2 440 8 1 1
8346: 5 8 182 686 380
231984743: 9 72 888 7 38 9 7 607 3
21601: 37 6 2 132 7 96 1
724: 27 317 27 274 79
55994878860: 38 9 34 799 5 9 2 4 9 4
4631: 1 40 16 7 39
712350654: 857 68 17 18 453
229674: 1 723 402 36 58 3
2100: 843 740 55 76 386
921150275: 51 64 890 9 275
734929386: 632 380 4 9 90 34 6
2669199: 97 5 7 95 922 7 9 6 8 6 1
1500039: 2 7 331 3 6 2 3 8 1 9 27 9
72048: 240 650 9 49 76
1660302: 113 25 5 850 22 76 4 2
511746807: 47 9 809 9 465 807
38019125: 369 68 87 11 9 6
4527: 6 6 9 45 293 5 2 4 2 691
242568: 8 24 6 341 64 8
427: 3 81 4 91 1
23195120: 22 198 655 342 120
360: 9 6 4 2 3
6853: 79 6 78 216 7
35758: 336 21 1 43 8 6 1
2179618: 7 70 70 4 680 1 98
9606: 86 4 2 3 943
26749464: 1 5 433 5 717 98 84
776037573: 8 8 894 9 577 6 621 9
799293: 99 8 76 2 4 4 6 1 3 5 31 3
2691671: 1 7 6 2 1 4 1 12 65 668 3
1544: 898 24 1 496 99 27
68191364: 42 990 2 2 82
524438312: 524 4 382 42 70
8831455: 5 2 7 29 5 435 2 76 879
434271927: 649 708 8 725 73 4 7
88569642727: 885 69 642 7 27
663: 204 17 3
38449: 2 65 6 1 1 8 1 2 56 8 369
392709: 28 177 117 2 50 5 7 3 9
58033879: 8 725 4 9 7 8 16 570 1 9
94154: 150 22 5 86 358
43361102577534: 7 5 59 634 69 749 966
2026946: 8 257 6 983
5551744: 3 9 9 9 79 661 51 7 8 4
467134789: 819 596 957 92 29
1434: 1 5 1 6 8 520
1660075: 217 34 83 710 8 7 38 1
104704026560: 2 8 7 4 6 5 9 429 5 20 7 4
3362348024: 7 4 601 27 3 897 5 7
967272990: 17 30 354 9 559 9 64
695308: 69 436 8 86 854
617664: 4 19 879 684 696
280208148: 365 766 618 143 4
11358272: 74 3 5 44 43 11 29 63 2
102: 25 2 8 67 1
148752720571: 5 693 265 6 10 9 19 3 1
9326675237: 4 658 325 28 56 774 5
63112912358: 63 11 29 123 6 1
689052595: 202 96 7 7 485
6261: 8 4 31 16 93 8 13
1143244033: 857 230 95 9 29 2 1
4077224042: 5 343 675 763 17
148967182: 91 464 855 38 91
13013: 261 7 9 23 7
151402: 2 7 65 119 8 8 484 2 2
1162841: 4 653 7 444 5
122954: 931 42 59 1 119 25
8802293760: 8 6 5 2 7 248 208 5 72 6
882283627: 2 60 762 28 29 68 659
119320851948: 4 6 9 3 2 736 8 3 5 65 8 6
363560: 599 2 9 551 61
79156980000: 12 75 3 35 8 5 487 43
2016471: 8 80 2 5 9 9 1 5 7 66 90
541898: 7 906 63 68 6
8691: 44 4 41 2 4
57859465: 582 9 60 978 6 5 974
969507840: 8 5 3 520 71 4 254 7 3 1
111331: 14 9 2 8 4 3 1 40 188 3
79296: 9 72 2 52 62 4 2 48 7
99752561604: 25 783 42 2 4 32 2 482
260196: 85 8 466 6 2 104 53 9
54308747928: 84 978 7 115 1 6 958
177610113: 5 12 4 679 5 23 457 9
291015504: 409 342 4 702 138
111029044: 7 658 506 16 57 7 844
4431074491353: 263 96 287 7 27 650
61459200: 3 3 3 37 4 805 2 30 80 9
4938: 2 6 7 7 7 586 74 4 130 6
724927: 1 687 9 1 13 80 47
176219199: 8 533 928 1 351
7061236841: 52 30 20 299 859
1680930: 56 9 2 120 1 799 8 2 95
22230091458: 5 780 57 91 4 61
618962: 618 8 7 9 1
979087974: 896 52 407 2 5 53 393
1076124: 3 42 7 761 124
39804061: 3 6 7 9 3 2 3 685 535 6 1
617371560: 9 2 6 77 1 83 4 26 9 10 1
59292627728: 244 243 62 77 28
60679755965: 81 7 1 3 19 57 687 65
385718461: 2 6 873 908 8 3 3 3 2 24
70068614: 5 2 19 383 178 887 7 7
81627: 812 1 8 236 87 45 41
61252920: 7 396 200 229 90
122349515906: 536 4 1 3 95 66 704 49
236503863: 546 954 305 373 131
3351192: 2 65 1 640 75 9 78
5108625: 3 2 2 5 2 165 313 1 7 8 6
178031530140: 14 4 9 269 7 1 710 822
6883328: 6 94 1 3 113 7 9 4 1 4 4
4007370310: 15 90 8 9 7 357 89 830
588964251601: 7 5 347 2 47 20 963 5 1
270755048: 6 42 1 631 212 57 8 8
1332121: 8 9 8 4 2 3 6 800 8 3 3 88
5591335: 371 3 5 2 6 7 5
14219565360: 5 993 213 3 8 754 91 5
5861562162: 1 8 9 4 8 6 6 4 451 53 6 2
1433385: 874 74 21 72 9
15707744640: 568 36 6 5 59 434
1690128: 66 2 4 97 33
398948632: 65 4 61 85 5 3 7 72
10387019376: 63 1 245 7 6 77 42 328
4179604: 5 6 422 1 20 40 45 4
207295515460: 7 423 3 645 7 3 9 6 1 1 9
1496054: 80 69 48 12 54
117174039: 60 5 5 4 331 59 2 37
120561: 443 34 8 3 62
1093662: 1 413 9 1 86
72832203: 49 3 4 4 791 3 5 22 3 9 9
9172450: 520 94 7 264 49 175
5092: 9 52 9 6 5 869
205017: 859 5 67 47 3
502964: 5 465 2 92
982872: 55 31 30 94 721 1 6
18842130: 997 20 24 362 50 30
933: 11 824 8 3 87
100362657: 9 3 2 6 375 988 3 3 8 4 1
125631197: 7 8 1 2 92 6 9 72 1 563 2
16965: 936 759 2 5 8
63221509696: 76 214 5 4 340 89 8 8
175095120: 66 4 1 5 6 10 184 6 3 8 5
5948579768: 69 5 3 2 6 5 44 93 3 8 4 3
612455: 6 4 1 638 251 2 8 3 1 9 6
35828415: 6 4 1 7 9 779 2 22 5 4 5 7
1423570: 77 835 65 4 6 1 849
139702935: 55 8 4 5 5 6 4 90 2 935
521072: 148 8 55 9 5 8
42845205: 9 110 6 54 47 5
155790: 8 558 97 18 1
347911604818: 91 6 354 22 44 2 9 9 8 8
196579: 1 9 15 15 129 2 19 499
178336116: 5 53 16 4 522 6 6
211784: 352 6 6 22 4
357611951: 9 19 8 1 613 463 7 3 3 5
2856: 6 31 29 54 4
3115653: 8 404 964 5
139573401: 1 34 1 142 33 851 891
2731: 3 107 8 1 8 8 80 3
1635930605522: 8 5 9 6 8 137 7 94 604 2
2517747584: 8 1 3 715 424 5 755 1 9
13551: 8 9 6 589 4
8640: 9 60 9
246434062: 6 18 632 93 960 87 62
844073: 298 57 899 67 7 47
14942463139: 169 883 197 631 39
70584888: 8 8 23 8 888
66176064187: 882 7 833 5 9 17 2 7 5 3
54955: 54 95 5
1683752: 417 2 9 562 7
31395181: 94 497 1 1 672 9 4
418453: 9 7 19 1 1 349 2
737204: 8 1 4 189 9 3 86 4 5 5 1 3

168
2024/go/day08/day08.go Normal file
View File

@@ -0,0 +1,168 @@
package day08
import (
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
)
type loc struct {
x int
y int
}
type pt struct {
display rune
antinodes int
paired map[loc]pt
visited map[rune]bool
}
func Part1(input string) int {
grid := inputs.ToGrid2D(input, "\n", "", pt{display: '.'}, func(c string) pt { return pt{display: rune(c[0]), paired: make(map[loc]pt), visited: make(map[rune]bool)} })
for x1 := 0; x1 < grid.SizeX(); x1++ {
for y1 := 0; y1 < grid.SizeY(); y1++ {
pt1 := grid.Get(x1, y1)
if pt1.display != '.' {
for x2 := 0; x2 < grid.SizeX(); x2++ {
for y2 := 0; y2 < grid.SizeY(); y2++ {
pt2 := grid.Get(x2, y2)
if x1 != x2 && y1 != y2 && pt1.display == pt2.display && !isPaired(x1, y1, pt1, pt2) {
pt1.paired[loc{x: x2, y: y2}] = pt2
pt2.paired[loc{x: x1, y: y1}] = pt1
}
}
}
}
}
}
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt1 := grid.Get(x, y)
if pt1.display != '.' {
for ploc := range pt1.paired {
addAntiNodes(x, y, ploc.x, ploc.y, grid)
}
}
}
}
antinodes := 0
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt := grid.Get(x, y)
if pt.antinodes > 0 {
antinodes++
}
}
}
return antinodes
}
func Part2(input string) int {
grid := inputs.ToGrid2D(input, "\n", "", pt{display: '.'}, func(c string) pt { return pt{display: rune(c[0]), paired: make(map[loc]pt), visited: make(map[rune]bool)}})
for x1 := 0; x1 < grid.SizeX(); x1++ {
for y1 := 0; y1 < grid.SizeY(); y1++ {
pt1 := grid.Get(x1, y1)
if pt1.display != '.' {
for x2 := 0; x2 < grid.SizeX(); x2++ {
for y2 := 0; y2 < grid.SizeY(); y2++ {
pt2 := grid.Get(x2, y2)
if x1 != x2 && y1 != y2 && pt1.display == pt2.display && !isPaired(x1, y1, pt1, pt2) {
pt1.paired[loc{x: x2, y: y2}] = pt2
pt2.paired[loc{x: x1, y: y1}] = pt1
pt1.antinodes++
pt2.antinodes++
grid.Set(x1, y1, pt1)
grid.Set(x2, y2, pt2)
}
}
}
}
}
}
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt1 := grid.Get(x, y)
if pt1.display != '.' {
for ploc := range pt1.paired {
addAntiNodes_p2(pt1.display, x, y, ploc.x, ploc.y, grid)
}
}
}
}
antinodes := 0
fmt.Printf("%v\n", grid.StringWithFormatter(formatter))
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt := grid.Get(x, y)
if pt.antinodes > 0 {
antinodes++
} else {
if pt.display != '.' { antinodes++ }
}
}
}
return antinodes
}
func formatter(p pt, x int, y int) string {
if p.antinodes > 0 {
return "#"
}
return "."
}
func isPaired(x int, y int, p1 pt, pt2 pt) bool {
return p1.paired[loc{x: x, y: y}].display == pt2.display
}
func addAntiNodes(x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) {
px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2)
if px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY() {
return
}
pt1 := grid.Get(px1, py1)
pt1.antinodes++
grid.Set(px1, py1, pt1)
if px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY() {
return
}
pt2 := grid.Get(px2, py2)
pt2.antinodes++
grid.Set(px2, py2, pt2)
}
func addAntiNodes_p2(frequency rune, x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) {
px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2)
if !(px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY()) {
pt1 := grid.Get(px1, py1)
if !pt1.visited[frequency] {
pt1.antinodes++
pt1.visited[frequency] = true
grid.Set(px1, py1, pt1)
addAntiNodes_p2(frequency, x1, y1, px1, py1, grid)
}
}
if !(px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY()) {
pt2 := grid.Get(px2, py2)
if !pt2.visited[frequency] {
pt2.antinodes++
pt2.visited[frequency] = true
grid.Set(px2, py2, pt2)
addAntiNodes_p2(frequency, x2, y2, px2, py2, grid)
}
}
}
// Function to calculate two points symmetrically placed above and below the line
func offsetPoints(x1, y1, x2, y2 int) (int, int, int, int) {
dx := x1 - x2
dy := y1 - y2
p1x := x1 + dx
p1y := y1 + dy
p2x := x2 - dx
p2y := y2 - dy
return p1x, p1y, p2x, p2y
}

View File

@@ -0,0 +1,39 @@
package day08
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............`)
require.Equal(t, 14, r)
}
func TestPart2(t *testing.T) {
r := Part2(`............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............`)
require.Equal(t, 34, r)
}

50
2024/go/day08/input.txt Normal file
View File

@@ -0,0 +1,50 @@
.....y..........................p................r
........I.........................................
......................4.s.........................
..........4.......................................
....y.............................................
......................................p.........r.
..........0..s......N..................1.....p....
..y........4.......................p..............
...............0..................................
..............0....t....N....h....................
.............N....................................
......j...................s............H...l..O...
..........q.................H................O....
..f...e.qj.....y...0..............................
...........t..........................k..Q..r.....
.........6................Q..s...x......W.........
....2..b...e....t..4.........c.....xW.j...........
...e....................w................1.....O..
..e..j..5...........................c.............
.........B..2...............MK................H...
...2......b...g..X...q..........h...............O.
...q...2..........m....k...i...............QV.x...
...................i.........W.k.............HQ...
........b...X...............D..........c...N......
................................l..........h.....I
.m...........g......l.......c.............3......V
....X.......m........g...V.K...7......F.d.........
.........b.X...U..........................C.......
.....................l..............o.1....C......
............u.............K..............3...d....
......................i.T....f................V...
..............................1.k.................
.B.....E......9..m....K..5.M......................
...P...............M...95....o..i........I........
...............................S......3......wI...
.....EP...........9........5..T.R.................
.P..........v..9......f.............R.Co..w3......
..........h...SG..v.E...7..f.T....................
..........6..........L.................Y.......d..
..........B...............U........D..............
....B................U.....8..M....n...J..........
.........................L................Fw......
....L6E.P.................7.UG....J.....Y.D.......
........t........v...SJ........n..d...............
......................8v.....uG...................
..................L.....n.........................
...............T..............n......D............
..............o.........8................J.Y.R....
..................S...............u....F.......R..
........6..............u.....7.8..........Y..F....

117
2024/go/day09/day09.go Normal file
View File

@@ -0,0 +1,117 @@
package day09
import (
"adventofcode2024/utils"
"fmt"
)
func Part1(input string) int {
disk := []int{}
file_id := 0
for i := 0; i <= len(input); i++ {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, file_id)
}
i++
if i < len(input) {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, -1)
}
}
file_id++
}
printDisk(disk)
for i:=len(disk)-1;i>0;i--{
if disk[i] != -1 {
id := disk[i]
disk[i] = -1
for j:=0;j<=len(disk);j++ {
if disk[j] == -1 {
disk[j] = id
break
}
}
}
}
printDisk(disk)
checksum := 0
for i:=0;i<len(disk);i++ {
if disk[i] != -1 {
checksum += i * disk[i]
}
}
return checksum
}
func Part2(input string) int {
disk := []int{}
file_id := 0
for i := 0; i <= len(input); i++ {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, file_id)
}
i++
if i < len(input) {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, -1)
}
}
file_id++
}
printDisk(disk)
for i:=len(disk)-1;i>0;i--{
size := 0
if disk[i] != -1 {
id := disk[i]
for {
if i-size > 0 && disk[i-size] == id {
size++
} else {
break
}
}
free := 0
j := 0
found := false
for ;j<i && free < size;j++{
if disk[j] != -1 {
free = 0
continue
}
free++
if free == size { found = true }
}
if found {
for k:=0;k<size;k++ {
disk[i-k] = -1
disk[j-size+k] = id
}
// printDisk(disk)
}
i -= (size -1)
}
}
printDisk(disk)
checksum := 0
for i:=0;i<len(disk);i++ {
if disk[i] != -1 {
checksum += i * disk[i]
}
}
return checksum}
func printDisk(disk []int) {
for _, x := range disk {
if x == -1 {fmt.Print(".")} else {
fmt.Printf("%d", x)
}
}
fmt.Print("\n")
}

View File

@@ -0,0 +1,17 @@
package day09
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1("2333133121414131402")
require.Equal(t,1928, r)
}
func TestPart2(t *testing.T) {
r := Part2("2333133121414131402")
require.Equal(t, 2858, r)
}

1
2024/go/day09/input.txt Normal file

File diff suppressed because one or more lines are too long

103
2024/go/day10/day10.go Normal file
View File

@@ -0,0 +1,103 @@
package day10
import (
"adventofcode2024/utils"
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
)
type Position struct {
height int
summit bool
}
func Part1(input string) int {
score := 0
i := 0
grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} })
fmt.Println(grid.StringWithFormatter(formatter))
for y := 0; y < grid.SizeY(); y++ {
for x := 0; x < grid.SizeX(); x++ {
position := grid.Get(x, y)
if position.height != 0 {
continue
}
wipe_summit(grid)
score += getScore(x, y, 0, 0, grid)
fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score)
i++
}
}
return score
}
func Part2(input string) int {
score := 0
i := 0
grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} })
fmt.Println(grid.StringWithFormatter(formatter))
for y := 0; y < grid.SizeY(); y++ {
for x := 0; x < grid.SizeX(); x++ {
position := grid.Get(x, y)
if position.height != 0 {
continue
}
wipe_summit(grid)
score += getScore2(x, y, 0, 0, grid)
fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score)
i++
}
}
return score
}
func formatter(p Position, x int, y int) string {
return fmt.Sprintf("%v", p.height)
}
func wipe_summit(grid *grid2d.Grid[Position]) {
for y := 0; y < grid.SizeY(); y++ {
for x := 0; x < grid.SizeX(); x++ {
pos := grid.Get(x, y)
if pos.height == 9 && pos.summit {
pos.summit = false
grid.Set(x, y, pos)
}
}
}
}
func getScore(x, y, level, score int, grid *grid2d.Grid[Position]) int {
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
for _, dir := range directions {
x1 := x + dir[0]
y1 := y + dir[1]
nposition := grid.Get(x1, y1)
if level == 8 && nposition.height == 9 {
score++
}
if nposition.height != level+1 {
continue
}
score = getScore(x1, y1, nposition.height, score, grid)
}
return score
}
func getScore2(x, y, level, score int, grid *grid2d.Grid[Position]) int {
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
for _, dir := range directions {
x1 := x + dir[0]
y1 := y + dir[1]
nposition := grid.Get(x1, y1)
if level == 8 && nposition.height == 9 {
score++
}
if nposition.height != level+1 {
continue
}
score = getScore2(x1, y1, nposition.height, score, grid)
}
return score
}

View File

@@ -0,0 +1,31 @@
package day10
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732`)
require.Equal(t, 36, r)
}
func TestPart2(t *testing.T) {
r := Part2(`89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732`)
require.Equal(t, 81, r)
}

56
2024/go/day10/input.txt Normal file
View File

@@ -0,0 +1,56 @@
43217654309879876104563234589896761012345656543098901001
34108903212368123233472105676787851299856567832187812652
45677814301457014312986345589876940387765678943046543743
56789325100876525800345276430105432456566589858956769821
65438456912963436901236187621234501223455410767349874430
74321067803451107898547093412012982016764323101210143561
89412210987430210789698892102123673107895214589723652678
78601521856521345678721743089034543212345605679854781789
66789430545678934505430654898745672212236765434765690878
55676545038943213216765989601654981300129870121012345969
46543216127657804389834808762347690456789983498141456452
65454307233456934870126712354878765565210012507230987321
54567898332110125961015645403969234674323215616546576010
65658983021001876854324106912452128789321308723455678901
76543212137892965348933217832141089873410419678964987652
89862901236543501267018363101033210565566566569873788543
89871876544345652106529854892123521454479877654012699830
78100703454278743212434763763014672343287778943210581021
65210212565189858906763212654985785650198961212101432010
54321056876012567875898708783476698763267890303215678321
87012567988703489874345679692676543294986725456574329478
96543498589876530365210189501987650187675216987687610569
01234567651010921234501076401236501010564307678596789876
10389830532329854376542345321545692323403018789455430965
21456721013456765289031234980098783410912129670320121054
92505432565421010109120345671107654567823451061210120123
87615443478302341018750134543234541050765962552121234984
34322342189219650129665234789432132021894873443010965673
45451056077828743234574343276543032134703210523457876532
51069987456943104545987650167898749865612309610765454101
32678678345652210698092156756547056764303458779890363232
43010589232781306787183045876532178965210569888211274321
56923432101090458989254234923421369878934678898302989430
87889211078764567876360143010030450767125986567401276589
96676305669653478985478652102141341458076803456564345676
45435434734522780340349760123456232349883712678178737894
80127821821011091211299854354987101016792103549069016323
92346940910329654304587121267807652345013401232108925412
81055432101458765643671010871018947654324589543987432101
76567789023467010782532346965425638945695678654986540012
05498654110567821891047897212334721032786014345678901098
12387013223489932346156598101549889821012823216765212387
03456323016576542345692367210678710701296954907854323456
12345465437895431016781450123467623654387867878985401501
21089870124326528701670101874345634565676541045621032012
32189210065017019632543210965236730120545632456734548743
43498349876298903545450143050159821321234012349895699654
34567658389101232123469052101567634489234510106786789985
99876501276788943016578769872498105672105621215021058876
87035432365897654107689898763343234321678789334134567655
70129641034781089898791099854232145690569245493254321567
63238701123654178718982387763156056781410126787655010498
54345652321073265001073456012047189872328901098546710327
34568543434589874132569895145438976987437812361239891210
21879654898678013203456701236327805456546521450967890123
30968745467654320112345210987610112345545430567856543234

76
2024/go/day11/day11.go Normal file
View File

@@ -0,0 +1,76 @@
package day11
import (
"adventofcode2024/utils"
"fmt"
"strconv"
"strings"
)
func Part1(input string) int {
stones := strings.Fields(input)
for i := 0; i < 25; i++ {
n_stones := []string{}
for _, stone := range stones {
switch {
case stone == "0":
n_stones = append(n_stones, "1")
case len(stone)%2 == 0:
d1 := strconv.Itoa(utils.MustAtoi(stone[0 : len(stone)/2]))
d2 := strconv.Itoa(utils.MustAtoi(stone[len(stone)/2:]))
n_stones = append(n_stones, d1)
n_stones = append(n_stones, d2)
default:
n_stones = append(n_stones, fmt.Sprintf("%d", utils.MustAtoi(stone)*2024))
}
}
stones = n_stones
}
return len(stones)
}
func Part2(input string) int {
stones := strings.Fields(input)
smap := make(map[string]int)
smap2 := make(map[string]int)
for _, stone := range stones {
smap[stone] = 1
}
for i:=0;i<75;i++ {
for k, v := range smap {
switch {
case k == "0":
smap2["1"] = smap2["1"] + v
case len(k)%2 == 0:
d1 := strconv.Itoa(utils.MustAtoi(k[0 : len(k)/2]))
d2 := strconv.Itoa(utils.MustAtoi(k[len(k)/2:]))
smap2[d1] += v
smap2[d2] += v
default:
k2 := fmt.Sprintf("%d", utils.MustAtoi(k)*2024)
smap2[k2] += v
}
}
smap = CopyMap(smap2)
smap2 = make(map[string]int)
}
count := 0
for _, v := range smap {
count += v
}
return count
}
func CopyMap(original map[string]int) map[string]int {
// Create a new map to hold the copy
copied := make(map[string]int)
// Copy each key-value pair from the original map to the new map
for key, value := range original {
copied[key] = value
}
return copied
}

View File

@@ -0,0 +1,17 @@
package day11
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1("125 17")
require.Equal(t, 55312, r)
}
func TestPart2(t *testing.T) {
r := Part2("125 17")
require.Equal(t, 55312, r)
}

1
2024/go/day11/input.txt Normal file
View File

@@ -0,0 +1 @@
3 386358 86195 85 1267 3752457 0 741

146
2024/go/day12/day12.go Normal file
View File

@@ -0,0 +1,146 @@
package day12
import (
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
)
type Plot struct {
crop string
visited bool
region int
x int
y int
}
type Region struct {
plots []Plot
crop string
id int
area int
perimteter int
sides int
}
func Part1(input string) int {
var val int
region_id := 0
regions := make(map[int]Region)
grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} })
fmt.Println(grid.StringWithFormatter(formatter))
for y := 0; y < grid.SizeY(); y++ {
for x := 0; x < grid.SizeX(); x++ {
var region Region
plot := grid.Get(x, y)
if plot.visited {
continue
}
region_id++
region = Region{id: region_id, area: 1, crop: plot.crop, sides: 4}
plot.region = region_id
plot.visited = true
plot.x = x
plot.y = y
grid.Set(x, y, plot)
region.plots = append(region.plots, plot)
regions[region_id] = region
try_neighours(grid, &region, x, y)
regions[region.id] = region
}
}
for _, region := range regions {
val += region.area * region.perimteter
}
return val
}
func Part2(input string) int {
var val int
region_id := 0
regions := make(map[int]Region)
grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} })
fmt.Println(grid.StringWithFormatter(formatter))
for y := 0; y < grid.SizeY(); y++ {
for x := 0; x < grid.SizeX(); x++ {
var region Region
plot := grid.Get(x, y)
if plot.visited {
continue
}
region_id++
region = Region{id: region_id, area: 1, crop: plot.crop}
plot.region = region_id
plot.visited = true
plot.x = x
plot.y = y
grid.Set(x, y, plot)
region.plots = append(region.plots, plot)
regions[region_id] = region
try_neighours(grid, &region, x, y)
regions[region.id] = region
}
}
for _, region := range regions {
val += region.area * get_sides(grid, region)
}
return val
}
func formatter(p Plot, x int, y int) string {
return fmt.Sprintf("%v", p.crop)
}
func try_neighours(grid *grid2d.Grid[Plot], region *Region, x int, y int) {
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
plot := grid.Get(x, y)
perimeters := 0
for _, dir := range directions {
x1 := x + dir[0]
y1 := y + dir[1]
nplot := grid.Get(x1, y1)
if nplot.crop == plot.crop {
if !nplot.visited {
region.area++
nplot.visited = true
nplot.region = plot.region
nplot.x = x1
nplot.y = y1
grid.Set(x1, y1, nplot)
region.plots = append(region.plots, nplot)
try_neighours(grid, region, x1, y1)
}
} else {
perimeters++
}
}
}
func get_sides(grid *grid2d.Grid[Plot], region Region) int {
sides := 0
corners := [][][]int{{{-1, 0}, {0, -1}, {-1, -1}},
{{+1, 0}, {0, -1}, {+1, -1}},
{{-1, 0}, {0, +1}, {-1, +1}},
{{+1, 0}, {0, +1}, {+1, +1}}}
for _, plot := range region.plots {
for _, o_corners := range corners {
c1 := grid.Get(plot.x + o_corners[0][0], plot.y + o_corners[0][1])
c2 := grid.Get(plot.x + o_corners[1][0], plot.y + o_corners[1][1])
c3 := grid.Get(plot.x + o_corners[2][0], plot.y + o_corners[2][1])
if c1.crop != region.crop && c2.crop != region.crop {
sides++
} else if c1.crop == region.crop && c2.crop == region.crop && c3.crop != region.crop {
sides++
}
}
}
return sides
}

View File

@@ -0,0 +1,29 @@
package day12
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE`)
require.Equal(t, 1930, r)
}
func TestPart2(t *testing.T) {
r := Part2(`AAAA
BBCD
BBCC
EEEC`)
require.Equal(t, 80, r)
}

140
2024/go/day12/input.txt Normal file
View File

@@ -0,0 +1,140 @@
UUUUUUUUUUUUUUUUUUUDQQQQQQQOOOOOHHSSSSSYYYYYYYYGGGGNNNNNNNNTTTTTTTTTTTTTTDDDDDDDDDDDDDDDDDDNNNCCNJJJJOOHHHDDDDDDDDDDDDDDDDDDXXMBBBBMMCCCCCCC
UUUKUUUUUUUUUUUUUDDDDDDDQQQOOOOOOOOOSSSSSYYYYYYYYGGGGGNNNNTTTTTTTTTTTTTTTTTTTTDDDDDDIIDDDNNNNNCCNJJJOOOHDDDDDDDDDDXDDDDDDDMMMXMMMMMMMMCCCCCC
UUUKKUUUUUUWUUUUUUDDDDDDDDDROOOOOOOWWSSSSYYYYYYYGGGGGGGQNTTTTTTTTTTTTTTTTTTTTTDDDDDDDIDIINNNNLNNNNOOOOODDDDDDDDDDXXDDDDDDDMMMMMMMMMMMMCCCCCC
UUKKUUKKXUUUUUUUUDDDDDDDDDDDDOOOOOOOOYSSSSSYYYYYGGGGGGQQNNTTTTTTTTTTTTTTTTTTTTDDDDDIDIIIINNNNNNNNNNOOOODDDDDDDXDDXXDDDDDDDMMMMMMMMMMMMMMCCCC
UUKKUKKKXXUQQQQUUDDDDDDDDDDDDOOOOOOOOYYYYYYYYYYYGGGGGQQIINTTTTITTTTTTTTTTTTTTTTDDDIIIIIIIINNNNNNNNNOOODDDDDDDDXXXXXXDDDDDMMMMMMMMMMMMFFFFCCC
UKKKKKKKXKAWWWWWDDDDDDDDDDDDDOOOOUUOYYYYYYYYYYYYGGGGQQQQIIDITIIIITTTTTTTTTTTTTDDDDIIIIIIINNNNNNNNLLLLODDDDDDXXXXXXXXDXDDDMMMMMMMMMMMMFFFFCCC
KKKKKKKKKKKWWWWKDPPDDDDDDDWWWOOOOOUUYYYYYYYYYYYYYGRQQQQQIIIIIIIIITTTTTTTTTTTDDDDDDIIIIIIIIINNNNNNNLLLLLDDDDDXXXXXXXXXXDDDDDMMMMMMMMMMFFFCCCC
KKKKKKKKKKWWWWWWDDDDDDDDDSWWWOWOOOOUYYAYYYYYYYYYYYQQQQQIIIIIIIIOIITTTTTTTTTTDDDDIIIIIIIIIIINNNNNLNNNLLLDDDDDDXXXXIXYDDDDDDDMMMMMMMMMMFFFCFCC
KKKKKKKKWWWWWWWWSSDSDDDDDSSWWWWOOOOUYYAYYYYYYYYYYQQQQQQIIIIIIIIIITTTTTTTTTTDDDIIIIIIIIIIIINNNNNNLLLLLLLDDDDDDXXXXIXYDDDQDDDMMMMMMMUMFFFFFFFC
KKKKKKKWWWWWWWWWSSSSDSDSSSSWWWWWOOOUYYYYYYYYYYYYYYQQQQIIIIIIIIIIIIIXXXXXTTTTDIIIIIIIIIIIKINNLNNNLLLLZLLLLDDVDXXXXXYYDDQQDDTMMYYYMMUUUFFFFFCC
KKKKKKKKWWWWWWWWWWSSSSSSSSSSWWWWWWOUYPPPPPYYYYYYQQPQQQQAIIIIIIIIISSXXXXXXXTTDIIIIIIIIIIIIIIILLLLLLLLZZLLLDDDXXXXXXXYYDXXXYMMMYYYYMPUUFFFFFFC
KKKKKKKKWWWWWWWWWWBBBBSSSSSWWWWWWWSSPPPPWWWWWWAYPPPPQAAAAITTIIIIIXXXXXXXUTTXXXIIIIIIIIIIIIIOLLLLLLLLZZLLLLLLLLXXXXYYXXXXXXXXRPPPPPPPPPFFCCFC
KKKKKKDWWWWWWWWWWWDDBBBSSSSWWWWWWWWSSPPPPWWWWWWWPPPPPAAAAIIIIIIIIXXXXXXXXXDXXIIIIIIIIIIIIIIOLLLLLLLZZZZZZLLLLNXNNXNYYYXXXXXXPPPPPPPPPPFFCCCC
KKKKKKWWWWWWWWWWWWBBBBBBBSSSWWWWWWWSSSSPPWWWWWWWPPPPPAAAAAAIIIIIIIXXUUUUUUXXXXIIIIIIIIIIIIIILLLLLLLZZZZZZZLLLNNNNNNYYYXXXXXXPPPPPPPPPPCFCCCC
KTKQQKWWWWWWWWWWBWBBBBBBBSBSWWWWWSSSSSPPPWWWWWWWWPPPPPPAAFAIIYYYUUUUUUUUUUUXXXQQQIIIXXXXXXXXXXLLLLLZZZZZZZZZLNNNNNNYYXXXXXXXPPPPPPPPPPCCCCCC
QQKAQQWWWWWWWWWWBWBBBBBBBBBSWWWSSSSSSSSPPWWWWWWWPPPPPPPPPPYYYYYYUUUUUUUUUUUQXQQQQQQIXXXXXXXXXXLZLLEZZZZZZZZZLNNPNNNYYXXXXXPXPPPPPPPPPPPCCCCC
QQQQQQQWWWWWWWWWBBBBBBBBBBVWWWDDSSSSSSSSSPWWWPPPPPPPPPPPPPYYYYYYUUUUUUUUUUUUUUUUQQIIXXXXXXXXXXLZZZZZZZZZZZZLLUUUUUUUUXXXXXPPPPPPPPPPPPCCCCCC
QQQQQQQQWWWWWWWWBBBBMMMBBBMWWWDSSSSSSSSSSPPPPPPPPPPPPPPPYYYYYYYBYYXXXXXUUUUUUUUUOIIIIZZZZZLLLZZZZZZZZZZZZZZZZIIIIUUUUUXPPXPPPPPPPPPPYYCCCCCC
QQQQQQQQQWWZZZWMMMMMMMMMBMMWWDDSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYXXXXXXUUUUUUUUUOOIIIZZZZLLLLLZZZZZFFFFFFFFFHHHIUUUUUPPPPPPPYPPYPPPYYYCCCCCC
QQQQQQLQQQWWZZZMMMMMMMMMMMHHWSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYYXXXXXXXUUUUUUUUUOIIIIIZLLLLLLZZZZZZFFFFFFFFFHHHIUMUUUPPPPPPPYYYYYYYYYYYCCCYC
QQQQQLLQLLZZZZMMMMMMMMMMMMMMWSSSSSSSSSSSPPPPPPPPPBYPPPYYYYYYYYYYYYXXXXXUUUUUUUUUIIIIIIIILLZZZZZZZZZFFFFFFFFFHHFFFFQUULLPPPPPQYYYYYRYYYYYYYYY
QQQLLLLLLLLZZZMMMMMMMMMMMMMMNMSSSSSSSSSSVVPPPPPPBBYYYYYYYYYYYYYYYYYXXXXUUUUUUUUUOIIIIILLLLZZZZZZZZZFFFFFFFFFFFFFFFFUUMMPPPPPYYYYYYYYYYYYYYAA
QQQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSSSVVPPPBBBBBBYYYGGGGGGGGGYYYYYYYYUUUUUUUUUIIIIILLLLZZZZZZZZZZFFFFFFFFFFFFFFFFMMMOPPPPGYYYYYYYYYYYYYYYA
QQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSRRSVVVVVVBBBBBYYYGGGGGGGGGYYYYYYYXUUUUUUUUUIIIIILLLLLZZZZZZZZZZZHHZZHHFFFFFFFFMMMMMPPPYYYYYYYYYYYYYYYYY
QQLLLLLLLLLZZZMMMMMMMMMMMMMMMSSSSSSRRRRSVVVVVBBBBBBBYYGGGGGGGGGYYYYYYEEUUUUUUUUUIIIIILLLLLBZZZZZZZZZZHHHHHHFFFFFFFFMMMMMMPIIYYYYYYYYYYYYYYYY
QQQLLLLLLZZZZZZMMMMMMMMMMMMMFSSSSSSRRRRRRVVVVVVVVBBYGGGGGGGGGGGYYXYYYEEEEEEEEEEEIEIILLLLLLZZZZZZZZZZZZHHHHHFFFFFFFFMMMMMMPPIIYYYYYYYYYUUYYYU
QQQQQQGLLLLPPPMMMMMMMMMMMMMMMSRSSSRRRRRRVVVVVVVVBBBQGGGGGGGGGGGGGGYXXXEEEEEEEEEEEEELLLLLHZZZZZZZZZZZXZHHHHHFFFFFFFFMMMMIIIIIYYYYYYYYYYUUUUYU
QQQQQQQQQLKPPPPIIMMMMMMMMMUUUURRSRRRURRRVVVVVVVVVBQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJEELLLHHHHHHHHHZZDDZZZHHHHHFFFFFFFFQMMMQQIIIIYUUUUYYYYUUUUUU
JJQQQTQQQKKKPPPPPQQMUUMUUUUUURRRSRUUURRRUUUVVVUVVVQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJJJLLHHTTHHHHHHYYYDDDZHHHHHFFFFFFFFQMMMQQQQQUUUUUUUUUUUUUUUU
JJJJQTTQKKKPPPPPPQQQUUUUUUUCURRRRRRUUURRUUUVUUUUVVQQGGGGGGGGGGGGGGXXXXZEEEEEEEEEJJJJJHTTTTHHHHHHYDDDDHHHHHHMMQQQHQQQQMQQQQQUUUUUUUUUUUUUUUUU
JJJJJTTTPKKPPPPPPPQUUUUUUUUUUURRRRRRUUUUUUUVUUUUUVVQGGGGGGGGGGGGGGXXXXZEZZZZEEEJJJJJTTTTTTTTHHHHYYYMMHHHMHHMMMQQQQQQQQQQQQQUUUUUUUUUUUVUUUUU
JJJJJTTPPPPPPPPPPPPUUUUUUUUUURRRRRRUUUUUUUUUUUUUUVVUGGGGGGGGGGGGGGXXRRZZZZZZEEDDDJJTTTTTTTTHHHHHYMMMMHMHMMMMMMMQLLLQLQQQQQQUUUUUUUUUVUVVUUUU
JJJJJJJPPPPPPPPPPPUUUUUUUUUUURRRRPRRRUUUUUUUUUUUUVVUGGGGGGGGGGGGGGZRRRRRRRDDDDDDDJJJZTTTTTTTHHYYYYMMMMMHHMMMMMLLLLLLLLQQSQQSSUUUUBBBVVVVVUUU
JJJJJBBPPPPPPPPPPPUUUUUUUUUUUURRRPPCCUUUUUUUUUUUUUUUGGGGGGGGGGGGZZRRRRRRRBDDDDDDDJJJTTTTTTTTYHYYYYYYUMMMHMMMMLLLLLLLLLLLSSSSUUUUBVVVVVVZVUUU
JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURRPPPCCGUUUUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRYDDDDDDJJTTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLSSSSSSUUUBVVVVVVVVVUU
JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURUPPPCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDJTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLLSSSSSSSSSEEEEVVVVVVVU
JJJJBBBBQQQPPPPPPPUUUUUUUUUUUUUUPPCCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDTTTTTTTTTTYYYYYYYOYMMMMMMMMMMMMMLLLLLLSSSSSSEEUEEEVEEVQQVQ
JJJJJBBBBQQQPPPPUUUUUUUUUUUUUUPPPPCCCCCCCCCFFUUUUUUUQGGGGGGEEKKKKZZRRRRRRRRRDDDDHDTTTTTTTTTTTTYYYYYYYMMMMMMMMMMMMMMMSSSSSSSSSSEEEEEEEEQQQQQQ
JJJJBBBBBQQQQQPPUHHWUUUUUUUUUUPPPPCCCCCCCCCFFUUEUUMUQGGGGGGEEEKKKZRRRRRRRRRRRHDDHDDDTTBTTTTTTTYYYYYYYYMMMMMMMMMMMMSSSSSSSSSSSEEEEEEEEEEQQQQQ
JJHBBBBBQQQQQPPPPHHWWUUUUUUUUPPPPPCCCCCCCCCCAUUEUUUUQGGGGGGEKKKKPRRRRRRRRRRRRHHHHHDTTTTTNTTTTTTTXYYAAYYMMMMMMMMMMMGGSGGGOOOSOOOEEEEEEEEEQQQQ
JHHHBBBBQQQQQPPPPHHWWUUUWWWUPPPPPPPPCCCCCCAAAAAEEEUUUGGGGGGCKKKKKKKRRRRRRRRRRHHHHHDTWWTTNNNTTTXXXYAAAAMMMMMMMMMMMGGGGGGJOOOOOOEEEEEEEEEEQQQE
HHHHBBBUQQQQQPPPPWHWWWUWWWWUPPPPPPPPPPCCCCAAAAAEEEEEEGGGGGGCKKKKKKKRRRRRRRRRGGHHHHHHWWNNNNNNTXXXXXXAAAAAMMMMMMMMGGGGGGJJOOOOOOEEEEEEEEEEEQEE
HHHHHBBBBQQQPPPPWWWWWWWWWWWWWPPPPPPPPPCCCAAAAAEEEEEECCCCCCCCKKKUKKRRRRRRRRRRRGHHHHHWWDDDNNNNTTXNNNNVAAAAAMWMMMMMGGGGGGJJOOOODEEEEEEEEEEEEEEE
HHHHHHHHUQQUPPPPWWBWWWWWWWWWWPPPPPPPPPCCAAAAAAAEEEEECCCCCCCCCKKKKRRRRRRRREKKKKKDHHHWDDDDNNNNNNNNNNNNNAAAAAMMMMPMMEGGGEOOOOOOEEEEEEEEEEEEEEEE
HHHHUHHHUQQUUPPPSUUWWWWWWWWWWPPPPPPPPPPCJPBAATTTTTEEEERRCCCCRRKKKKRRRRRRRRKKKKKKNHHWDDDDDNNNNNNNNFFNNAAAAAAAAMPMEEGGGEOOOOOOVVVEEEEEEEEEEEEE
HHHHUUUUUUUUUUVVUUWWWWWWWWWWWPPPPPPPPPPPPPAATTTTTTEEEERRUCCCCRKKKKKKRRRKKKKKKDDJDDDWDDDDDNNNNNNNNNNNAAAAAAAAAMMAEEEGGEEOOOOOOVVSESSSSEEEEEEE
HHHHHUUUUUUUUUUUUUWWWWWWWWWWWPPPPPLTTPPPPPPTTTTTTTTTEERRRCCCCRRKKKKKRRKKKKKKKDDDDDDDDDDDDDDNNNNNNNNNAAAAAAAAMMAAEEEEGEEEEEOOVVSSSSSSSEEEEEEE
HHHHHHHHHUUUUUUUUUWWWWWWWWWWLLLLLLLTTPPPPPPTTTTTTTTTEERRPCERRRRRKKKKKKKKKKKMKLDDDEDDDBBBBBBBNNNNNNNNNAAAAAAAAAAAAAEEEEEEEEOOVVSSSSSSSSSSEGGE
HHHHHHHUUUUUUUUUXUWWWWWWWWWWLLLLLLLTTTPPPTTTTTTTTTTTERRRRRRRRRRRRKKKKKKKKMKMLLLDDDDDDBBBBBBBNNNNNNANAAAAAAAAAAAAAAEEEEEEEEEESSFSSSSSSSSSESGG
HHHHHHHUUUUUUUUXXXXWWWWWWLLLLLLLLLTTTTTTTTQTTTTTTTTTTRRRRRRRRRRRKKMMKKKKKMMMMMLLDDDDDBBBBBBBNNNNNNNAAAAAAAAAAAAAAAKKEEEEEEEESSSSSSSSSSSSSSGG
HHHHHUUUUUUUUUUXXXXXWWWXLLLLLLLLLLTTTTTQQQQTTTTTTTTTTTRRRRRRRRRRRKMMMKKKKMMMMMMDDDDDDBBBBBBBNNNNNNNNNAAAAAAAAAKKKKKKEEEEEEEEESSSSSSSSSQSNQGG
HHHKKUUUUKUUUWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQTQQQTTTTTTRRRRRRRRRRRRMMMMKKKKMMMMMMDDDDDDBBBBBBBDNNNNNNNBBBBBBBAAAAKKKKKKKEEEEEEEESSSSSSSSQQQQGG
HHHHKKLKAKKUWWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQQQQTTTTTTTRRRRRRRRRRRRMMMMMKMMMMMMMMQQDDDDBBBBBBBNNNNNNNNBBBBBBBAAAAKKKKKKEEEEEEEESSSSSSSSSQGQQGG
HHHHHKKKKKKUWWWWWXXXXXXXXLLLLLLLLLQVQQQQQQQQQQQTTTTTRRRRRRRRRRRNNMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBNABBBBBBBAAAAKKKKKKEEEEEENEESSSSSSQSQQQQGQ
HHHHKKKKKKKRWWWWWWXXXXXXXLLLLLLIILIQQQQQQQQQQQQQTTTTRRRRRRRRRRRNMMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAKKKKKKEEEENNNNSSSSSSSQQQQQQQQ
HMHHKKKKKKKRWWWWWXXXXXXXXLLLLLLIIIIQQQQQQQQQQQQQTTTRRRGRRRRRRRRNMMMMMMMMMMMMMMZQZZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAAAKKKKEEENNNNNSSSNSSSQQQQQQQQ
MMKKKKKKKKKWWWWWWXXXXXXXXLLLLLLLLIIIQQQQQQQQQQQQQQTRRRRKKRRRRRNNMMMMMMMMMMMMBBZZZZZZDBBBBBBBBBBBBBBBBBBBBBBAAIIAKKKKKKKENNNNNNNSNSSUUQQQQQQQ
NMMMMKKKKKKWWWWWWWXXXXXLLLLLLLLLLLLIIQQQQQQQQQQQQEEERRIIKRRRRNNNMMMMMMMMMMMMMBZZZZZZZBBBBBBBBBBBBBBBBBBBBBBNIIIKKKKKKKKKKNNNNNNNNSUUQVQQQQQQ
MMMKKKKKKKKWWWWWWXXXXXXXXRRRRJXXXLIIQQAQQQQQQQQQQEEEEEIIIIINNNNNNMMMMMMMMMMMBBZZZZZZZDSSBBBBBBBBBBBBBBBNNNEEIIIKKKKKIKKNNNNNNNNNNNQQQQQQQQQQ
MFMIFFKKKKKKWWWWWWXXXXXXRRRRJJJXXQQQQQQQQQQQQQQQQEEEEEEEIINNNNNNNNNNMMMMMMMBBBBBZZZZZDZZBBBBBBBBBBBBBBBNNNIIIIIKKKIKIINNNNNNNNNNNQQQQQQQQQQQ
FFBIFFFKKKKKWWWWWWXXXXXXWWRRRJJXXXXQQQQQQQQQQQQQQEEEEEIIIINNNNNNNNNNNMMMMMMMBBBCBZZZZZZZBBBBBBBBBBBNNNNNNIIIIIIIIIIIIINNNNNNNNNNNNNQQQQQQQQQ
FFBBBFFFFKKKYWWWXXXXXXVWWWRRRJXXXXXXXQQQQIQQQUQQUUEUEEIIIIIIINNINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBIINNNNIIIIIIIIIIIIIIINNNNNNNNNNNNNHQQQQQQ
FBBBBFFFFFFFFWWWXXXXXXXWWWRWWXXXXXXDDPPPQQUUUUUQUUUUIIIIIIIIIIIINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBINNNNNIIIEIIIIIIIIIIIINNNNNWNNNNNNHQZQQQQ
BBBBBFFFFFFFEEEQXXXXXXXXWWWWWXWXXXXDDPPZZUUUUUUUUUUUIIIIIIIIIIIINNNNNNMBBBBBBBBBBBBZZZZZZZBBBBBBBBBIIIIEEEEEEIIIIIIIIIIIWWWWWUWWNWNNNNQZZDDD
BBBBBFFFFFEEEEEQXNNXXXWWWWWWWWWWXDDDDQQUUUUUUUUUUUHBIIIIIIIIIIIBNNNNNNBBBBBBBBBBBBZZZZZZZZBBBBBBBBBIIIIIEEEEEIIIIIIIIIIIWWWWUWWWWWNNNNNZDDDD
BBBBBBFFFFFEEEEEENNNNWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBIIIIIIIIIIIBNNNNNBBBBBBBBBBBBDBBZZZZZZBBBBBBBBBIIIIEEEEEEEEEIIIIIIIWWWWWWWWWWWNNNZZZDDDD
BBBBBBBEFFFEEEEEENENNNWWWWXXXXXXXXXXDDDDDDDDUUUUBBBBBIIIIIIIILBBBNBNNNNBBBBBBBBBBBBZZZZZZZBBBBBIIIIIIEEEEEEEEEEEIIIIIIIWWWWWWWWWWWZZZZZZDDDD
BBBBBBEEEYEEEEEELEEENNWWWWXXXXXXXXXXDDDDDDUUUUUUUBBBBIIIIIIIIIBBBBBBBBBBBBBBBBBBBBBBZZZZZZHHHUUUIIIIIENEEEEEEEEEIIIIMMMWWWWWWWWWWWZZZZZZZZDD
BBBBBBBEEEEEEEEEEEEENWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBBIIIIIEIIBBBBBBBTTBBBBBBBBBBBBBZZZZZZZHUUUUUUUIIEEEEEEEEEEEEEMMMMMMMWWWWXXXXXWZZIJZZZZDZ
BBBBBBBBBEEEEEEEEEEEELXXXXXXXXXXXXXXDDDDDDUUUUUUUBTUBIIIIIIIBBBBBBBBTBBBBBBBBBBBBBZZZZZZZZUUUUUUUUIIIELEEEEEEEEEEMMMLWWMWXXXXXXXXXZIIIIIZZDZ
BBBBBBBBBEEEEEEEEEEEEEXXXXXXXXXXXXXXDRRDZAUUUUUUUUUUUNNNNIMBBBBBBBBBBBBBBBBBBBBOOBZZZZZZZZZUUUUUUUUUEEEEEEEEEEEEEMMMLLWWWXXXXXXXXXZIIPIZZZZZ
BBBBBBBBBBEEEEEEEEEEEWXXXXXXXXXXXXXXDRRDAAAUUUUUUUUMMMNMNNMBBBBBBBBBBBRNBBBBBVNOZZZZZZZZUUUUUUUUUUUUUEEEEEEEELELLMMLLLWWWXXXXXXXXXZIIIIIIZZZ
BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAARAUUUUUUUMMMMMMMMBBBBBBBBBBBRNNBBNNNNOOZZZNNZUUUUUUUUUUUUUUUUEEEEEELLLLMLLLLWWWXXXXXXXXXZIIIIIIZZZ
BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAAAAAUUUUUUMMMMMMMMBBBBBBBBBBRRNNNNNNNNOONZZNNZUUUUUUUUUUUUUZEEEEEEEELLLLLLLLVWWWXXXXXXXXXIIIIIIIIIZ
BBBBBBLLLLLLLLXXEEEVEKXXXXXXXXXXXXXXWVVVVVVAAAAUUUUMMMMMMMMBBMBBBBBBBBRNNNNNNNNNNNNNNUUUUUUUUUUUUUUUEEEEEEEEELLLLLLLLLLLWXXXXXXXXXIIIJZZZZZZ
BBBBBBLLLLLLLGLLEEEEEKXXXXXZZZZZZZWWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBNNNNNNNNNNINNNNUUUUUUUUUUUUUUJEEEEEEEELLLLLLLLLLLWWXXXXXXXXXJJJJJJJZZZ
BBBBBBLLLLLLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBBNNNNNNNNNNNNNNUUUUUUUUUUUUVVICCELEEEELLLLLLLLLLDDWXXXXXXXXXWWJJJJZZZZ
BLLLLLLLOOOLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVVURRUFRMMMMMMMMMBBBBBBBBNNNNNNVKKNNNNNNNNNNNUUUUIVVVVVICCCEEEEELLLLLLLLLDDDDXXXXXXXXXJJJJJJJZZZ
BLLLLLLLOOOLLLLLLLLLLLCZZZXXXXXXXXXZVVVVVVVVVVRRRRRRRRMMMMMMMIIIBBBBBBBBVVVVVKYNNNNNNNNNNNUIIIIVVVIIIIEEEEELLLLLLLLLLDDDDDDXXXJJJJJJJJJJJZZZ
BLLLLLLLOOOLLLLLLLLLLLLLZZXXXXXXXXXZVVVVVVVVVRRRRRRRRRRRTTTIIIIIIIBBBYYVFVVVVVYYNNNNNNNINNNIIIIVVIIIIEEEEEEEELVLLLLGLLDDDDDXXXJJJJJJJJJJJJJZ
LLLLLLLLOOOLLLLLLLLLLLLNZZXXXXXXXXXZVVVVVVVVRRRRRRRRRRRRRRRNIIIIIBBBBYYVVVVVYYYYYYNNNNNIIIBIIIIVIIIIIBEEEDDKELVVDLLLLDDDDDDDDDJJJJJJJJJJJJJZ
LLLLLLLLOOOLLLLLLLLLLALNZZXXXXXXXXXZVVVVVVVVKRRRRRRRRRRRRRRRRIIIIBBBBBYYYYVVYYYYYYNNNIIDIIIIIIIIIIIIIIDREDVDEVVVDLLDLDDDDDDDDJJJJJJJJJJJJJJJ
LLLLLLLLOOOLLLLBBBLLAAZZZZZZZZZZZZZMVVVVVVVRRRRRRRRRRRRRRXRRIIIIIIIIBYYYYYVVYYYYYYNNNIIIIIIIIIIIIIIIIIDDDDDDDVVDDDDDDDDDDDQDDDJJJJJJJJJJTJJC
LLLLLLLLOOOLLLBBBBLLLAAAAAMZZZZMZZMMMVVVVVVRCCCRRRRRRRRRRRRRIIIIIKKYYYYYYYYYYYYYYYYYNNIIIIIIIIIIIIIIIIDDDDDDDVDDDDDDDDDDDQQDDDJJJJJJJJJTTTJC
LLLLLLLLOOOLLLLBBBLQLAAAAAMMMZZMZMMMVVVVVVVRCCCCCRRRRRRIIIRRRIIIIKKYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIISIDDDDDDDVVDDDDDDDDDQQQDQQGJJJJJJJJGGGCC
LLLLLLLLOOOLLLBBBBBBAAAAAAMMMMMMMMMMMVVVVVVCCCCCCRRRRRRIIIIIIIIIIIKYYYYYYYYYYYYYYYOOOIIIIIIIIIIIIIIIGIDDDDDDDDDDDDWWQQQQQQQQQQGJTJJWWWWGGGCC
LLLLLLLLOOOLLLBBBBBBAAAAAAAMMMMMMMMMXXVVVVVCCCCCCCEEERJJJIIIIIIIIKKKKYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIGGGDDDDDDDDDDIWWGQQQQQQQQTTJJTTGGGGWGGGGC
TLLLLLLLLLLLLLBBBBBBBAAAAAAMMMMMMMMXXXVVXVVCCCCCCCEEEEAAAAAIIIIIIKKKKYYYYYYYYYYIIIIIIIGIIIIIIIIIIFGGGGDDDDDDDSDWWWGGQQQQQQQQTTTTTGGGGGGGGCCC
TLLLLLLLLLLLLLCBBBBBBBACAAAMMMMMMMMXXXXXXXCCCCCCCCEEECAUUUUUUIIIIKKKYYYYYYYYYIIIIIIIIIGIIIIIIFFFFFGGGGDDDDDDSSSSWWWGGQQQQQQQTTTTGGGGGGGGGCCC
ZLLLLLLEELLLLLBBBBBBBUCCCMMMMMMMMMMMXXXXXCCCCIIIIIIIIIIUUUUUUHIIKKKKYYYYYYYYYYGXIIIIIIGIIIIIIGGFFFGGGGGDDDDDSSSSSGGGGGQQQQQTTTTGGGGGGGGCCCCC
ZZLLLZZLLLLLLLBBBSBBBBBCMMMMMMMMMMXXXXXXXXCCCIIIIIIIIIIUUUUUUHIIIIKKJYYYYYYYYGGGIIIIIGGGGIIIQGGFGGGGGGGSSSSSSSSSSSSGGQQQQQTTQTTTTGGGGGGCCCCC
ZZZEZZZZZLLRLLCCKCBBCCCCMMMMMMMMMMMXXXXXXXCCCIIIIIIIIIIUUUUUUHHHIIKKJYYYGGAGGGGGGFGIWGGGGIIGGGGGSSSSSSSSSSSSSSSSSSGGGQQQQQQQQQTTGGGGGGGCCCCC
ZZZZZZZZZZLLLLSCCCCCCCCCCMNNMMMMMEEXXXXXXXXCCIIIIIIIIIIUUUUUUHQHHHJJJJJYGGGGGGGGGFGGGGGGGGGGGGGGSSSSSSSSSSSSSSSSSWWWGWQQQQQQQQQTGGGGGGCCCCCC
ZZZZZZZZSSLLLSSSCCCCCCCCMMNMMMMMMMMXXXXXXCCCTIIIIIIIIIIUUUUUUHQHHJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSSSSSSWWWWWWWWWQWQQQQWQTTGGGGGGGGCCCC
ZZZZZZZZSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXCXXCIIIIIIIIIIQQQQQQQQQAJJJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSWWWWWWWWWWQWWWQQGGGGGGGGGCCCC
ZZZZZZZSSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXXXXXIIIIIIIIIIIIQQQQQQAAEAJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGDDDSSSSSSSSWWWWWWWWWWWWQQQQQGOGGGGGGCCQC
ZZZZZZZZSTTTSSSSSCCCCCCCMMMMMMMMMMXXXXXXXXXXXXXWWIIIWAIIIQQAPQQAAAAAJJJJGGGGGGMGGGGGGGGGGGGGGGGGGGGGDDDDSSSSSSSAWHWHWWWWWWWQQQQQGGGQQGGGGCQQ
ZZZZZZZZZTTTSSSTSSCCHCCMMMMMMEMMMAXXXXXXXXXXXXWWWIIIIIIIIIAAPPPAAAAAJJJMGGGGGGMMMGGGGGGGGGBBGGGEGGGGDDBDSSSSSSSHHHHHWWWWYWWQQQQQQQQQQQQGQQQQ
ZZZZZZZOZTTTTTTTTSCCHCHMMMEEEEEMAAXXXXXXXXXXXXWIIIIIIIIIIIAUAPAAAAAAJJJMGGGMMGMMMGGGGGGGGGGGGGEEGGGGSSSSSSSSSSSHHHHHWWWYYQQQQQQQQQQQQQQQQQQX
ZZZZZZZOZZTTTTTTTTTHHHHHMEEEEEEEEAAXXGXJXXXXXXWIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHWHHHHQQQQQQQQQQQQQQQQQ
ZZZZZOOOTTTTTTTTTTTTTTEHEEEEEEEEAAXXXXXJXCXXXIIIIIIIIIIIIIAAAAAAAAAAMMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHHHHHHQQQQQQQQQQQQQQQQQ
ZZZZZOOOTTTTTTTTTTTTTTEEEEEEEEEEEAXXAAAJACCCCIIIIIIIIIIIIIAAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGGGGEEEEEEESSSSSSSSSSSHHHHHHHHHHHHQKKQQQQQQQQQQQQQQ
OOOOOOOOOOTTTTTTTTTTTUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIFAAAAAAAAAAAMMMMMMMMMMMGGGGGGUGGGEGEEEEEEESSSSSSSSHHHHHHHHHHHHHHHHKKKKQQQQQQQQQQQQ
OOOOOOOOOOTTTTTTTTTTUUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGEEEEEEEEEEESSSSSSSSXXHHHHHHHHHHHHHHKKKQQQQQQQQHQQQQ
OOOOOOOOOOOTTTTTTTTTCCCESSSSSSSZEAAAAAAAEEECCSIIIIIIIIIISSAAAAAAAAAAMMMMMMMMMMMMMMGGGGOOEEEEEEEEEEEESSSSSSSSXXXHHHHHHHHHQHHHHKNPPIQQQQQHQHHH
OOOOOOOOOOTTTTTTTTTTCCCCSSSSSSSEEEAAAACEEEESSSIIIIIIIIIISSAAAMMAAAAAMMMMMMMMMMMMMMXXGGJEEEEEEEEEEEXBSSSSSSSSXXXXHHHHHHHQQHHKKKNNPIIIQIIHHHHH
OOOYYYYYOOTTTTTTTTTTBCCCSSSSSSSEHHHAAAEEEEESSSIIIIIIIIIITGGAMMMAAAMMMMMMMMMMMMVVVMXXXJJJJEEEEEEEEEXXSSSSSSSSXXXXXHHHHHHHHHKKKKKNNIIIIIIHHHHH
OOYYYYYYOTTTTTTTTTUTCCCCSSSSSSSEHHHAAAEEEEEESSIIIIIIIIIITGGAMMMAAAAAMDMMMMMMMMVVXXXXXJJJJEEEEERRREXXSSSSSSSSXXXXXHHTHTKKHHKKKKKNNTIIIIIHHHHH
OOYYYYYYOYTTTTTTTCUCCCCCSSSSSSSYYHIIIIIEEEEESSIIIIIIIIIITTTTMMMMAAADDDDMMMMMMMVVVVXXXJJJJJEEEERRRXXXBBBXXXXXXXXXHHHTTTTKKKKKKKNNNTIIIIIIHHHH
YYYYYYYYYYTTTTTTTCCCCCCCSSSSSSSYYHIIIIIIEEEEESSSSSSSSSTTTTTJTYYYAADDDDDDVVMVVVVVVVJJJJJJJJEEEEERRXXXBBXXXXXXXXXXGGGTTTTTKKKNNNNNIIIIIIIIIHHH
YYYYYYYYYYYYTTTYYYCCCCCCSSSSSSSSSPIIIIIEEEEEESSSSSSSTSTTTTTTTTYYYADDDDDDVVVVVVVVVVJJJJJJJJEEEERRRXXXXXXXXXXXVXVVVVGTTTUTKNNNNNNNIIIIIIIIIHHH
YYYYYYYYIIYYYYYYYCCCCCCCCCSSSSSSSIIIIIIIEEEEEEESSSSSTTTTTTTTTTTYYYDDDDDDVVVVVVVVVVVVVJJJJJEEERRRRRRXXXXXXXXXVVVVVGGTTTTMNNNNNNNNIIIIIIIIIHHH
YYYYYYYYHHHHHHYYYYCCCCCCCCSSSSSSSIIIIIIEEEEESESSSSSSTJTTTTTTTTYYYYYDDDDDDVVVVVVVVVVJJJJJJJEEERRRRRRRRXXXXXXXVVVVVVVVATTNNNNNNNNNIIIIIIIIHHHH
YYYYYYYYYHHHHHHYYYCCCCCCCCSSSSSSSIIIIIGEEEEESSSSSSSSSYTTYTYYYYYYYYYDDDDDDDDVVVVVVVVJVVVVJEEERRRRRRRRRXRRXXXXVVVVVVVVAAAANNNNNNNNNIIIIIIIIHHH
YYYYYYYDYHHHHHYYYYCCCCCCCCSSSSSSSIIIGGGEEEEEESSSSSSSSYYYYYYYYYDDDYYYDDDDSDDDVVVVVVVVVVVVVEEERRRRRRRRRRRRXXXXVVVVVVVVAAAANNNNNNNNNNIIIIUUIIHH
YYYYYYYYHHHHHYYYYYCCCCCCCCSSSSSSSIIIIIIIPEEEEESSSSSYYYYYYYYYYYDDDDSSDSSSSVVVVVVVVVVVVVVVEEEERRRRRRRRRREEXXXVVNVVVVVVAAAANNNNNNNNNNIIIUUUUUHH
SYSSSSYYHHHHHHYYYYCCCYCHCCSSSSSSSSSSSIHPPEEEEEEESSSYYYYYYYYDDYDDDDSSSSSSSSSVVVVVVVVVVVMMMMMMKMRRRRRRRRTEXXXXTVVVVVVAAAAAANNNNNNNNNNUIUUUUUUH
SYSSSSYYHHHHHHYYYYYYCYIHHCSSSSSSSSSSSHHHHEEEEEESSSSAYYYYYYYDDDDDDDFSSSSSSSSSVVVVSVVMMMMMMMMMKMMRRRRRRTTEETTTTTTVVVAAAAAAANNNNNNNNNNUUUUUUUUU
SSSSSSSSSHHHHHYYYYYYYYYHHHHSSSSSSSSSSHHHHEEEEEEAASSSHYYYYYYDDDDDFFFSSSSSSSSSSVVVSVVMMMMMMMMMMMMRTRRRRTTTTTTTTTTVAAAAAAAAANNNNNNNNNNUUUUUUUMU
SSSSSSSHHHHHHHHHYYYYYYYYHHHSSSSHHIIIHHHHEEEEEAAAAASHHHHSYYYDDDFFFFSSSSSSSSSSSSSSSVVMMMMMMMMMMMAATRRRTTTTTTTTTTUVAAAAAAAANNNNNNNNNNNUUUUUUUUF
SSASSSSSSHHHNHHHZZJJYTYHHHHHHHHHHHIIHHHHHHEEEAAAAAAATHXXXYYADDFFFFSSRSSSSSSSSSSSVVVMMMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUNNNNNUNUUUUUUUBBBF
SSASSSSSSHHHHJHZZJJJYYYHHHHHHHHHHHHHHHHHHHGEEAAAAAAAAXXXXYYAAAAAAAASASSSSSSSSSSSSSVVMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUUNNUNUUUUUUUUUBBBBB
SAAAASSSSBHHVJHHJJJJYYHHHHHHHYYHHHHHHHHHHHGAAAAAAAAAAXXXXXYYAAAAAAAAAAASSSSSSSSSVVVMMMMMMMMMMAATTTTDTTTTTTTTTTTAAAAAAAAAUUUUUNUUUUUUUUBBBBBB
SAAAAASBBBBJJJJHJJJJYYHHHHHHYYYYYHHHHHHHHAAAAAAAAAAAAXKXXXIRAAAAAAAAASSSSSGASSSSVVVTMMMMMMMMAAAATTMDTTTTTTTXZTTAAAAAAVAAVVUUUUUXUXUUUUUHHBBH
AAAAAASSSBJJJJJJJJJHHHHHHHHYYYYYYYYYHHHHHAAAAAAAAAAAAXXXNIIRRAAAAAAAAAAAASSAASSSSVTTMSMMMMMMMAAATTMMMMTTTXTXXTXAAAAAAVVVVEUUUUUXXXUUUUUUHHHH
AAAAAJRJJJJJJJJJJJJHHHHHHHYYYYYYYYYYHHHHHAAAAAAAAAAAAJIIIIIRAAAAAAAAAAAAAASAAATSRVTTMMMMMMMXXXAAATPMMMKXXXXXXXXXAAAAAVVVVUUUUUXXXXXXXUUUHHHH
AAAAARRTTJAAJJJJJJJJHHHHHHHYYYYYYYYYHHHAAAAAAAAAAAAAAJIIIIIIIIIAAAAAAAAAAAAAATTTVVTTMMMGMZZXXXXAAMMMMXXXXXXXXXXXAAAVVVVVVUUUUXXXXXXXXXHHHHHH
AAAAARRRJJAJJJJJJJJJHHHUUUUUYYYYYYYYYYEAAAAAAAAAAAAAAAYYIIIIIIIIAAAAAAAAAAAAAATTTTTTWMMMMZZXXXAAAAMMMXXXXXXXXXXXAAAVVVVVVUVVUXXXXXXXXXXHHHHH
AAAAAAARJAAJJJJJJJJJMPPUUUUUYYYYYYYYYYAAAAAAAAAAAAAAAAAAIIIIIIIAAAAAAAAAAAAAAATTTTTWWDDDMXXXXXXXAAAXXXXXXXXXXXXXAAVVVVVVVVVVUXXXXXXXXHHHHHHH
AAAAAARRRAAAJJJJJJJJPPPUUUUUYYYYYYYYYYAANNAAAAAAAAAAAIAIIIIIIIIAAISAIIIAAAATAATWWTWWWWDDXXXXXXXXXXXXXXXXXXXXXKKKAAVVVVVVVVVVUXXXXXXXXHHHHHHH
AAAAAGGRRAAAAAJJPPPJJPPUUUUUYYYYYYYYYYYOOOOROSSAAAIAAIIIIIIIIFIIAIIIIIIAAOOOAATTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKAAKVVVVVVVVVVVTXXXXXIIXXHHHHH
AAAAAGGGRRRAAAAAAPPPPPPPPPYYYYYYYYYYYYOOOOOOOSSSSAGGGGGIIIIIFFIIIIIIIIAAOOOOOOTTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKKKKKKVVVVVVVVVVXXXXXXXEXXHHHH
AAAAAGGARAAAAAAPPPPPPPPPPPPPYYYYYYOYYYOOOOOOOSSSSGGGGGIIIIIIIFIIIIIIIIAAOOOOOOOOWWWWWWIIXHXXXXXXXXXXXXXXXXXXXXKVVVVVVVVVVVVVVVXXXXXXXEXXHHHH
AAAAAGGAAAAAAAAPPPPPPPPPPPPPPPYYOOOOOYOOOOOOOOOSSGGGGGGIIIIIIIIIIIIIIIOOOOOOHHHHWWWWWWIIXHXXXXXXXXXLXXXXXXXXXXXZZVVVVVVVVVVVVVVXXXXXXXXXHHHH
AAAGGGAAAAAAAAPPPPPPNNNPPPPPPPPPPOOOOOOOOOOOOOCGGGGGGGGGIIIIIIIIIIIIIIIQIOOOHHHHHWWWWWWIJHHXXXXXXXXXXXXXXXXXXHXZZVVVVVVVVVVVVVVXXXXXYYXXHHHH
GAAGGGGAAAAAAAAAPJJNNNNPNPPPPPPPNOOOOOOOOOOOOOCGGGGGGGGGGGIIIIIIIIIIIIIIIOHHHHHHHWIWIIIIJHHXXXXXXXXXXXXXXXZZXXZZZVVVVVVVVVVVVVVYXYYYYYYYEEHH
GGGGGGGGAAAAAAAAAJJNNNNNNPPPPPPPPOOOOOOOOOOUOOOGGGGGGGGGGINIIIIIIIIIIIIIIIIHHHHHHHIIIIJJJHHXXXXXXJXXXXXXXXXZZZZZVVVVVSSSZVVZVVVYYYYYYEEEEHHH
GGGGGGGGGAAAAAAAAJJNNNNNNPPPPPPPPPPOOOOOOOOUUUGGGGGGGGGGGIIIIIIIIIIIIIIIIHHHHHHHHIIIIIIJJJHXXXXXXXWXXFXXXXZZZZZZVZZVVVVVZZZZZVYYYYEYYEEAEHHH
GGGGGGGGAAAAAAAAAAJNNNNNNNPNPPPPXXXOOOOOOOOOUUGGGGGGGGGGGGIIIIIIIIIIIIHHIIHHHHHHHHHIIIIJJJHXXXXXXXWXFFFXXXXZZZZZZZZZZZVZZZZZZZYYYYEEEEEEHHHH
GGGGGGGGGGGAAAJJJJJNNNNNNNNNPPPXXXXOOXXOOOOOGGGGGGGGGGGGGGGGIIIIIIIIIIIHHHHHHHHHHHHHHHHHHHHHXXXXXXXXXFFFFXXZZZZZZZZZZZZZZZZZZZZZYYEEEEEHHHHH

58
2024/go/day13/day13.go Normal file
View File

@@ -0,0 +1,58 @@
package day13
import (
"adventofcode2024/utils"
_ "adventofcode2024/utils/grid2d"
_ "adventofcode2024/utils/inputs"
"regexp"
_ "fmt"
"strings"
)
func Part1(input string) int {
val := 0
machines := strings.Split(input, "\n\n")
pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)`
re := regexp.MustCompile(pattern)
for _, machine := range machines {
matches := re.FindStringSubmatch(machine)
a := utils.MustAtoi(matches[1])
b := utils.MustAtoi(matches[2])
c := utils.MustAtoi(matches[3])
d := utils.MustAtoi(matches[4])
X := utils.MustAtoi(matches[5])
Y := utils.MustAtoi(matches[6])
// fmt.Println(matches)
B := (Y*a - X*b)/(a*d - c*b)
A := (X - c*B)/a
// fmt.Printf("A: %d B: %d\n", A, B)
if (A*a + B*c == X && A*b + B*d == Y) {
val += A*3 + B
}
}
return val
}
func Part2(input string) int {
val := 0
machines := strings.Split(input, "\n\n")
pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)`
re := regexp.MustCompile(pattern)
for _, machine := range machines {
matches := re.FindStringSubmatch(machine)
a := utils.MustAtoi(matches[1])
b := utils.MustAtoi(matches[2])
c := utils.MustAtoi(matches[3])
d := utils.MustAtoi(matches[4])
X := utils.MustAtoi(matches[5]) + 10000000000000
Y := utils.MustAtoi(matches[6]) + 10000000000000
// fmt.Println(matches)
B := (Y*a - X*b)/(a*d - c*b)
A := (X - c*B)/a
// fmt.Printf("A: %d B: %d\n", A, B)
if (A*a + B*c == X && A*b + B*d == Y) {
val += A*3 + B
}
}
return val
}

View File

@@ -0,0 +1,45 @@
package day13
import (
"testing"
"github.com/stretchr/testify/require"
)
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`)
require.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`)
require.Equal(t, 480, r)
}

1279
2024/go/day13/input.txt Normal file

File diff suppressed because it is too large Load Diff

149
2024/go/day14/day14.go Normal file
View File

@@ -0,0 +1,149 @@
package day14
import (
"adventofcode2024/utils"
grid "adventofcode2024/utils/grid2d"
"fmt"
"regexp"
"strings"
)
type Robot struct {
velocity [2]int
}
const SIZE_X = 101
const SIZE_Y = 103
func Part1(input string) int {
grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{})
pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)`
re := regexp.MustCompile(pattern)
lines := strings.Split(input, "\n")
for _, line := range lines {
matches := re.FindStringSubmatch(line)
fmt.Println(matches)
x := utils.MustAtoi(matches[1])
y := utils.MustAtoi(matches[2])
x1 := utils.MustAtoi(matches[3])
y1 := utils.MustAtoi(matches[4])
robots := grid.Get(x, y)
grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}}))
}
fmt.Println(grid.StringWithFormatter(formatter))
ng := ticks(grid, 100)
fmt.Println(ng.StringWithFormatter(formatter))
return get_saftey(ng)
}
func Part2(input string) int {
min_safe := 240096000
min_i := 0
max_safe := 0
max_i := 0
grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{})
pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)`
re := regexp.MustCompile(pattern)
lines := strings.Split(input, "\n")
for _, line := range lines {
matches := re.FindStringSubmatch(line)
fmt.Println(matches)
x := utils.MustAtoi(matches[1])
y := utils.MustAtoi(matches[2])
x1 := utils.MustAtoi(matches[3])
y1 := utils.MustAtoi(matches[4])
robots := grid.Get(x, y)
grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}}))
}
fmt.Println(grid.StringWithFormatter(formatter))
max_safe = get_saftey(grid)
for i:=0;i<7380;i++ {
ng := ticks(grid, 1)
safe := get_saftey(ng)
if safe > max_safe {
max_safe = safe
max_i = i
}
if safe < min_safe {
min_safe = safe
min_i = i
}
grid = ng
}
for i:=7380;i<7390;i++{
ng := ticks(grid, 1)
fmt.Println(ng.StringWithFormatter(formatter))
grid = ng
}
fmt.Println(grid.StringWithFormatter(formatter))
fmt.Printf("max_safe: %d max_i: %d min_safe: %d min_i:%d", max_safe, max_i, min_safe, min_i)
return get_saftey(grid)
}
func formatter(robots []Robot, x int, y int) string {
if len(robots) == 0 {
return " "
}
return "*"
}
func ticks(g *grid.Grid[[]Robot], seconds int) *grid.Grid[[]Robot] {
ng := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{})
for y := 0; y < g.SizeY(); y++ {
for x := 0; x < g.SizeX(); x++ {
for _, robot := range g.Get(x, y) {
nx := x + ((robot.velocity[0] * seconds) % SIZE_X)
if nx < 0 {
nx = g.SizeX() + nx
}
if nx >= g.SizeX() {
nx = nx - g.SizeX()
}
ny := y + ((robot.velocity[1] * seconds) % SIZE_Y)
if ny < 0 {
ny = g.SizeY() + ny
}
if ny >= g.SizeY() {
ny = ny - g.SizeY()
}
robots := ng.Get(nx, ny)
ng.Set(nx, ny, append(robots, robot))
}
}
}
return ng
}
func get_saftey(grid *grid.Grid[[]Robot]) int {
robots := 0
val := 1
for y := 0; y < grid.SizeY()/2; y++ {
for x := 0; x < grid.SizeX()/2; x++ {
robots += len(grid.Get(x, y))
}
}
val *= robots
robots = 0
for y := 0; y < grid.SizeY()/2; y++ {
for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ {
robots += len(grid.Get(x, y))
}
}
val *= robots
robots = 0
for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ {
for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ {
robots += len(grid.Get(x, y))
}
}
val *= robots
robots = 0
for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ {
for x := 0; x < grid.SizeX()/2; x++ {
robots += len(grid.Get(x, y))
}
}
val *= robots
return val
}

527
2024/go/day14/day14_test.go Normal file
View File

@@ -0,0 +1,527 @@
package day14
import (
"testing"
"github.com/stretchr/testify/require"
)
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`)
require.Equal(t, 12, r)
}
func TestPart2(t *testing.T) {
r := Part2(`p=80,75 v=69,72
p=88,10 v=-28,-23
p=79,61 v=79,59
p=37,102 v=92,-43
p=12,22 v=-5,-95
p=60,13 v=-30,-42
p=3,59 v=-96,-88
p=85,33 v=-43,-41
p=44,14 v=63,45
p=6,6 v=-34,-86
p=47,102 v=12,42
p=36,88 v=-88,-93
p=78,27 v=-18,52
p=96,64 v=-62,-34
p=49,99 v=-78,-15
p=57,31 v=-80,21
p=25,57 v=8,-84
p=69,20 v=81,61
p=80,5 v=-11,-30
p=2,35 v=-85,77
p=9,12 v=-4,36
p=37,68 v=12,-69
p=47,88 v=-8,-90
p=72,68 v=59,-86
p=55,38 v=-68,-94
p=60,58 v=41,37
p=76,87 v=-1,-18
p=89,9 v=38,92
p=100,67 v=17,-53
p=83,73 v=80,32
p=77,19 v=-54,-20
p=10,86 v=-65,36
p=13,88 v=-64,-84
p=50,29 v=-17,-29
p=79,38 v=89,-57
p=55,57 v=-68,22
p=71,82 v=-80,52
p=37,83 v=-68,-43
p=25,5 v=81,-22
p=83,54 v=-32,-75
p=27,95 v=-77,-55
p=70,97 v=-72,-4
p=3,84 v=-60,-60
p=16,29 v=-35,99
p=39,39 v=37,-38
p=76,94 v=90,60
p=18,21 v=-86,-26
p=22,84 v=-16,66
p=45,83 v=-40,-43
p=35,52 v=54,3
p=30,21 v=14,36
p=69,61 v=69,-66
p=52,22 v=-28,33
p=9,21 v=-85,-73
p=87,32 v=79,52
p=28,85 v=-35,85
p=32,58 v=-49,89
p=22,75 v=85,44
p=45,19 v=-88,61
p=97,59 v=98,-75
p=70,81 v=82,7
p=97,102 v=-23,-8
p=92,68 v=89,72
p=24,42 v=-63,-97
p=21,64 v=-45,-47
p=58,3 v=-69,51
p=33,68 v=19,-20
p=27,6 v=-89,-21
p=28,81 v=-67,-8
p=59,83 v=-66,-82
p=3,14 v=-3,-1
p=19,65 v=15,-25
p=57,37 v=53,-29
p=36,84 v=-4,-84
p=55,96 v=82,-21
p=68,101 v=51,51
p=68,8 v=-90,-30
p=78,51 v=-51,-63
p=4,55 v=-63,97
p=100,60 v=76,-13
p=7,91 v=-96,-73
p=97,17 v=-54,33
p=85,60 v=69,-3
p=20,39 v=96,-85
p=24,12 v=86,-84
p=34,7 v=-7,-36
p=30,69 v=-67,97
p=65,17 v=20,33
p=39,101 v=-7,-83
p=38,51 v=-90,-4
p=99,61 v=-13,59
p=30,1 v=-67,-96
p=1,89 v=-85,-83
p=8,1 v=68,4
p=89,89 v=-52,85
p=81,5 v=-55,71
p=99,60 v=-94,-72
p=68,70 v=-10,78
p=81,18 v=89,-95
p=47,61 v=-39,56
p=91,71 v=85,59
p=28,66 v=44,-28
p=10,64 v=-59,-4
p=84,10 v=-32,-11
p=29,52 v=-37,34
p=78,43 v=-92,12
p=85,3 v=-71,4
p=37,85 v=-46,-84
p=56,21 v=21,-32
p=17,17 v=15,17
p=26,87 v=45,-93
p=57,21 v=-6,40
p=95,48 v=-33,59
p=38,59 v=65,-72
p=59,85 v=-50,-99
p=17,21 v=86,-45
p=53,3 v=-28,-46
p=1,40 v=-54,-91
p=61,13 v=-40,83
p=33,35 v=-72,-96
p=40,14 v=33,-8
p=29,89 v=53,-59
p=74,0 v=-22,-42
p=12,32 v=-65,-4
p=82,89 v=-12,20
p=35,71 v=-40,20
p=14,5 v=95,83
p=46,44 v=39,92
p=25,54 v=-66,-47
p=91,78 v=64,53
p=14,9 v=25,67
p=39,29 v=-29,8
p=20,100 v=95,51
p=59,41 v=92,-82
p=15,92 v=93,-73
p=42,93 v=3,-86
p=82,93 v=-21,-96
p=50,9 v=12,-39
p=81,22 v=-13,99
p=72,81 v=-51,-93
p=88,19 v=-72,-14
p=8,93 v=-85,-15
p=54,2 v=61,8
p=44,81 v=66,41
p=78,10 v=90,8
p=19,53 v=68,4
p=80,43 v=9,46
p=11,38 v=-66,88
p=31,3 v=4,-2
p=49,28 v=-74,21
p=27,15 v=54,-88
p=96,87 v=-50,-67
p=94,94 v=-5,-97
p=16,89 v=73,23
p=93,32 v=-53,93
p=47,17 v=-29,92
p=10,78 v=16,35
p=55,33 v=-60,-17
p=55,73 v=-68,-22
p=100,62 v=17,-69
p=67,91 v=-49,45
p=68,53 v=-42,-41
p=35,73 v=54,47
p=20,63 v=-85,-12
p=23,16 v=-87,33
p=70,55 v=50,-16
p=92,6 v=41,-59
p=9,97 v=-37,47
p=48,48 v=42,40
p=96,37 v=-90,32
p=66,13 v=-60,91
p=62,46 v=-50,18
p=11,15 v=98,77
p=42,78 v=1,47
p=10,40 v=15,-48
p=88,44 v=7,-75
p=27,53 v=-70,-9
p=21,7 v=-56,96
p=92,81 v=-22,69
p=57,65 v=92,-34
p=85,63 v=77,11
p=92,2 v=-30,21
p=59,16 v=73,-70
p=16,11 v=86,-89
p=82,16 v=80,-36
p=41,30 v=-49,19
p=13,6 v=14,73
p=67,99 v=-91,51
p=37,20 v=-65,-37
p=85,16 v=99,-14
p=1,39 v=-44,56
p=37,29 v=74,5
p=44,51 v=-18,93
p=43,9 v=-55,-84
p=5,10 v=-65,26
p=51,90 v=-59,-96
p=55,98 v=-9,23
p=0,94 v=88,-49
p=91,43 v=-14,-72
p=93,43 v=-69,-94
p=84,100 v=-12,54
p=23,46 v=85,78
p=79,37 v=39,-10
p=1,23 v=99,-79
p=73,50 v=-51,84
p=78,58 v=-31,-16
p=75,44 v=69,71
p=27,5 v=-87,14
p=95,91 v=-33,63
p=22,94 v=-5,-37
p=36,11 v=-5,-60
p=18,3 v=-64,-27
p=44,14 v=24,-92
p=96,40 v=65,-92
p=47,1 v=84,25
p=93,22 v=68,-48
p=14,32 v=-24,37
p=99,17 v=78,-89
p=53,36 v=10,58
p=44,44 v=-78,-60
p=15,28 v=-96,-20
p=96,61 v=-81,-45
p=58,87 v=-9,7
p=20,43 v=84,-22
p=50,42 v=-18,68
p=74,23 v=-12,42
p=12,57 v=-94,-94
p=49,49 v=-89,40
p=47,98 v=-67,-8
p=84,17 v=-62,11
p=31,6 v=-57,-42
p=28,67 v=66,-81
p=0,3 v=-88,-13
p=51,76 v=82,76
p=67,81 v=87,-14
p=84,78 v=39,41
p=39,74 v=72,35
p=30,10 v=64,-77
p=10,31 v=11,-4
p=6,90 v=-4,76
p=90,24 v=-2,-23
p=8,39 v=-57,-27
p=31,69 v=93,-25
p=79,38 v=39,-35
p=69,31 v=70,30
p=1,16 v=7,73
p=46,9 v=-99,-70
p=53,16 v=-94,-84
p=32,60 v=33,-69
p=62,22 v=-99,-4
p=66,3 v=98,20
p=4,76 v=46,-75
p=50,71 v=-90,22
p=57,12 v=31,-15
p=59,84 v=-50,-65
p=33,0 v=76,-48
p=58,76 v=-30,44
p=6,69 v=6,35
p=74,91 v=-61,-43
p=36,92 v=-58,60
p=2,78 v=-48,-98
p=43,91 v=53,76
p=34,101 v=-77,79
p=40,44 v=-68,28
p=71,64 v=47,-48
p=54,7 v=84,15
p=54,75 v=-60,-31
p=14,40 v=86,12
p=80,29 v=-92,-26
p=8,47 v=-33,-69
p=2,41 v=12,-9
p=39,60 v=-38,59
p=13,22 v=86,-20
p=25,12 v=-57,11
p=60,47 v=96,96
p=50,51 v=-48,-82
p=85,40 v=89,74
p=99,4 v=-94,-21
p=75,7 v=29,-73
p=28,58 v=-80,24
p=46,94 v=-9,56
p=24,65 v=-76,62
p=50,2 v=-20,70
p=85,55 v=-5,66
p=38,11 v=43,36
p=53,54 v=53,24
p=18,45 v=65,96
p=94,22 v=16,80
p=79,28 v=75,-69
p=30,38 v=-15,-29
p=5,23 v=-4,49
p=8,98 v=96,-99
p=7,60 v=-14,47
p=96,17 v=88,-73
p=48,23 v=-41,35
p=17,31 v=-26,-23
p=13,52 v=66,37
p=58,19 v=41,55
p=25,9 v=-77,-89
p=3,92 v=55,-80
p=74,95 v=20,-77
p=26,70 v=43,72
p=54,4 v=96,-18
p=63,8 v=-97,49
p=23,51 v=87,-75
p=24,18 v=85,36
p=8,52 v=6,-13
p=97,50 v=17,-72
p=47,66 v=-25,6
p=38,78 v=3,-93
p=62,6 v=5,77
p=56,74 v=-70,-6
p=94,99 v=9,34
p=19,92 v=-18,26
p=35,54 v=-47,-69
p=92,8 v=-13,42
p=47,86 v=12,-90
p=12,83 v=-68,2
p=0,18 v=-75,-89
p=11,99 v=-99,14
p=88,20 v=62,21
p=27,53 v=53,-47
p=17,44 v=-5,-91
p=57,10 v=66,-65
p=66,95 v=-71,-12
p=38,21 v=23,95
p=68,69 v=-31,35
p=87,71 v=50,72
p=98,12 v=47,33
p=94,21 v=66,51
p=53,97 v=-16,-93
p=59,35 v=6,39
p=12,88 v=-86,88
p=85,16 v=39,8
p=38,85 v=35,80
p=44,9 v=-48,11
p=71,18 v=-82,39
p=85,14 v=-74,-73
p=88,22 v=-42,36
p=8,6 v=-58,38
p=21,58 v=-66,9
p=25,17 v=-68,95
p=89,16 v=-34,-86
p=33,54 v=64,-88
p=57,8 v=54,51
p=40,18 v=-98,58
p=91,22 v=-34,-53
p=75,81 v=-70,26
p=89,70 v=-2,69
p=62,6 v=-1,-92
p=78,24 v=-82,-42
p=47,7 v=-75,83
p=86,8 v=-63,95
p=80,64 v=-36,-79
p=69,95 v=-30,29
p=46,86 v=85,20
p=76,35 v=-82,-51
p=33,15 v=-17,55
p=40,58 v=-2,-11
p=76,31 v=39,2
p=46,82 v=-15,-45
p=14,53 v=36,-16
p=98,66 v=68,-3
p=83,38 v=35,-87
p=41,9 v=53,70
p=35,33 v=-68,-68
p=53,66 v=62,97
p=75,80 v=49,-62
p=66,70 v=-50,47
p=78,80 v=7,64
p=82,16 v=85,-81
p=58,25 v=11,-70
p=36,72 v=33,72
p=66,92 v=-91,10
p=24,52 v=-98,22
p=74,7 v=-36,-79
p=46,26 v=-61,-90
p=52,24 v=53,-88
p=92,26 v=31,78
p=60,52 v=80,-81
p=82,78 v=-81,-49
p=10,3 v=-15,-55
p=91,31 v=99,77
p=75,50 v=-91,40
p=49,71 v=93,91
p=1,94 v=-54,54
p=96,50 v=39,18
p=0,3 v=-53,33
p=34,9 v=-17,-8
p=96,28 v=68,-63
p=25,4 v=66,21
p=94,74 v=82,-89
p=47,66 v=-17,87
p=58,23 v=63,83
p=13,82 v=-74,75
p=29,85 v=40,79
p=57,7 v=50,83
p=7,88 v=-37,-16
p=81,61 v=-10,34
p=6,32 v=33,-60
p=63,7 v=1,98
p=59,29 v=-31,-85
p=85,91 v=19,-18
p=22,39 v=21,90
p=25,13 v=75,89
p=14,100 v=-27,30
p=33,6 v=97,-53
p=84,83 v=-22,38
p=100,69 v=77,-38
p=2,67 v=-14,-25
p=71,71 v=-53,73
p=9,43 v=-52,98
p=55,76 v=-60,94
p=49,91 v=-35,-95
p=77,68 v=26,12
p=41,91 v=-17,-15
p=1,69 v=-44,72
p=32,61 v=4,59
p=94,12 v=-33,30
p=1,35 v=96,49
p=72,64 v=-61,-53
p=76,93 v=38,-37
p=97,9 v=33,61
p=60,32 v=80,18
p=16,68 v=15,-29
p=99,72 v=66,44
p=99,18 v=56,99
p=42,11 v=-88,11
p=57,69 v=-2,-2
p=39,57 v=26,-51
p=34,15 v=73,42
p=56,55 v=-61,-75
p=89,1 v=67,-27
p=21,100 v=5,70
p=85,11 v=-35,63
p=16,35 v=47,-63
p=98,0 v=93,-2
p=51,89 v=-9,85
p=50,32 v=84,-42
p=29,63 v=78,-76
p=92,86 v=89,10
p=27,11 v=-77,51
p=65,21 v=-59,68
p=84,68 v=20,-50
p=19,2 v=-24,-36
p=25,78 v=25,-85
p=90,92 v=59,-87
p=70,100 v=10,-52
p=48,78 v=3,54
p=85,81 v=30,44
p=53,65 v=41,-67
p=13,95 v=82,-29
p=5,19 v=95,75
p=37,96 v=-68,26
p=83,16 v=-5,-9
p=31,17 v=4,-20
p=83,34 v=-83,-76
p=50,88 v=93,-5
p=66,36 v=-30,58
p=11,29 v=-44,83
p=31,31 v=-77,-51
p=26,85 v=14,-18
p=8,76 v=65,69
p=60,70 v=-40,47
p=69,70 v=22,64
p=85,53 v=18,12
p=97,93 v=-58,-57
p=52,83 v=92,-9
p=20,92 v=30,50
p=88,73 v=32,3
p=83,16 v=-42,-14
p=57,89 v=-29,20
p=50,19 v=73,8
p=8,101 v=-94,-68
p=12,77 v=-4,-84
p=63,28 v=-84,91
p=46,25 v=13,-95
p=93,21 v=88,-26
p=10,54 v=-24,72
p=69,16 v=-92,-30
p=26,68 v=21,97
p=56,30 v=-90,-51
p=62,69 v=-1,-50
p=7,6 v=55,-39
p=63,78 v=76,92
p=57,55 v=-51,-19
p=70,62 v=18,37
p=88,26 v=-61,82
p=80,50 v=-73,99
p=40,1 v=-78,86
p=35,85 v=81,-12
p=17,74 v=56,47
p=36,99 v=64,-15
p=56,18 v=-29,-14
p=42,44 v=-18,46
p=84,4 v=-63,-2
p=97,75 v=27,-62
p=47,71 v=54,-50
p=26,101 v=-67,-83
p=30,74 v=-57,66`)
require.Equal(t, 0, r)
}

500
2024/go/day14/input.txt Normal file
View File

@@ -0,0 +1,500 @@
p=80,75 v=69,72
p=88,10 v=-28,-23
p=79,61 v=79,59
p=37,102 v=92,-43
p=12,22 v=-5,-95
p=60,13 v=-30,-42
p=3,59 v=-96,-88
p=85,33 v=-43,-41
p=44,14 v=63,45
p=6,6 v=-34,-86
p=47,102 v=12,42
p=36,88 v=-88,-93
p=78,27 v=-18,52
p=96,64 v=-62,-34
p=49,99 v=-78,-15
p=57,31 v=-80,21
p=25,57 v=8,-84
p=69,20 v=81,61
p=80,5 v=-11,-30
p=2,35 v=-85,77
p=9,12 v=-4,36
p=37,68 v=12,-69
p=47,88 v=-8,-90
p=72,68 v=59,-86
p=55,38 v=-68,-94
p=60,58 v=41,37
p=76,87 v=-1,-18
p=89,9 v=38,92
p=100,67 v=17,-53
p=83,73 v=80,32
p=77,19 v=-54,-20
p=10,86 v=-65,36
p=13,88 v=-64,-84
p=50,29 v=-17,-29
p=79,38 v=89,-57
p=55,57 v=-68,22
p=71,82 v=-80,52
p=37,83 v=-68,-43
p=25,5 v=81,-22
p=83,54 v=-32,-75
p=27,95 v=-77,-55
p=70,97 v=-72,-4
p=3,84 v=-60,-60
p=16,29 v=-35,99
p=39,39 v=37,-38
p=76,94 v=90,60
p=18,21 v=-86,-26
p=22,84 v=-16,66
p=45,83 v=-40,-43
p=35,52 v=54,3
p=30,21 v=14,36
p=69,61 v=69,-66
p=52,22 v=-28,33
p=9,21 v=-85,-73
p=87,32 v=79,52
p=28,85 v=-35,85
p=32,58 v=-49,89
p=22,75 v=85,44
p=45,19 v=-88,61
p=97,59 v=98,-75
p=70,81 v=82,7
p=97,102 v=-23,-8
p=92,68 v=89,72
p=24,42 v=-63,-97
p=21,64 v=-45,-47
p=58,3 v=-69,51
p=33,68 v=19,-20
p=27,6 v=-89,-21
p=28,81 v=-67,-8
p=59,83 v=-66,-82
p=3,14 v=-3,-1
p=19,65 v=15,-25
p=57,37 v=53,-29
p=36,84 v=-4,-84
p=55,96 v=82,-21
p=68,101 v=51,51
p=68,8 v=-90,-30
p=78,51 v=-51,-63
p=4,55 v=-63,97
p=100,60 v=76,-13
p=7,91 v=-96,-73
p=97,17 v=-54,33
p=85,60 v=69,-3
p=20,39 v=96,-85
p=24,12 v=86,-84
p=34,7 v=-7,-36
p=30,69 v=-67,97
p=65,17 v=20,33
p=39,101 v=-7,-83
p=38,51 v=-90,-4
p=99,61 v=-13,59
p=30,1 v=-67,-96
p=1,89 v=-85,-83
p=8,1 v=68,4
p=89,89 v=-52,85
p=81,5 v=-55,71
p=99,60 v=-94,-72
p=68,70 v=-10,78
p=81,18 v=89,-95
p=47,61 v=-39,56
p=91,71 v=85,59
p=28,66 v=44,-28
p=10,64 v=-59,-4
p=84,10 v=-32,-11
p=29,52 v=-37,34
p=78,43 v=-92,12
p=85,3 v=-71,4
p=37,85 v=-46,-84
p=56,21 v=21,-32
p=17,17 v=15,17
p=26,87 v=45,-93
p=57,21 v=-6,40
p=95,48 v=-33,59
p=38,59 v=65,-72
p=59,85 v=-50,-99
p=17,21 v=86,-45
p=53,3 v=-28,-46
p=1,40 v=-54,-91
p=61,13 v=-40,83
p=33,35 v=-72,-96
p=40,14 v=33,-8
p=29,89 v=53,-59
p=74,0 v=-22,-42
p=12,32 v=-65,-4
p=82,89 v=-12,20
p=35,71 v=-40,20
p=14,5 v=95,83
p=46,44 v=39,92
p=25,54 v=-66,-47
p=91,78 v=64,53
p=14,9 v=25,67
p=39,29 v=-29,8
p=20,100 v=95,51
p=59,41 v=92,-82
p=15,92 v=93,-73
p=42,93 v=3,-86
p=82,93 v=-21,-96
p=50,9 v=12,-39
p=81,22 v=-13,99
p=72,81 v=-51,-93
p=88,19 v=-72,-14
p=8,93 v=-85,-15
p=54,2 v=61,8
p=44,81 v=66,41
p=78,10 v=90,8
p=19,53 v=68,4
p=80,43 v=9,46
p=11,38 v=-66,88
p=31,3 v=4,-2
p=49,28 v=-74,21
p=27,15 v=54,-88
p=96,87 v=-50,-67
p=94,94 v=-5,-97
p=16,89 v=73,23
p=93,32 v=-53,93
p=47,17 v=-29,92
p=10,78 v=16,35
p=55,33 v=-60,-17
p=55,73 v=-68,-22
p=100,62 v=17,-69
p=67,91 v=-49,45
p=68,53 v=-42,-41
p=35,73 v=54,47
p=20,63 v=-85,-12
p=23,16 v=-87,33
p=70,55 v=50,-16
p=92,6 v=41,-59
p=9,97 v=-37,47
p=48,48 v=42,40
p=96,37 v=-90,32
p=66,13 v=-60,91
p=62,46 v=-50,18
p=11,15 v=98,77
p=42,78 v=1,47
p=10,40 v=15,-48
p=88,44 v=7,-75
p=27,53 v=-70,-9
p=21,7 v=-56,96
p=92,81 v=-22,69
p=57,65 v=92,-34
p=85,63 v=77,11
p=92,2 v=-30,21
p=59,16 v=73,-70
p=16,11 v=86,-89
p=82,16 v=80,-36
p=41,30 v=-49,19
p=13,6 v=14,73
p=67,99 v=-91,51
p=37,20 v=-65,-37
p=85,16 v=99,-14
p=1,39 v=-44,56
p=37,29 v=74,5
p=44,51 v=-18,93
p=43,9 v=-55,-84
p=5,10 v=-65,26
p=51,90 v=-59,-96
p=55,98 v=-9,23
p=0,94 v=88,-49
p=91,43 v=-14,-72
p=93,43 v=-69,-94
p=84,100 v=-12,54
p=23,46 v=85,78
p=79,37 v=39,-10
p=1,23 v=99,-79
p=73,50 v=-51,84
p=78,58 v=-31,-16
p=75,44 v=69,71
p=27,5 v=-87,14
p=95,91 v=-33,63
p=22,94 v=-5,-37
p=36,11 v=-5,-60
p=18,3 v=-64,-27
p=44,14 v=24,-92
p=96,40 v=65,-92
p=47,1 v=84,25
p=93,22 v=68,-48
p=14,32 v=-24,37
p=99,17 v=78,-89
p=53,36 v=10,58
p=44,44 v=-78,-60
p=15,28 v=-96,-20
p=96,61 v=-81,-45
p=58,87 v=-9,7
p=20,43 v=84,-22
p=50,42 v=-18,68
p=74,23 v=-12,42
p=12,57 v=-94,-94
p=49,49 v=-89,40
p=47,98 v=-67,-8
p=84,17 v=-62,11
p=31,6 v=-57,-42
p=28,67 v=66,-81
p=0,3 v=-88,-13
p=51,76 v=82,76
p=67,81 v=87,-14
p=84,78 v=39,41
p=39,74 v=72,35
p=30,10 v=64,-77
p=10,31 v=11,-4
p=6,90 v=-4,76
p=90,24 v=-2,-23
p=8,39 v=-57,-27
p=31,69 v=93,-25
p=79,38 v=39,-35
p=69,31 v=70,30
p=1,16 v=7,73
p=46,9 v=-99,-70
p=53,16 v=-94,-84
p=32,60 v=33,-69
p=62,22 v=-99,-4
p=66,3 v=98,20
p=4,76 v=46,-75
p=50,71 v=-90,22
p=57,12 v=31,-15
p=59,84 v=-50,-65
p=33,0 v=76,-48
p=58,76 v=-30,44
p=6,69 v=6,35
p=74,91 v=-61,-43
p=36,92 v=-58,60
p=2,78 v=-48,-98
p=43,91 v=53,76
p=34,101 v=-77,79
p=40,44 v=-68,28
p=71,64 v=47,-48
p=54,7 v=84,15
p=54,75 v=-60,-31
p=14,40 v=86,12
p=80,29 v=-92,-26
p=8,47 v=-33,-69
p=2,41 v=12,-9
p=39,60 v=-38,59
p=13,22 v=86,-20
p=25,12 v=-57,11
p=60,47 v=96,96
p=50,51 v=-48,-82
p=85,40 v=89,74
p=99,4 v=-94,-21
p=75,7 v=29,-73
p=28,58 v=-80,24
p=46,94 v=-9,56
p=24,65 v=-76,62
p=50,2 v=-20,70
p=85,55 v=-5,66
p=38,11 v=43,36
p=53,54 v=53,24
p=18,45 v=65,96
p=94,22 v=16,80
p=79,28 v=75,-69
p=30,38 v=-15,-29
p=5,23 v=-4,49
p=8,98 v=96,-99
p=7,60 v=-14,47
p=96,17 v=88,-73
p=48,23 v=-41,35
p=17,31 v=-26,-23
p=13,52 v=66,37
p=58,19 v=41,55
p=25,9 v=-77,-89
p=3,92 v=55,-80
p=74,95 v=20,-77
p=26,70 v=43,72
p=54,4 v=96,-18
p=63,8 v=-97,49
p=23,51 v=87,-75
p=24,18 v=85,36
p=8,52 v=6,-13
p=97,50 v=17,-72
p=47,66 v=-25,6
p=38,78 v=3,-93
p=62,6 v=5,77
p=56,74 v=-70,-6
p=94,99 v=9,34
p=19,92 v=-18,26
p=35,54 v=-47,-69
p=92,8 v=-13,42
p=47,86 v=12,-90
p=12,83 v=-68,2
p=0,18 v=-75,-89
p=11,99 v=-99,14
p=88,20 v=62,21
p=27,53 v=53,-47
p=17,44 v=-5,-91
p=57,10 v=66,-65
p=66,95 v=-71,-12
p=38,21 v=23,95
p=68,69 v=-31,35
p=87,71 v=50,72
p=98,12 v=47,33
p=94,21 v=66,51
p=53,97 v=-16,-93
p=59,35 v=6,39
p=12,88 v=-86,88
p=85,16 v=39,8
p=38,85 v=35,80
p=44,9 v=-48,11
p=71,18 v=-82,39
p=85,14 v=-74,-73
p=88,22 v=-42,36
p=8,6 v=-58,38
p=21,58 v=-66,9
p=25,17 v=-68,95
p=89,16 v=-34,-86
p=33,54 v=64,-88
p=57,8 v=54,51
p=40,18 v=-98,58
p=91,22 v=-34,-53
p=75,81 v=-70,26
p=89,70 v=-2,69
p=62,6 v=-1,-92
p=78,24 v=-82,-42
p=47,7 v=-75,83
p=86,8 v=-63,95
p=80,64 v=-36,-79
p=69,95 v=-30,29
p=46,86 v=85,20
p=76,35 v=-82,-51
p=33,15 v=-17,55
p=40,58 v=-2,-11
p=76,31 v=39,2
p=46,82 v=-15,-45
p=14,53 v=36,-16
p=98,66 v=68,-3
p=83,38 v=35,-87
p=41,9 v=53,70
p=35,33 v=-68,-68
p=53,66 v=62,97
p=75,80 v=49,-62
p=66,70 v=-50,47
p=78,80 v=7,64
p=82,16 v=85,-81
p=58,25 v=11,-70
p=36,72 v=33,72
p=66,92 v=-91,10
p=24,52 v=-98,22
p=74,7 v=-36,-79
p=46,26 v=-61,-90
p=52,24 v=53,-88
p=92,26 v=31,78
p=60,52 v=80,-81
p=82,78 v=-81,-49
p=10,3 v=-15,-55
p=91,31 v=99,77
p=75,50 v=-91,40
p=49,71 v=93,91
p=1,94 v=-54,54
p=96,50 v=39,18
p=0,3 v=-53,33
p=34,9 v=-17,-8
p=96,28 v=68,-63
p=25,4 v=66,21
p=94,74 v=82,-89
p=47,66 v=-17,87
p=58,23 v=63,83
p=13,82 v=-74,75
p=29,85 v=40,79
p=57,7 v=50,83
p=7,88 v=-37,-16
p=81,61 v=-10,34
p=6,32 v=33,-60
p=63,7 v=1,98
p=59,29 v=-31,-85
p=85,91 v=19,-18
p=22,39 v=21,90
p=25,13 v=75,89
p=14,100 v=-27,30
p=33,6 v=97,-53
p=84,83 v=-22,38
p=100,69 v=77,-38
p=2,67 v=-14,-25
p=71,71 v=-53,73
p=9,43 v=-52,98
p=55,76 v=-60,94
p=49,91 v=-35,-95
p=77,68 v=26,12
p=41,91 v=-17,-15
p=1,69 v=-44,72
p=32,61 v=4,59
p=94,12 v=-33,30
p=1,35 v=96,49
p=72,64 v=-61,-53
p=76,93 v=38,-37
p=97,9 v=33,61
p=60,32 v=80,18
p=16,68 v=15,-29
p=99,72 v=66,44
p=99,18 v=56,99
p=42,11 v=-88,11
p=57,69 v=-2,-2
p=39,57 v=26,-51
p=34,15 v=73,42
p=56,55 v=-61,-75
p=89,1 v=67,-27
p=21,100 v=5,70
p=85,11 v=-35,63
p=16,35 v=47,-63
p=98,0 v=93,-2
p=51,89 v=-9,85
p=50,32 v=84,-42
p=29,63 v=78,-76
p=92,86 v=89,10
p=27,11 v=-77,51
p=65,21 v=-59,68
p=84,68 v=20,-50
p=19,2 v=-24,-36
p=25,78 v=25,-85
p=90,92 v=59,-87
p=70,100 v=10,-52
p=48,78 v=3,54
p=85,81 v=30,44
p=53,65 v=41,-67
p=13,95 v=82,-29
p=5,19 v=95,75
p=37,96 v=-68,26
p=83,16 v=-5,-9
p=31,17 v=4,-20
p=83,34 v=-83,-76
p=50,88 v=93,-5
p=66,36 v=-30,58
p=11,29 v=-44,83
p=31,31 v=-77,-51
p=26,85 v=14,-18
p=8,76 v=65,69
p=60,70 v=-40,47
p=69,70 v=22,64
p=85,53 v=18,12
p=97,93 v=-58,-57
p=52,83 v=92,-9
p=20,92 v=30,50
p=88,73 v=32,3
p=83,16 v=-42,-14
p=57,89 v=-29,20
p=50,19 v=73,8
p=8,101 v=-94,-68
p=12,77 v=-4,-84
p=63,28 v=-84,91
p=46,25 v=13,-95
p=93,21 v=88,-26
p=10,54 v=-24,72
p=69,16 v=-92,-30
p=26,68 v=21,97
p=56,30 v=-90,-51
p=62,69 v=-1,-50
p=7,6 v=55,-39
p=63,78 v=76,92
p=57,55 v=-51,-19
p=70,62 v=18,37
p=88,26 v=-61,82
p=80,50 v=-73,99
p=40,1 v=-78,86
p=35,85 v=81,-12
p=17,74 v=56,47
p=36,99 v=64,-15
p=56,18 v=-29,-14
p=42,44 v=-18,46
p=84,4 v=-63,-2
p=97,75 v=27,-62
p=47,71 v=54,-50
p=26,101 v=-67,-83
p=30,74 v=-57,66

119
2024/go/day15/day15.go Normal file
View File

@@ -0,0 +1,119 @@
package day15
import (
_ "adventofcode2024/utils"
_ "adventofcode2024/utils/grid2d"
_ "adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
_ "regexp"
"strings"
_ "github.com/deckarep/golang-set/v2"
)
type Loc struct {
x int
y int
}
type Queue struct {
elements []Loc
}
// Push adds an element to the end of the queue
func (q *Queue) Push(value Loc) {
q.elements = append(q.elements, value)
}
// Pop removes an element from the front of the queue
func (q *Queue) Pop() (Loc, bool) {
if len(q.elements) == 0 {
return Loc{}, false // Return zero and false if the queue is empty
}
value := q.elements[0]
q.elements = q.elements[1:] // Remove the first element
return value, true
}
// IsEmpty checks if the queue is empty
func (q *Queue) IsEmpty() bool {
return len(q.elements) == 0
}
func Part1(input string) int {
var val int
var rloc Loc
in := strings.Split(input, "\n\n")
dirs := map[rune][2]int{
'<': {-1, 0},
'>': {1, 0},
'^': {0, -1},
'v': {0, 1},
}
grid := inputs.ToGrid2D(in[0], "\n", "", ',', func(c string) rune { return rune(c[0]) })
directions := strings.ReplaceAll(in[1], "\n", "")
fmt.Printf("%v\n", grid.StringWithFormatter(formatter))
fmt.Printf("%v\n", directions)
found := false
for x := 0; x < grid.SizeX(); x++ {
if found {
break
}
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y) == '@' {
rloc = Loc{x: x, y: y}
found = true
break
}
}
}
fmt.Printf("Robot: %v\n", rloc)
for _, dir := range directions {
q := &Queue{}
x := rloc.x
y := rloc.y
Loop:
for {
x += dirs[dir][0]
y += dirs[dir][1]
switch grid.Get(x, y) {
case 'O':
q.Push(Loc{x: x, y: y})
case '.':
for !q.IsEmpty() {
grid.Set(x, y, 'O')
loc, _ := q.Pop()
fmt.Printf("%d,%d\n", loc.x, loc.y)
// grid.Set(loc.x, loc.y, 'O')
x -= dirs[dir][0]
y -= dirs[dir][1]
}
grid.Set(rloc.x, rloc.y, '.')
rloc.x = x
rloc.y = y
grid.Set(rloc.x, rloc.y, '@')
break Loop
case '#':
break Loop
}
}
// fmt.Printf("%v\n", grid.StringWithFormatter(formatter))
}
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y) == 'O' {
val += (100 * y) + x
}
}
}
return val
}
func Part2(input string) int {
return 0
}
func formatter(p rune, x int, y int) string {
return string(p)
}

View File

@@ -0,0 +1,57 @@
package day15
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^`)
require.Equal(t, 10092, r)
}
func TestPart2(t *testing.T) {
r := Part2(`##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^`)
require.Equal(t, 0, r)
}

71
2024/go/day15/input.txt Normal file
View File

@@ -0,0 +1,71 @@
##################################################
#...O.#..O....##O..OO.#O..#.#.......OO...#O.#OO..#
#O#..OO...O..O.O.....O.O.O....OO#.....O#.O.OO..O.#
#........O....#...O......O.OO...#..O.O.#O#....O..#
#..O.OO..O..O.#..O.O.OO.O...O...O......#O.....O..#
#..OO.....O.OO.O#.......O.........O.....O.O.O....#
#.O.#.O.O#......OO........O.O.....OO..O.O.O.#.#O.#
#........#.....#.##O....O.O..OOO.......OOO.#O....#
#.O#.#...OO.....#.......O...O...#O.O.......OO..OO#
#.O...O..#O...#O..O.........O.O..OO..O.......O.OO#
#O.O......O.OO..O.O.......O.OO#O.##...#....#O.O.O#
#.O...O.OO.O....O..O.O...O...#.O....OO..O.O#O#OO.#
#.....O.O..#O.....O.O..##O.O#OO...O...O.O.O......#
##..O...O..OO.O.O.O..OO........#.##.........O.O..#
#..O...O.OO..OOO.O...#..#.........#.O....OO......#
#O....OOO.OO...O##.O.OO..O.O.....O.O.OOO....O.O.O#
#O.O..OO.O..OO............O....O....O..OO...OO..##
#.O...O.O.O.....O..O.O...O.#.......OOO...........#
#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....#
##..#.OO.O.OO.#.O....O...#........#........O.O...#
#..O.OO...O....#..OO.O...........OOOO#..OO#O.....#
#OO.O#...#..#...O#........O.OOO...OO....#O.OO#OOO#
#...OOO............#O.#.@...O.....O#.#.O...O..O..#
#...O...OO.#..O......O..............#OOO......OOO#
#..#OO...O.#O......O..OO.O#...O....OO..O...O.O#O.#
#.#.##...#O........#.O.....#O#.O.OO..OOO..#..O...#
#.#....#...O..O#O..OOO.....#....#......O...O...#.#
#....O....O......O.O.O..........O.O..O.O......O..#
#.#OO#O.OO............O##.##O.O#.O...O#.........O#
##.O.#..........#......#OOOO.OO.#.O.O.O.....O..#.#
#O.....#OO.....O..............#...O.O..O.....OO#.#
#O.O.O..O#OO.O.O....O..O......O..O........OO.....#
##O....O...............................#.O.....O##
##..O...#...O.........O#...#O...O.OO......OO.O..O#
#O..OO.....OOOO.#......O.#OO..O.O...O.O...O.O.O#.#
#..O.....O.O........O.....O.....O#....OO##OOO..#O#
#O..##....OOO..O#.O....O.#...O.....O.O.O......O.O#
#..OO.#O.......O.OO.O#O.O.....O.....OO..OO.OOOO..#
#.#.#OO.O..O.O........O#.#...#..O.O.O.#.O..OO.O.O#
#..O#.OO.O.#.....O...O..OO#..O...O.O#...O.....#.O#
#.OO.OO....O.O..O..#OO.....#......#.#OO..#.#O.O#.#
#...O....#..#......O....O..O#O...O....OO.......O.#
#.#.....O#.......O..O..#O.OOOO..........O.O......#
#.O.O.....OO.O.O.O..#O.O.O..O.OO....O....##.....##
#O..#.OOO##....O.O..OOOO.O...O..O#..........O....#
##.O##...O.O.....O.O#...O.........#...........OOO#
#O#O.....#..O.OOO...O..OO.....OOO............#O..#
##################################################
^^<^>^^<<^v>^><^^^<v<v^>^^<><^v>v<^vv>^v<^>>v>^vv<<vv>>>>>>v^>v>^>^v<^v^<v^<^v>>^^>v<<>>^v^<v<v>v<v<v^<>>^>v^>^^^<^<v<v<<<v<^vv>^v>>v<v^>><vvv>^>v<^^vvv<>vvv<^v<>v><><^^<>v^^<^><v^><>>^^>v^<v>>^<><<^><<>v>>vvv<^^v^v^><vv>>v^^><v^<<^v>^vv<^<^<^<><>>>^><vv>>^<v^<><><^v<^<^v<^^>^<><<^<<^vv^^v<vv^^>^<^<v^v^^<v^>^v<vvv^vv<^^<^^>v>>^v>^v><v^^^v>^<^<v<^>>^><>^v<>v>^^^<^vv^^<^v<vv>><^^^v<<>>>^<^^>^<v>v>><v^v<<<v>^<vv<^<v^>^<^<v^<>^><v<>^>><<^><vv>>vv<>v^<vvv^<v><v^vv>^<<><vvv>^<><>^^v<^v<<>vv><^>><^<<v<^>^>>^^>v<^>v^>^<vv><v><<^^^^v^<>^>^v^^v<v^<v>v<><<<v>vv^v><vv^>>>v>>>>><v<vvvv<<^v>^v>^<><<<><>v<vv<v><>^vv>v<>^v^<>>v<v>>>v^>^<vv^^<v<^<^>vv^vvv^^<<>vv>^>^v>>v^^vv<^v>^^vv<>^v>^>v^^<>^^><vvvvvv<^^>^^v<>^^^<^^<>^>^v><v><<>>^<>>v>>^><^>v<v><>v^v<v><>^<<>>v>^v<vv><>^v<^>^^v>v>>^<^^^<<vvv><<v><<>vvv^v><<v^vv><^^^v^^^>v><<^^v>vv^v><v>^>^v<>>vv<<^v<v><>v><^><>>^vv><>><<vv^v<^^>><<>>v>><><vv>v^^<^<v<<^vv^<^^<v^<vv<<v<>v<>^<^<^>v^^^>>v<^^<^^^>^^>^>^>^^<><vvv>v>v<vv<^v<^>vv^<vv>v^>^<^<>v>^^>v<^>v>v>><>
^vv>>>^vv><^v^<>v>^><<v>^^<v^v<v^>^>^v>><>>^>^<<^^v^^vv>^v^<<v>^v^>v<v>v<<>^>vvv>v>^vvv>>vv^>v^^v^^v<v^v>v^^<><<<^^><<^<vv<>>>>^<>v><v>>^v<v<<vv>>v>><>v><<^v^><>v><v^^<>v>^>>^^><>v<v<^vv<^v>>^><v>^v>^>><<<^vv<>^<<^><^<<><>vv^^v<<>v>v^vvv<v^>>^>^>^<>v<>vv>^><vv>>v<v<>^^v<>><>>v<>>^^<>v^<v^v^v>vvv<><^^v^>vv<<v>^^>>>v>^>^^><<^v><v^>^^>>^^>v<<<v^><><<><>vv^>v>v^>vv><^<v^><>><<>^>vv<<<v>>v><^^<v^><v>^>v^^<^v>v^<<v^>><v^>^<<>^^vvv>vvv><<><^><>>><<>>^><v<<v><^<v<>>^><><^^vv<^>^vvv<^>>><<^>><^v<v^<vv<v><<v^^v^<><^>v>^v>v<v<<>>><v>^vv^>>><v^><^>v^<>>v>v^v^><^<vv>v^v^<^v<>^><^>>v^^>v<^^^<v^^v>v>v>^^^<^^><v<vv<^vv^<vv<<<><><^>>v<>v<^v>^^<>v^>^v<v^<vv^v>v<<<v>^<^v^^^>v^vv<>vv>^^<<><^><vv>><<^v<^>v>>^>><<^<>vv^>v><>^vv^^v>v<<>^<><^^>^^><^>>^v>vvvv>^>v><<^<v^v<^<<^^<>^><^v^<<v<>^v><^>vvv><^v<>><<^^>^<^<<v^^^<^v><<<v<<>v>^v^>^>vv^<><v^^<><><>^^<^v^^>^^^^^vv<<<v^<vv<<<v^^<v<^<<v><vv^<<<<<<^^^vv><^vv<<<>><>v>vv>^^^<^><><<><<v<><>><^vv^^<<v^<^^^>v<>^^^^<><^^^<vv><>^^<><<>><vv>>^<>v<v^v<<vv^>^^>^^>>^v>v^
^>>v<><<<vvv^^^<vv><<<vvv>v<<<<^v<>v<<^vv<^vv<^^>>v^>^v^>^<>>>v<^<<^^>>vv^^<^^^>^><vv<v<v^^v<vv^<<^v<<^v<v<v><>>>vv<>vv<>^^>vv^vvvv<v>vv<vv^^>^<v<vvvv^>v>^^<<^<<<>v>^<^<v>v>vv<<v<^vv>>^^<v<v<v<>>^>><^<v<<>^^v<>^<^v>^><><<vv<^><<^><>^>^^vv^>^<<<^>^v>^v<<<>^^<^^<<^<v><^^<>^<<<^v^<>^>vv<vvv>v><<<^vv^<^><>><><>v^^>v<^<^vv<>><^>v>^v<><>>^v^^^^v^<<><^^v>><>^v^<v^><>>^<vv>v>v^^v<^v><>>v<v^v<v<v>><^^<<^v<>v<<^<v>^>><<<^>>v<v<<^^v<v>v>^<^>^<^v^<^v>>>>>><^vv<v<v^<^v^<<><^>v>>v<vv>^<vv<<v^v>>>vvv<v<vv<<<^v<v<>^vvvvvvv>^^>>>^v<>><>^<<<>^><^^v^v<>><^>^>v><<v>>>v^>^<^<^<v^vv>><<^<>vv^^v^<>v<<<^>>v<v>vv^>><<^<^^><^^>>>v>^^^>^v<v>v<v^<v^>^<<>^^^<^v>><>>>>v^<>>^^^<>v^^v^>><<>v>>^>^vvv<v>><>^v>vv^v>><vvvvv^>^><>^>v<<^>><^^v><^<v^^>>^^>^>vv><<<^vvvvv<^<^<<vv>^<^^<>v^^>^v<^^v<>v>^>^>vv^>v>^<vvv<<^<>^<^<^^v><^<^^v^<vv>v<>>^>v^v<^v>>><^v<^<<^v<^vv^^><>^v<><^><v^v>v<>vvv^^^>^^^^^v<^^^<v^<^>^v<<v<^^v<^v^<<^>><<>>>v^v<>v^^^>^vv>v>v>>><><v^<v><vv<>v>vvvv>v>>vvv><v<v^<^<v<^vvv>^<v<>v<>^^v^<^vv^^>^^>>vv<><^vv><v<
<^^>^<^>><<>>v>vv^vv<^<<<<>^v<<>>^v<>>>^v><<<><^<^><>>><vv<v<v^<>>v^>v<><v^><^v>v^>^^v^^>v<<v<<v^^^<>v<^v^^<<<^v^^vv^v<v>v>vv^>^^v<vv^<<^>v^<^^<vvv><^>>>>^><<>^><vvv>^v^<^v>v^v><<>v^<>>v^^^<v>><<^>^>^<^vvv>><v<<>^<^><<v>^v>^^<><^^^>^><vvvv><^^><v>>v^vvv><vvv<^^v^v<v<><^<<v^>v>>^<<<<>^v<v>v^>^<^<<>><^>vvv>v>>v^><><>vv>>^vv>>vv<^<>^^^>^>v>^v><^v^>v^<v^v^^^>^v^>^>vv<vvv^<<^<>vvv<vv^<vv<<<v^^>v<<^^<^<>^^^v<v<^>><>><<<^^<>v<>vv<^<^v^v>v>v^vv^v<<v<^>^v<v^^v>^<<<<^^<<>v<<<<<>v<^<v>vv<>^<><v^^v^^<v^^<<vv<v^vv^>><><^<^^<^<>v<>^<<<<v^<<^<<vv<v<>>vv<<vv>^vv<>^^<>v><<v>><vv^^^^><<<^<^>v^vv>vvvv^>v<<v<>^^^v<<<><v<v^^><v^v>>^>>^>><v<<>vv>>>v>v^<<<v<^<<>>^^<v^vv<^^<v<v^^<>v>v^<vv<v<<>>^<^^<^^>><^^>v>v>^^>v>>>^<>^^v^v>^^<^v>^v><<<vv>v^>v^<v^><v^<^>vvv><<^>>v^^>>>^<v^v^>vvv<v<>v^>^^v^^>vvv>^v^^<v^<<v^<<<>^v^<^<vvv<<<<<v<<vv^<v>>v>>><v>^^<><>v<vv^>v>^vvv<<>>v<v<>^<>^<^<<v<<vv^<v^^<<^<^v<^<^>vv^<<vv^<^vv>v>v><^^>^><vv>vv<^<v<>^<^^v<><vvv<<>^vvv^^v<v<v<^<>^vv>>^>v>v<^^<>vv>^<<>^^^>^<^<^>v>vv^^><>^>^v>>^<>
^<^^<^>v<^<^>^^>><<<>v<^^><>>^^<^^>^v^^><^v^^<^vv><>>v<^v^>>>^<>>^>^>^<<v>>^^^<^v<>vv^v^^<^>v>^>><<>>v<><^<<v<v><<>v>>^<><v<v<>>>>v>^v^<<<>^vv<<v><^>vv>vv>><v^v^^v<<<^<<<^vv><^><><<>v><vv<><^<<v<<vv^vv<^>>v>>>><><>^<v^^>vv<^v^vv><<^>v>v<<><>^>^v<^>v>v<>v<<>^vv<vv>>v><>><<<>>^^^<^^^^<<v^<<v><v<v<v>>^>>vv>^v<^>>vv>^^v>^vv^<v<^^v>^<v<v>^v><v>v>>><<<>>>v>vv<^>^v>v<vv^^v<^<v^^v<^v><v^>v^^^<><>v<^>><^vv>^<<^<>><<<<^<vv^<v<<v^>^>^^<v^<^vvvv<<v^><><>v><<^v<<<<<^v<v><v<<^<<v<>>v<^^v<<^<>^><<v^v^><<>>v<<^v>v>>>v<>>v><><^vv<vv><^^<<v^vv<^>v>v<v^<<<<v>v^<>^^>>>><<<>^^^^v>v>>>>^v><<^^<vv>>v^<<v^^<^v^v>v<>>^^v>^><^v>^>^^vvvvv<v>>^>v<v<^<>>v><vvv>v>v^^<v>^>^<><<^^^^<<v^<v>>^<^<vv<<^^^v>v>^>><v>>><v<>vv>>>v^>^><^^v>>^>>vv<^^<>><v>vv^^v<v<>^<>>>vvv<>^>vv^<<^<^<>vv>^>v>v<^<<><<vv^<<>^v^<^^^<^^^^vv^>^^>^^>><>^<^>v>v<^>>^^^^>^^><<v><v>>vv><^<vv^<v^v^vv>^>v>^^^^v><v>^v>^v<^v^>v>^<v<^v<v><v<<v^>>^^^>v>v^^v^<v>v>^v<^<v^^^v^>^^>^>vv^^vv>vv>v^v<^<^vv^><v^vv<<^>^^<v>v>^vvvv<>^^v<><vv>><<<vv>v<^>><><^><>>^<v^<><
^><^v>v^><v^<>vvv^^v^v<v^>v<>>>v>>vv^^>v^><^^<>v^><<v<<v^<<v>>^v^<v^v^^^^^<^v<v^<^^<^>><v^^^>v>^^>><<<v>^><>v><^v><vv^>>>><<<><v>v^><<<>><<>^v^^^^<^^><><>^^vv^<^v<v>^>>^>^><>vv^>>>>v^<>vv^>>v^<>vv<v^^>>>><v><^><^>^vvvv><<^vvv^<>>v^v>><^^^><>>v^<v<v<v><v^^vv<v>>^<^^><<<>vvv^^^v>^v<>v^>v<<v^v>>v>v<>^v>vvvv<^>^^^v^^<v><>^<vv<><^^<vv<^<v<>v>>^^^><>v^>><^>vv>><^^^v>><^<<^><<>^>^<>v<v<^<<>v>vv^^^^<^>^v<>>^v>>>^v<>v<^v<<^v^v<<<v^vv^><^>><v^>v^v^v<<^^v>vv<v^^v<v^^<<<^v<^>^>v><>v>^vv>^v>><v^^>^<<^><>v>^>v>^<v><<^<>>^<v^^<<>^v<>^>v^<>^v><v<><v<vv>vvv<><<>>^<^^>^<<>^<>vv^^v^^<<>v<<><^<<v<><v<<>^^<>>><<^<v<v<>v<<^>v<v^^v<><<v>><v<^v>vv>^>>>>>vv<<><^^vv^>v^<>v<<vvvv><<>^>^<v^<>v>vv^^<^v>v<^<<v^>>>^vv>v^<>^v^<>^>><><>v>>v>^><^><^>v><<>>^^^<vv<<<v^v^<<><<^v>v>^vv^>><v>>^^<vv^v<^^vv><>v<^<^>>^v^>v<><^>>>vvv^^^^>vv>^>>>><^<>^>v^v<v<^v>>v<^<v^v<>>>>><^^vv><<>vv<>v<>>^>^^<>>vv>>><<>vvv<<>>vv>^<^^v>>v>^<<<><^v^v^>^v^><<>^v><>>^^>v>>>^<v<>^>>v<>>>^v>^v^<<<vv^>^<<<><>vv^>vvv>^^v>v<^v^v^><^v<>^v>^<>><<^v>vv^
^>v<>>^vvv>>v<v<^>^vvv>>v^><>><^v<><vv>vv^<v<^>>^^><<>><^<^>^v<>v>>v^<>>^<<^vv<^^<>^v><<>>^^<<<v>^vv^v>^>^<>v>>>^<^<^<>v<^><<^><<>>vv><<><v<><>^<v^^<^>>>v^<v>^<v>>>>^v<^^<<vv^v<v<^^<<>v><>><^<<<vv^>^v>>^vv^v<><v<vv<>^>><<v<<>>>>^<v<v^v<^v><>>v><>>^^v>>^><^^^>^^>^>^>^<vv>vvvvv<^^>>>>v>vv>v>^vv^v<^v>^>^>vv>v<>v<><<>v^v<>><<<<v<<^vv>v<<>^v^><<v^^v>>v<><<v<v>^v>^>^><^^^>v<<v<^<v<^<>>vvv<<^^<vv^v<^^v>v>^vv^<^>v>>>v>^^><^>^v>^v^^>^^<v^^><v<vv^^>v><>><v<>^<^><^^v^^vv<^>^^>^>>vv<^<vv>><v>vv<<<v<^vvv<<<><>><><<^^v><vv^v><^<^<>v^v>^v^<<<v^>v^<<<<<vv>v^<>v<^^<<^>^v<<><>><v><><<<^^>v>^^<^^<v^v<vv>><v<<>v>v<^v>^>>v>>v>v<vv<>><^v^v<^v>^vv^><^v>><v<><<^<^^^^^^>>v>v^<>v>>v<vvv><>v^>v><<<^v^<^<^<>^>>v>>>v><v>^vv>^^<>v^<v>v>v><^v<v>^>v>>^<vvv><^v>>>v>v>vv>^^^>vvv<v^<v>v^><^>^^^v<^><>^^<<^<<^^<^^>^<>^<^<^<v<v^>^v<^^<<><v>>>^v>^^^^^^^^<>v><v><^<^v><v^v^vv><^>^v^^v>v^^<>vv^<^^v<><v^>v^><v>^v>v<<<<v^<^v><>><><v<>^<v<><^<^<<><>>^<><<<v>^^<>v^>>^vvv<v^<<v>^<^^v^^v<<><^>vv>>^v<^^<v^^<>>^<v>^>^<v<<<^<^v^^vv<>>>
^>vv>^^>v^>>^<vv^>><>>^<>v><<>v>v^^^>>v>>vv^^<<<>v^^<vvvv<>v<v><<>v<vv^^>>>^<>^v<<v>^<v^vv<^vvv>^^<><^<<>^<>>v^vv<v>v^<v<^^v<<><vv<^^<^<<v<^>v<v>^<v<^^v><^<v<<v<^^<v^<^>>v^<^^<<^^<<^v<><^v^^v^v^v^^>v^><^>vv>>^><^<<v<>v>v>><>^<vv<<^^>v>^<v><vv^v>^<^>>v^<v<><<>v<<v^v>v^>v<v^^<^^>v>vv^><vv>v^vvv^<>^v<v<<^<>><<vv<><<>v^vv>vv<><v^v>^><^<><^v>>v<<^^^><^>^<>v^^v^^><^^>>v^^<>v>><<vv^^v^>>v<<v<v<<^><<vv>^^^^^<<><>^vv^<><<>v>>>^><<<v>^<><>^^v^vv>>v^vvv<>><><><v<<v>^vv^v>^<^<^v>>>><^>>v>^v><<>^^<>^v^<>vv^<^<vv^vv><>^<<>v><^<^^<v<^<v^^v<>^^>^<>^^^^<^^>v<<<<v^>v>v>>^vv>vv<v^vv>v^>v^vv>v^>vv<v^>^v<>>>vv>^>>^^^>><^^v^^<^^>vv<^v>v^vv<<vv^<<vv^^<><^<v^>^<>^vv<<v^^v>^vv>vv<v><><v<>>^<<><v<v>^<<v><>v<v<^<^vv^^<^<><<>v<>v^^<>vv>^^>^vv^v<v^v^^>>^<>v^v^>vv^^^>^>><>v><>>>v>>>v>v^v^v>v<^>^<^^>v<>>^><<v^>^^<^^<^v^v>vv<v>v<^vv<v^<<v><^<<v^v^^^vv>><>^<<v^<>v^>vv^^<vv^^^^>^>^>^>><<^>>^<v>v^>v^^^v<^^^<^>>v^v<>^<><<v<v<vvv^^<^<>v><^^v^<^>>^^v^>>^<<v<<^<<v><<>v<^^^^<<^<v<>^v^^^^^>vv^>>v<^><<<v<<^<v><><v^v<vv>v^<>v>^
^<v>^<<>^<^<<<>v^^v>v>>^^^^^^<><^^<<^^v<>^^<v^v><^>^v><v<^^^>>>><><<<^^v^<><<<><<v><^v<<^v>vvv>><^>^>^><^>^>>>v^<v><<<<<vvvv^v>^>>v^><^<vv<^>^vv>vv<^>><^^v^^vv<>^^v<>^<v>>>^^vv^^>>v^>>><<vv>v<^v^vvv>vvv>^v>^^^<><>v>v<v<>><<><^v>>>^<<^vv^^>>^<^^v^>v^<><<^>v>^v^<<><><>v^>>>v>><<^^v^vv^v<><<v^vv^>^vvvv^>^><><v^<^^^v^vv<<v>>>>v^>>^vvv^<><^v>vv<>^><><^>v>vvvv>^^><v>vvv<v>><^>^v>>^>v>^v<>>>>^^>^>v>^<vvv^^<vv<>^>^^>>><^<^^v<v<^v<^^v^>^^^^>^v>v<<v>v^vvv>><v>v^<^v^v<^v^v<^<<>^v^<>>v>v>^^<v<>vv>^v<v>><v><>^^<v><<<>v<>v>v><<<<^vv>^>>v><<v<vv<<>v<^v>v<<>><<>^><<^>>vvvv^<^v^^>>vv>><^vv<^^^>>>v^>^v>vvvv^>>v^><<^<^>^>^<v<>>v><v<><><<<^<^vv^<<<>^<<^^<<>v<>><<<>>>>^>v><vv<^>^^><><v>^><<v>v>^><vv^v<>^v<^v^v>^<^v^^><<<>v>>v^vv>^^^^v><^>><><<<v^^^<<<^<v^>^^<>vv^v^<><v>^>^<>v<^^<vv<^>>>>^>^><v<vv^^>><v><<<><^>>^v<v<^v^^vv<<v^<^<>><<>vv>><<>v^^>v>vv<^<v<^<<vv>v<^>v^v<v^<<v<v<v<^>>>^v<><<<>^v<v>^<><^v<<<v<v<<^<^^<^^>vv>>^>^>^>>v>^<^v<<<>^v^v>^<vv^v<^^^v>v<>v>v>><^<<<v>><>v^^^v^<<vv<<><^v>>><^^^v>vv>v<>v<>^^>
>^^<^v>v<<^<v><>^^>^<>v<v^v>v>v^>^<^v^<v^<v>^>^>vv^<>><<>^v>^><vv^<<^>v^v<^^^>v<>v>><v><vv>><vv>vvv<>^^^vv<^v<^v^<^<>>v<>^<vv<>><vv<^<><<<vvvv>^<^><^<<v<v^vv>vv^>><vv^<><<<vv^<>>>^vv>v<v^v<v^<<>v^^>v^^vv<>><>^vv^<vv>>v>>^^<^^v<v<<>^>^^v<>^<vv^vvv^<<^^v^><<<<^v^^v><v<>>v^^v>^^<^<^>>v^v>^<<v<<>^v<>>^vvv<<v^^^v^v>^vv>^<<<>^^^<^^<v<<<>^vv^^^<>^^v>>><v>><<v^v>^>v<v<<^v<v^v>vv<^><>^<><>^^<v>>>^<<^>^^<>vv^vv<>v<<v>^>vvv><^<^v><v^>vv<^^^>v>>vv<>><^^<v>v^^vv>^<<^<<^>v^>v^<>^<>v^v<v^vv<><>v><^><v^<<>>^<v>^<><>>v^vv^<v<>^<^>v<>>>^>>><<><>>^<vvv^>v>^^>>v><<^^v<v><>^<<><>>>><vv^^^<<v^<<v>^>><><^>>>v^vvv^^^<><>^<^v<>>v^>>vvv>^<><v<v<^>^vv<>^v>><>><>v^v>^^>vv<^<<<v<^<^>^^^v<><^<^v>vv>^<>v<<^vv^^vvv>><>>v<<v^v<>>v^^vv^>^<<<vv>^^v<<v<<^>^>v<^^<<^vv><>>^v>^^vvvv>^<^<v^<^>v^<vv<^v<<<v>^v<v^<^>v><^^^v<>>v^v^^>v^^^^^<v<^v<>^^>^v<<><<<^vv<<^v<v<<v^v>v^<vv^><<^<<>>><<><v><<><><vv<<vvv^>vv>>^^>>>>^<v>^v^^v<vv<><<>>^<<vvv>>>>^^<>>>vv><<>>><v<v>^<^<>vv>>v^>v>^>>>^>^>>>>>>^>>><^^v><<><^vvv^>^v^>^>>^v>v^v<>^><^>v
^^^<^vv>^<<^<<><^<<>v^<^^vv><^<vv<^^<^v^^><>^v>v<>^v^^vvv<v><^<>vvv<v^<>^>><^vvv<v<^><>^>><>>^>v<>>>>>v^^<^<>^>^<^<<^^<>^>^>^v^v<v<^v<<^<vv><<>v>^v>>>><v<>^>v>>^v<>><>^>^>v<^<^<^<^<<<v^<<^<^vvv<^^<v<v><>^^>><v<>^<>vvv<<><vv<^<v>><>^>vv^>^^v^^><vv>v<^^>>>v^v<><^^<v^<vv>vv<v<^v>v>v<<^<^>^^<v><<^v>>><^^<^^v<>v^><<vv^>>^v^<<>v>>v>^^>><<v>^<<<^><^^vvv^>^>v<^v<v<>^>^><<^v<>>^><>^<v<><>>vv<><>v^<>v^<^>>vv><^v^v<<<>v><v^vvv<>^<vv^v<><^v^v<<<^<>>vv^<^^>>^v^<<v>v<^vvv<>v^v>><^v>>^v^^^><<^<<v><v<v^>^<^>^vvvv<^v>^>>><vv<^vv^v>^v<<><v<^v><<^>><^^<v^>v^^^v^>vv<vv^>v^^>^v<<v>^>vv^^^v>><<>vv>>^<v^<>^<>^v>v^v<v^v><<^^^>>^vv<>>v>vvv<v<^vv^<^v^^<v^v<v^^v<^><^v<<>^^v<^>v>^>v>^<>v^<v>v<><vvv<<v^v^v>>>^vvv^v^<>>>>^v^<<>>>>v<>>^^^^><<^^^^<>^<v<v<^<v>>^<>><<^<<>>^>>vvvvvv^><^^>^^^>^>v<^^<vvv^v<<vv>^^>>v>v<><^<^^>>^>>^v><v<v^^^v<v<vvv<vv>vv^vv<v<>^v<vv^vv<^<vvv<<><>>v<<<><<v<v^>vv^<^<v^<vv^^^<v<>v>v><>^v>v<^<>>^>>v<<<>^<v^v^^v>vvv<v<^>>v^<<^^>^<>vv><>^^<vv>^v>v^>vv<^^<>^<>v<v^<vvv^<>>vvv<^><<<>^>>^^>v^v<<>^v>>
v^^v<<v>v>><v>><<>^>^>^v><^^v<^^^^^v^^<>><>>>^<<><^<<^<v<>>^<^^^<>>>>v<<>>>vvv<vvv>v^<v<>v^<><v<>v^^>>^>>^<^^v^>v<>^>vv<>>>>vv<v>v>v^v^vv>v<vv><>>vv^<>v^<>><v<<<<v<<<<^<<>v<<>vv<<>^>vv<><vv^<>v>^<vvvv<^^><><^v^>>^<^<<>v^<<^<v<^vv>><><>^^><v><><<>>v<<v^v^^^<v>^vv<>^>>v<><^>^<<>^>v^><><>^<v>v>^<v><>v<<v^^v^vv>^>^v>^>>^>^<<><<^>^><><^v^><^vvv<v<>v><>^v>^>vv<^v<v<>><^<vvvv>^^^>><<v<>^v<<><>v^^^^^^<v<v<<v^^vv<>^vvv>^<<<<>v^<<^><<^>vv<^><^v<v<^<<>v<v<v<^vv^^<v^^v<v>^>^v<vv^<v>vv^<v^>>>>><<<^^vv><^<v<<<>><^>>v^^>^^><^vvv<<^vv^^<^>^>v^vv<v<<vv><><v<v<><^>v>v><>>^>>^^^^^v<>^^>v^>^>^^<^<^<v>^vv^^vv^>v<v<<>v>vvvv<>v^>^<^^v>^>^v<v^v<<>v>v^v<v><<><^v>>>vvv^^<<>><^<vv>^>^<v^v^v><v^vvv>vvv^>v<^><vv^>v>>^<>^<vv^^<^v<><>v><^<>><<<>><<<^<vv<>>>>v>vvv^>><<v^^vv>><v>>>>^>v>>v>^>^>>><><v<<<^>^><<^<^>v^^v^>^^>^>^<>^v^>^v<v^^><>v^<<>v^v>v><vv<><^>>v>><v><<>v<v>><<>vvv>><^^v<>>v>v^>>vv>^<^>^<><v<v<><v<vv>v<v^v^<><<v<<^vv<v^><^<v>vv<^>v^v<^<<^<^v<^v><^vv<v^>v><v<<<v<>^<>^vv^>>><^^<^v<^^<^<v>v^vv<<<>^v>v<<>v>><
<>>vv^v>v<^<^^v^v^<^>>><^^<<<^<<^<^<<>v^^^^^<^>v^>vvv^>><^<<>>v^<><<v^v>><<^^<^^><<><vv>>v^v^v><v<^<^v<<>><^^><v>>v>v<^<><^^><<>^<<vv<v>^v^^v>^^<^<v>v^^v^<^v>^<><<v^^^^<><vvvv<v<<<^^v^<><v<<><v<^>>^<v<v>>^^^<v<<>^<><^^<<>v>^<v^^^><><^<><^v<v<>^^<v><^^<^><vv><^<<^^^>v<<>^><vv^>>>>>>v>^>^>><<vv^<<<>^^>>^v>^v>><^vv^v<<^^^<^v^v^>v^v<v>>^<<^vvvv>v>^^>><<<<<vv>>^v^v^><vvvvv^<^vvv<><><><<<>><^<^^^^vv<>><v>>>><vv>^v>>>>>v^<^<>vv^<^^v^^>>^<v^^<>^<^<^<><>>^><^>^<<v^v>^^>v<^^>><^<^vv^v^<<^>>>v<<vvvvv><^>><<^v<^<^<>v<^vv^^^v<^v<^^vv<v^^v>>^vv<vvvv>>>>v^^^>><>v^>><<>v>^^<v<<>^<^^<<>><>v>>v^v<^>vvvv^^^^vv><>v>^v>v^v><<>^vv^v>>^<>^^^^^v^v>^^vv>v>>>v>^<v>^^vvvv^^>^^><^vv><><>^v^>>v>v^><><^^^^<^vv>^^v>^^>^vv<v>v^^>^>^^v^<^>v^vv<>vv^<<><>^>vv^^v>vv^^<<>>^v^^<<^>^><>v>>^<<<v>v>^<v<vv<>v<<<vvv<<v^v><<vv^vv<^^><>^v>^^^>>v<^^v>>v^>v>>>^vv^>><<><<vvvv<<>><v^vv><^^^v<^>>vv>>>^^<v^<v<^^<^<>^vv>>v<v>><^^>v><><v>>^>v>v^<>vv<<^vv>>^>^vv><v^^>vvv<v>^>>vv^^<>><>v^>^v>v^v>^>>v<^v^<><v<><>^v<>>><<>^v><>v^vvv>vvvv>^<<
^^><<<^^v>^v<<^<^v<^v^v><^v<vv^><^>^v<<vv<>><^^<<^>><>vv^vvv^v<vv<<^v^^v<>>v<>v<<>vv><>vvv<><^vv^^<<^<^v<>^<^<><<v<v<><><vv>^>>^v>>^v^>><^><vv>^><^vv>>><v<>>^>vv^v^<<v><>^^<^v^<<v<<>v>>^<<v>v^v>v><v^>v><^<v^>>^<vv^>vv>v<^v^vv<>>^>>^>v^^^^^><<>vv^vv<^^>^>^<<^^^>v<>vv<^^<<v^<<v<>^<v<^v<<^^^>v>^>>><^<<>^<>^v<<>^>v^>vv^^^<>^^<><v>^><v^^>>^^v^<v^v><v>v>vv<<<^>>><v<^vv>v>>^^^>^^v^<^^>^>^>>>><^^>^<^^><v>v<<^v><v<>^^^v>^^^>^<^^>v<<^v>v<v>v>v^^>^>v>^vv>>v^<v<^^>v<<<><vvv<^>^<^^v><^^<^<v<<^>^v<<^vv>>v>vvv>^v>vvv<vv^^^vvv^^>>^<><><v<<vvv>^><<<^v^^^^v^^>v>^>v<^v<<^>^vv^<v^^>^<>>^<^<<vvv>v>^<^^<>>><>><<v^<>v<>><^vvv>v>><v>>^>v<^^>v^^vv>v^^<><^v<v^^>v^^v><^^<>^>v>>vv<v<><>>^<<^^vv>v<v<^v^<<^^^>v<^^v<v^v^>v<v^^>^<<^v<>>v<>>>>^^v>v>>^<^v>vv<^>^<<><<^<><v^>>^<<v^^v^^^<<<>^><>^<vv><v^>>v^<>^^<^<>v<v>^v<>v><<>^<^^^v><vvv>^<^<^><v^^>>>><>^><<v<>v>^^<^>^<><v><vv>v<vv<v^>>^^<<^v^<><^v<>^v<<v^v^v<><<<<<^^<^>v<v<><<>^v^>^v^v>^<^>^<v><^>v<<vv<<<<v^<^vv<>v^v>^v>>^v<>v<^vv<>>^^^<>v><><>><>v>^<vv^^^<^>>v^<v<vv<>v
vv<<>>vv<^>^^<<^>v>^v<<^^<v<><v^><<^^><vv>^>>vv<<>^v><>>>^^<<<v<<>^vv>vvv<<><<><v^^>v^<v^^>v>v>vv^>v>^v<v<<<vv>^<v><v<^>>^>>^v>><>^<^><<><>>>vv<<vv>>>v>><>vv<<>>v<vv^>v>^<vvv^^v>^vv<><vv^>^^<<<^^v<>v^^<<<><>v<^^>v<>^vv>^v>>^^^<><<^^^<<<v>>>^v^>vvv^v>v<^v<<>>^<v<<^>v^^v^<v<<><^<>^<vv^^v<>^<<v>>v><>><><<^v<<vv<<>v<^<<>>><>>vv^>^<<>^^v>^><v>^<<^v>^>v^>^vv<^v><^^v^<>v^<^>>^v<<v>^^^^^v^^>^<<v<<>v<v^^<<<><><^><^v<^<>v<^v^v>^<v^vvv>>v><^><><v<^^><^v^<<><v>^>^>^^v^<v<^<><<v<>^<>^>vvvv^v^v^v^v><><><>v^<v^v<<>^v^<v^^^v^<v^v<<v^<><<v<>>>vvv^<>^<^^vv^^<<<^v^>>>>>^^>>^>>^^>^v>vvv<<v<v^^<<<v<v^^^<>^^v>^<v^v<v^>^v<vv>^v^^<<^><vv>>v>v>^^>^<<^><>>^v^><>^^>v>^<<>^^><<v^<vvv>^v>^>>^^^<>>><<^^^<>>v^<><><>v^v>><v<^vvv><^<^<^v^>v^vvvv^v>>vv^>v<<^^^<<>>^<>vv><^><v^v<v^vvv^v^v>^v>v^<^^^v^>v^>^<>^v^v^v<<<^>^<>^>v<^>>>vv<<>>^vv<>^><v>^vvvv>v<<v>v^v<^vv<^^^v<^<>^><>>v>^><<^<>><^^<v^v>>^<v>v^^<^^vv^<<>><v<vv^^^>v<^v>>><<^^v><vv<v>^<^v^^^v<vv>>^^^^<^^^<^>v<^<>>^<^>vvv<^<v>><>v<^^>><^><^v<vvv^v^^><><<<^^v^^><^v<<>v
^vv<>v>^v>^<><vv^<>^v><vv^vv^^v^<<<v><>><><^>^^^^<<vv>v^<>^><>^v<<<v^^><v^<v^v^v^>vv<v<^>>>v^<<v>>v<v^>><>v>v^^<<<>>^v>^vvv<v^><vv^><^^^><^v>>v^vv<<>><>v<>>v<<<^<<<^<><<<<v><<v<v<><>>^v^vvvvvv^v^<<v^<^<>>v<<v^>v<>vv<><<<v>^v><><v^>>><^v^v>v<v<<<><vv>>v>>v><^v><<v>>^vv>v^v<v>^^>>>v>v^v>vvv<<<>>>v^v><<<>v>>^><<^vv<>><vvv><^>^vvv>v<<<<>^>v<^^<><v><^<^>>^vv<^v>^<v^<<>v^>^^>^^><^vv<<^<><<<v><^<<^v<vvv^>^v^>^><v^>>>^v^><<>>^^v^<<^<>>v^>vv><>^^<^>^^v^v<<>^^<v^<v^<<^<v>^v<>>><v<<^vv<><<^^^<>^^>^>v^^>^v^^<^>^^>vv>vvvv<^v>v<v^<^^v<v^^>^v<>^v<<^>>v>>^^v>^^v><vvv<>v><^^v<<<<v>vv^<><v>><<>vv^<<><^<<^^^<v<^>v>^<<<<^>v>^v^^><>^<^vv><vv>v>>^^>>^><^>^<^v^>^<v<^<^<^>>>^>v<<>><^^<<>vv><^<<<>v>^^v>v<v^^>vvv>v<>>><^^>^>^vvvv^vvvv<>v<^v^^^^v<>^^>v^^<^^<<^<>^v<^v>>v^<<^<>v^^v^^<vv><v<v^<^v<<^^v^<<<v<><^><vv^^^v>>v<>^<v^vv><>>^<><<v<<^v>^^^>><>v^<v<^^^v<v><^><^v^^>>v<<vv<<vv^<>^<>v^<>^vv>v<^^<^vv<>vv>>^vv>^v<<^>>^^>vv^><^><v^<^<^^>><v><vv^<<^<vv<v<v><^>^>v^v^vv>v<^>><^>v>v>v><>>^<<><^v<^^>v><v>>>^v><<>^v>>v>^
<v^>>^^>^><<<>v>>^><<><v<<^><>^<><>>^>>>v^vv<v<^v>^<<>^>^<vv^<^vv^>v<>>><v<v>>v<<vv^vv^>v<>v^>>v<<<<<v>>v<vv^v>v^v^<<v^^>v^>^>>vvv<>>^vv>^v^><<v<<>^^^<v<v>v<>>v^vv<v>^v^<^^v>>>v<>^v^<^vvv<><>>vv^>v<<<<>>vv<<vvv^^vvv^v^>>^v<v>>><^><^^^<vv^>>v<vv^<><<>>>v>^v^<^<vv>>v^^<v^v<<<><<vv^vvv^>v>v>>>v>^>^<vv>v<^<^^<^vv<v<>>^<>^v>vv>^<v^vv^>^>><^v^v>v<<v><<v<<>>v^^^>^^>^<>^>v>>v>><v<^<>>><v>vv><vv><>>^v^>>v^^v^><>^><>^^>>>v^<>>>v<v^>^>v^^>>>>v>v<^v>><v<>^v^><>^^<>^<<<>^<>>><v>>>v><>^v^v^<<<<v^^^^>^<<<<>v<^^^v><><>^^v^v<^^^<v<vvv<<^>^>^<^^<v<>^<<v^><v>>vvv<^v^>^v><>v^v^^<>>^v><<v<<<^v><v><<<v<v>vv^^>v<^^<><<<>>>>><<v><<^<>>^v<vvv>>vvv<<v^<^v^<>>v<<^><v^^<>>v>v<>><vv<<^v>^>^^v>><^<^<^^^v<v^vv>v^<><v<^vv><^^v<^<^<>^>^<v<^^>v>vv^v>^v<>v^^<<<^^<>^v<>^<^v^><>v<>^v>^v<v^>v^v^>><v^^v>v>^v<<^>v<<^^v<v>^v>^v<^^>>>>v><>^>vv>^v<v^v^<<>v<^v>^><vv<>v>v<^^<>v<v^^^<^<^^<v>^><v>^v^>>v^^>^v<v<>^>v<^vv^^^v<><v^vvv><>^^^>v^^>^<^^><^v^>><^^v>^^^v^>>><><v><<<>><<<<>v>^>>>^^^v<^^^><<>>>^v<><>v<^vvvv>^<><>^<<<>v^^v^^>vv
<><^>^v^>v^^^<>^^^<><>>>>vv<<v>^v><v^v^^^>v>^^><<>v>^<^v^vv^<vvvv<><>>^<v<<>^^^<v<^vv^v<^v>^v^>vv^><^><v<^^^>>^v^v^^vvvv>><<<v<<vvvv<>vvv><><^^>v^>><>^<>^^v^^v>^<v^<>>^^v<vv>^^>v^><^^v<^><>vv^<^^^>>vv^^<<<>>^^v^>v<^<^v>>>v>>><<vvvv<v<^^><>><><v^vvv>v^^v<>v>^v<<^^<v<<v<v<>vv^<<v<<^>>v^v>^<<<>>v^<>v^>vv>v^^>v<>v>v<v^^>>><>^<<^v^<v^v<^v^^v<><^<^<^vv>>^>vv^^>>^<><>^<v>>>vvv^>v^^>vv^vv<<>v><v<<^vvv><<v<v>vv><<>>>^<^v<<<>v^<<>^<>>>v<>>^<^<^v^<^v>><v>v<<v<^<>v^<<<^<>^v<^^>v>^v<^^>v^v^>>v>v<<^>v^>v^>^^<<^<vvv^v>^v<v><<<v<v<^<>^v<<^v<v<v^^<<vv^^v<>vv^>^^<v>>>><>^>^^<v^v>>><<vv<<^>v>>>^v>^>>v<^^v<>^vv<v^>v>^^>>>v^>v<<v<^^^^><^<^v><^v>^^>^v>^<>v^<vv^><v<>^<>vv>v><><v><v^<vv><^v^>^^<<<<>><<><vvv<vvv>^^<<>v^><v^<^>^^>^^vv<^^v^^>^>vv>>^<>v><<v>v>v^^<v>^vv^vv>vvv^>vv>vv^<v>>>>v<^^><^>>vv>^><<><^><<v>v>><<v>>vv^<><<^<^<>^><v<<<>v>v^v<<v<^><>v^><<v^<>^^v<>^>vv^v<v<^<<v<vv<>>>>^^^v>>>^><<<^<^<^^v<<<v^<<^<><>><>^^vvv>^vv>>^v<v^^><><^v<><vv>v>^v^><>^v<<v>v^^^><^>v^vv<<<v<>vv>v<v^<<vv>><^v<^<v<vv>^^><^^<v>
<v^v><^<^v>vvv^v<^v^^>vv^><><>vvv<v<><v>><>v<v<<>v^^^<v>>^<^^<<^v^v>^v^<<^<v^v<v^^<v^^<<^v^>>>v<^^<><^v<v>^<<v>>>>>^<<>^v^<<>><<v^^>^<^><<>v^>^>v>vv<v^^<^v<<v>^<<v^>vv^^^^vv>^>vv<v^<>>^^v<^<>>><>vv>>vvv><^v>^v^v^<^>^vv><^<^>^<v<^>><^<><<^^vv<vv^<v><v^<>>>^>v^^^v<<v<v^<<^^^>><v^^^<^^><<vv^^<>^v^<><v^><^>>v^<v<v^^>^v<^>v>^<v<>^<>v<<^vv^v><^v^v<^vv^><><^^<<v^<^v^v>>v^<<^^vv^<<>^v^^^<<<><<>>^>^>v><<>v^<<>v<^v^<v^><><<v^^><^^<>vv>^vv^^v^v>^><^vvvv^v^<v<<vv<<^<v^>>^<^^vvvv^<^<v<<v>v<^<<<v><>v>><>>^<vv>v^^><>^v>^v><<<^^^^^<<^><<v^v<v>v^>v<v^<>>v>v^^^^v><^><vvv>>^>^><>v>vv<<<v^v<^<vv^<>>>^><>v<><^<><v^<>>^^<^>^^^v^^<<>>vv>><^<<v><<<>^v<<^v^v<<>^>^vv>><>v<<vv^>^^<>v^>v>>vv<^vv<v>>>>>v<<vvv<v><>v><><^<<^<^><<<<>v<v<<vv^v>>>v><>v<>v<^vv><<>v>><v^>v>vv><^>><>>>^^^>v>^<>v<v^v<><>v^<^v<>v^^^vvv^^v^vvv>vvv^v>>^<^>^v<^>>>^<>>^v<<>v<^<<^><<v^^>>>>^<><^v^^><>><^>vv>^>vv<^v^>v^^v^>^<^<v^>>^vvv>>vv^^vv^><<v>^^<<><^>^v^v>>^<v<><^<^^^<<^>v>>^vvv>v>><^>^<^v><v<<v><^v>^<v<vvvv>v<vv<v^^><v<^>^^<<^>^^<<>>vv^^<^
<<<^<^v<^v>>v<v<<>^^>><><^>v<vvvvv>v>^^^vvv<<<v^<^^<^^v<>>^>v>^><<<<v^v><^v<v<^>v<v<^>^v>^>><<^vv>^^<>v>>><v^>>><><^vv<>v<^><^>>>v<^>>v^<^>>>^>^>v^>vv>^>^<v<vv<<<<^^><v<>vv<v^<><<v^v>^^<^vv^<^><^<^<vv>^v^<<v^<v^<v^<^v<>><<^><^>>^<v^>^<^>^>^^<^v^>><^>>><><^^>v^v>vv^^v>^><<^<<<><<<^v>><vv^>>><<<>v<>^>^v^<>^><>^>><<<>>^v^vv^v^<^<<>^^<<^^>^^v<>^vv>v>v^^v^<vv^>><v<^>^v<^^v><v<^>^<^v><<>^<^^v<^^v^<><<>^<vv<^vv^^^>^<<v<>v>vv>><^>v>v<vv<vv^^><>^v>v<<<><vv<<^<v>v^<>vv<>^<^>vv^^<^<^>>><<vv<>v^^vv><<^<>^<<<>v><v>vv^><^>><>><^^><^v>v>><>><v^<v^v>v>>v^<vv>^<<>>v>vv^>^v>v<^>><>>vvv<<vv>^>^>^<vvv^v><vvv>^^>^>^>^><>v><^<v^^^<<<<<v^^<<^<<^^>>>vv><v<><^v>>^>>v^<^<<>>v<>v>v^^v^<>><>><>^>v><^<>^><>v><<<^v<<>>^^<^^>v^>^>^><v>>v^v^>^^v>vv^v<<v^^^v<>vvv><>^^>vvv^>vvvv>^^^>^<^^>v<^<vv>vvv<<>^<<<>^<vv^v>>^v>v>v^><><^>><v<^vvv>>>^>^<^^^<vvv>><>vvvvv<v^>^v<v<>v>^>^>>v^v^vv^>^>>v>>^^v>>^^><>v<^<<>>^>><vvvv>^^><^<vv>>>v><^>v^^><<v^v<<^<>^>v^<<>^><vvv^<><^^>>^><<vvv<v<>vv>>^^<<><vv<<>>>^><<v^^^><<v>^v>v<<v>v^>v<<>v

225
2024/go/day16/day16.go Normal file
View File

@@ -0,0 +1,225 @@
package day16
import (
"adventofcode2024/utils/dijkstra"
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
_ "strings"
)
type (
Vec struct{ x, y int }
Dir struct{ x, y int }
Cell rune
Move struct {
p Vec
d Dir
}
Maze struct {
height, width int
start Vec
end Vec
grid *grid2d.Grid[Cell]
}
)
const (
WALL Cell = '#'
CORRIDOR Cell = '.'
START Cell = 'S'
END Cell = 'E'
PATH Cell = '*'
)
var (
NORTH = Dir{0, -1}
EAST = Dir{1, 0}
SOUTH = Dir{0, 1}
WEST = Dir{-1, 0}
DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST}
)
func Part1(input string) int {
maze := Maze{}.Parse(input)
fmt.Println(maze)
data := inputGraph(*maze)
graph := dijkstra.CreateGraph(data)
data.From.Label = "EAST"
path, dist := dijkstra.GetShortestPath(data.From, data.To, graph)
for _, p := range path {
maze.grid.Set(p.X, p.Y, PATH)
}
fmt.Println(maze)
return dist
}
func Part2(input string) int {
maze := Maze{}.Parse(input)
fmt.Println(maze)
data := inputGraph(*maze)
graph := dijkstra.CreateGraph(data)
data.From.Label = "START"
data.To.Label = "NORTH"
paths, _ := dijkstra.GetAllShortestPaths(data.From, data.To, graph)
bestPaths := make(map[Vec]struct{})
for _, path := range paths {
for _, node := range path {
bestPaths[Vec{x: node.X, y: node.Y}] = struct{}{}
}
}
return len(bestPaths)
}
func inputGraph(maze Maze) dijkstra.InputGraph {
data := dijkstra.InputGraph{}
data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}
data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}
for y := 0; y < maze.height; y++ {
for x := 0; x < maze.width; x++ {
if maze.grid.Get(x, y) == WALL {
continue
}
for _, dir := range DIRECTIONS {
nx, ny := x+dir.x, y+dir.y
if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height {
continue
}
if maze.grid.Get(nx, ny) == WALL {
continue
}
for _, d := range getAllowedDirections(dir) {
ss := dirToString(dir)
ds := dirToString(d)
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: x, Y: y, Label: ss},
Destination: dijkstra.Point{X: nx, Y: ny, Label: ds},
Weight: func() int {
if dir == d {
return 1
} else {
return 1001
}
}(),
})
}
}
}
}
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"},
Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(EAST)},
Weight: 0,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"},
Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(WEST)},
Weight: 0,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"},
Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(NORTH)},
Weight: 0,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"},
Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(SOUTH)},
Weight: 0,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"},
Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(EAST)},
Weight: 0,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"},
Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(WEST)},
Weight: 2000,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"},
Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(NORTH)},
Weight: 1000,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"},
Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(SOUTH)},
Weight: 1000,
})
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "EAST"},
Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "NORTH"},
Weight: 1000,
})
return data
}
func dirToString(dir Dir) string {
switch dir {
case NORTH:
return "NORTH"
case EAST:
return "EAST"
case SOUTH:
return "SOUTH"
case WEST:
return "WEST"
default:
return "UNKNOWN"
}
}
func getAllowedDirections(direction Dir) []Dir {
switch direction {
case NORTH:
return []Dir{NORTH, EAST, WEST}
case SOUTH:
return []Dir{SOUTH, EAST, WEST}
case WEST:
return []Dir{WEST, NORTH, SOUTH}
case EAST:
return []Dir{EAST, NORTH, SOUTH}
}
return []Dir{}
}
func (m Maze) Parse(input string) *Maze {
m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) })
m.height, m.width = m.grid.SizeY(), m.grid.SizeX()
for y := 0; y < m.height; y++ {
for x := 0; x < m.width; x++ {
c := m.grid.Get(x, y)
switch c {
case WALL, CORRIDOR:
m.grid.Set(x, y, c)
case START:
m.grid.Set(x, y, CORRIDOR)
m.start = Vec{x, y}
case END:
m.grid.Set(x, y, CORRIDOR)
m.end = Vec{x, y}
}
}
}
return &m
}
func (m *Maze) String() string {
s := ""
for y := 0; y < m.height; y++ {
for x := 0; x < m.width; x++ {
if y == m.start.y && x == m.start.x {
s += string(START)
} else if y == m.end.y && x == m.end.x {
s += string(END)
} else {
s += string(m.grid.Get(x, y))
}
}
s += "\n"
}
return s
}

View File

@@ -0,0 +1,47 @@
package day16
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############`)
require.Equal(t, 7036, r)
}
func TestPart2(t *testing.T) {
r := Part2(`#################
#...#...#...#..E#
#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#
#.#.#.#.###.#.#.#
#...#.#.#.....#.#
#.#.#.#.#.#####.#
#.#...#.#.#.....#
#.#.#####.#.###.#
#.#.#.......#...#
#.#.###.#####.###
#.#.#...#.....#.#
#.#.#.#####.###.#
#.#.#.........#.#
#.#.#.#########.#
#S#.............#
#################`)
require.Equal(t, 64, r)
}

141
2024/go/day16/input.txt Normal file
View File

@@ -0,0 +1,141 @@
#############################################################################################################################################
#.....#.....#...#.................#...#.......#.........#...#.......#...#.......#.......#...#...#.....#...#.......................#...#....E#
#.###.#.#.#.###.#.###.###.#######.#.#.#.#.###.#.###.###.#.#.#.###.#.###.#.#.#####.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#######.#.#.#.###.#
#...#.#.#.#...#.....#...#.#.....#...#...#.#...#.#...#...#.#.#...#.#...#.#.#...#...#...#.....#.#.#.#.#...#...#.....#.#.#.....#.....#.#.#...#.#
#.#.###.#.###.#.#####.#.#.###.###########.#.#####.###.###.###.###.###.#.#.#.#.#.###.#######.#.#.#.#.#########.#####.#.#.#####.#####.#.###.#.#
#.#.....#.#.#.#...#...#.#...#.....#.....#.#.....#.#.#.#.........................#.#.......#.#.#...#.....#...#.#...#.....#...#.#...#.#.....#.#
#.#######.#.#.#.###.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.###.###.###.#.###.#.#.#.#.#######.###.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.#.#######.#
#...#...#.#...#.#...#.#...#.#.#.#...#.#.......#...#...#...#...#.#.....#...#.#...#.......#...#...#.....#...#.#.....#...#...#...#.#.........#.#
###.#.###.#.#####.###.###.#.###.#.#####.###.#.#####.###.#.###.#.###.###.###.#####.#########.#.#.###.#.###.#.#####.#.###.#######.###########.#
#...#...#.#.#.....#...#...#.#...#.#...#.#...#.#...#...#.#.....#...#...#.#...........#.........#.#...#.#...#.........#.#.#.......#...........#
#.#####.#.#.#.#######.#.###.#.###.#.#.#.#.###.#.#####.#########.#.#.###.#.#####.###.#.#####.#.#.#.###.###.###.#####.#.#.#.#######.#########.#
#.#.....#.#...#.......#...#.#.#.....#.#...#.#.#...............................#...#.#...#...#...#.#.#.....#.#.....#...#.#.#.....#.......#...#
#.#.###.#.#####.#.###.###.#.#.#.#.###.#.###.#.###############.#.#.#.#.#####.#.#####.###.#####.#.#.#.#####.#.#####.###.#.#.#.###.#######.###.#
#.#...#.#.....#.#.....#...#...#.#...#.#.....#.#.....#.................................#...#...#...#...#...................#...#...#...#...#.#
#.###.#.#####.###.#.#.#.#####.#.#.#.#.#######.#.###.#.#######.###.#.#.#.#.###.#.#########.#.#.#.#.#.###.#.#####.#.###.#.#.###.#.#.###.###.#.#
#.#...............#.#...#...#.#...#.........#.....#.#.#.......#...#.#.#.#.#...#.#.....#...#.#.....#.....#.....#.#.....#.#.#...#.#...#...#...#
#.#.#####.#.#####.#.#####.#.#.###.#########.#.#####.#.#.#######.###.#.###.#.###.#.###.#.#.#.#.#########.#.###.#########.#.#####.###.###.###.#
#.#.#.....#.....#.#.#.....#.....#.....#...#.#.#.....#.#.#.......#.#.#.....#.#...#.#...#.#.#.#.........#...#.#.........#.#.........#...#...#.#
#.#.#.#####.#####.#.###.#######.#####.###.#.###.#####.#.#####.###.#.#######.#.#.#.#.#.#.###.#.#######.#.###.###.#.###.#.#########.###.#.#.#.#
#.#.......#...#...#...#...#...#.....#...#.#.#...#.#.....#.....#.....#...#...#.#...#.#.#.....#.#.......#.#.......#...#.#.....#.......#.#.....#
#.#######.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.###.#######.#.#.#########.#.###.###.#.#######.#.#####.###.#.#####.#.###.###.#.#.#.#
#.....#...#...#...#.#.#.#...#.#.........#.#...#...#...#...#.#.#.......#...#.......#.#.#.......#.........#.........#.#...#.#.#...#.....#.#.#.#
#####.###.#.#.###.#.#.###.###.#.#########.#####.#####.#.#.#.#.#.#############.###.#.#.###########.#######.#######.#.#.#.#.#.###.#######.#.#.#
#...#...#.#.#.#...#.......#.#.#.#.......#.......#.....#.#.#...#.............#.#...#.#...#.......#.........#...#...#...#...#...#...#.....#.#.#
#.#.###.#.#.#.#.###########.#.#.###.###.#.#.#####.#####.#.#####.#.#########.#.#.###.###.#.###.#.###########.###.#####.###.#.#####.#.#####.#.#
#.#.#.#.#.#.#.#.....#.....#...#...#.#.....#.#.....#.#...#.....#.#.#.......#.#.#...#.#.....#...#.#.....#.....#...#.......#.#.................#
#.#.#.#.###.#.#####.#.###.#.#####.#.#######.#.#####.#.#####.#.#.#.#####.###.#.###.#.#########.#.#.###.#.###.#.###.#####.#.###.###.###.#.###.#
#.....#.#...#.....#...#...#...#...#.#.....#.#...#.#...#.....#...#.#.....#...#.#...#...#.......#...#...#...#.#.#...#.....#.#.#.........#...#.#
#.#####.#.#######.#####.#####.#.###.#.###.#####.#.#.#####.#.#####.#.#####.###.#.#####.#.###.#######.#######.#.###.#.#####.#.###############.#
#.#.....#...#...#...#...#.....#.#...#.#.#.......#.#.......#.....#.#.....#.#...#.......#.#...#.......#.....#.#.....#.....#.......#.........#.#
#.#.#######.#.#.###.#.#######.#.#.###.#.#########.#############.#.#.###.#.#.###.#########.#.#.#########.#.#.#####.#####.#####.###.#######.#.#
#...#.....#...#...#.#.......#...#...#...#.........#.......#...#...#...#.#.#...#.#...#...#.#.#.#.....#...#.#.....#.....#.....#.#...#.....#...#
#.###.#.#.#.#####.#########.###.###.###.###.###.#.#.###.#.#.#.#########.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#######.#####.#.#.###.#.#####.#
#.#.....#.#.#...#...#.......#.............#.#.#.#.#.#...#...#.#.........#.#.#.....#.#.#.#.#.....#.....#.#.#.#...........#...#.#...#.#.#...#.#
#.#.#.###.###.#.###.#.#########.#####.###.#.#.#.#.#.#.#########.#.#####.#.#########.#.#.#.#.#######.###.#.###########.###.###.###.#.###.#.#.#
#...#...#.....#.....#.#.........#.....#...#.....#.#.#.#.....#...#.#...#.#.#.......#...#.#...#.#...#...#...#.............#.#...#...#.....#.#.#
#####.#.#######.#####.#.#.#############.#####.#.###.#.#.###.#.###.#.#.###.#.#####.#####.#.###.#.#.#.#.#.###.###########.#.###.#.###.#####.#.#
#.#...#.......#.#.....#.#.#...#.............#.#.#...#.....#.....#...#...#.#...#.#...#...#.#...#.#.#.#.#...#.#...#.....#.#.#.....#...#...#...#
#.#.#.###.#####.#.#####.###.#.#.###########.###.#.#############.#######.#.###.#.###.#.###.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.###.#.#####
#...#...#...#...#.#.#.......#.#.#.......#.....#.....#.........#.........#...#.#.....#...#...#...#.#.#.#.....#.#.#.........#.#.#...#...#.#...#
#.###.#.###.#.###.#.#.#######.#.#.#####.#####.#.#####.#######.#.#####.#.###.#.#.#######.###.#.###.#.###.###.#.#.#.#########.#.#.#####.#.#.#.#
#.......#...#...#.#.........#...#...#.#.....#.#...#...#.#.....#.#.....#...#...#...#...#.....#...#.#.....#.....#.#.#.........#.#.......#.#.#.#
#.###.#.#.###.#.#.###.#########.###.#.#####.#.#####.###.#.#######.#######.#######.#.#.#.###.###.#.#.#####.#####.#.#.#########.#########.#.###
#.#.....#.....#.#...#.#.......#.#...#.....#.#.......#.....#.......#...#.....#...#...#.#.#...#...#.#.#.....#...#.#.#.#.........#.....#...#...#
#.#.#.#######.#.#.#.###.#.###.###.###.#####.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.#.#.###.#.#####.###.###.#.###.#.#
#.#.#.....#...#.#.#.#...#...#.#...#.....#...#.........#.........#.#.#.#.#.....#.....#.#...#...#.#...........#.#...#.#.#...#.......#.#...#.#.#
#.#.#.###.#.#.#.#.#.#.#####.#.#.#######.#.###.#########.#.###.#####.#.###.#####.#####.#.###.###.#######.#########.#.###.#.#####.#.#.###.###.#
#.#.#.....#.#.#.#.#.#.......#.#.#...#...#.#.#...#.#.....#.#...#.........#...#...#...#.#.#...#...#.....#.#.....#...#.....#.#.....#.#.........#
#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#####.#####.###.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#.#.#####.#.#.###.#.#########.#
#.#.......#.#.#...#.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#...#...#...#...#.#.....#.#.#.#.#...#.#.#...#...#.#.#.#.........#...#.#.....#...#.#
#.#######.#.#.###.#.#.#.#.###.#####.#.#.###.#.#####.#.#.#.#.#.###.###.###.#.#######.#.#.#.#.#####.#.###.###.#.#.#####.#.#####.#.#######.#.#.#
#.#.......#.#...#.#.#...#...#.#.......#.#...#.....#.#.#...#.#...#.....#.#.#.......#...#.....#.....#...#.#.....#.....#.#.#.....#.........#.#.#
#.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#####.#.#.###.#.###.#.###.#.#.#######.###########.#######.#.#.#########.###.#.###############.#.#
#.#...#...#.#...#.#...#.#...#...#.#.....#.#.#.....#.#.#...#...#.........#...................#.#.....#.#.#.........#...#...#.......#.......#.#
#.###.#.#.#.#####.###.###.#.#####.#.#####.#.#.#####.#.#.#####.#########.###################.#.#.#####.#.###.###.#.###.#####.#######.#######.#
#...#...#...#.....#.......#.....#.#.#.....#...#.........#...#...#.....#...#...........#.#.....#.......#...#.....#.......#...#.....#.#.....#.#
###.###.#.###.#####.###########.#.#.#.###########.#.#####.#.###.#.###.###.#.#########.#.#.#######.#####.#.###########.#.#.#.#.###.#.###.###.#
#...#...#...........#.#.....#.....#.#.#.......#...#.#.....#.....#.#.#.#...#.#.#.....#.#.....#...#.....#.#.................#.#.#.#.#...#.....#
#.#.#.#####.###.#####.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.#####.#.#.#.###.#.#####.#.#####.#####.#########.#####.#.#.#.#.#.###.###
#.#.#.#...#.#.......#.....#.....#.#.#.#...#.#.#.......#.....#...#.#.#...#.......#.....#...#...#.#...#.....#.........#...#...#.#...#.#...#...#
#.###.#.#.###.###.#.###########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#########.#######.###.###.#####.#########.###.#.###.#.#######.#####
#.#...#.#.....#...#.#.........#...#.#...#...#.#.....#...#...#...#.#.#...#.........#.........#.#.#...#...#...#.....#...#.#...#.#...#...#.....#
#.#.###.#.#####.#.#.#.#######.#.###.#####.###.#.###.#.###.#######.#.#.###.#######.###########.#.#.###.#.###.#.#####.###.#####.###.#.#.#.###.#
#...#...#.....#.#...#.#.....#.#.#...#.....#...#.....#...#.........#.#.#.........#.......#...#...#.....#...#.#...........#...#...#...#.......#
#####.###.#.###.#####.#.#.###.###.###.#####.#######.###.###.#######.#.#########.#.#.###.###.#.#########.###.#########.###.#.###.#######.###.#
#.....#...#.....#.....#.#.......................#...#...#.........#.#.......#...#.#...#...#.#.......#...#...#.........#...#...#.......#.....#
#.#####.#.#######.#################.#########.#.#.###.###.#####.#.#.#######.#####.###.###.#.#.#.###.#.#.#.###.###.#####.#####.#######.#.#####
#.#.#...#...#.................#.#...#.........#.......#.#.#.#...#...#...#...#...#.......#.#.#.#...#...#.#.....#...#...#...#.........#.......#
#.#.#.#.#.###.###.###########.#.#.###.#################.#.#.#.#####.#.#.#.###.#.#########.#.#.###.#####.#######.###.#.###.#########.###.###.#
#.#.#...#.........#.....#.....#.#.#.....#...#.............#.#.#.....#.#.......#.........#.#.#...#.........#.......#.#...#...#.....#.#.....#.#
#.#.###.#.#######.#####.#.#####.#.#.###.#.#.###.###.###.#.#.#.#######.#################.#.#.###.#.#.#####.#.#######.###.###.#.###.#.#.###.#.#
#.#...#.#.....#.........#.#.....#.#.#...#.#...#...#...#.#.....#.......#.........#.......#.#...#.#.#.....#.#.#...#...#...#...#...#.#...#.#.#.#
#.#.###.#.###.###########.#.###.#.###.###.###.#######.###.#.#.#.###############.#.#######.#.#.#.###.###.#.#.#.#.#.###.#.#.#####.#.#####.#.#.#
#.#.....#.#...............#.#...#...#...#...#.#.....#.......#...........#.....#.#.#.......#.#.#.....#.#.#.#...#.#.#.......#.....#.......#...#
#.#.###.#.#.#################.###.#.#.#.###.#.#.###.#######.###########.#.###.#.#.#.###.#.###.###.#.#.#.###.#####.#.###########.#.#####.###.#
#.#...#...#.#...#...#.........#...#.#.#...#.#...#.#.#.....#.#.....#...#.#...#...#...#.#...#...#...#...#.....#.....#.....#.......#.....#...#.#
#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.#.#####.#.#.###.###.###.#.#.#.###.#########.#####.#.#.#####.###.#.#.#######.###.#####.#####.###.#.#
#.#...#.......#.#.#...#...#.#...#...#.....#...#...#...#.#.....#.#...#.#...#.#.#.......#.......#.....#.......#.#.#.....#...#...#.#.....#...#.#
#.#.###.###.###.#.###.#.###.#.#######.#.#####.#.#.#####.#######.#####.###.#.#.#.###.#.#.#####.#####.#########.#.#.#####.###.#.#.###.###.#.#.#
#.#.#.....#.....#.#.....#.#.#.........#.......#.#.........#.............#.#.#.....#.#.#.#.....#.....#.......#.#...#...#.#...#.#...#...#.#.#.#
#.#.#.#.#.#.#####.#######.#.#####.#####.#.#########.###.#.#.#####.#####.#.#.#######.#.###.###.#.#.###.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.#.#
#.#...#.#...#...............#...#.#...#.#.#.......#...#.#.#...#.......#.#.#.#.......#.#...#.#.#.#.......#...#.......#.......#...#.#.#...#.#.#
#.#####.#.#.###.#######.#####.#.#.#.#.###.#.#####.#####.#.#.#.#.#.###.#.#.#.#.#######.#.###.#.#.#######.#.###.###########.#####.#.#.#######.#
#.....#...#...#.#...#...#.....#...#.#.#...#.#...........#.#...#.#...#.#.#.#.#...#...#...#.#...#.........#.#.....#...#.............#.#.......#
#.#.#.#.###.#.###.#.#.###.#.#######.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#.#.#.#.#####.#.#########.###.#.#####.#.#.#########.###.#.#######
#.#.#.......#.#...#.#.....#.......#.#...#...#.#.#.......#...#.#.#...#...#.#...#...#.#.........#.......#...#...#...#.#.#...#.....#...#...#...#
#.#.###.#####.#.###.#.#########.###.#######.#.###.#####.###.###.#.###.#######.#####.#.#######.###.#.###.#####.#.###.#.#.###.###.#.#.###.###.#
#...#...........#.#.#...........#...#.......#.........#.....#...#...#.#.....#.....#.......#...#...#.#...#.....#.#.....#...#...#.#.#...#.....#
#.###.#.###.#.#.#.#.###########.#.###.#.#################.###.#####.#.#.###.#####.#.#####.#.###.###.#.#####.###.#######.#.###.#.#.###.#####.#
#.....#.....#.....#.......#.....#...#.#...#.............#...#.....#.#.#...#.....#.#.....#.#.....#...#.#...#...#.....#...#.....#.#.#.#.....#.#
#.#######.###########.###.#.#######.#.###.#.###.#.#####.#########.#.#.###.###.#.#.###.###.#######.###.#.#.#.#######.#.#########.#.#.###.#.#.#
#.#.....#.......#...#...#.#...#.........#...#.#...#...#...........#.....#...#.....#...#...#.........#...#.#.#.......#.#.#.....#...#...#.#.#.#
#.#.###.#########.#.###.#.###.#.#######.#####.#.###.#########.#.#.#########.#######.###.###.#######.#####.###.#######.#.#.###.#.###.#.#.###.#
#.#.#.#...........#.#...#.#...#...#...#...........#.....#...#.#.#...#.....#.....#.....#.#.....#...#.#...#.....#.....#.#.....#.......#.#.#...#
#.#.#.#############.#####.#.#####.#.###.#.#########.###.#.#.#.#####.#.#.#####.#.#######.###.###.#.#.#.#.#######.###.#.#############.###.#.###
#.#.#...#...#.......#.....#.#.#...#.#...#.......#.....#.#.#.#.....#...#.....#...#.....#.....#...#.#...#...#.....#...#.............#...#...#.#
###.#.###.#.#.#######.#####.#.#.#.#.#.#####.###.#.###.#.#.#.#.#.#########.#.#.###.###.###.#.#.###.#.#####.###.###.###############.###.#####.#
#...#...#.#.#...#...#.........#.#.........#...#...#...#.#.#.#.#.............#.....#.#...#.#...#...#.#...#.....#...#.......#.....#...#.......#
#.###.#.#.#.#.#.#.#.###.#####.#.#########.#.#.#####.#.#.#.#.#######.###.#.#########.###.#.#####.#.###.#.#######.###.#####.#.#.#.###.#.#####.#
#.................#...#.....#.#.....#.#...#.#.....#.#.#.#.#.........#...#.....#.......#.#.#.....#.#...#.#.........#.....#.#...#.#.#...#...#.#
#.#.#.#.#####.#.#.###.#####.#######.#.#.###.#####.#.#.#.#.#########.#######.#.#.#####.#.#.#.#####.#.###.#.#.#####.#####.###.#.#.#.#####.###.#
#...........#...#.#.........#...#...#.#...#.....#...#.#.#...#.....#.#.....#.#...#.#...#.#.#.#.....#.#.#.#.#.#...............#.#.......#.....#
#.###.#.###.#.###.#########.#.#.#.###.###.#####.#####.#.###.#####.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###########.###.#########.#####
#.#.........#.....#.........#.#.#.#.#.....#...#...#.#.....#.....#...#.#...#.#.....#...#.#.#.#.#.....#.#...#.#.#...#.......#.#...#.......#...#
#.###.#.#.###.###.#.#####.###.#.#.#.#.#####.#.#.#.#.#####.#####.#.###.#.###.#.###.###.#.###.#.#.#####.###.#.#.#.###.#######.###.#.#########.#
#.......#...#.......#...#.#...#.#.#...#.....#.#.#.#.....#.#...#.#...#.#.#...#...#...#.#...#.#.#.#.......#.#.....#...#.....#...#...#.#.......#
#####.#.###.#.#####.#.###.#.###.#.###.###.###.###.#.###.#.#.#.#.###.#.#.###.###.#####.###.#.#.#.#.#.###.#.#######.#####.#.###.#####.#.###.#.#
#.......#.....#.....#...#.#.#...#...#.....#.#.#...#...#.#.#.#.#.#...#.#.......#.#.....#...#.#.#.#.#...#.#...#.....#.....#...#...#.......#...#
#.#####.#######.#####.#.#.#.#.#####.#######.#.#.#####.#.#.###.#.#####.#.#.###.#.#.#####.###.###.###.#.#.###.#.#####.#######.#.###.#########.#
#.#.....#.......#.....#.#.#.#.......#...........#...#.#.#.....#.....#...#.....#.#.....#.#.#...#.....#.....#.........#.....#.#.....#.....#...#
#.#.###.#.#######.#.###.#.#.#########.###########.#.#.#.#####.#####.###.#######.#.#####.#.#.#.#######.#####.###.#.###.#.###.#.#.###.###.#.#.#
#.#.#.....#.....#.#...#.#.#.....#...#...#...#.#...#.#.#.....#.#.......#.....#.....#...#.#.#.#.........#.....#.#.#...#.#.....#...#...#.#...#.#
#.#.#.#.###.#####.#.#.#.#.#####.#.#.#####.#.#.#.###.#.###.###.#.###.#.#####.#######.#.#.#.#.###.#####.#.###.#.#.#.#.#.###.#.###.#.###.#####.#
#.#.#.#.....#...#...#.#.#.....#...#.......#.#.#.#.#.#.#.#.....#.#.......#.#.#.....#.#.....#.#.......#.#.#...#.#.#...#...#.#...#...#.......#.#
#.#.#.#.#####.#.#.#.#.#.###.###.###########.#.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.###.#.#.#.#####.###.#.###.#####.#.#
#...#.#.......#.#...#.#.....#...#.........#.#.#...#.#.......#.#.#.#...#...#...#...#...#...#.#.....#...#.#.....#.#.#.....#...#...#.#.#.......#
#.###.#.#######.#####.###.#.#.#.#.#####.###.#.###.#.#######.#.#.###.#.###.#####.#.###.#.#.#.###.#.###.#.#####.#.#.#####.#.#.###.#.#.#.#.###.#
#.#...#.#...#...#...#...#.#...#.#.....#.....#.....#.......#...#.....#.#.#.#.....#...#.#.#...#...#.#.......#...#.#.....#.#.........#.#.#.....#
#.#.###.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#####.#.#####.#.#######.#.#.#.#########.#.#####.#.#.#.#####.#.#.#.#####.#.###.#.#.###.#.#####.#
#.#.#...#.#.#.#.#.#.....#...#...#...#.#.......#...#.#.#.....#...#...#.#...#.....#...#.#.......#.#.........#.#.#.......#...#.#...#...#.......#
#.#.#.###.#.#.#.#.#######.###.#.#####.#########.#.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.#########.#.#######.#.#.#####.#.#########.#
#...#.....#.#.#.#...#...#...#.#.....#.........#.#...#.#.#.....#.....#.#.........#.#...#.#.#.....#.#...#.....#.......#.#.#...#...#.#.....#...#
###########.#.#.###.#.#.###.#.###.###########.#.###.#.#.#.#######.###.#.#######.#.#####.#.#.###.#.#.###.###.#######.#.#.###.#.#.#.#.#.#.#.#.#
#.#.......#.#.#...#.#.#...#.#.....#.......#.#.#.......#.#.........#...#.........#.....#...#.#.....#.#.....#.......#.#.#...#.#.#...#.#.#.#.#.#
#.#.#####.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.#.#.###.#.###.###.#.#.#.#######.#####.#.#.###.###.###.#.#####.#####.#.#.###.#.#.#.#####.#.#.#.#
#.......#.#.#...#.#.#.#.#.#...#.....#...#...#.#.#.#...#...#...#...#.#.#.....#.#.........#.#...........#...#...#.#...#.#...#.#.......#.#...#.#
#########.#.###.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#######.#.#.#####.#.#.#.###.#.#####.###.#####.#######.#.###.#.#####.#.###.#######.#.#####.#
#.......#...#...#.#.#.#.#.#.#.........#...#...#.#.#...#...#.#.....#.#.#.#...#...#...#.#...#...#.......#.#.#.........#.#...#...#.#...........#
#.#####.#####.###.#.#.#.###.#########.###.#.#####.#.#.#.#########.#.#.#.###.#####.#.#.#.#.#.#.#.#####.#.#.###########.#######.#.#.###.#.#####
#...#.........#...#.#.#...#.#.......#...#...#.....#.#...#.........#.#.#...#.#.....#.#.#.#.#.#.......#.#.#.........#...#.....#.#.............#
#.#.###########.###.###.#.#.#######.#.#.#####.#####.#####.#######.#.#.#.#.#.#.###.#.#.#.#.#.#######.#.#.#########.#.###.###.#.#.#.#####.###.#
#.#.#.......#.............#.....#...#.....#.......#.#.....#...#...#.#.#...........#.#.#.#.#.#...#...#...#.#.......#.#...#.......#.........#.#
###.#.#####.###.#.###.###.###.#.#.###.#.###.#####.#.#.###.#.#.#.###.#.#.#######.###.#.###.#.###.#.#######.#.#######.#.#.#######.#######.#.#.#
#...#.....#...#.....#.#...#...#.#.....#...#...#...#.#.#...#.#.#...#.#.#...#.#...#...#...#.#.....#.....#.......................#...#.....#.#.#
#.#######.###.#.###.#.#.#.#.#.#.#.###.#.#.###.#.###.#.#.###.#.###.#.#.###.#.#.#########.#.###.#####.#.###.#.#.###.#.#########.#.#.#.###.#.#.#
#.......#.#.#...#...#...#...........................#.#.#...#.#...#.#...#...#.....#...#.#.....#.....#...#.#.#...................#.#.#...#...#
#.#.###.#.#.###.#.#.#########.#.###.#.#.###.#.#########.#.#.###.###.#######.#####.#.#.#.#.#####.#######.#.#.###.#.#########.#.#.###.#.#.###.#
#.#.#.#...#...#.#.#.......................#.#.#.........#.#.#...#.#.#.....#.#...#...#...#...#...#.......#.#.....#...#.......#.#.#...#.....#.#
#.#.#.#####.#.#.###.###########.#########.#.#.#####.#####.#.#.###.#.#.#.###.#.#.#############.###.#######.#########.#.#######.#.#.#####.#.#.#
#S..........#.#...........................#.........#.....#.......#...#.......#...............#...................#...........#.........#...#
#############################################################################################################################################

91
2024/go/day17/day17.go Normal file
View File

@@ -0,0 +1,91 @@
package day17
import (
"encoding/json"
"fmt"
"regexp"
"strings"
"golang.org/x/exp/slices"
"adventofcode2024/utils"
)
type Opcode int
const (
adv Opcode = 0
bxl Opcode = 1
bst Opcode = 2
jnx Opcode = 3
bxc Opcode = 4
out Opcode = 5
bdv Opcode = 6
cdv Opcode = 7
)
func Part1(input string) string {
m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1)
a := utils.MustAtoi(m[0])
b := utils.MustAtoi(m[1])
c := utils.MustAtoi(m[2])
var pgm []int
json.Unmarshal([]byte("["+m[3]+"]"), &pgm)
fmt.Printf("%d %d %d %v\n", a, b, c, pgm)
out := fmt.Sprint(run(a, b, c, pgm))
out = fmt.Sprint(strings.Trim(strings.ReplaceAll(out, " ", ","), "[]"))
return out
}
func Part2(input string) int {
m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1)
b := utils.MustAtoi(m[1])
c := utils.MustAtoi(m[2])
var pgm []int
json.Unmarshal([]byte("["+m[3]+"]"), &pgm)
fmt.Printf("%d %d %v\n", b, c, pgm)
a := 0
for n := len(pgm) - 1; n >= 0; n-- {
a <<= 3
for !slices.Equal(run(a, b, c, pgm), pgm[n:]) {
a++
}
}
return a
}
func run(a, b, c int, pgm []int) (output []int) {
for ip := 0; ip < len(pgm); ip += 2 {
operand := pgm[ip+1]
combo := []int{0, 1, 2, 3, a, b, c}[operand]
switch pgm[ip] {
case int(adv):
a >>= combo
case int(bxl):
b ^= operand
case int(bst):
b = combo % 8
case int(jnx):
if a != 0 {
ip = operand - 2
}
case int(bxc):
b ^= c
case int(out):
output = append(output, combo%8)
case int(bdv):
b = a >> combo
case int(cdv):
c = a >> combo
}
}
return output
}

View File

@@ -0,0 +1,25 @@
package day17
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0`)
require.Equal(t, "4,6,3,5,6,3,5,2,1,0", r)
}
func TestPart2(t *testing.T) {
r := Part2(`Register A: 2024
Register B: 0
Register C: 0
Program: 0,3,5,4,3,0`)
require.Equal(t, 117440, r)
}

5
2024/go/day17/input.txt Normal file
View File

@@ -0,0 +1,5 @@
Register A: 61156655
Register B: 0
Register C: 0
Program: 2,4,1,5,7,5,4,3,1,6,0,3,5,5,3,0

126
2024/go/day18/day18.go Normal file
View File

@@ -0,0 +1,126 @@
package day18
import (
"adventofcode2024/utils"
"adventofcode2024/utils/dijkstra"
"adventofcode2024/utils/grid2d"
"fmt"
"strings"
)
type (
Vec struct{ x, y int }
Dir struct{ x, y int }
Cell rune
Move struct {
p Vec
d Dir
}
Maze struct {
height, width int
start Vec
end Vec
grid *grid2d.Grid[Cell]
}
)
const (
WALL Cell = '#'
CORRIDOR Cell = '.'
START Cell = 'S'
END Cell = 'E'
PATH Cell = '*'
)
var (
NORTH = Dir{0, -1}
EAST = Dir{1, 0}
SOUTH = Dir{0, 1}
WEST = Dir{-1, 0}
DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST}
)
func Part1(input string) int {
maze := Maze{}.Parse(input, 1024)
fmt.Println(maze)
data := inputGraph(*maze)
graph := dijkstra.CreateGraph(data)
path, dist := dijkstra.GetShortestPath(data.From, data.To, graph)
for _, p := range path {
maze.grid.Set(p.X, p.Y, PATH)
}
fmt.Println(maze)
return dist
}
func Part2(input string) int {
maze := Maze{}.Parse(input, 2877)
fmt.Println(maze)
data := inputGraph(*maze)
graph := dijkstra.CreateGraph(data)
_, count := dijkstra.GetShortestPath(data.From, data.To, graph)
return count
}
func inputGraph(maze Maze) dijkstra.InputGraph {
data := dijkstra.InputGraph{}
data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y}
data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y}
for y := 0; y < maze.height; y++ {
for x := 0; x < maze.width; x++ {
if maze.grid.Get(x, y) == WALL {
continue
}
for _, dir := range DIRECTIONS {
nx, ny := x+dir.x, y+dir.y
if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height {
continue
}
if maze.grid.Get(nx, ny) == WALL {
continue
}
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: x, Y: y},
Destination: dijkstra.Point{X: nx, Y: ny},
Weight: 1,
})
}
}
}
return data
}
func (m Maze) Parse(input string, bytes int) *Maze {
m.grid = grid2d.NewGrid(71, 71, CORRIDOR)
for _, line := range strings.Split(input, "\n") {
if bytes == 0 {
break
}
in := strings.Split(line, ",")
x := utils.MustAtoi(in[0])
y := utils.MustAtoi(in[1])
m.grid.Set(x, y, WALL)
bytes--
}
m.start = Vec{0, 0}
m.end = Vec{70, 70}
m.height, m.width = m.grid.SizeY(), m.grid.SizeX()
return &m
}
func (m *Maze) String() string {
s := ""
for y := 0; y < m.height; y++ {
for x := 0; x < m.width; x++ {
if y == m.start.y && x == m.start.x {
s += string(START)
} else if y == m.end.y && x == m.end.x {
s += string(END)
} else {
s += string(m.grid.Get(x, y))
}
}
s += "\n"
}
return s
}

6915
2024/go/day18/day18_test.go Normal file

File diff suppressed because it is too large Load Diff

3450
2024/go/day18/input.txt Normal file

File diff suppressed because it is too large Load Diff

87
2024/go/day19/day19.go Normal file
View File

@@ -0,0 +1,87 @@
package day19
import (
"sort"
"strings"
)
func Part1(input string) int {
in := strings.Split(input, "\n\n")
towels := strings.Split(in[0], ", ")
patterns := strings.Split(in[1], "\n")
// fmt.Println(towels, patterns)
count := 0
not_possibles := make(map[string]bool)
for _, pattern := range patterns {
if isPossible(towels, pattern, not_possibles) {
// fmt.Println(count, pattern)
count++
}
}
return count
}
func Part2(input string) int {
in := strings.Split(input, "\n\n")
towels := strings.Split(in[0], ", ")
sort.Strings(towels)
patterns := strings.Split(in[1], "\n")
// fmt.Println(towels, patterns)
count := 0
memo := make(map[string]int)
for _, pattern := range patterns {
count += countPossible(sortStringsByPrefix(towels), pattern, memo)
}
return count
}
func isPossible(towels []string, pattern string, not_possibles map[string]bool) bool {
if pattern == "" {
return true
}
if not_possibles[pattern] {
return false
}
for _, towel := range towels {
if strings.HasPrefix(pattern, towel) {
if isPossible(towels, pattern[len(towel):], not_possibles) {
return true
}
}
}
not_possibles[pattern] = true
return false
}
func countPossible(towels map[byte][]string, pattern string, memo map[string]int) int {
if pattern == "" {
return 1
}
//If memo has key
if val, ok := memo[pattern]; ok {
return val
}
count := 0
for _, towel := range towels[pattern[0]] {
if strings.HasPrefix(pattern, towel) {
count += countPossible(towels, pattern[len(towel):], memo)
}
}
memo[pattern] = count
return count
}
func sortStringsByPrefix(slice []string) map[byte][]string {
result := make(map[byte][]string)
for _, str := range slice {
result[str[0]] = append(result[str[0]], str)
}
for _, t := range result {
sort.Strings(t)
}
return result
}

View File

@@ -0,0 +1,42 @@
package day19
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb`)
require.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`)
require.Equal(t, 16, r)
}
func TestPart2Long(t *testing.T) {
r := Part2(`rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb
wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur`)
require.Equal(t, 16, r)
}

402
2024/go/day19/input.txt Normal file
View File

@@ -0,0 +1,402 @@
rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb
wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur
bururbrguwurbguwrubbbbbuburuuuwbgbgrwggbugrwrwurwwbrb
wgwgwbwuggbbwbrbgrwwgwbrbwbrbggrrgburbubwwur
wguwuugubwggburwwbbbbwrgwbrwuubgbbrugrbrrbrrugwuwguwrwwwur
rubwururuggurrgbgrburbrgbuuuuurwgubbbrbuwwbgbwgwrb
rwrwguwuwgbruwurgbwbgrugwgrggwwrrgrbwrurrrrgbrgbbgwggwb
buggrbwwurwuwbwrrwgubuwgburrrwbwubugugwurrbwgwburwubuurwbb
ggwgwrrwbrbgggbubwgwgguurbwwwggbuwbrubuubrrwur
uugugbrwbbwuugwwuwugurbuugbrugrrgbwgugggrgggrgrur
bwrubgugbuugbwrwbbubbgbugbbgruubwrwgubwguubbbugu
wrgrwwgbgubrrwbbgbwuurgbbwrrgwrrwuugrgubwrgrwbwbbbwrgrbb
rwbwwwgrgbrbgwurwbwwrrguwbrbwgrubrubguwurg
rbggguwguwrbgbbruruwgguuwwwrwbugwbbbbrrwgwb
wburgubbbrbgugwurbgrrwgbbuggbrggbrbubrwbrrwur
wgwrwurgrbwgwwuwrgwwbubwbubwbubggwbwgbwwgr
bgbbbgwwgbggrububrubbwwwguruurbbwwububwugwwuburgwurgrwr
rugwgbugbwbbrbgbwrbgwgurbuuwbbwbwbwbguugruwbrrrugwwu
rwbgruguuurwbubwrbrbwwrwurguwuwbbgggrurbgbgbwwwggwu
ubwubgbbrgbbbbgwwurgbuwuubgurwrggrrrgrbbbgggbrbb
wuuruwbwubrwgwuurugbrbwgubruuwwurwgwrbrugwrrbuuuww
ugwgbwrggrwwuwbgwwrubwuubrbrbwgbbwgbubburuguwguww
grbguwwuwgrburgggguugubwwgwguuwbwuwuwgugwggggwurrubwgbbwrb
buwbuwubrrugrrurwrwwbbbrugurgwguwugwwbrurrwbrgrg
gwwgggurwbwggwwbwrrgwwgurubrubbrbuuruurwur
rruguggbrrgwgwgrwbwwwugrbrubgruugrgwgubrgwbubwbrw
grbbbwrrugwrwwurwguugugguwuwggruubrgubguuurubrgrrruwub
wwrwguwwurbwuwwrrwgwggbgwruugbbrgruubwrwur
bgbwwwbbubrugwgubbgbggburrwggbbggbrbgwrrrbrgurwur
gwbwurgrwwbrgrubwgruubbrugbruruwuwgrubugwg
uguugbrbuuugbwwrgubrwgwrgggwrrgbrrbwbuwwwwbgbuwurbrbr
ugbggbwuwrgwugurggrugbrgwbwwbgbrwugubgrwrbuuwgrurwgguugwwwur
uwrwuggbuwwbururwgbrggwgwubburwwggguwwrrggwu
grrwwwrugbwuubrggrwgrwuuuwgwrwrbugrrrwubgwggwbguurbw
rgbuuwbgwgwuwurrgwrgugruwgwbgggbuugugbbwwrwugwrurubwr
gwguwrwgbbruuwrbbubburwgrrrrrwburrwuwrwgwgwur
bgbbuuguggrgrwugruwrbuuuuurwgbwbbubwrrggwrbw
rwwurubruwuwbrbwugrwbgwwuwwuuwuwurwwgwbrwgubgrruuurugwgg
wbwguwbrruruuwubggrbggwggugurgwgbrbugbwwbrbwuguuugr
uguuwrrbrwugrwwbbuwwrgbrwgbwubbubgwwbuuwgrwuwggbwr
wguwwrbbggrugbwrugbububgurrubggbwwugubbubuuguggrwur
uuurbwwwguurrbrgrrrbwgbwuuuwurwbuwgurwguugwrwggb
urrgwwwbuuwrwugrurgwgggrgbwuugruruuwwubruwwbru
wugugbguguwugbwgrgbrugrwwgrbwrgwwubruwwrggggwur
brubbgbwubwugbrruwububuuwbbwbrugwrbbrrggrgwrugrrwbbrrub
gwwruubbrrbbrwuubrwrrgwuwrgbuuwgggbburgwurrwbuuuub
wbugwuwbbwwwggrwwbgwuggbwuuwwgwuwbrubwrgubwurwwrguur
urgrgwrurbwggguubwuuwrbbwrgggggugurgggbbwbbwgwuu
wwgubrruggbgrwbggwbrubwggbwuuuwbbrwgbgbbbrbwruwwwwurw
wuurrggguwwbgbgubugrbwgwgggrwbwgbubuwwbbrwbuurwgwguwgurwur
rgrggggggbwrrbgggguurbbbubugbururrgrrrbbgwugbwrbgubb
rbburbururrbrurrwgrwrruwubwbgrrurgrubuwwur
bgguburbbruwugrurubbubgbggwgbgrrgwgwbguguwgubrrgwrbrwur
rrrwrbgwwrubwuwurgrrwbruwuwbgwbuguurgbrbrgwur
rrgbbgrurgrgrbrwggbubbbubbwgbuuwwugbrwgwrgwbru
bwggrguguburbbrwurrbgrgbgwwrwrrrwuwgwgbggwrggubwbgubbwurbb
gbwuwwgggrgwbbrrbuuruwubwrubgubwwbgwbgrbgurbg
bbwgrbbgwurwbrgbggwbwgwurburbburgugurbbbwbbbggrbu
urwgrwgguuuwruuwrbuggggwurbrbgwrbwbggwur
wbgrurwuwgugbuwgrwrwbbgrbbburwggugugrrgbrbbwrbbrruuwgwur
ubbuggwrwrgggrugwuwwuwrgruwwbrwruuugwgrrurgurrrbbugbr
uuugrwugwuuwurgwbrgwgugrrwbrrwrbuururubguuwrbwugrbbrgwur
ubrwgrruuugwgbrgbgwgugrbwwurgbwrbgwuubbuwrbgwwwwur
gguubbgggggwwwwrrrbwwubggwuggubguuuubwwugrrrgguwrbwrwwrwur
bgwuuuggwgbbbgwugwuuuwububgurgbwbbwbuwrbuwgrgg
buwwrrurugrgbgbubuwbgwgurbrrguwuwwurwwgrurrwrbwggrrbrrgrg
urggwurbbubbrubrggwgbbwbuubgggbggrwbwrrwburubg
rbuurgbbrrgbuwwrwgurrbgbrurwgbbrrbgbwbgbbwwuwwb
ugbggurgguuurggguuubgurrgurbuwrrgbgwwgbwwbwwrgbggrwwrbrbrb
wbwbubbrwubwggwuugrgubbuguwgurruugrrbwbbuwbgb
ubuggruwrwgwbubuuuubuwwgwrbuurbuwgwgruwgrgrurwrrrwgwbuwg
bwuuwubuwrwbwbubwgbwwwbwubgugugrugwrrrwgwbgw
ruwurrbgbuwrwrbwrbguwbgrbrrubugbubbwugrrbgubggbrugw
wggrwwgwurbgggbgubgrwggwbwbrbggwwbrrurwbbguwurgb
bwbgbbuwwruggbgrrrbbwbgrbbuwuuuugbwgggwwwgbwbbbwubwu
wrrbgbbbguwgrwrrrgbbugrruuuwbgwgbgwurbbuwrugg
bggrbrgwgrurwgubgwwwwuwbbuururugwwrbrgrbubwwur
ubbwwrwrwurwgbwrwwggwgggburbgggbuwrwbbwrubrubgugbrwwuw
rbguwwbrgrrbbwuuwwgurbwbrwbbbuuubrwrggwwubbgrrwgrrwuwu
wurrurgbwbgbwbrrubbrggbwgbwrwbuubgrbuwuwrbgrgrbw
rrbgbrurwrwugbgwwrggbrgbwugurwrbwwrubugubwru
guwbrgbuuurrguurgugwgwwrwwbrgbgwwwgbbgguwwwur
gggbrwguwguwgwurrgurruuuubrruggwrgbubugurrbububgrw
ggrburwwubbwwrwgbgggurrbgggwgrrbrbbbbwugbwrbrwubur
bbbgrugwwgwggbruwrgwwbgrbbuubuguwbggwwugbuugwbwrubgguuwwg
guwgwbggruuwgrwgrbwgrrwurwgbgwwurgubrubgbuubrwwwuw
rguwrbbrbubuguurbgwburguwbwbwgwggbgwgwwuwubrwruu
uguggubuwrwrugrwwuuuguguwwrwrbgwbwbwwggurbbggbrbguwwgubwwur
bggwbuuwurgbwbrbwbbrrgwwgugrrugubbrbggbrrwug
bwrruwuguwwgbwwrrbbgrrrrrrgugbwwrrgbuuwuwrwr
bgwbugbuwwrwwrwburwwgbgbwubrbrwgbugrruuugbbbrgurbwub
ruguuwgbrrguuuwbbwwbgbgrbwgwgbwbwwrbruubrw
rguwwwggbrwbruuwwbubbbbgbbwgrwgwggggrggwbgg
ruwrugwwbuwbwwwbrwbggwburrwwururguruuguguwgrbu
bgugbrbgggbbwugwbwuurbubruwwbrbbbgrgwrgrgggrbwrg
wbrgrgbrwbwbrwuuwbrbbwrwrrwbgwggubrbrbwrrgrbuwwr
grwuwgugrwbgrgwwbwwbggwgrwrgubgrrruuburrurwwrwbrrggwgwwbgwur
ubwbwbrrbgrgwuuwgwubgggrgurwuwbrwggurrgrgurrwubrubbw
rbrgwuwggbbubruruuuubbggwrgurrwrwwuwrgguurr
urgurgubgrgubwgugwrbuugrwrgwbgwwwwubrwwbguggrrrrrb
grrurbuubrwguguurrbrguwrrggwwwgburgrrrwbgwwbbrwrwrwgwub
uruwwwbgbbbbggbbbbuwwgubburwwuugburguurwur
gwurgwwwrgrurgbbrrrwrbggbgrwgbrgugruruuwwgrgwwwwrwuwubugbu
rugguwwgwrruurwbgwuguuruuuwbgbgubbubrrrbgwbwwwwbbbb
wbbwgwrgbwwburuurgrugbwggrwbgrgubbrbwurggbggbwwwrgggbr
ugrrurbugbwwrguugwugggrrugwgururwbbubgbrwrwur
rugbrrbwbbrrwbrgwuwbgugggruuubburgbrbububrrbubwuurub
wgurrbuugubgwwbruubrrwbwwubbgrububguwgbrrwwuwuwuuw
ubrruwbuguurgbbrrrwuggbggwbrrgwgubgwbruugwuuurgubrbwugwwb
wuwrrbuwuwbburgwurwggwugggbgrwrwgburgurgbg
uwwburubuwrrubbuwgwbugwrwbgugwgbbggwbugbwuwwbruggwur
bgrubrbwruwuuuwwrgrwubrggbbgbuubbgugubrrburbgu
bgrgrgbugrurwburwbbrruwrwbburwbwbggguwburrrwuggurbbrbgrbu
bguwuggrguwbrgruuuguwwgrbgrwbuugwrbrbgburwbwwbwrb
wggbwwbwwwbbggggurbbwuubgrbrgbbrrwuuwburrugwwubgru
rbgburuuggwwwguwwrbrggbrwuwgbrgbrwwbgrugwuubguwbu
gbrbuububuububrbgrgwurbbwbuugwbrwrururgugwgbwwgggbbgbwurgwur
ruurwgwggwbbwrbgrrurguwgwwrurgrgggrgguubgguwuwrw
uwbubgwguuubbbgbrrgwwrbbrururwgurrgbbrbgubwwgbgwuguuwurub
wrwrugugguwbuwwwwgrwrbgrbwuwburbbwwgubugwuguwuwwur
urbrbwwuggwurgwbrrbgrbwrbugbugbbbwuuguwrrwurrwur
rbrbubrrruggbrrwrwbruwburrwuwgwrrwgubbgguug
gubrurwwgwwuwbrrgurggrgbwwrrgbbruurgbuubrwgr
bbrwuugubuugwwwwgbrgubbbrgbrrguwrggrurrwgbrggbugbbwwbwrrgu
uugbbwwwgwgurgggrugubgbrwwrwrwrrurugrwwur
guwgwbwgrbwbrrwrbugbbwuugwbbwgwwbrwrwubbbrb
bbbrurugrugbwuguuwwrgbrbwbwwuwwbrwbrwurgbgbggrgruuuru
ubuubgbgbuwugugurbbwuubrrgbwwubuggwbururggrrrgr
ubgwwbgurbruggwwrubwggubbuubggbggbwwwwwwgubwgu
gburuwbbrrrbwwbgbugugguugbbbwbubbguwrbrgbbgwgburrugr
gbgwbgruwrgwrrurwuugrwugruwrgubwbrrbugubugugbbwu
burbubrgbwgrwwrwbbrbuururggwbwubugrwruruuwbuuggrwbgb
bbbwgubrburwbubwwbruubguugrgwrgguuruubbwbb
guwggggrgrrugrbbrwururugbbrwrurwgbwgrrrguwwrrbbbwuwuug
bgwrrrgwruwrbbuwgbrugruugwrrrugwwuubbugubbubgggubrrrwwg
bbgbrwrwrbwbbrgwwgbugugugrrbwbbbbrbgguwrbugrbwgwrbru
rrbwwggrgwurbuwbwbggbrrbggurugwgubgggbrrbwwrugrwgurbugur
ggburugbwruugbburgrbugrgrwbbwbruubgubgbgubugubbbgrrbrgrg
rwuwrgbwgwubwubrrbgbrrbwrrwgugwgguubbrbbwguwwwwur
wuwwgbbbwrgwrrbrrgwbwwubbwrwrrrwwuuburuubwbuubuwwbbgg
wbbgwrgbrbubwggbuwwuwwggrugwwrugrgwuubbwuugrggbbrgubwrrgu
burrbwgrgbrgrruugwbwruugwbbbburwbbuwgrwuguwrbgwur
bbwbwuwwwbwbrgwwwrrwggbwgruurrbrgwggbrbbbrrbgbbgrrrwrugg
wwwbbgwgbwwrbugurgugrrggbuguugrbbgwrguugggbwwugrugu
gurbrggwrwugwgrggrbrgwugbrbuugrwurrwgrbwurwuuruwuggwruwr
guuwgguwwubrbwwguubugurbwbrrwwwbbwgggrwururgg
wubuuuurbuwbrrrurbggbgrwbbwrbuwwbwwbrbrggrwgggwwwur
wgwrwugbrwgubguguuugwbubuwbbrwgbbgrgubrruuuuuuu
wbrgwggwruuwruwwrbruubuwgwwwbuuugbwububbgwbgwbgbg
wwwwgwwwugrwgrgrgwbbuwgbgruwugrrwuugbrbrurrrguubwwur
bgbubwrwwrgrwrbuwgurrguwbruuwgguwrurwrurrwgugggbwrbwwggw
rwwurgwuwgbbwggwwuurbwbbwrwrbwbrwrgbrbbrwbr
wrugbbrgbbugrrwbrwgwuggrbrwwwgbgbbuuurwuwubbggubbg
grrwurgburgruuurgrbuurgwgwurubgbbubbubuwwwbwbuuubbbrrwur
uguuguurrwbbwgwrwgruubgguubgwggbburbuwwgbrwruururwbgrgrrgu
gugbrwwwbguggrubbuwbbbwggbgurruruwubrwggruurwbggrrruurwbb
grgrbwuurwwwuwuwwwgbuubwbuuruwwwgguubwbruggbrgub
gwruurrugubbwbbwrggrgurbwuugbgbgbubbugbgugbwbwuu
wuubwrgrruwwrurwgwwurbugrgbrbuggbuwwbwrrrbrwr
urwbwrrbbgbbwwuwbwubrbruwgubruuuguguwubguwugurubr
rrwbbrwrbbuwbwrwwwrrguwrbgrwbubwuurugurgbwrru
wwrbgbubrrruubrggbrrgugbwuwgrbgbburbbgwur
gwuwggbbrbgbbgubgbwburbguuggugrrwrbubruuurggwrw
rurruwgrrrurwwwbbuuuwbrbrbrugrgwgrrrwbbgrgwguguubg
bwgwrwggwggrwbwbbrbbbrgrwbbuubrugbwbrbwggbwb
bwwwbugwbgubgrruwrbubggwurwwuuggbrugrrururggrbwbbggbrwgug
uugwuuggrrbgugbwuubwwugwruubbbrrwbwgbbruuggggwuurgrw
bwrururgwugwrwuwbbrgwgugrurwgrwbwwwwrbgwur
ugrrrurbggwwugubwrggwgrggrrbuggrurbbbrrugwurubbbguruwbuwb
uwbgubgrrwrbgrgurubgrurrrguwbbuurbuwbgwbgruwrggwur
rwurbubbwububgbbubbugubrbbuuwwwuuuruwwrwruwwbwbwwgwbrggbg
bwgrguuruwwbwrbubwrbbbbuburwwugwbwurggwguurguguurww
wwruuguwbgurrgwrubbbwurgubguuuwrwgwugwgrrwwwrgurrurrbgrbrwur
grurwwuwwububrrggbwrgrgbuggrwrbruubwbggggrbbwrwbwwrugr
brbuguuwuubuuwurrrburrgbbuwgwbwwwrrgwrwwuwuwbguurbrr
wgrbuurrbubrrgbgbbbbbrrwrurrwgbgwbrrrwrbubruubuubwrbbbwwur
wruuuggbrburwrbbwrwbwrbwrbrurbbgggggguuwgbbgrguggwruuuww
bgubgggbruwwrggrwubbbgbrbbrwrgbruugwruggguwwur
bbgrbgruburguuwwruubrbbbwwrrrgugbgururgbgwggrbwrwur
ubwubwwubbuurwuuruwrgwwwwwbbwgwrggbwrwbbubwgubbuwru
bbuguuwuuwururbgubrruruguwwwugwruwbwgwrwbgwur
wuwrugbugwbubwwwrrugbbrruwgwgruuugbgrurbwwrwg
ubgwwwwgrbbrrgwwwbugrubwwwrurbbgbbwrbbgubwbruurbuurwr
gguggugrbwrwuubgrurbgbgrgugbgrurbuwguburbuwbrwbrwgubgu
uubgrwbgwuurrwwuubwburbruwgrrrgubuwwwwrgwu
wwrbwwwgubgubrguugrwbubwgrbuuurrgrwruwbgubwuuwuwggwububrgwur
brgrgwbgrbbbgwgbugwwubgruruubgguuwrwuwwrwbbbgbururw
rrgwguwuuubrurwwwrrugbwugrubrrwurrbrrrbggrb
ugwgwbbbrggbwugbrrbruuubrggwugruguugugwbggwrgrw
wurbrrgbbwwrwgwwgugwwbbbgbwwbrwbbggrgbggbwru
ubwwwrurbubbwbggbbwrwbrrwgwwubguggwwggbggwur
bgwgwwuurwgbbrugrgrgubrguwwrugwwwgrbuuwbrbwbrwgwwwbwurwg
wrrbubuuguruwrbggbugbgwwruuwgbwubwbruwgbwwwwrguwbwwur
urrrrbugwrwrurgubrwubbrrwbrgwuururbuwrgrggugrw
gggubrggugbbbwbwgrgwwruwwwbuwbuwgggbbbgwubuguuurwbgu
uruuruugbrggruwbuguwbggbrgwbbburuwbwwuwrgbw
bwwuwgrggrgrurwwbbbbgwwuwbwwrwwbggrrguugbgruuuubwuwugu
gwbububrubrgwubrbwrwgwubrgrwrwbrrubggwbgbuuwrwubrwwwrggg
wbggbrrbrggbuwwwbrurbbgrbuuuwrrbuguruwurwgr
brubbuwubbbwgbgrwuggbgggbrbbguuwuuwrgubbrugbbbgugrrwur
gruuubwuggbbggugrbbgbwrwgwwgwgwuwwbruuugbugrrru
wwbwwuwrguubrwugrbrgggbwuwwgbrbwguurbrbwguuwwrbgwwubwwuwbu
grrbgrwwwugbwbguwgrgrrbubgwrwwgrggwuwuwrgggbugrbugg
wuuwgbggburgggrgubbrugbgrbruubruwguuggwwuwbgggwuwwgu
wurubwgrgurrgbgrgbbwbgggwwuwbbgbrruugggruguggbwruwru
gbrugrbuwrgwrrurrrurrwuwgwgbbgwrwgugwbwrbbwrrbrrub
ugbwrugbruwwurwwrwgbuwrgrrgwrugbruggrrbwbuwbburwur
guuuwuwbuurggburbbuugwgwrgguugrguguubbbbuug
rrgubrbbwuggurbrrgrbbbwwwrgrrbgwgubruwguruurwgwgbwgbrwur
wuggruwburuwbubuwuwbwwrrwrbwgwwubuwrugbggwgbwbuuwg
wwrrbwgubbrrwuwbggrwwrbubbuggwrrwwrrgugurguurwrrwbbwgbw
grggruubbgubugwgugbwgbuuwugrwwrrwrggwurwuguuurgrwuwrbwrwwr
wrguwwubrgrgbuuurggwubbwgwubgbgrrburbgwururbbgwrburr
gwbgguuwwgrbbbrwbuwgrrgwubwgurbwrruwrggbugrwwwur
wrbrwrgrurrugwuggbbrrurburubwrrbuugubrrrrbugwrrwgbuwrgbbr
rbuggurgwgwwuuwuuwubbbrguugbubrurwrrwuuwugubwugrugbrrwur
brgwburbwbrbrwgwruwwggbbgrwrbguguugugubgrgwgwwr
wrbbbrwgwbrgggrrwbwgbbwbrggrwrburrbgbgrbbuugwg
uggbwubwrwwbrgrwwruuwwrggbwrbuwurwgurgbuguwuugbwbg
brgwbgbuggbbgrguggbwggrgrwrubururuwubrgwwbbgwrwugwugwr
buruuuuwgugwbgbrwrbururbrurwwbburuurbwuuugbbbwwuwrugugbrg
rrgrrrgwggguuwugrwwguubbbuggrwrbruuuguwgwg
ugbgruuwruwbwbgrgggbwugbwbbwurugwgwuurbuwrg
bwuwugbbubggwwrwubuubwgrrbrrbugrurubrrguwrbr
rguwwugwruwrgbwwgbgugrwubrwrbbwwrbggubugubwgwrbrwuuubu
wgbwggggrgrgrbgurwbuugwuwwrbwbbbugruwgubwwgrrgwur
ugrgwgguuuwbrgrgrugbruwrbbbrguwuurgurgugurrgbubuwgubuwbwu
ggwwwbgwgwguwrrruwuubwgbrubgruuurrrubuurrrgbguurw
grwrwuubrwwurbwgbggwrwuuruwguuurrgbwguwubwbuurgwbgugwuwbwr
bbwuuwrrwgrrbgrgbruurguuubuwrwguwuwbbggwrubbug
rrbbruwbbrbbrbbbwbubbgwurrbubrrbrrubbwugubr
burrubrururbguwwgrubwwbgwugrrwgbbgwgrwbubgurgug
wuwubwwburgugwwbgwurbbwwgrwguguwwbgwggubgbwbbrgrurrbbr
buruwbrugwrwbrgruurbrwbbrggbwgugwbuwgrgbwwwruugrggrg
wrgurwwgwwrbrubuwrbrruurrbbgggwuwgugwwurbwgurgwbbbrwr
buubbgbrrbwgwwwbgwrubwrugruurgggwrbugubrgwrrgbu
bwrbbuguugbgurbruwgbbruuwubwbggbrbrbugggubbbwwwbbguggwwgrg
burggrbrgwrwbwwbrbuwuguwwwwbrbbrbrbbwwur
uwbrggwrbwuruubggbwuurubrrbwubrwwgugwruwgugguu
grbgggbwbbwwuwbrggrurwwgbrruwgbwgbruwwruwubrruwwbbwuuw
wbrrgrrguwbuuugbrrrgggurbrwbwwgwrwbrurwggubbuwuwgwgwbbbbb
brbgubgrwrbbuwwwbwrguwwwuggurrubrugruwrguuwwubgru
rrbbrguwrrugwuubrwgwwrubrubuwbuwbrgwbrwuruuguwuuwrgrgur
rgwrbggrbwuwwwggrggrgrwwgwgrbbgrubuwugbrrwrbgwb
wwwugwuggbgwwrrbuwwrrwuuguggbgbwwrrbggwrbwwguur
ugugbrwrgwbrrrbbrwrrrbuugubrwgwrrgugwbwgbguuwwwruguwgrwg
gwgrbgguuurbwbwbwuuguubgbrgrrguwrbubgwwrug
gubwwbrwrruwbwwrwwwbrgwbugrrbuwubruuwbrwbbwubrw
uggwgbwrguwwubbugbgrwurgubggugwwwwbwuburwgub
uwrrgwrrrwrwbgwruuugbwbgwggwrrrwwgurrrrrgurwwwgruruwgw
urrubgggbbwgbbrbrbwrrwgrwwgrggwbbbrrurgrrurgubwbwu
grurubrburbbwwuuwrubbbbwrwbbwrgwrbggwgguwuuwwur
bwbbwbrgrbwrwbbwugrugurruruububburwuwgugguwrwur
rbrrbgubwbgwuwuuwwwrubgggwwuuugggubbrrbbggwrwb
gbwrugrgubwbrwwurbbgwgrrbuubrrubuwubguuuwgu
bggbwuuubgwrgwuwbbuguwrburrrurbbubrgwrwrwgrg
wgurrrrbbggwbbruwbwbrbguuubwwrbuurbrurrurwur
gwbgbgwbruuruwuurrrrurrwbgrbbwguwgbgrwgrrwuwwwgbbrr
rubburrrwggbwuwrbggrubrgurgwbgwbwurgbgwrbgwg
uubuwbubrggrwwwuurgburbuguuugrbguuwugubwbgwrgrggu
uwurgbguubbuuwrubbgubggurrgrrbbrrrwwugwruwr
uwwgwugguugrugbubbrwwgubwubbwrwguwbwguwggrgugrwguggubrwb
bgrbggwgbbgrggwwrbbubwwugbwgrurrurbuuurbrbburbruur
rubwrbrrwwgwuwbbbubrguggwwbuwrrguwbwrgggwburbwuurwb
rrgbbwwwbwbubwbwrugbugguwbuwrubuwrubbgwbgwgwrbgurrurruu
gbuwwwwgrguwgwbgrugrrwbwuuguubgrbbugbbgrgbrgbb
rwrwbgruwbrbgbrbgwwrbwubbwwuwbrbbbburuwrugggr
buubbrbubwwuggurrwwuguuuwbrbwbrgggrubwbbrgbwurugrwgrrwwgb
rrgbuwbwuuwwwbwuugrurggwbrbwwuruwwwuruwur
grrbrwwbguwbbggguuwwugugrugrgwwwbrgrgbguggwrr
rbgrwugbgggbubugwrburgggrbwbrruuuubrrrguugruwwrbgrbwg
urgrbrrrgwuwwgguwuwuuubwwrugwrgbwrbuwuwbgwbwurwwwrgbrrggb
rgrwwwwwugbgugbugrgbuwrgwrwgburuwrrgrbwbuubwguwwwugbrg
wbbbggwwuuwwgwwuguuuwuwwugrwwwubgugurrrugubwgw
brbuwwwgwgurwgbwrrbrgruguwgbrbwububbrgrbuwrugrwwur
uubuuggbguurwbrwgrburbbbwburubgurguugbbruruur
grrrwbuwuwruwgbwwwgbbgwbbguwbwurrugwwbuwbuuurrurwur
ruruwrwuuwbrgbugwwgwgbrbwwrrrwrbrburrgruwrwwbbbugubwwgrbww
bgwruugguuwuurbubgwgrgruwbuwwwwguwwwrbgrwrurwbggrguw
wuwwwwuuburggurgwrgruuwggbguurwbggrwbuugrwbggurbgrgb
rugwbbuwrgruubgggwuwwrggbgwwbuubrguwugbburrbgrrbwrru
gubgwgwuubwuubrbrbbwwbwrbguruuurgrgrggurbuguwbgr
ubbwgruubgbuwuurrguwrbuwwgubbrgwrruggurbuguwrbrbbwgur
wgggurbbwuubrbwrgwuurrbwgwburrwrbuuwbwurwur
gwgbwwrubwugbrgrwbgwbgruwugbwubbbbbwubbubg
ugubrbguubwgbgwugbwgwrrgruugbbbbruwugwrurugrgrwwrbw
urgurgubwuugbgbgurbbrrgggggwuwgrwbwgbubwuruuwbub
rrrruwwgwgubwbubbggrbruuururugbwwgwwugwgggwguggg
uggbbuubrurwubuuwrurrbwwuuwubrbgwrbrrrrwbrbgwggwuruur
rbbbwbgrurugbbwguurrugubrbgbgggrbuguwrgwwbgrrw
wrgwrugruwbgrwbgbbguwgubwwbugubrgbrgwgburguubbbbuwrwwur
rwbuurbrbgrgrgbgbbbrgbrrgggrbbrgrruuubrguubbrgrwwwwuwrubgr
bubwrwwbrruwrbuuugggrrrruuwrbwwbggwrwbuuguwwbgurgbu
uwwrwwgbbwrugruuuuruuwuwgrwbwrbgubwwrbbwgbgbgwg
buuwrguuuurguwbrbrrwguubrrubgggwwrbbwgbgrr
uuwwgwuwgbgwruwuuubrrbwuwrrurrwbgwbuwbwurwur
ubgurwwbwgwruurwwubrwuwrbugggruurwugurruwguwgbrgrugr
uguuguwubgrgbrbgbwgwuwwwubbwrgrbuguuugrwur
rrwbrrrbuwwgwgrggwrwbrrubwrbrrbbwubrrwwur
ubugrwwbbrgugburbgrrwwwuugbwrugbgurgrwrgubur
bgwbgguwrgwruwgwwrwrugurrugbrggubwbbgwwwwrbwwrugggbrwggrrw
wurrguggggwgbuwwguwbbbbgwburwwbrrwrrgwur
gbrwwgrguuwwrrgugubwbgwuuugwgrwbbwrwbgurugruurwuuubrwur
rrrwugwrrwwruwbggwrruuwgrbuwbbgbbggruwwbgruwggburwg
brbwwggbgwwbgruwubbbbggwwubrgubbuwububuwurwbbwwbwu
gbbggrbwwuuwuugrwuugwbrurrruububggwrwggrgurwwur
rgbwwrruugbgruruwuburgrwrwbbuwgrggguugugurwggwggrgugggrg
brbbwrruuubuwurrrwburbrbwgwurrbrgbrwrbgguruuwuuurbgbbg
gwbrwbguugbbwrgrgrbgbruwgwruwbrwugrrgbwwgb
wuurgwugrugguwwwbwwubwuubgwubuuubrwuuububrugwbgggrruggrrr
rggbuwwggruugruwugggrgrbwbwrggrgugwubrrgrwgwrwuru
uguguwwwgugrgbrwgbubwwuurbgguwubrrugrruruwrgrwwubgwg
gbbbrwurrubrugwrgwrbugwggugrwuubuwbgrurbuwbgbbbgw
wrgwuwbwrbbrgrbwbrbuggbuwbrgurwggwbbgrwwuwbbgwrrrgrubbb
bbubbrgwrgbbbrgguurggrurwuwubgwuwubburbgwrgw
urggrwbgbggrwbwburbbubggbrgbgwbrururrgwgbbuwbu
urggbbbrbubbwubbbbrbgubrwrrwbuwbbbbrguwrubbuwuwgg
ugugbubbugggwwbbruggwwrugbrurguugbrwbgwuuwbbwuguggb
wrbwrrbgrurbuwwrwwwrrrbrbuuwbuwbggwgggwuuwwuwbrwwrwbrrrrrwur
ggubgbruuuwbgrubwbbubgruwwwuurbrwbgwrrwbrbrgu
bwbbrgwgburwwbgrrwgbururwrwggguwgbwwbgwuuggwuggrbg
ugwwgugbuwruuggugggwrbuguuugggwbrwrbubguuuubwbwgwg
buugrgrruurbbrbgguubgbgbbuuuwuwgwbrrgwur
gwbbguuwwbburguugubrwgwwwubbubrgwruurwwruruwu
guuwbugrurwbbugrbrwuwbgwbrgruruwugwwbrrgrwgrwrugggbwwur
grurbgrrubwwwbwrrurwbwbgurwuwgwruwwwurwrwwrrugw
bwgbuwurrugwwrurbrurwgwubrrrrbuwwbruuggwbrubbrgur
ugwuwgrubrrgbbrwwgwggbwubgrbrbwwbgwbgrbuwuwwrrwg
ubbuwubugwwrgwrrwwubguurgbgwrbubwwbrwrwbbburuuruuurbuubu
wrbrgwubgrruuwbgguwbubwbbggrbgwbwrgwwrrgrgrbgbugubwg
wrugubgwbruwgrgrbgrugggwwwrwrwuwbururgrwrggwwrubuwbbbggbu
wugubugbbrrwwwrguburwrguwrugubwgugrbbguwrgwwwbgggubrrwgbgwur
rwrbgwguwurbrrbbbrrwrugrbggggwruubwruwbgbwrrrwbg
brrgrrugggggwgurgububrgbuuwgubugbgbgbuggwbburbgugugbw
gbbugurwwrbrbwbwwgbbrrruuwbubwwwgrbubuwgrw
wgubburbrubrwwugugwrburrbgurbgbruuurwgubgwb
ubwubwbgwrgwwuwbugbrwgbgrwgrwuwbrbububguguwrgwrwwwur
uwgwrwguwrbrgguwbgubrbwrurrwubbwbggbwbbbwburrruwbruugu
bwbwwbrwwwuwrrbugrgrrbwwgrugurwuubwbwgguwgbwwgwuwrbrb
wurrwgubuuwrrbbbuggwbwugrbgwwbrurwwuwwuruur
wgggrgrurbbbrbuurubgububwuwrgbbuuugbwwwbgurbruwbugubr
rurrubrwrwubrgurbbbgwrrbubwggbwwbbwgguugwrwwubuw
wwuggububbrrbbwrbwrwburwbrgwwgwugguwgrbwuwbuurrwwugbwr
ggrwbrwrbwwbwwwbgbgbbgwurrbwwbgubwbgrgubugr
rbbbbgrggurwuguurugugrruugwrwgrwgrbwbbwgrbrurggr
wrubwggwbuwrbggwbuwggwbwgwrruguwrbubrggbrwur
gwgbwrwugbwuwubwwwgrbrrbwubbwbwrubbbrwuuuwuw
bgwgubbuuugurwrbubrurburggwbrguwbggbgbbbbg
gwurgbbburbrrubgwwruwrwugbwwwwruuggwgguwuuuwuuurubgru
bgrwbuugwwrgggrggwrgrbbggrgbwrrwubwububurrrbgwggg
bbwuwrurwgbrrurguggrgwgggwuurbrrrurguwurrwgwruwbbgb
guwugbwrwwbgrrrugwuwurubwbwurgbwubwubbrwgwugb
uwrurbgwubuwruuggburburggwguwwbwgggwgbrgrwwrrrgww
ggwwbgrbuwrruurugggwrbwwgrgrwburgrwwwwrwbrbrrwrgurggrgwur
wurbwgrugbwugrbugbrrwugruwrgubuuwuwgrgbwgggb
wwuubuuuwrguuwwugbuwuububwubbguubgbubgrrbugbrgrwrbwrb
wwbrbwgbggbuubrwwgrguubbrbbwbbuwurbggubrrrrw
ggrugurgbwggwwwrwwbbgbuubuuubbwrurbubwbgbrwur
wgbrwgurwwgbbwwurugwgwugrggwurgrgbbbbrrbrbrgwuur
urwrbrgrwgwuurgubugbburugbgbguwbubgbwugbuubu
bwgwwuugrrrgrbwbggwuuwwurugbwbwgubgbwrubwgrw
brurrbbgubrrrurwwwwbubbgwgwgrugubbggwbggwubuuug
uwbwgrubgbbgrrrrubrgrgrbrbgurrbrgwrrbwgrwrgrgwgrrubbuuwu
wgbbrwurubuuwgruwgubrwwwubgbggrburruggbbrrwwruwwwwur
uwurruwrugbgbwrrbgwrwuwwuubruwrubrwwbwrwgggwugbrrrrwur
bbuggwgbbruurubuuwgbbwbrbrrbggggrrbuubrububbubugu
brbguwururwguwbrgrrwbbbwbgrgbgwgwgwgrrggrwrbbrburrur
gwbbrrwwrggwrrgwwrwwwurrggbuugubbrwbbggwur
rgguburbuggbbbrgurrwrwrggbrgrbuwbrgwwbwrurbugbbbu
buwuwwbuwugrrgrwuugbrgwurwwgguwgbggrrurbwgrurrwur
uugubgwggruuuggwgrbuwbrbuuwbgugwbuugwbgbgwuuuwgruwu
rwwubbrgwbuwbbguugwgbwburrwubruubbuwwwwwgbbbbruwuuurwur
rrrrwwguwgrurbubgbrgbrurwwgubwuuwuwbbwruwwur
bbubuubgbwgbruwugggurrwguggbwbbbbbgrbwggubwgwubgbwrwur
bubgwubbwrrbbwgurwrubrrubgurwwgrubbbugrgub
rbwgrbubbubwwrbgbgbwgrbubguurwwgguwgubbrrbubwr
guugbrgwbubububrbrwurrgwurbwrggbgbrbwwrbbuggugwgubrwrwbbbb
grrbguguwwwuwurruubggguububgwurbubrrurwrwguggbrwrwgugb
rgbgbugubuwrbbrwwuwubbububgwbugwurruwrbrgwg
bwbwgubgwbwwurrubgbrgurugugwwrwrrbwwbbwggrb
uuwwrgrurgbwgruuuubbugrrwbwgrbggwbubwbwbwgwuubugbrwur
bbwrbrwrrrrwwbbguwrbruwgbbrwurwrwuugbwgugurwwugrrurgugubu
urgwrrgrgggrguggbgrbggwuuburbwrwgwgrgbwrgg
ruuuwrwubrwwuguurrwgbrbbgggrrrgrbuwuuwwrrguu
grwwrrrrggbuwurwbugugugrrwwuwwgggrbrwwrbwuwbwgw
rrwbbruwuwwwuggwrwbrgwwgggrbrrgwrbgbwbbrwrbubgrrggwrwgrg
uwwwbwwuurrguuwwubwrbbuubbwwgrbwwbbwwwurwbuuwrwrwggwur
grrgwbgubwrbubrwubguburrggbbugwwwwruuwwuggbg
grbwwuwubbgggwbbuggrgwburwwrruruugrgwwwgwwwrgrbuwbrgb
ggrggrrgbgggrrgrbrurwgbgrrwbgruwwbbggbgwwbubwrggwgr
wgrubwrwbbrgbwuurwbwwuubwgbuubbwrugugurbgwrbwrbuwgguurww
rbwbwbgwuubrrrgrrubbbbburbbwuwwubbbguubgwwwur
buuuwrwwbuuguurwwbuwwgrgrgrrrugwrggbggwbgubw
wwuwwwwbrrwbwgwuuwwwgwguwgwubuwwgwuggrbwbrr
gbbgbwbbrbrgwrwburbrbwrburrgwwuguruubrgubgrgrwugb
urbgbwwrrwguurugruurbuwbruwrguuburguwwuuruwbggbwuwggb
bwrwwuurugugggwuuwrbrgbuugbuwbuubrgrrrrbwgbgwgbu
ubwrugrgrwruwggbwruuggbubwguguubwrrbggbgwggrww
uwbubuuwbgbuwbguwuwwgbggugwwubrbubgbuwrrbuwbuwrwbubgbrgru
bbruurgrwuwbrgruruwwuwbwuugwurbbrwgugrrrurbubgrgw
wbgwwrrwgwrugwurgbggbgwwgbwrbrbwwrrwugwrwbuuugguww

220
2024/go/day20/day20.go Normal file
View File

@@ -0,0 +1,220 @@
package day20
import (
"adventofcode2024/utils/dijkstra"
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
)
type (
Vec struct{ x, y int }
Dir struct{ x, y int }
Cell rune
Move struct {
p Vec
d Dir
}
Maze struct {
height, width int
start Vec
end Vec
grid *grid2d.Grid[Cell]
}
)
const (
WALL Cell = '#'
CORRIDOR Cell = '.'
START Cell = 'S'
END Cell = 'E'
PATH Cell = '*'
)
var (
NORTH = Dir{0, -1}
EAST = Dir{1, 0}
SOUTH = Dir{0, 1}
WEST = Dir{-1, 0}
DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST}
)
func Part1(input string) int {
maze := Maze{}.Parse(input)
fmt.Println(maze)
data := inputGraph(*maze)
graph := dijkstra.CreateGraph(data)
path, dist := dijkstra.GetShortestPath(data.From, data.To, graph)
for _, p := range path {
maze.grid.Set(p.X, p.Y, PATH)
}
fmt.Println(maze)
return dist
}
func Part2(input string) int {
const saves int = 100
count := 0
maze := Maze{}.Parse(input)
// fmt.Println(maze)
data := inputGraph(*maze)
graph := dijkstra.CreateGraph(data)
path, dist := dijkstra.GetShortestPath(data.From, data.To, graph)
cost := make(map[Vec]int)
cheats := []Cheat{}
for i, p := range path {
cost[Vec{p.X, p.Y}] = i
}
cheat_data := cheatGraph(*maze)
for _, s := range path[:len(path)-saves] {
fmt.Println("Checking start:", s)
for _, e := range path[saves:] {
fmt.Println("\tChecking end", e)
cheat_data_1 := cheatGraphAdd(maze, cheat_data, s)
cheat_data_2 := cheatGraphAdd(maze, cheat_data_1, e)
cheat_graph := dijkstra.CreateGraph(cheat_data_2)
_, cheat_dist := dijkstra.GetShortestPath(dijkstra.Point{X: s.X, Y: s.Y}, dijkstra.Point{X: e.X, Y: e.Y}, cheat_graph)
fmt.Println("\t\tcheat distance:", cheat_dist)
if cheat_dist <= 20 {
cheat := Cheat{start: Vec{s.X, s.Y}, end: Vec{e.X, e.Y}, cost: cost[Vec{s.X, s.Y}] + cheat_dist + dist - cost[Vec{e.X, e.Y}]}
fmt.Println("\t\tSaving cheat:", cheat)
cheats = append(cheats, cheat)
}
}
}
for _, cheat := range cheats {
save := dist - cheat.cost
// fmt.Println("[", i, "]", "save", save)
if save >= saves {
count++
}
}
return count
}
func abs(in int) int {
if in < 0 {
return in * -1
}
return in
}
func inputGraph(maze Maze) dijkstra.InputGraph {
data := dijkstra.InputGraph{}
data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y}
data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y}
for y := 0; y < maze.height; y++ {
for x := 0; x < maze.width; x++ {
if maze.grid.Get(x, y) == WALL {
continue
}
for _, dir := range DIRECTIONS {
nx, ny := x+dir.x, y+dir.y
if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height {
continue
}
if maze.grid.Get(nx, ny) == WALL {
continue
}
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: x, Y: y},
Destination: dijkstra.Point{X: nx, Y: ny},
Weight: 1,
})
}
}
}
return data
}
func cheatGraph(maze Maze) dijkstra.InputGraph {
data := dijkstra.InputGraph{}
for y := 0; y < maze.height; y++ {
for x := 0; x < maze.width; x++ {
if maze.grid.Get(x, y) == CORRIDOR {
continue
}
for _, dir := range DIRECTIONS {
nx, ny := x+dir.x, y+dir.y
if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height {
continue
}
if maze.grid.Get(nx, ny) == CORRIDOR {
continue
}
data.Graph = append(data.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: x, Y: y},
Destination: dijkstra.Point{X: nx, Y: ny},
Weight: 1,
})
}
}
}
return data
}
func cheatGraphAdd(maze *Maze, in dijkstra.InputGraph, s dijkstra.Point) dijkstra.InputGraph {
x := s.X
y := s.Y
out := dijkstra.InputGraph{}
out.From = in.From
out.To = in.To
out.Graph = append([]dijkstra.InputData{}, in.Graph...)
for _, dir := range DIRECTIONS {
nx, ny := x+dir.x, y+dir.y
if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height {
continue
}
if maze.grid.Get(nx, ny) == CORRIDOR {
continue
}
out.Graph = append(out.Graph, dijkstra.InputData{
Source: dijkstra.Point{X: x, Y: y},
Destination: dijkstra.Point{X: nx, Y: ny},
Weight: 1,
})
}
return out
}
func (m Maze) Parse(input string) *Maze {
m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) })
m.height, m.width = m.grid.SizeY(), m.grid.SizeX()
for y := 0; y < m.height; y++ {
for x := 0; x < m.width; x++ {
c := m.grid.Get(x, y)
switch c {
case WALL, CORRIDOR:
m.grid.Set(x, y, c)
case START:
m.grid.Set(x, y, CORRIDOR)
m.start = Vec{x, y}
case END:
m.grid.Set(x, y, CORRIDOR)
m.end = Vec{x, y}
}
}
}
return &m
}
func (m *Maze) String() string {
s := ""
for y := 0; y < m.height; y++ {
for x := 0; x < m.width; x++ {
if y == m.start.y && x == m.start.x {
s += string(START)
} else if y == m.end.y && x == m.end.x {
s += string(END)
} else {
s += string(m.grid.Get(x, y))
}
}
s += "\n"
}
return s
}

View File

@@ -0,0 +1,45 @@
package day20
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...#...#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############`)
require.Equal(t, 100, r)
}
func TestPart2(t *testing.T) {
r := Part2(`###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...#...#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############`)
require.Equal(t, 0, r)
}

141
2024/go/day20/input.txt Normal file
View File

@@ -0,0 +1,141 @@
#############################################################################################################################################
#.........#...#...###...#...###...###...###...........#.....#...#.....#...###...#...#...#...#...###...#.....#.......#...###.............#...#
#.#######.#.#.#.#.###.#.#.#.###.#.###.#.###.#########.#.###.#.#.#.###.#.#.###.#.#.#.#.#.#.#.#.#.###.#.#.###.#.#####.#.#.###.###########.#.#.#
#.......#.#.#.#.#.#...#...#.#...#...#.#.....#...#...#.#...#.#.#.#...#.#.#.#...#...#.#.#.#.#.#.#...#.#.#.#...#...#...#.#.#...#...#.......#.#.#
#######.#.#.#.#.#.#.#######.#.#####.#.#######.#.#.#.#.###.#.#.#.###.#.#.#.#.#######.#.#.#.#.#.###.#.#.#.#.#####.#.###.#.#.###.#.#.#######.#.#
###...#.#.#.#.#.#.#.......#...#...#.#.#.......#...#...#...#.#.#.###.#.#.#.#.#.......#.#.#.#.#...#.#.#...#.#...#.#.#...#.#.#...#...###...#.#.#
###.#.#.#.#.#.#.#.#######.#####.#.#.#.#.###############.###.#.#.###.#.#.#.#.#.#######.#.#.#.###.#.#.#####.#.#.#.#.#.###.#.#.#########.#.#.#.#
#...#...#.#.#.#.#.###...#.....#.#...#.#.#...#...#...###...#.#.#.....#.#.#...#.......#.#.#.#.#...#.#.....#.#.#.#.#...#...#.#.#...#...#.#.#.#.#
#.#######.#.#.#.#.###.#.#####.#.#####.#.#.#.#.#.#.#.#####.#.#.#######.#.###########.#.#.#.#.#.###.#####.#.#.#.#.#####.###.#.#.#.#.#.#.#.#.#.#
#...#.....#.#...#.....#.#.....#...#...#.#.#.#.#...#.#.....#.#.......#.#.#...........#.#.#.#.#...#.......#...#.#.....#...#.#.#.#.#.#.#.#...#.#
###.#.#####.###########.#.#######.#.###.#.#.#.#####.#.#####.#######.#.#.#.###########.#.#.#.###.#############.#####.###.#.#.#.#.#.#.#.#####.#
#...#.#...#...........#.#.....#...#...#.#.#...#.....#.#...#...###...#.#.#.###...#...#.#.#.#...#.#...#.......#.###...#...#.#...#...#...#.....#
#.###.#.#.###########.#.#####.#.#####.#.#.#####.#####.#.#.###.###.###.#.#.###.#.#.#.#.#.#.###.#.#.#.#.#####.#.###.###.###.#############.#####
#...#.#.#.###.....#...#.......#.....#.#.#...#...#...#...#...#...#...#.#.#...#.#.#.#...#.#.#...#...#...#...#.#.#...#...#...#...#.........#...#
###.#.#.#.###.###.#.###############.#.#.###.#.###.#.#######.###.###.#.#.###.#.#.#.#####.#.#.###########.#.#.#.#.###.###.###.#.#.#########.#.#
#...#...#.....#...#...#...........#.#.#.....#...#.#.###...#.#...###.#.#.#...#.#...#.....#.#.#...#####...#.#.#.#.#...#...#...#.#...........#.#
#.#############.#####.#.#########.#.#.#########.#.#.###.#.#.#.#####.#.#.#.###.#####.#####.#.#.#.#####.###.#.#.#.#.###.###.###.#############.#
#.......#.....#...###...#...#.....#.#.....#.....#.#...#.#.#.#.......#...#...#.....#.#...#.#.#.#...#...#...#.#.#.#.....#...###.......#.......#
#######.#.###.###.#######.#.#.#####.#####.#.#####.###.#.#.#.###############.#####.#.#.#.#.#.#.###.#.###.###.#.#.#######.###########.#.#######
#.....#...###...#...###...#.#.#...#.#.....#...###.#...#.#.#.......#.......#...#...#.#.#.#.#.#...#.#...#.#...#...#.....#.........###.#.......#
#.###.#########.###.###.###.#.#.#.#.#.#######.###.#.###.#.#######.#.#####.###.#.###.#.#.#.#.###.#.###.#.#.#######.###.#########.###.#######.#
#...#...###...#...#...#...#...#.#...#.......#.....#.###.#.....###...#.....#...#.#...#.#...#.#...#.#...#.#.#.......###.#.......#.#...#...#...#
###.###.###.#.###.###.###.#####.###########.#######.###.#####.#######.#####.###.#.###.#####.#.###.#.###.#.#.#########.#.#####.#.#.###.#.#.###
#...#...#...#...#...#...#.....#...#.....#...#.......#...#.....#.....#.....#.#...#.#...#.....#...#.#...#.#.#.........#.#.....#...#.....#...###
#.###.###.#####.###.###.#####.###.#.###.#.###.#######.###.#####.###.#####.#.#.###.#.###.#######.#.###.#.#.#########.#.#####.#################
#...#...#.....#.###...#.#...#...#.#.#...#...#.###...#...#.....#...#...#...#...#...#...#.....#...#.#...#...#.....#...#.......#...#.....#.....#
###.###.#####.#.#####.#.#.#.###.#.#.#.#####.#.###.#.###.#####.###.###.#.#######.#####.#####.#.###.#.#######.###.#.###########.#.#.###.#.###.#
#...#...###...#.#.....#...#.....#.#.#.#.....#...#.#.#...#.....#...#...#...#.....#####.....#...#...#...#.....###...#...###...#.#...#...#.#...#
#.###.#####.###.#.###############.#.#.#.#######.#.#.#.###.#####.###.#####.#.#############.#####.#####.#.###########.#.###.#.#.#####.###.#.###
#.#...#...#...#.#.......#...#...#...#.#.#.......#.#...#...#...#...#.#####.#.#...###...###...#...#...#.#...#.....###.#.....#.#.#.....###.#...#
#.#.###.#.###.#.#######.#.#.#.#.#####.#.#.#######.#####.###.#.###.#.#####.#.#.#.###.#.#####.#.###.#.#.###.#.###.###.#######.#.#.#######.###.#
#.#...#.#...#.#.#.......#.#...#.#...#.#.#.#.....#.....#.....#.#...#...#...#.#.#...#.#.#.....#...#.#.#.#...#.#...#...#.......#.#.........#...#
#.###.#.###.#.#.#.#######.#####.#.#.#.#.#.#.###.#####.#######.#.#####.#.###.#.###.#.#.#.#######.#.#.#.#.###.#.###.###.#######.###########.###
#.#...#.#...#.#...#.......#...#.#.#.#.#.#.#.#...#...#.......#.#...#...#...#.#.#...#.#.#.....#...#.#.#.#.###.#.....#...#...###.#.........#...#
#.#.###.#.###.#####.#######.#.#.#.#.#.#.#.#.#.###.#.#######.#.###.#.#####.#.#.#.###.#.#####.#.###.#.#.#.###.#######.###.#.###.#.#######.###.#
#.#.#...#...#.......#...###.#.#...#.#...#.#.#.#...#...#...#.#...#.#.#...#.#.#.#...#.#.#...#.#.#...#.#.#.....#.....#.....#.....#.......#...#.#
#.#.#.#####.#########.#.###.#.#####.#####.#.#.#.#####.#.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#######.###.###################.###.#.#
#.#.#.....#.#...#.....#...#.#.....#.....#.#.#.#...#...#.#.#...#.#.#...#.#.#...###...#...#.#.#...###.#...#.....###...#.......#...#...#.#...#.#
#.#.#####.#.#.#.#.#######.#.#####.#####.#.#.#.###.#.###.#.###.#.#.#####.#.###############.#.#######.###.#.#########.#.#####.#.#.#.#.#.#.###.#
#.#.......#.#.#.#.......#.#.....#.......#...#...#.#.#...#...#.#...#.....#...........#.....#...#...#.....#.........#.#.....#.#.#...#.#.#...#.#
#.#########.#.#.#######.#.#####.###############.#.#.#.#####.#.#####.###############.#.#######.#.#.###############.#.#####.#.#.#####.#.###.#.#
#.........#.#.#.#...#...#...###.............#...#.#.#...#...#.#.....#.....#.....#...#.....#...#.#.................#.......#...#...#...#...#.#
#########.#.#.#.#.#.#.#####.###############.#.###.#.###.#.###.#.#####.###.#.###.#.#######.#.###.###############################.#.#####.###.#
#.........#...#...#...#...#...#.........#...#...#.#.#...#...#.#...#...#E..#...#.#...#.....#...#.....#...........................#.....#...#.#
#.#####################.#.###.#.#######.#.#####.#.#.#.#####.#.###.#.#########.#.###.#.#######.#####.#.###############################.###.#.#
#.........#...#.........#.#...#.......#.#.....#...#.#.#...#...###...#########.#.#...#.#...#...#.....#.#.........#.............#...#...#...#.#
#########.#.#.#.#########.#.#########.#.#####.#####.#.#.#.###################.#.#.###.#.#.#.###.#####.#.#######.#.###########.#.#.#.###.###.#
#.........#.#.#.#.........#.....###...#.#.....#.....#...#.....###############.#.#.#...#.#.#...#.......#.......#...#.........#...#.#...#.....#
#.#########.#.#.#.#############.###.###.#.#####.#############.###############.#.#.#.###.#.###.###############.#####.#######.#####.###.#######
#.........#.#.#.#.......#.....#.....###...#...#.....#...#.....###############.#...#.#...#...#.#...............#...#.#.....#.....#...#.#.....#
#########.#.#.#.#######.#.###.#############.#.#####.#.#.#.###################.#####.#.#####.#.#.###############.#.#.#.###.#####.###.#.#.###.#
#.........#.#.#.#.....#...###.......#...#...#.....#.#.#.#.....###############.....#...#...#...#...#.............#...#...#.......#...#...#...#
#.#########.#.#.#.###.#############.#.#.#.#######.#.#.#.#####.###################.#####.#.#######.#.###################.#########.#######.###
#...#...#...#...#...#.............#...#...#.......#...#.#.....###################.....#.#.........#.#...........#.......#.....###.......#...#
###.#.#.#.#########.#############.#########.###########.#.###########################.#.###########.#.#########.#.#######.###.#########.###.#
###...#...#.........#...#.......#.....#...#.....#...#...#.....###################...#.#...#.........#.........#...#...#...#...#...#...#.....#
###########.#########.#.#.#####.#####.#.#.#####.#.#.#.#######.###################.#.#.###.#.#################.#####.#.#.###.###.#.#.#.#######
#...###...#...........#...#.....#...#...#.......#.#.#.........###################.#...###...#...............#.......#.#.#...###.#...#.......#
#.#.###.#.#################.#####.#.#############.#.#############################.###########.#############.#########.#.#.#####.###########.#
#.#...#.#.#...#...#.........#.....#...............#.......#...###################...#...#...#.....#.......#.....#...#...#.#...#.#...........#
#.###.#.#.#.#.#.#.#.#########.###########################.#.#.#####################.#.#.#.#.#####.#.#####.#####.#.#.#####.#.#.#.#.###########
#...#...#...#.#.#.#...#.......#...#...#...#...#...#...#...#.#...#############...#...#.#...#.......#.#.....#...#...#.....#...#...#.....#.....#
###.#########.#.#.###.#.#######.#.#.#.#.#.#.#.#.#.#.#.#.###.###.#############.#.#.###.#############.#.#####.#.#########.#############.#.###.#
###.....#...#...#.###...#...#...#...#...#.#.#...#.#.#...#...#...#############.#.#.#...#...#.........#.......#...#.....#...............#.#...#
#######.#.#.#####.#######.#.#.###########.#.#####.#.#####.###.###############.#.#.#.###.#.#.###################.#.###.#################.#.###
###...#...#.....#.....#...#...#.....#...#...#...#...#...#...#.###############.#...#.....#.#.#.........###.......#.#...#.......#...###...#...#
###.#.#########.#####.#.#######.###.#.#.#####.#.#####.#.###.#.###############.###########.#.#.#######.###.#######.#.###.#####.#.#.###.#####.#
#...#...........#...#...#...#...###...#...#...#.......#.....#...#...###...#S..###...#...#...#...#...#.....#...#...#...#.#.....#.#...#.#...#.#
#.###############.#.#####.#.#.###########.#.###################.#.#.###.#.#######.#.#.#.#######.#.#.#######.#.#.#####.#.#.#####.###.#.#.#.#.#
#...#.....#...#...#...#...#...#.......#...#...#...........#...#...#.....#...#.....#.#.#.###...#...#.........#...#...#...#...###.#...#.#.#...#
###.#.###.#.#.#.#####.#.#######.#####.#.#####.#.#########.#.#.#############.#.#####.#.#.###.#.###################.#.#######.###.#.###.#.#####
###...#...#.#.#.#...#...#...###.....#.#...#...#.....#...#.#.#.#...#.....#...#...#...#.#.....#.......#...........#.#.#.....#.....#.....#.....#
#######.###.#.#.#.#.#####.#.#######.#.###.#.#######.#.#.#.#.#.#.#.#.###.#.#####.#.###.#############.#.#########.#.#.#.###.#################.#
###...#.....#...#.#.......#.......#.#.....#.#.......#.#.#...#...#.#...#.#.#.....#...#.............#.#.........#...#...###.....#.....#.......#
###.#.###########.###############.#.#######.#.#######.#.#########.###.#.#.#.#######.#############.#.#########.###############.#.###.#.#######
#...#.#...#...###...............#.#.....#...#.#...#...#.....#.....#...#...#.......#...#...#.......#.....#...#.........#...###...###.#.......#
#.###.#.#.#.#.#################.#.#####.#.###.#.#.#.#######.#.#####.#############.###.#.#.#.###########.#.#.#########.#.#.#########.#######.#
#...#.#.#...#...................#.....#.#...#...#...#.......#.......###.....#...#...#.#.#.#...........#...#.#.......#...#.........#.#.......#
###.#.#.#############################.#.###.#########.#################.###.#.#.###.#.#.#.###########.#####.#.#####.#############.#.#.#######
#...#...#.....#.....................#.#.....#.......#.......#.....#...#...#...#.....#...#.....#.....#.....#.#.....#...#...#...#...#.#.#...###
#.#######.###.#.###################.#.#######.#####.#######.#.###.#.#.###.###################.#.###.#####.#.#####.###.#.#.#.#.#.###.#.#.#.###
#...#.....###.#.#.................#.#.#.....#.#...#.......#...#...#.#.###.........#...#.....#.#...#.###...#.....#...#.#.#.#.#...#...#...#...#
###.#.#######.#.#.###############.#.#.#.###.#.#.#.#######.#####.###.#.###########.#.#.#.###.#.###.#.###.#######.###.#.#.#.#.#####.#########.#
###.#.#.....#...#...............#...#.#.#...#...#.......#.......#...#.#...#...#...#.#.#.#...#.###.#...#.......#.....#...#...#...#.....#...#.#
###.#.#.###.###################.#####.#.#.#############.#########.###.#.#.#.#.#.###.#.#.#.###.###.###.#######.###############.#.#####.#.#.#.#
#...#.#...#.#...###.............#...#...#...#.....#...#...#...###...#...#.#.#.#...#.#.#.#...#.....#...#.......#.......#...###.#...###...#...#
#.###.###.#.#.#.###.#############.#.#######.#.###.#.#.###.#.#.#####.#####.#.#.###.#.#.#.###.#######.###.#######.#####.#.#.###.###.###########
#.....###.#.#.#.#...#.....#.......#.......#.#...#...#.....#.#.....#...#...#.#...#...#...###...#...#...#.......#.#.....#.#...#...#.#.........#
#########.#.#.#.#.###.###.#.#############.#.###.###########.#####.###.#.###.###.#############.#.#.###.#######.#.#.#####.###.###.#.#.#######.#
#...#.....#.#.#.#.....#...#.#.............#.#...#.......###.#.....#...#...#...#...#...#...###...#...#.......#.#.#...###...#.....#.#.#.......#
#.#.#.#####.#.#.#######.###.#.#############.#.###.#####.###.#.#####.#####.###.###.#.#.#.#.#########.#######.#.#.###.#####.#######.#.#.#######
#.#.#.....#.#.#.#...###.....#...#...#...###.#...#.....#.#...#...#...#.....#...#...#.#.#.#.#...#.....#.....#...#.#...#...#.#.....#...#.......#
#.#.#####.#.#.#.#.#.###########.#.#.#.#.###.###.#####.#.#.#####.#.###.#####.###.###.#.#.#.#.#.#.#####.###.#####.#.###.#.#.#.###.###########.#
#.#.#.....#...#...#.#...#.....#...#...#...#.#...#.....#.#.....#.#.#...#...#.#...###.#.#.#.#.#.#.......###.......#.....#...#...#.#...#...#...#
#.#.#.#############.#.#.#.###.###########.#.#.###.#####.#####.#.#.#.###.#.#.#.#####.#.#.#.#.#.###############################.#.#.#.#.#.#.###
#.#.#.....#.......#.#.#.#...#.#...........#...###.....#...###.#.#.#...#.#...#.....#.#...#.#.#...#...........#.....#...#...#...#...#.#.#...###
#.#.#####.#.#####.#.#.#.###.#.#.#####################.###.###.#.#.###.#.#########.#.#####.#.###.#.#########.#.###.#.#.#.#.#.#######.#.#######
#.#.......#.#.....#...#...#.#.#.................#.....#...#...#.#.#...#.........#.#...#...#...#.#.........#.#...#...#...#.#.......#.#...#...#
#.#########.#.###########.#.#.#################.#.#####.###.###.#.#.###########.#.###.#.#####.#.#########.#.###.#########.#######.#.###.#.#.#
#.#.........#...........#...#.....#.............#.....#.#...#...#.#.###...#.....#.#...#.#.....#.#...#.....#.....###...###.........#.....#.#.#
#.#.###################.#########.#.#################.#.#.###.###.#.###.#.#.#####.#.###.#.#####.#.#.#.#############.#.###################.#.#
#...#.......###...#.....#...#...#...#.....#.....#.....#.#...#.#...#...#.#.#.#...#.#.#...#...#...#.#.#...........#...#.....###...###.......#.#
#####.#####.###.#.#.#####.#.#.#.#####.###.#.###.#.#####.###.#.#.#####.#.#.#.#.#.#.#.#.#####.#.###.#.###########.#.#######.###.#.###.#######.#
###...#...#.....#...#...#.#...#.....#.#...#...#.#.....#.###.#.#...#...#.#.#...#.#.#.#.#...#.#.###.#.#...#.....#...#.......#...#.....#.......#
###.###.#.###########.#.#.#########.#.#.#####.#.#####.#.###.#.###.#.###.#.#####.#.#.#.#.#.#.#.###.#.#.#.#.###.#####.#######.#########.#######
#...#...#.......#...#.#...###.......#.#...#...#...#...#.#...#.#...#.#...#...#...#.#.#.#.#.#.#.#...#...#.#...#.#...#.#...#...#.....#...#.....#
#.###.#########.#.#.#.#######.#######.###.#.#####.#.###.#.###.#.###.#.#####.#.###.#.#.#.#.#.#.#.#######.###.#.#.#.#.#.#.#.###.###.#.###.###.#
#...#.#.........#.#.#.#.......#.....#.#...#...###...###.#...#.#.#...#.#.....#.###.#.#.#.#.#.#.#.....###...#.#.#.#.#...#.#...#.###.#.###.#...#
###.#.#.#########.#.#.#.#######.###.#.#.#####.#########.###.#.#.#.###.#.#####.###.#.#.#.#.#.#.#####.#####.#.#.#.#.#####.###.#.###.#.###.#.###
###...#.......#...#.#.#.#.......#...#.#...#...#.........#...#.#.#.....#.#...#...#.#.#.#.#.#.#.#.....#.....#.#.#.#.....#.....#...#.#.....#...#
#############.#.###.#.#.#.#######.###.###.#.###.#########.###.#.#######.#.#.###.#.#.#.#.#.#.#.#.#####.#####.#.#.#####.#########.#.#########.#
#...#.........#.###...#...#.......#...###.#.###...#.....#.#...#.......#...#.#...#.#.#.#.#.#.#.#.#.....#...#.#.#.....#...#...#...#.....#...#.#
#.#.#.#########.###########.#######.#####.#.#####.#.###.#.#.#########.#####.#.###.#.#.#.#.#.#.#.#.#####.#.#.#.#####.###.#.#.#.#######.#.#.#.#
#.#.#.....#...#.......#.....#...#...#...#.#.#.....#...#...#...#.....#.#.....#...#...#.#.#...#...#...#...#.#.#...#...###.#.#.#.......#.#.#.#.#
#.#.#####.#.#.#######.#.#####.#.#.###.#.#.#.#.#######.#######.#.###.#.#.#######.#####.#.###########.#.###.#.###.#.#####.#.#.#######.#.#.#.#.#
#.#.......#.#.#.......#.....#.#.#.#...#...#.#.#...#...###.....#.###...#.....#...#...#...#...........#.###.#...#.#.#.....#.#.........#.#.#.#.#
#.#########.#.#.###########.#.#.#.#.#######.#.#.#.#.#####.#####.###########.#.###.#.#####.###########.###.###.#.#.#.#####.###########.#.#.#.#
#...........#.#.###...###...#.#.#.#...#.....#...#.#.#.....#...#.......#.....#.....#.....#...........#...#...#.#...#.#...#...###.....#.#.#.#.#
#############.#.###.#.###.###.#.#.###.#.#########.#.#.#####.#.#######.#.###############.###########.###.###.#.#####.#.#.###.###.###.#.#.#.#.#
#...#.......#.#.....#...#.#...#.#.###...###.......#.#.......#...#.....#...#...#...#...#...#.........#...###.#...#...#.#...#...#...#.#...#...#
#.#.#.#####.#.#########.#.#.###.#.#########.#######.###########.#.#######.#.#.#.#.#.#.###.#.#########.#####.###.#.###.###.###.###.#.#########
#.#.#.....#...#.....#...#.#...#.#.#.........#...#...#.........#...#...#...#.#.#.#...#...#.#.#.......#.....#.#...#.#...#...#...###.#.........#
#.#.#####.#####.###.#.###.###.#.#.#.#########.#.#.###.#######.#####.#.#.###.#.#.#######.#.#.#.#####.#####.#.#.###.#.###.###.#####.#########.#
#.#.......#...#...#.#.#...#...#.#.#.#.....#...#.#...#...#...#...###.#...#...#.#.......#.#.#...#.....#.....#.#...#.#...#...#.......#...#...#.#
#.#########.#.###.#.#.#.###.###.#.#.#.###.#.###.###.###.#.#.###.###.#####.###.#######.#.#.#####.#####.#####.###.#.###.###.#########.#.#.#.#.#
#.#.......#.#.#...#.#.#...#...#...#...#...#.#...#...#...#.#...#.....#.....###.#.......#...#.....#...#.....#.....#.....###.......#...#...#.#.#
#.#.#####.#.#.#.###.#.###.###.#########.###.#.###.###.###.###.#######.#######.#.###########.#####.#.#####.#####################.#.#######.#.#
#.#.#.....#.#.#.###...###...#...###...#.....#...#...#...#.###...#...#.......#.#...#.......#.#.....#.#...#...............#.......#.....###...#
#.#.#.#####.#.#.###########.###.###.#.#########.###.###.#.#####.#.#.#######.#.###.#.#####.#.#.#####.#.#.###############.#.###########.#######
#.#.#...#...#.#.....#...#...#...#...#.#...#.....#...###.#.#.....#.#.#...#...#...#...#...#.#.#...#...#.#.#.......#.....#.#...#...#...#...#...#
#.#.###.#.###.#####.#.#.#.###.###.###.#.#.#.#####.#####.#.#.#####.#.#.#.#.#####.#####.#.#.#.###.#.###.#.#.#####.#.###.#.###.#.#.#.#.###.#.#.#
#...#...#...#.#...#.#.#...#...###...#...#...#...#...#...#.#.#...#.#.#.#.#.....#...#...#...#...#.#...#.#.#.....#.#...#...#...#.#.#.#.#...#.#.#
#####.#####.#.#.#.#.#.#####.#######.#########.#.###.#.###.#.#.#.#.#.#.#.#####.###.#.#########.#.###.#.#.#####.#.###.#####.###.#.#.#.#.###.#.#
#...#...#...#.#.#...#.#...#.###.....#...#.....#.#...#...#.#...#...#...#.#...#.###.#.....#####...###.#.#.......#.#...#.....#...#.#.#.#.....#.#
#.#.###.#.###.#.#####.#.#.#.###.#####.#.#.#####.#.#####.#.#############.#.#.#.###.#####.###########.#.#########.#.###.#####.###.#.#.#######.#
#.#.....#...#.#.#.....#.#.#...#...#...#...#.....#...###.#.###...........#.#...#...#...#...#...#.....#.........#.#.###.....#.###.#.#.#...#...#
#.#########.#.#.#.#####.#.###.###.#.#######.#######.###.#.###.###########.#####.###.#.###.#.#.#.#############.#.#.#######.#.###.#.#.#.#.#.###
#.#...#...#.#.#.#...#...#...#...#.#.#.......#...#...#...#.#...#...#...#...#.....#...#...#...#.#...#...#...#...#.#.#.......#...#.#.#.#.#.#...#
#.#.#.#.#.#.#.#.###.#.#####.###.#.#.#.#######.#.#.###.###.#.###.#.#.#.#.###.#####.#####.#####.###.#.#.#.#.#.###.#.#.#########.#.#.#.#.#.###.#
#...#...#...#...###...#####.....#...#.........#...###.....#.....#...#...###.......#####.......###...#...#...###...#...........#...#...#.....#
#############################################################################################################################################

181
2024/go/day21/day21.go Normal file
View File

@@ -0,0 +1,181 @@
package day21
import (
"adventofcode2024/utils"
"adventofcode2024/utils/dijkstra"
"adventofcode2024/utils/memo"
"fmt"
"math"
"strings"
)
type Pair struct {
s dijkstra.Point
d dijkstra.Point
}
type Path struct {
path []dijkstra.Point
path_str string
cost int
}
type State struct {
code string
depth int
isNumericPad bool
}
var numericPad = map[dijkstra.Point]string{
{X: 0, Y: 0}: "7", {X: 1, Y: 0}: "8", {X: 2, Y: 0}: "9",
{X: 0, Y: 1}: "4", {X: 1, Y: 1}: "5", {X: 2, Y: 1}: "6",
{X: 0, Y: 2}: "1", {X: 1, Y: 2}: "2", {X: 2, Y: 2}: "3",
{X: 1, Y: 3}: "0", {X: 2, Y: 3}: "A",
}
var directionPad = map[dijkstra.Point]string{
{X: 1, Y: 0}: "^", {X: 2, Y: 0}: "A",
{X: 0, Y: 1}: "<", {X: 1, Y: 1}: "v", {X: 2, Y: 1}: ">",
}
var directions = []dijkstra.Point{{X: 0, Y: 1}, {X: 0, Y: -1}, {X: 1, Y: 0}, {X: -1, Y: 0}}
var lookup_np = get_paths(numericPad)
var lookup_dp = get_paths(directionPad)
var m *memo.Memo
func init() {
m = memo.New(get_shortest_path)
}
func Part1(input string) int {
codes := strings.Split(input, "\n")
cost := 0
for _, code := range codes {
initialState := State{
code: code,
depth: 2,
isNumericPad: true,
}
result := m.Get(initialState).(int)
cost += result * utils.MustAtoi(code[:len(code)-1])
}
return cost
}
func Part2(input string) int {
codes := strings.Split(input, "\n")
cost := 0
for _, code := range codes {
initialState := State{
code: code,
depth: 25,
isNumericPad: true,
}
result := m.Get(initialState).(int)
cost += result * utils.MustAtoi(code[:len(code)-1])
}
return cost
}
func get_paths(in map[dijkstra.Point]string) map[Pair][]Path {
lookup := make(map[Pair][]Path)
data := dijkstra.InputGraph{}
for p := range in {
for _, dir := range directions {
np := dijkstra.Point{X: p.X + dir.X, Y: p.Y + dir.Y}
if in[np] != "" {
data.Graph = append(data.Graph, dijkstra.InputData{
Source: p,
Destination: np,
Weight: 1,
})
}
}
}
graph := dijkstra.CreateGraph(data)
for s := range in {
for d := range in {
paths, cost := dijkstra.GetAllShortestPaths(s, d, graph)
for _, path := range paths {
path_str := ""
for x := 1; x < len(path); x++ {
f := path[x-1]
t := path[x]
switch {
case f.X == t.X && f.Y < t.Y:
// Moving verticallY down
path_str += "v"
case f.X == t.X && f.Y > t.Y:
// Moving verticallY up
path_str += "^"
case f.Y == t.Y && f.X < t.X:
// Moving horizontallY right
path_str += ">"
case f.Y == t.Y && f.X > t.X:
// Moving horizontally left
path_str += "<"
default:
// No matching case or invalid input
fmt.Println("Invalid direction")
}
}
lookup[Pair{s, d}] = append(lookup[Pair{s, d}], Path{path, path_str, cost})
}
}
}
return lookup
}
func find_point(in string, lookup map[dijkstra.Point]string) dijkstra.Point {
for k, v := range lookup {
if v == in {
return k
}
}
return dijkstra.Point{}
}
func get_shortest_path(key interface{}) interface{} {
state := key.(State)
if state.depth < 0 {
return len(state.code)
}
// (Optional) If you need to modify the state, work on a copy.
newState := state
newState.code = "A" + state.code
cost := 0
for x := 0; x<len(newState.code)-1; x++ {
pps := shortest_paths(string(newState.code[x]), string(newState.code[x+1]), newState.isNumericPad)
min := math.MaxInt // Start with a very high number not just 65535
for _, pp := range pps {
nextState := State{
code: pp.path_str + "A",
depth: newState.depth - 1,
isNumericPad: false,
}
mm := m.Get(nextState).(int)
if mm < min {
min = mm
}
}
cost += min
}
return cost
}
func shortest_paths(s, d string, isNumericPad bool) []Path {
if isNumericPad {
return lookup_np[Pair{s: find_point(s, numericPad), d: find_point(d, numericPad)}]
} else {
return lookup_dp[Pair{s: find_point(s, directionPad), d: find_point(d, directionPad)}]
}
}

View File

@@ -0,0 +1,25 @@
package day21
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`029A
980A
179A
456A
379A`)
require.Equal(t, 126384, r)
}
func TestPart2(t *testing.T) {
r := Part2(`029A
980A
179A
456A
379A`)
require.Equal(t, 126384, r)
}

5
2024/go/day21/input.txt Normal file
View File

@@ -0,0 +1,5 @@
480A
965A
140A
341A
285A

9
2024/go/day21/tt Normal file
View File

@@ -0,0 +1,9 @@
v<A <A A >>^A v<<A>A<A>>^AvAA<^A>AvA<^A>vA^A
<vA <A A >>^A vA A <^A >A <v<A>>^AvA^A<vA>^A<v<A>^A>AAvA^A<v<A>A>^AAAvA<^A>A
v < < A > > ^ A <A>AvA<^AA>A<vAAA>^A
< A ^A>^^AvvvA
0 29A

Binary file not shown.

91
2024/go/day22/day22.go Normal file
View File

@@ -0,0 +1,91 @@
package day22
import (
"adventofcode2024/utils"
rb "adventofcode2024/utils/ringbuffer"
"strconv"
"strings"
)
func Part1(input string) int {
var secret uint
total := 0
secrets := strings.Split(input, "\n")
for _, secret_str := range secrets {
secret = uint(utils.MustAtoi(secret_str))
for i := 0; i < 2000; i++ {
secret ^= secret * 64
secret %= 16777216
secret ^= secret / 32
secret %= 16777216
secret ^= secret * 2048
secret %= 16777216
}
total += int(secret)
}
return total
}
func Part2(input string) int {
var secret uint
var banannas0, banannas1, banannas2, banannas3, banannas4 int
seq_map := make(map[string]int)
total := 0
ringBuffer := rb.NewRingBuffer[uint](5)
secrets := strings.Split(input, "\n")
for _, secret_str := range secrets {
found_map := make(map[string]bool)
secret = uint(utils.MustAtoi(secret_str))
for i := 0; i < 2000; i++ {
secret = get_next_secret(secret)
ringBuffer.Add(secret)
if ringBuffer.Len() < 5 { continue }
ring := ringBuffer.Get()
banannas0 = get_bannnas(ring[0])
banannas1 = get_bannnas(ring[1])
banannas2 = get_bannnas(ring[2])
banannas3 = get_bannnas(ring[3])
banannas4 = get_bannnas(ring[4])
map_str := diff_bannanas(banannas1, banannas0) +
diff_bannanas(banannas2, banannas1) +
diff_bannanas(banannas3, banannas2) +
diff_bannanas(banannas4, banannas3)
if _, ok := found_map[map_str]; !ok {
seq_map[map_str] += banannas4
found_map[map_str] = true
}
}
}
for _, v := range seq_map {
if v > total {
total = v
}
}
return total
}
func get_next_secret(in uint) uint {
in ^= in * 64
in %= 16777216
in ^= in / 32
in %= 16777216
in ^= in * 2048
in %= 16777216
return in
}
func get_bannnas(secret uint) int {
return int(secret) % 10
}
func diff_bannanas(a, b int) string {
ret := ""
diff := a - b
if diff >= 0 {
ret = "+" + strconv.Itoa(diff)
} else {
ret = strconv.Itoa(diff)
}
return ret
}

View File

@@ -0,0 +1,20 @@
package day22
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1("1")
require.Equal(t, 8685429, r)
}
func TestPart2(t *testing.T) {
r := Part2(`1
2
3
2024`)
require.Equal(t, 23, r)
}

2154
2024/go/day22/input.txt Normal file

File diff suppressed because it is too large Load Diff

242
2024/go/day23/day23.go Normal file
View File

@@ -0,0 +1,242 @@
package day23
import (
"fmt"
"regexp"
"sort"
"strings"
)
type Lan struct {
nodes []*Node
}
type Node struct {
key string
adjacent []*Node
loops [][]*Node
}
func Part1(input string) int {
total := 0
lan := &Lan{}
pattern := `^([a-z]{2})-([a-z]{2})$`
re := regexp.MustCompile(pattern)
lines := strings.Split(input, "\n")
for _, line := range lines {
matches := re.FindAllStringSubmatch(line, -1)
for _, match := range matches {
lan.AddNode(match[1])
lan.AddNode(match[2])
lan.AddConnection(match[1], match[2])
lan.AddConnection(match[2], match[1])
}
}
for _, node := range lan.nodes {
if node.key[0] == 't' {
connections := node.adjacent
for _, connection := range connections {
c := lan.getNode(connection.key)
for _, n1 := range c.adjacent {
for _, n2 := range connections {
if n1.key == n2.key {
already_found := false
for _, loop := range node.loops {
if contains(loop, c.key) && contains(loop, n2.key) {
already_found = true
break
}
}
for _, loop := range c.loops {
if contains(loop, node.key) && contains(loop, n2.key) {
already_found = true
break
}
}
for _, loop := range n2.loops {
if contains(loop, c.key) && contains(loop, node.key) {
already_found = true
break
}
}
if !already_found {
already_found = true
total++
loop := make([]*Node, 0)
loop = append(loop, node)
loop = append(loop, c)
loop = append(loop, n2)
node.loops = append(node.loops, loop)
fmt.Printf("%v,%v,%v\n", node.key, c.key, n2.key)
}
}
}
}
}
}
}
lan.Print()
t := 0
for _, node := range lan.nodes {
if node.key[0] == 't' {
t += len(node.loops)
fmt.Printf("Node: %v\n", node.key)
for _, loop := range node.loops {
for _, n := range loop {
fmt.Printf(" %v ", n.key)
}
fmt.Println()
}
}
}
fmt.Printf("Total: %d\n", t)
return total
}
func Part2(input string) int {
total := 0
lan := &Lan{}
pattern := `^([a-z]{2})-([a-z]{2})$`
re := regexp.MustCompile(pattern)
lines := strings.Split(input, "\n")
for _, line := range lines {
matches := re.FindAllStringSubmatch(line, -1)
for _, match := range matches {
lan.AddNode(match[1])
lan.AddNode(match[2])
lan.AddConnection(match[1], match[2])
lan.AddConnection(match[2], match[1])
}
}
for _, node := range lan.nodes {
connections := node.adjacent
for _, connection := range connections {
c := lan.getNode(connection.key)
for _, n1 := range c.adjacent {
for _, n2 := range connections {
if n1.key == n2.key {
already_found := false
for _, loop := range node.loops {
if contains(loop, c.key) && contains(loop, n2.key) {
already_found = true
break
}
}
for _, loop := range c.loops {
if contains(loop, node.key) && contains(loop, n2.key) {
already_found = true
break
}
}
for _, loop := range n2.loops {
if contains(loop, c.key) && contains(loop, node.key) {
already_found = true
break
}
}
if !already_found {
already_found = true
total++
loop := make([]*Node, 0)
loop = append(loop, node)
loop = append(loop, c)
loop = append(loop, n2)
node.loops = append(node.loops, loop)
fmt.Printf("%v,%v,%v\n", node.key, c.key, n2.key)
}
}
}
}
}
}
lan.Print()
maxLoop := 0
var maxNode *Node
for _, node := range lan.nodes {
if len(node.loops) > maxLoop {
maxLoop = len(node.loops)
maxNode = node
}
}
fmt.Printf("Max: %d\n", len(maxNode.loops))
nodeList := make([]*Node, 0)
keyList := make([]string, 0)
for _, loop := range maxNode.loops {
for _, l := range loop {
if !contains(nodeList, l.key) {
nodeList = append(nodeList, l)
keyList = append(keyList, l.key)
}
}
}
sort.Strings(keyList)
fmt.Println(strings.Join(keyList, ","))
return len(nodeList)
}
func (g *Lan) AddNode(key string) {
if !contains(g.nodes, key) {
g.nodes = append(g.nodes, &Node{key: key})
}
}
func (g *Lan) AddConnection(from, to string) {
fromNode := g.getNode(from)
toNode := g.getNode(to)
if fromNode == nil || toNode == nil {
err := fmt.Errorf("Error: Invalid edge (%v --> %v)", from, to)
fmt.Println(err.Error())
} else if contains(fromNode.adjacent, to) {
err := fmt.Errorf("Error: Existing edge (%v --> %v)", from, to)
fmt.Println(err.Error())
} else {
fromNode.adjacent = append(fromNode.adjacent, toNode)
}
}
func (g *Lan) getNode(key string) *Node {
for i, v := range g.nodes {
if v.key == key {
return g.nodes[i]
}
}
return nil
}
func (g *Lan) Print() {
for _, v := range g.nodes {
fmt.Printf("\nNode %v : ", v.key)
for _, v := range v.adjacent {
fmt.Printf(" %v ", v.key)
}
fmt.Println()
for _, loop := range v.loops {
for _, v := range loop {
if v != nil {
fmt.Printf(" %v ", v.key)
}
}
fmt.Println()
}
}
}
func contains(list []*Node, key string) bool {
for _, v := range list {
if key == v.key {
return true
}
}
return false
}

View File

@@ -0,0 +1,79 @@
package day23
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`kh-tc
qp-kh
de-cg
ka-co
yn-aq
qp-ub
cg-tb
vc-aq
tb-ka
wh-tc
yn-cg
kh-ub
ta-co
de-co
tc-td
tb-wq
wh-td
ta-ka
td-qp
aq-cg
wq-ub
ub-vc
de-ta
wq-aq
wq-vc
wh-yn
ka-de
kh-ta
co-tc
wh-qp
tb-vc
td-yn`)
require.Equal(t, 7, r)
}
func TestPart2(t *testing.T) {
r := Part2(`kh-tc
qp-kh
de-cg
ka-co
yn-aq
qp-ub
cg-tb
vc-aq
tb-ka
wh-tc
yn-cg
kh-ub
ta-co
de-co
tc-td
tb-wq
wh-td
ta-ka
td-qp
aq-cg
wq-ub
ub-vc
de-ta
wq-aq
wq-vc
wh-yn
ka-de
kh-ta
co-tc
wh-qp
tb-vc
td-yn`)
require.Equal(t, "co,de,ka,ta", r)
}

3380
2024/go/day23/input.txt Normal file

File diff suppressed because it is too large Load Diff

297
2024/go/day24/day24.go Normal file
View File

@@ -0,0 +1,297 @@
package day24
import (
"adventofcode2024/utils"
"fmt"
"regexp"
"sort"
"strings"
)
type Network struct {
gates []*Gate
wires []*Wire
}
type State int
const (
NA State = iota - 1
ZERO
ONE
)
type Wire struct {
name string
state State
}
type Operation int
const (
AND Operation = iota
OR
XOR
)
type Gate struct {
in [2]*Wire
out *Wire
op Operation
}
func Part1(input string) int {
network := &Network{}
network.wires = make([]*Wire, 0)
data := strings.Split(input, "\n\n")
network.AddWires(data[0])
network.AddGates(data[1])
for {
if network.OutputKnown() {
break
}
for _, gate := range network.gates {
// fmt.Printf("%d: %v\n", i, gate)
if gate.out.state == NA && gate.in[0].state != NA && gate.in[1].state != NA {
switch gate.op {
case AND:
gate.out.state = And(gate.in[0].state, gate.in[1].state)
case OR:
gate.out.state = Or(gate.in[0].state, gate.in[1].state)
case XOR:
gate.out.state = Xor(gate.in[0].state, gate.in[1].state)
}
}
}
}
return int(network.Output())
}
func Part2(input string) int64 {
data := strings.Split(input, "\n\n")
inputs := strings.Split(data[0], "\n")
num_inputs := len(inputs) / 2
fmt.Println(num_inputs)
var x_value int64
var y_value int64
var z_value int64
y_value = 0
for i := 0; i < num_inputs; i++ {
// y_value = 1 << i
x_value = 1 << i
network := &Network{}
network.wires = make([]*Wire, 0)
network.AddWires2("x", num_inputs, x_value)
network.AddWires2("y", num_inputs, y_value)
network.AddGates(data[1])
// for i, gate := range network.gates {
// fmt.Printf("%d: %v\n", i, gate)
// }
network.SwapOutputs("z07", "rts")
network.SwapOutputs("z12", "jpj")
network.SwapOutputs("z26", "kgj")
network.SwapOutputs("vvw", "chv")
// for i, gate := range network.gates {
// fmt.Printf("%d: %v\n", i, gate)
// }
for {
if network.OutputKnown() {
break
}
for _, gate := range network.gates {
// fmt.Printf("%d: %v\n", i, gate)
if gate.out.state == NA && gate.in[0].state != NA && gate.in[1].state != NA {
switch gate.op {
case AND:
gate.out.state = And(gate.in[0].state, gate.in[1].state)
case OR:
gate.out.state = Or(gate.in[0].state, gate.in[1].state)
case XOR:
gate.out.state = Xor(gate.in[0].state, gate.in[1].state)
}
}
}
}
z_value = network.Output()
if x_value + y_value != z_value {
fmt.Printf("(%d):\t x:%4d\t: y:%4d z:%4d\n", i, x_value, y_value, z_value)
}
}
ans := []string{"z07", "rts", "z12", "jpj", "z26", "kgj", "vvw", "chv"}
sort.Strings(ans)
fmt.Println(strings.Join(ans, ","))
return z_value
}
func (n *Network) AddWires(data string) {
for _, line := range strings.Split(data, "\n") {
v := strings.Split(line, ": ")
n.AddWire(&Wire{name: v[0], state: to_state(v[1])})
}
}
func (n *Network) AddWire(wire *Wire) {
n.wires = append(n.wires, wire)
}
func (n *Network) AddWires2(w string, count int, value int64) {
for x := 0; x < count; x++ {
name := fmt.Sprintf("%s%02d", w, x)
v := fmt.Sprintf("%d", (value>>x)&1)
n.AddWire(&Wire{name: name, state: to_state(v)})
}
}
func (n *Network) AddGates(data string) {
// ntg XOR fgs -> mjb
pattern := `^([a-z0-9]{3}) (AND|OR|XOR) ([a-z0-9]{3}) -> ([a-z[0-9]{3})$`
re := regexp.MustCompile(pattern)
for _, line := range strings.Split(data, "\n") {
matches := re.FindAllStringSubmatch(line, -1)
for _, match := range matches {
n.AddGate(match[1], match[2], match[3], match[4], &n.wires)
}
}
}
func (n *Network) SwapOutputs(a, b string) {
_, wire1 := to_wire(a, n.wires)
_, wire2 := to_wire(b, n.wires)
for _, gate := range n.gates {
if gate.out.name == a {
gate.out = wire2
} else if gate.out.name == b {
gate.out = wire1
}
}
}
func (n *Network) AddGate(in0, op, in1, out string, wires *[]*Wire) {
var in [2]*Wire
var outw *Wire
*wires, in[0] = to_wire(in0, *wires)
*wires, in[1] = to_wire(in1, *wires)
*wires, outw = to_wire(out, *wires)
n.gates = append(n.gates, &Gate{in: in,
op: to_operation(op),
out: outw})
}
func (n *Network) OutputKnown() bool {
for _, gate := range n.gates {
if gate.out.name[0] != 'z' {
continue
}
if gate.out.state == NA {
return false
}
}
return true
}
func (n *Network) Output() int64 {
var ret int64
ret = 0
for _, gate := range n.gates {
if gate.out.name[0] != 'z' {
continue
}
addr := utils.MustAtoi(gate.out.name[1:])
if gate.out.state == ONE {
ret += 1 << addr
}
}
return ret
}
func (n Gate) String() string {
return n.in[0].name + "(" + n.in[0].state.String() + ")\t" + n.op.String() + " " + n.in[1].name + "(" + n.in[1].state.String() + ")\t ->\t" + n.out.name + " (" + n.out.state.String() + ")"
}
func to_state(in string) State {
switch in {
case "1":
return ONE
case "0":
return ZERO
}
return NA
}
func to_operation(in string) Operation {
var val Operation
switch in {
case "AND":
val = AND
case "OR":
val = OR
case "XOR":
val = XOR
}
return val
}
func to_wire(in string, wires []*Wire) ([]*Wire, *Wire) {
for _, v := range wires {
if in == v.name {
return wires, v
}
}
wire := Wire{name: in, state: NA}
wires = append(wires, &wire)
return wires, &wire
}
func And(a, b State) State {
if a == ONE && b == ONE {
return ONE
}
return ZERO
}
func Or(a, b State) State {
if a == ONE || b == ONE {
return ONE
}
return ZERO
}
func Xor(a, b State) State {
if (a == ONE && b == ZERO) || (a == ZERO && b == ONE) {
return ONE
}
return ZERO
}
func (state State) String() string {
switch state {
case NA:
return "NA"
case ZERO:
return "0"
case ONE:
return "1"
default:
return "Invalid"
}
}
func (op Operation) String() string {
switch op {
case OR:
return "OR"
case AND:
return "AND"
case XOR:
return "XOR"
default:
return "Invalid"
}
}

View File

@@ -0,0 +1,17 @@
package day24
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1("")
require.Equal(t, 0, r)
}
func TestPart2(t *testing.T) {
r := Part2("")
require.Equal(t, 0, r)
}

313
2024/go/day24/input.txt Normal file
View File

@@ -0,0 +1,313 @@
x00: 1
x01: 0
x02: 1
x03: 1
x04: 0
x05: 0
x06: 1
x07: 1
x08: 0
x09: 1
x10: 1
x11: 1
x12: 1
x13: 0
x14: 1
x15: 1
x16: 1
x17: 1
x18: 1
x19: 1
x20: 0
x21: 1
x22: 0
x23: 1
x24: 0
x25: 1
x26: 1
x27: 1
x28: 1
x29: 0
x30: 0
x31: 1
x32: 0
x33: 1
x34: 1
x35: 0
x36: 0
x37: 1
x38: 0
x39: 1
x40: 1
x41: 1
x42: 1
x43: 0
x44: 1
y00: 1
y01: 0
y02: 0
y03: 1
y04: 1
y05: 0
y06: 0
y07: 0
y08: 0
y09: 0
y10: 0
y11: 1
y12: 0
y13: 1
y14: 0
y15: 1
y16: 1
y17: 1
y18: 1
y19: 0
y20: 0
y21: 1
y22: 1
y23: 1
y24: 1
y25: 0
y26: 0
y27: 1
y28: 1
y29: 1
y30: 1
y31: 0
y32: 0
y33: 0
y34: 1
y35: 1
y36: 1
y37: 0
y38: 1
y39: 1
y40: 1
y41: 1
y42: 0
y43: 1
y44: 1
x03 AND y03 -> htr
gwb AND kvf -> pkd
x04 AND y04 -> jjm
qcm XOR twv -> z21
rrq XOR bmp -> z44
x43 AND y43 -> pnn
x06 XOR y06 -> qmt
x26 AND y26 -> z26
y00 AND x00 -> whb
jfq XOR fbb -> z36
y33 AND x33 -> mmb
x38 AND y38 -> vqt
bbh OR qtd -> jfq
cbs AND ttb -> qtd
wqs OR cmf -> tpf
x10 AND y10 -> bfm
djp OR pfb -> qvr
x20 XOR y20 -> vhb
kkd XOR cjg -> z32
qpp XOR stg -> z41
kkd AND cjg -> mdv
tpp OR pfj -> twv
www AND qdf -> vjf
y15 XOR x15 -> hmr
mtg XOR sqm -> z09
x33 XOR y33 -> chc
x41 AND y41 -> pkj
x31 AND y31 -> cvn
x09 AND y09 -> nvw
mtg AND sqm -> chg
pkr AND kcv -> thc
x07 XOR y07 -> cds
x15 AND y15 -> fpr
mwv AND jsg -> wdw
mwv XOR jsg -> z38
y16 XOR x16 -> svs
y14 XOR x14 -> fnq
wth OR vjf -> btv
bvp AND gdb -> stc
cjb XOR rjc -> z04
x13 AND y13 -> pfb
x30 AND y30 -> qgf
htq AND rtk -> dsm
x18 XOR y18 -> kvf
y12 AND x12 -> mqn
bcj XOR bkh -> z03
x07 AND y07 -> sdj
bdf OR wbw -> qkf
y30 XOR x30 -> kbn
tpf AND vhb -> tpp
hqd OR fpr -> hgh
vfm XOR hbw -> z23
x01 AND y01 -> bdf
nvw OR chg -> vgp
x21 XOR y21 -> qcm
bwg AND mfn -> djp
dnf OR pkj -> ksp
y44 AND x44 -> gqr
y11 AND x11 -> smr
smr OR dsm -> ksn
jkm OR pkd -> rjf
thc OR sqt -> rbd
qvr XOR fnq -> z14
cjb AND rjc -> fsb
svg XOR fmt -> z31
x06 AND y06 -> ssv
dtj OR vvq -> jvp
chv XOR fqf -> z34
cvr AND hck -> pjd
dqp AND nbm -> hvv
x29 AND y29 -> vvq
y13 XOR x13 -> mfn
ksn AND nft -> z12
jjd XOR whb -> z01
chc AND rnq -> vjh
y36 AND x36 -> kfn
cwh OR vvw -> ttb
qkf AND wsv -> pqc
rdj OR kfv -> gdb
x08 AND y08 -> jrr
x02 AND y02 -> vdf
x12 XOR y12 -> nft
ptf OR jrr -> sqm
tdv OR wjp -> cjw
qvr AND fnq -> mch
x28 XOR y28 -> cfj
gtn XOR qmt -> z06
mqn OR jpj -> bwg
x36 XOR y36 -> fbb
qht OR bfm -> htq
y42 AND x42 -> mkg
ksn XOR nft -> jpj
x20 AND y20 -> pfj
cmt AND nbq -> gmc
rbd XOR knm -> z25
pvj XOR ksp -> z42
kgj OR stc -> www
tpf XOR vhb -> z20
pjd OR dsg -> mwv
cbs XOR ttb -> z35
bfk OR jvm -> gwb
ffj XOR rpg -> z17
vjr OR kwg -> pkr
pvj AND ksp -> dkc
y37 XOR x37 -> cvr
btv XOR cfj -> z28
gtq OR qgf -> fmt
nbq XOR cmt -> z39
wgq AND dqj -> tws
x24 AND y24 -> sqt
whj OR pnn -> bmp
x02 XOR y02 -> wsv
stg AND qpp -> dnf
kbn XOR jvp -> z30
y39 AND x39 -> gwq
cds AND rkv -> nph
kvf XOR gwb -> z18
mkg OR dkc -> sch
bqh XOR rjf -> z19
hck XOR cvr -> z37
jmk OR ssv -> rkv
x21 AND y21 -> cgd
pqc OR vdf -> bkh
rff OR mts -> rpg
bkh AND bcj -> rhq
bnv OR bst -> stg
bwg XOR mfn -> z13
sgt AND scc -> bnv
btv AND cfj -> tdv
svs AND hgh -> rff
hbw AND vfm -> kwg
x40 XOR y40 -> scc
y17 AND x17 -> jvm
y34 AND x34 -> chv
y35 AND x35 -> bbh
mdv OR rft -> rnq
fqf AND chv -> cwh
y28 AND x28 -> wjp
sch AND srj -> whj
htr OR rhq -> rjc
x05 XOR y05 -> dqp
cvn OR qnk -> cjg
y14 AND x14 -> tfr
y11 XOR x11 -> rtk
jfq AND fbb -> trr
ppb AND hmr -> hqd
gtb OR hvv -> gtn
y44 XOR x44 -> rrq
rtk XOR htq -> z11
x01 XOR y01 -> jjd
hmv XOR rts -> z08
y10 XOR x10 -> vpc
jvp AND kbn -> gtq
cjw AND ntj -> dtj
x22 AND y22 -> prp
ppb XOR hmr -> z15
y18 AND x18 -> jkm
x39 XOR y39 -> nbq
jjd AND whb -> wbw
x34 XOR y34 -> vvw
x19 AND y19 -> wqs
gwq OR gmc -> sgt
rbd AND knm -> rdj
srj XOR sch -> z43
y05 AND x05 -> gtb
x08 XOR y08 -> hmv
y25 AND x25 -> kfv
cgd OR jth -> dqj
vpc XOR vgp -> z10
tws OR prp -> hbw
jjm OR fsb -> nbm
wdw OR vqt -> cmt
rrq AND bmp -> cbv
rts AND hmv -> ptf
svs XOR hgh -> z16
y41 XOR x41 -> qpp
ntj XOR cjw -> z29
ffj AND rpg -> bfk
gqr OR cbv -> z45
x25 XOR y25 -> knm
chc XOR rnq -> z33
y43 XOR x43 -> srj
vgp AND vpc -> qht
x00 XOR y00 -> z00
cds XOR rkv -> rts
x24 XOR y24 -> kcv
x32 AND y32 -> rft
nbm XOR dqp -> z05
x35 XOR y35 -> cbs
mch OR tfr -> ppb
x16 AND y16 -> mts
www XOR qdf -> z27
x23 AND y23 -> vjr
x26 XOR y26 -> bvp
gtn AND qmt -> jmk
x29 XOR y29 -> ntj
y19 XOR x19 -> bqh
rjf AND bqh -> cmf
y38 XOR x38 -> jsg
x32 XOR y32 -> kkd
y03 XOR x03 -> bcj
y31 XOR x31 -> svg
y22 XOR x22 -> wgq
qkf XOR wsv -> z02
bvp XOR gdb -> kgj
x04 XOR y04 -> cjb
x17 XOR y17 -> ffj
y37 AND x37 -> dsg
y27 AND x27 -> wth
y23 XOR x23 -> vfm
sgt XOR scc -> z40
mmb OR vjh -> fqf
qcm AND twv -> jth
y09 XOR x09 -> mtg
sdj OR nph -> z07
wgq XOR dqj -> z22
trr OR kfn -> hck
y27 XOR x27 -> qdf
kcv XOR pkr -> z24
x42 XOR y42 -> pvj
x40 AND y40 -> bst
svg AND fmt -> qnk

76
2024/go/day25/day25.go Normal file
View File

@@ -0,0 +1,76 @@
package day25
import (
"fmt"
"strings"
"math"
)
type Lock struct {
diagram string
combination int
}
type Key struct {
diagram string
combination int
}
type Pair struct {
l Lock
k Key
}
func Part1(input string) int {
data := strings.Split(input, "\n\n")
locks := make([]Lock, 0)
keys := make([]Key, 0)
pairs := make([]Pair, 0)
for _, in := range data {
if in[0] == '#' {
locks = append(locks, Lock{diagram: in, combination: combination(in, '.') })
} else {
keys = append(keys, Key{diagram: in, combination: combination(in, '#')})
}
}
for _, l := range locks {
for _, k := range keys {
if key_fits(l.combination, k.combination) {
pairs = append(pairs, Pair{l: l, k: k})
}
}
}
fmt.Printf("locks: %d, keys: %d\n", len(locks), len(keys))
fmt.Printf("pair0 lock\n%s\n%d\n", pairs[0].l.diagram , pairs[0].l.combination)
fmt.Printf("pair0 key\n%s\n%d\n",pairs[0].k.diagram, pairs[0].k.combination)
return len(pairs)
}
func Part2(input string) int {
return 0
}
func combination(d string, k rune) int {
comb := 0
rows := strings.Split(d, "\n")
columns := len(rows[0])
for _, r := range rows {
for i, c := range r {
if c == k {
comb += 1 * int(math.Pow10(columns - i - 1))
}
}
}
return comb
}
func key_fits(l int, k int) bool {
for i:=1;i<6;i++ {
ll := l % int(math.Pow10(i))
kk := k % int(math.Pow10(i))
if ll < kk { return false }
}
return true
}

View File

@@ -0,0 +1,24 @@
package day25
import (
"log"
"os"
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
data, err := os.ReadFile("input.txt")
if err != nil {
log.Fatalf("failed to read file: %s", err)
}
r := Part1(string(data))
require.Equal(t, 0, r)
}
func TestPart2(t *testing.T) {
r := Part2("")
require.Equal(t, 0, r)
}

3999
2024/go/day25/input.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,17 @@
module adventofcode2024
go 1.19
go 1.23.2
require golang.org/x/exp v0.0.0-20221208152030-732eee02a75a
toolchain go1.23.5
require (
github.com/deckarep/golang-set/v2 v2.7.0
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c
)
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/testify v1.10.0 // indirect
github.com/stretchr/testify v1.10.0 // direct
gopkg.in/yaml.v3 v3.0.1 // indirect
)

View File

@@ -1,11 +1,14 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.7.0 h1:gIloKvD7yH2oip4VLhsv3JyLLFnC0Y2mlusgcvJYW5k=
github.com/deckarep/golang-set/v2 v2.7.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw=
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -2,23 +2,44 @@ package main
import (
"fmt"
// "math/rand"
"time"
// "math/rand"
"os"
// "strings"
// "time"
"adventofcode2024/utils"
// "strings"
// "time"
"adventofcode2024/day01"
"adventofcode2024/day02"
"adventofcode2024/day03"
"adventofcode2024/day04"
"adventofcode2024/day06"
"adventofcode2024/day07"
"adventofcode2024/day08"
"adventofcode2024/day09"
"adventofcode2024/day10"
"adventofcode2024/day11"
"adventofcode2024/day12"
"adventofcode2024/day13"
"adventofcode2024/day14"
"adventofcode2024/day15"
"adventofcode2024/day16"
"adventofcode2024/day17"
"adventofcode2024/day18"
"adventofcode2024/day19"
"adventofcode2024/day21"
"adventofcode2024/day22"
"adventofcode2024/day23"
"adventofcode2024/day24"
"adventofcode2024/day25"
"adventofcode2024/utils"
)
// Usage: go run main.go <NN>
// assumes input is in day<NN>/input.txt
func main() {
d := day()
fmt.Printf("Running day %02d\n", d)
start := time.Now()
switch d {
case 1:
fmt.Printf("part 1: %d\n", day01.Part1(utils.Readfile(d)))
@@ -32,14 +53,73 @@ func main() {
case 4:
fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day04.Part2(utils.Readfile(d)))
case 6:
fmt.Printf("part 1: %d\n", day06.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day06.Part2(utils.Readfile(d)))
case 7:
fmt.Printf("part 1: %d\n", day07.Part1(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)))
case 17:
fmt.Printf("part 1: %s\n", day17.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day17.Part2(utils.Readfile(d)))
case 18:
fmt.Printf("part 1: %d\n", day18.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day18.Part2(utils.Readfile(d)))
case 19:
fmt.Printf("part 1: %d\n", day19.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day19.Part2(utils.Readfile(d)))
case 21:
fmt.Printf("part 1: %d\n", day21.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day21.Part2(utils.Readfile(d)))
case 22:
fmt.Printf("part 1: %d\n", day22.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day22.Part2(utils.Readfile(d)))
case 23:
fmt.Printf("part 1: %d\n", day23.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day23.Part2(utils.Readfile(d)))
case 24:
fmt.Printf("part 1: %d\n", day24.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day24.Part2(utils.Readfile(d)))
case 25:
fmt.Printf("part 1: %d\n", day25.Part1(utils.Readfile(d)))
fmt.Printf("part 2: %d\n", day25.Part2(utils.Readfile(d)))
default:
panic(fmt.Errorf("no such day: %d", d))
}
elapsed := time.Since(start)
fmt.Printf("Execution time: %s\n", elapsed)
}
// Reads day from os.Args.
func day() int {
latest := 3
latest := 24
if len(os.Args) == 1 {
return latest
}
@@ -52,7 +132,6 @@ func day() int {
return day
}
func genNext(n int) {
os.Mkdir(fmt.Sprintf("day%02d", n), 0755)
f, err := os.Create(fmt.Sprintf("day%02d/day%02d.go", n, n))
@@ -94,4 +173,4 @@ func TestPart2(t *testing.T) {
fmt.Printf("wrote day%02d/day%02d_test.go\n", n, n)
utils.GenInputFile(n)
}
}

View File

@@ -0,0 +1,241 @@
package dijkstra
import (
"math"
"sync"
)
type ItemGraph struct {
Nodes []*Node
Edges map[Node][]*Edge
lock sync.RWMutex
}
// AddNode adds a node to the graph
func (g *ItemGraph) AddNode(n *Node) {
g.lock.Lock()
g.Nodes = append(g.Nodes, n)
g.lock.Unlock()
}
// AddEdge adds an edge to the graph
func (g *ItemGraph) AddEdge(n1, n2 *Node, weight int) {
g.lock.Lock()
if g.Edges == nil {
g.Edges = make(map[Node][]*Edge)
}
ed1 := Edge{
Node: n2,
Weight: weight,
}
ed2 := Edge{
Node: n1,
Weight: weight,
}
g.Edges[*n1] = append(g.Edges[*n1], &ed1)
g.Edges[*n2] = append(g.Edges[*n2], &ed2)
g.lock.Unlock()
}
// dijkstra implement
func getShortestPath(startNode *Node, endNode *Node, g *ItemGraph) ([]Point, int) {
visited := make(map[Point]bool)
dist := make(map[Point]int)
prev := make(map[Point]Point)
//pq := make(PriorityQueue, 1)
//heap.Init(&pq)
q := NodeQueue{}
pq := q.NewQ()
start := Vertex{
Node: startNode,
Distance: 0,
}
for _, nval := range g.Nodes {
dist[nval.Value] = math.MaxInt64
}
dist[startNode.Value] = start.Distance
pq.Enqueue(start)
//im := 0
for !pq.IsEmpty() {
v := pq.Dequeue()
if visited[v.Node.Value] {
continue
}
visited[v.Node.Value] = true
near := g.Edges[*v.Node]
for _, val := range near {
if !visited[val.Node.Value] {
if dist[v.Node.Value]+val.Weight < dist[val.Node.Value] {
store := Vertex{
Node: val.Node,
Distance: dist[v.Node.Value] + val.Weight,
}
dist[val.Node.Value] = dist[v.Node.Value] + val.Weight
//prev[val.Node.Value] = fmt.Sprintf("->%s", v.Node.Value)
prev[val.Node.Value] = v.Node.Value
pq.Enqueue(store)
}
//visited[val.Node.value] = true
}
}
}
// fmt.Println(dist)
// fmt.Println(prev)
pathval := prev[endNode.Value]
var finalArr []Point
finalArr = append(finalArr, endNode.Value)
for pathval != startNode.Value {
finalArr = append(finalArr, pathval)
pathval = prev[pathval]
}
finalArr = append(finalArr, pathval)
// fmt.Println(finalArr)
for i, j := 0, len(finalArr)-1; i < j; i, j = i+1, j-1 {
finalArr[i], finalArr[j] = finalArr[j], finalArr[i]
}
return finalArr, dist[endNode.Value]
}
func getAllShortestPaths(startNode *Node, endNode *Node, g *ItemGraph) ([][]Point, int) {
visited := make(map[Point]bool)
dist := make(map[Point]int)
prev := make(map[Point][]Point) // Store multiple predecessors for each node
q := NodeQueue{}
pq := q.NewQ()
start := Vertex{
Node: startNode,
Distance: 0,
}
for _, n := range g.Nodes {
dist[n.Value] = math.MaxInt64
}
dist[startNode.Value] = start.Distance
pq.Enqueue(start)
// Perform Dijkstra's algorithm
for !pq.IsEmpty() {
v := pq.Dequeue()
if visited[v.Node.Value] {
continue
}
visited[v.Node.Value] = true
near := g.Edges[*v.Node]
for _, edge := range near {
alt := dist[v.Node.Value] + edge.Weight
// Case 1: Found a shorter path
if alt < dist[edge.Node.Value] {
dist[edge.Node.Value] = alt
prev[edge.Node.Value] = []Point{v.Node.Value} // Reset predecessors
pq.Enqueue(Vertex{
Node: edge.Node,
Distance: alt,
})
}
// Case 2: Found an equally short path
if alt == dist[edge.Node.Value] {
// Add the current node as a valid predecessor if not already present
found := false
for _, p := range prev[edge.Node.Value] {
if p == v.Node.Value {
found = true
break
}
}
if !found {
prev[edge.Node.Value] = append(prev[edge.Node.Value], v.Node.Value)
}
}
}
}
// Iteratively reconstruct all paths
var paths [][]Point
stack := []struct {
node Point
path []Point
}{
{node: endNode.Value, path: []Point{}},
}
for len(stack) > 0 {
// Pop the top item from the stack
current := stack[len(stack)-1]
stack = stack[:len(stack)-1]
// Prepend the current node to the path
newPath := append([]Point{current.node}, current.path...)
// If we've reached the start node, save the path
if current.node.X == startNode.Value.X && current.node.Y == startNode.Value.Y {
paths = append(paths, newPath)
continue
}
// Push all predecessors onto the stack
for _, predecessor := range prev[current.node] {
if !Contains(newPath, predecessor) {
stack = append(stack, struct {
node Point
path []Point
}{
node: predecessor,
path: newPath,
})
}
}
}
return paths, dist[endNode.Value]
}
func Contains(slice []Point, value Point) bool {
for _, v := range slice {
if v == value { // Compare values
return true
}
}
return false
}
func CreateGraph(data InputGraph) *ItemGraph {
var g ItemGraph
nodes := make(map[Point]*Node)
for _, v := range data.Graph {
if _, found := nodes[v.Source]; !found {
nA := Node{v.Source}
nodes[v.Source] = &nA
g.AddNode(&nA)
}
if _, found := nodes[v.Destination]; !found {
nA := Node{v.Destination}
nodes[v.Destination] = &nA
g.AddNode(&nA)
}
g.AddEdge(nodes[v.Source], nodes[v.Destination], v.Weight)
}
return &g
}
func GetShortestPath(from, to Point, g *ItemGraph) ([]Point, int) {
nA := &Node{from}
nB := &Node{to}
path, distance := getShortestPath(nA, nB, g)
return path, distance
}
func GetAllShortestPaths(from, to Point, g *ItemGraph) ([][]Point, int) {
nA := &Node{from}
nB := &Node{to}
paths, distance := getAllShortestPaths(nA, nB, g)
return paths, distance
}

View File

@@ -0,0 +1,35 @@
package dijkstra
type Point struct {
X int
Y int
Label string
}
type Node struct {
Value Point
}
type Edge struct {
Node *Node
Weight int
}
type Vertex struct {
Node *Node
Distance int
}
type PriorityQueue []*Vertex
type InputGraph struct {
Graph []InputData
From Point
To Point
}
type InputData struct {
Source Point
Destination Point
Weight int
}

View File

@@ -0,0 +1,65 @@
package dijkstra
import "sync"
type NodeQueue struct {
Items []Vertex
lock sync.RWMutex
}
// Enqueue adds an Node to the end of the queue
func (s *NodeQueue) Enqueue(t Vertex) {
s.lock.Lock()
defer s.lock.Unlock()
if len(s.Items) == 0 {
s.Items = append(s.Items, t)
return
}
var insertFlag bool
for k, v := range s.Items {
// add vertex distance less than travers's vertex distance
if t.Distance < v.Distance {
s.Items = append(s.Items[:k+1], s.Items[k:]...)
s.Items[k] = t
insertFlag = true
}
if insertFlag {
break
}
}
if !insertFlag {
s.Items = append(s.Items, t)
}
}
// Dequeue removes an Node from the start of the queue
func (s *NodeQueue) Dequeue() *Vertex {
s.lock.Lock()
defer s.lock.Unlock()
item := s.Items[0]
s.Items = s.Items[1:len(s.Items)]
return &item
}
//NewQ Creates New Queue
func (s *NodeQueue) NewQ() *NodeQueue {
s.lock.Lock()
defer s.lock.Unlock()
s.Items = []Vertex{}
return s
}
// IsEmpty returns true if the queue is empty
func (s *NodeQueue) IsEmpty() bool {
s.lock.RLock()
defer s.lock.RUnlock()
return len(s.Items) == 0
}
// Size returns the number of Nodes in the queue
func (s *NodeQueue) Size() int {
s.lock.RLock()
defer s.lock.RUnlock()
return len(s.Items)
}

View File

@@ -0,0 +1,47 @@
package memo
import "sync"
type Func func(key interface{}) interface{}
type result struct {
value interface{}
}
type Memo struct {
f Func
cache map[interface{}]result
mu sync.RWMutex // Allows concurrent reads.
}
func New(f Func) *Memo {
return &Memo{
f: f,
cache: make(map[interface{}]result),
}
}
func (memo *Memo) Get(key interface{}) interface{} {
// First, try to read the cache using a read lock.
memo.mu.RLock()
res, ok := memo.cache[key]
memo.mu.RUnlock()
if ok {
return res.value
}
// Compute the result without holding the lock.
computed := memo.f(key)
// Now acquire a write lock to update the cache.
memo.mu.Lock()
// Double-check: another goroutine may have stored the result in the meantime.
res, ok = memo.cache[key]
if !ok {
res.value = computed
memo.cache[key] = res
}
memo.mu.Unlock()
return res.value
}

View File

@@ -0,0 +1,56 @@
package ringbuffer
import (
"sync"
)
type RingBuffer[T any] struct {
buffer []T
size int
mu sync.Mutex
write int
count int
}
// NewRingBuffer creates a new ring buffer with a fixed size.
func NewRingBuffer[T any](size int) *RingBuffer[T] {
return &RingBuffer[T]{
buffer: make([]T, size),
size: size,
}
}
// Add inserts a new element into the buffer, overwriting the oldest if full.
func (rb *RingBuffer[T]) Add(value T) {
rb.mu.Lock()
defer rb.mu.Unlock()
rb.buffer[rb.write] = value
rb.write = (rb.write + 1) % rb.size
if rb.count < rb.size {
rb.count++
}
}
// Get returns the contents of the buffer in FIFO order.
func (rb *RingBuffer[T]) Get() []T {
rb.mu.Lock()
defer rb.mu.Unlock()
result := make([]T, 0, rb.count)
for i := 0; i < rb.count; i++ {
index := (rb.write + rb.size - rb.count + i) % rb.size
result = append(result, rb.buffer[index])
}
return result
}
// Len returns the current number of elements in the buffer.
func (rb *RingBuffer[T]) Len() int {
rb.mu.Lock()
defer rb.mu.Unlock()
return rb.count
}

View File

@@ -0,0 +1,64 @@
package day01
import (
"strconv"
"strings"
)
func Part1(input string) int {
lines := strings.Split(input, "\n")
position := 50
output := 0
for _, line := range lines {
direction := line[0]
amount, _ := strconv.Atoi(line[1:])
if direction == 'R' {
position += amount
for position > 99 {
position -= 100
}
} else if direction == 'L' {
position -= amount
for position < 0 {
position += 100
}
}
if position == 0 {
output++
}
}
return output
}
func Part2(input string) int {
lines := strings.Split(input, "\n")
position := 50
output := 0
for _, line := range lines {
direction := line[0]
amount, _ := strconv.Atoi(line[1:])
step := 1
if direction == 'L' {
step = -1
}
for i := 0; i < amount; i++ {
position = (position + step) % 100
if position < 0 {
position += 100
}
if position == 0 {
output++
}
}
}
return output
}

View File

@@ -0,0 +1,35 @@
package day01
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`L68
L30
R48
L5
R60
L55
L1
L99
R14
L82`)
assert.Equal(t, 3, r)
}
func TestPart2(t *testing.T) {
r := Part2(`L68
L30
R48
L5
R60
L55
L1
L99
R14
L82`)
assert.Equal(t, 6, r)
}

4059
2025/gareth/day01/input.txt Normal file

File diff suppressed because it is too large Load Diff

49
2025/gareth/day01/poc.py Normal file
View File

@@ -0,0 +1,49 @@
def part1(input_file):
file = open(input_file, "r")
line = file.readline()
position = 50
output = 0
while line:
direction = line[0]
amount = int(line[1:])
if direction == "R":
position += amount
while position > 99:
position -= 100
elif direction == "L":
position -= amount
while position < 0:
position += 100
if position == 0:
output += 1
line = file.readline()
file.close()
print("Part 1:", output)
def part2(input_file):
position = 50
output = 0
with open(input_file) as file:
for line in file:
line = line.strip()
direction = line[0]
amount = int(line[1:])
step = 1 if direction == "R" else -1
for _ in range(amount):
position = (position + step) % 100
if position == 0:
output += 1
print("Part 2:", output)
part1("input.txt")
part2("input.txt")

119
2025/gareth/day02/day02.go Normal file
View File

@@ -0,0 +1,119 @@
package day02
import (
"math"
"strconv"
"strings"
)
// Very messy and not my finest work but not too bad for 6am
func parseInput(input string) [][2]int {
var ranges [][2]int
lines := strings.Split(strings.TrimSpace(input), ",")
for _, part := range lines {
if part == "" {
continue
}
ab := strings.Split(part, "-")
if len(ab) != 2 {
continue
}
a, _ := strconv.Atoi(ab[0])
b, _ := strconv.Atoi(ab[1])
ranges = append(ranges, [2]int{a, b})
}
return ranges
}
func divisors(n int) []int {
out := make([]int, 0)
for i := 1; i <= n; i++ {
if n%i == 0 {
out = append(out, i)
}
}
return out
}
func Part1(input string) int {
ranges := parseInput(input)
invalidSum := 0
for _, r := range ranges {
low, high := r[0], r[1]
minLen := len(strconv.Itoa(low))
maxLen := len(strconv.Itoa(high))
for digits := minLen; digits <= maxLen; digits++ {
if digits%2 != 0 {
continue
}
half := digits / 2
start := int(math.Pow(10, float64(half-1)))
end := int(math.Pow(10, float64(half)))
for first := start; first < end; first++ {
s := strconv.Itoa(first)
selected, _ := strconv.Atoi(s + s)
if selected < low {
continue
}
if selected > high {
break
}
invalidSum += selected
}
}
}
return invalidSum
}
func Part2(input string) int {
ranges := parseInput(input)
total := 0
for _, r := range ranges {
low, high := r[0], r[1]
seen := make(map[int]bool)
minLen := len(strconv.Itoa(low))
maxLen := len(strconv.Itoa(high))
for d := minLen; d <= maxLen; d++ {
for _, L := range divisors(d) {
k := d / L
if k < 2 {
continue
}
start := int(math.Pow(10, float64(L-1)))
end := int(math.Pow(10, float64(L)))
for base := start; base < end; base++ {
s := strings.Repeat(strconv.Itoa(base), k)
selected, _ := strconv.Atoi(s)
if selected < low {
continue
}
if selected > high {
break
}
if !seen[selected] {
seen[selected] = true
total += selected
}
}
}
}
}
return total
}

View File

@@ -0,0 +1,17 @@
package day02
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124`)
assert.Equal(t, 1227775554, r)
}
func TestPart2(t *testing.T) {
r := Part2(`11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124`)
assert.Equal(t, 4174379265, r)
}

View File

@@ -0,0 +1 @@
78847-119454,636-933,7143759788-7143793713,9960235-10043487,44480-68595,23468-43311,89-123,785189-1014654,3829443354-3829647366,647009-692765,2-20,30-42,120909-197026,5477469-5677783,9191900808-9191943802,1045643-1169377,46347154-46441299,2349460-2379599,719196-779497,483556-641804,265244-450847,210541-230207,195-275,75702340-75883143,58-84,2152-3237,3367-5895,1552-2029,9575-13844,6048-8966,419388311-419470147,936-1409,9292901468-9292987321

View File

@@ -0,0 +1,200 @@
3238233422322723245312524333415334121333413432322532233243267325442232433333224143383436222223233233
3655644666946277273684457436668666955664663983765757454464876854654654857865665766676664954456576457
2222222214221321222242232252322221422222222212122123221322623222234222422221122212282121422123326322
2124214643322332212222134232222223323244234222412424222132142344221221232224211124244142332242234423
3436232236223426333625431396643366362565194162563644533454346253234235616323362232354352264323633232
5222522242424132416252524213114222342315134433221233322222231246224242332433133211133213224152222532
5426122223223222711223433222337222332222222833232224339146332213332173223213812332213383222132234312
6754666344575335444575875747453663683596555517664555664546484534645635645553474345756556566654566656
5433475435554344344375445374544445355635555544744477536637334335232664335527685544454753243246465444
2533323723332334421324325274334254525431339343344558454433386313383333342332322853233331232763541433
3434243341345332224133423322532152471432322626222426413335421225224211233163443935254725234333133342
3541448771235152323243338633424215242426556266442614844233795554292323321243648444233424278324436324
4232241923231442232233522224233222222232431222432321223233222123223234123233322133322222222322224341
2322413333333323433423333323333431233331323233463333343333223323333323333323323333333332354333332133
2212425414842355412223552127242426224852234212232212232222255523322321224232222232323222235222434633
2222323222221122221215238122312222122214221322215512242233212223122222232412233122321222222271322222
5215532261853227652345746126415532422366821723536247423754252265364642376432522655527226425574722471
3222222422252332112231224221356222221223222134222221232223313326222222131432222522333222223122622222
6676222427665466767653734672313657732795538736586768869694693597677586674659542276554762257672793343
3653535256345253634345457434518545543444445544575534454455644555557475445545334555545353535563446555
2233222222323144222222444222122411422321222212315431213323242223222222242233222224322232221212242531
3424593117244244313425222742513498752244424152632323419112114524386212455225243275425565524227362317
5531424542533424455635625443656442662633435324445245422523346364263544533554433452426246313433372514
2522967564465922868445536669545363547885536537774684644666145884654894493744892656428549864924265585
8736457373466777928237878853455465677654727936757338659679873668786246374673877537787726887267376752
2962633343332244174633334533659659344458746512754522225623134372535234242564234635563533366423245423
5534345333543743355425442536744453254445333225545543535344457451545632594543356384535385568433456583
1222242782342223422232152131532242432823342274223223333234321212231233434122949312531515162212332222
3434444332724222433423222345344859344234434244424222439432433414116164422214232344446376442441344422
1222131622223342163222227222122143223242122222121212232322222226112222222221222222222252212222224251
4262513533352222332233331225332231334153323333343383333133232834422433332433333343231743131343623232
2555454275557549374368453564565154525643271535272434413352635365473535263236544335364434615263242555
2132223355322342221432325223133355343253533434522435535322233332423232323244152221532243233455233213
4333343123322333234342333333323333322322324231321332212223322333332323234332221332323311243233133313
2332233333222334222442235222225322232322253234322231453222232241223133221323632233412254332224124244
3441632222323232421248242763264244122234632343422122214222322222244421122442226222412431417242323342
2343221313234232624432424245315522424236224523135333322124222312233232412231324422232221244343433431
3343222224333332146373333536133223346235344317253322382322262522232642222242324443332123216233333336
2322312242313222417322222222222216232212214122221242233233243122243212322223222232222221852212222312
2223223341233323322432232212233323331231233213322232233322231334742823233312233134243223333133122813
3228334576353333562327554733771334232485374333433542631274235374544691334331347733234373357337725333
3454244353353733542724475534227534446346833483535544236532367313365345453652244346263533435345913544
2246211242428262951721221182321231224644212222142422283351232222221262176382312228292322229224212222
6431432336442565163354443334452545623333245524212534544624222324342356231541294462352313344454212354
2252117225531222122221132222211222212222142223318712222127262222211222122422322212222242922222231312
1123144213142231424531224423714253222543235421344223222121252523232422211142423222321624314221344422
5232224422123225232122225112224241222222223215252312222321153231322223323222245523253328123222222551
3621232222112263122322246123222323222222512232221321432423223272222142328132212121222121722217621221
2214222412122212232321333262225222332232232227222242222222335335222223332222262222223532514222121223
2444741342314432395654242442245546624556344421445142212345263223224343343424334485233344552235344253
3333463433354333837333621424322336535344233323423838531653453683332523962234334133224526144314536364
5233451445357625537562657759256372535254626263575665372569645126455436743347439353353254435432874561
3663386342525234673448454446432334344423338533332433256344673633766354323333234733666733443363156993
4646264122632272152731226385422122232389226213253536722212342532472422734255623435243713254142122416
3324315533434373442757634653443532352441324226346363223259263334634127442224334414533372361535353625
3123247753461326484274222842132361327344636382448381324233242757236332232212231414124233233873435132
3233343222325533333253333344532433545334343153543345332342242432335532543365242334353225242142246234
2233122341331332425544342454212321223425213335322342532322111224221332254222245232433433337242232311
3634366254544744542544545363644446633443454444433454343444445442535455234542947463224644445635444433
3633332723672391314313438632262276312226266642352226633983253547635125722222233222322926322577322232
3349532424243225533432226342412622222355454427424444422423223514522514554332136332333124532332242453
3322652426343223283633633453326532426128221533638567312453331214352342234233823343233331348433483233
3263222324513843332311751222421122234213332433332233432222452233322223233232231222314232122413333346
3324424543235445343532636425243343353347322733541434155245334643241125223435453448654645267683332472
4234523123332252462334421551311512252533524623636312441222334223323142422752276162215723345522233424
3453355424333343224433334444322836743342424333464334424342244444532744223434353439324346343134345443
5232225334455644395443426443453336424533442322134345525242534235325326232332254333459253214434432564
4323344383331322442312221213433424324423315127366323232352236343344337114672432324332542133443313334
1764276943738333483449376253345367364323233372359752443954437338534536336432543736348373352783333548
2332239223223854323335331223333383313233221523333228336232341351833392228333813353333132432338233323
4583591334525833233466252342338345436334284343934424328652553552334233137558828333333482323533333745
4233444624654525435643568366547136244562544465423332263526257467634235533338336334454535625566363266
7152548554343414554436353216685221244535423895629554685556276432315645347364425558275323214283253454
2421264125122232322422263243242143322542832641422542623222222234312242112672321232211432331256525423
3452151314152322833231342345322332321332325731334515333322253125224452542121222641233122412326723521
3223333523324343142123232222312322343214453442342321232244232232313424324242452234313221443212322314
5455335555555244444343434356464535433565522544555544533435444535455454563751494555455525542312553642
2532323522123514123223222362334223243315331623312522222332232566327213321322236133323352321232252211
2223328233439225525461513372563325152332242222423331327722331422417422244522425251452226185433552133
2222361253434322222324326322322573223432333333736363133233122352132233332333641323133312322223133132
1226344252613414224222243423523423232134321332276321322234142322432427224252624232424332525226523222
2252321212212225132232214262243322222521132222232122111222321221221222232242522121229221222412222222
3112422332212244222132422321223121113323132223285222231111222324432262344212322223243222211223223232
3223833132233332453422423333764133253133323332252225266362252326131253337333351413333314522222314332
5223423222232512422633522223243143252433355433435243152432332224244352243415222332312334453521223332
2333122244233465315224221212321234353232323336532422482322333112522422323624153222632331534322232224
3231222242442232122232443314242222442223251242432222424122251512222442323524422422432242342313223344
5644414434454344454443543383452425354534344244343858446444355554238543437342544643643345631355464355
1232222332222332243322212212424322232323321323212223322232332131331332313225133332222342532512334323
1125422227334692563222364233231324222323356241222463222274411354445223323221223523423337388626432965
6225122321122223211424222214222712222242242222422243222222132211223222223421223334611222222122222222
3645564444551544255548255454537635664556558585153955773356653554496365547554555454555423535344655555
1343221246323622245222234442432224253426267241221242242442444262472422221321232744752242322632314632
3232555333332354435335362634135123343356244234263316444276362432623333533533641533565535443255432634
3335333333133123333233353233233353333323334252334332323443323335333332333333433332331334233224542352
4676333533566746975628576749784694456766435483543573628547353567434736535766335667475674437754646756
2242712275422321222222123312422224243221212214222221434231315221232112222222121224712222242123322211
5232222113532224143221226251323324512122432423115322423221213222421232352654122252222432221522211221
2324326227332323323532862322424313121233432131332213321223233253423222283334252232219222461333123233
4638233763365656447356534356533563586353256748731467735514376457957325763695463546863356585443543874
4341223424434414544235445342328633543233443454413422444432343354433212242334262372215412124162174444
2326422519242433234222212432229723223323222322272642222323224241222452132242233142323222326431213229
2223326632213632543326153452322572226456223517446532123552312254533353514633325153244532252125332415
2548666542777567464423266492454544354454661745445344433867825595845487556474674534981345944556448496
3655836499753458447557343546944375655847554565459678854745985557565559545786564587863495674374558454
3272131532423362122223222322224622212282353323224321341281632222222528127232143262222222222262122122
2323222636483639363543233522326412713366693834623222221262373242138544415536224232523552252434745421
4576436326433332514343177135333415334462323434333633364617529635433436471434343574323543333534243333
7673924444565367226382625746534735668736376676725229766887388769486869648253727666686455732798673765
3242233522822433682823442441234512251142431642222244224352242172253256326332562448225246152424652223
2212212132222222228121133322232212222122222222422222212221222232221222221222222222311232212221222232
6466366554766673666845986646655556565666566546466763676654556666655756658655845534676566554257656666
2524152234153624656232213316273225622342332147241252323725113232215222426521213342223232333354222368
2223221222112512241122625222211322222213223222222222222312212222222121222142222211221222324322352222
1142652163542323322533543552241232222544345356425364346176325632225132253835472375562224422524325536
5392386646332728446732822143641788824676122643322647637183734251272163248735585358825328124247257556
2222323133232232223222212232113633222222221633222212334222224332422243113332212522132322222122312231
8683886678883624393276865368669575448493288727667228697234668168889838956386424374723775752657959836
3533425634665614423437735633756435366347744722543444677523242286463445344134345754464253774437421336
4463354424463534587843748445543473465646734545484353344345448664673433546735755553462345543244443443
3333494444324354464344753344444434442642424441645245754424433343613243676696454445443236434745474443
3334332433325432333124543334533333323553326334334483343323625345363333533333333333343453253342355266
1432236233423212223212242223121222252252212312221212762122212232322212323242235322211432422222224322
3333256463413233344333333312633332333325453422324333392463463322433225353231334433353243323444333333
7736237745293832739263726338732559784369673833547354558664757444786583187833223136867423585569516866
1131142332334142214421311222143312133214121223313231113442421334232144444222434113313432133424156789
3232124235342282623122252222373334433336322328113723262283353333823268352326382427242736332935222631
4468556567768676565885994797565466448385756746485674257645947658644358697757959999496265554795754628
2575245654587756544544555344325445444253846472736554654944456444532452574557457754455533455716351349
1449228731625783546145322282376767945223354784761591623444944679322296782334427733195467724784774276
2423643333337342333443333443333223333223346534343343634333534463723344313232423443333333243444143325
3335433461436335223245436411433353533346463835374345434473722236532435335542455353323333377788217332
2333423523644253232534232641334254632223332955423322342335543262329423753433432543282382132331333323
3244233433334443424441433434444534331244434432333323433414343334243433333434423224334334332434333433
6362712672268282283761924427141563687696283521585244925674622472623724287874234626273255264425238433
5328341233214483581323225524443336235432243422416445223334234212623234324243622412332523332443531452
3637386345347745474463377423675454654368458535577555336134534368354335444343774333474342353954334455
4434644244265424543324753622464334553552134445344662544355363441242264543543344425444645544434464446
3223212233353232233322333339364223224354221333223233543242213332331222243424322213322133134332333331
3153332553335544459766263375645636357666454552552332634752646655261553677536455646676626535362454335
5473534221354325227446257652544438222494273862536522244571444476228542225343361292447541154453339474
2221224222412325222534221221431233522264323422233352422222231322244442232223232225423242263232552343
5332427364273242312934243526733672664424442218537634449366534313935634536814632433225563842264427242
6235266277265342456137175322124157375434143165657145451146775315575231444663125462654744375531134289
3421222675734234317233291215315253432642242377222257341342223228582427172712135272254627136261223634
5433432112325134322333333233212322113333132322243423344352242233413143221311322442322313241245332221
3423734435853334374537836333333333317433352683453443353785482319323532251323373393833533838862838333
5657323833536351353333363782336373322831333642333243533331333328332333353233285222557336315323313364
2442519326432623532344727393285833347123418565397636331334347245722384632864525658762677744314646333
4125132521333231232235325331322342325622223234122792354213323311343523232323513253493324352496461423
3362421473222221213315222122344245222332224252326272222233232223321122235226142321223231326313224262
3732354133363432432423713233832433328234144313334323734464244363423672452673398233733263233338332332
3767773886665564214526315412774737756177467576263358827536626878161412332417831532815537625153423729
5521353234533542595546884224253243311325323554357328942323262343928222538322263522364222442233333513
2122322414223533222473242424222413224345321522325224322233424513224423322265123243112323352122333232
7483463487356554736635846165545667958374844736734327464437954584362574727377684673345568765357378597
2223232322112222262322322222223231422232232138221132212222221222213211221422223221321122111312126322
3366233325237424446412434433264222422124255734432634244335324412245234313132252455237262464232345253
4632413335342647253154534151123228132631386328422413224472722724124342692236632614222343373223423233
3342342323422353444442211123321342434233724244422661444243432722422232322335141331341534432231731331
7432225572522677423322272674452522724824325224215725322516323534252222823224553583222223552526274681
6564655556755655663744565365543666448665653225365335532354433635744424842635386541465356658353534585
1131244223511213433154353112523334432223215444342241233422145422553442224323331354313244212522426789
1111213122221322123222222222522212147228223621223212221222292312212231212121222222212231211222522222
2231621272211225174214132224132343252231425544532282456435473144273127234233623632443512324484121493
2121243212342132322231232321322151244424133442362222324422232121424122332112222233313421412322213232
2165314643441353632241614323463656325426665666531632561352152353513121235251663454652635354134356789
2475231214243222622422128232222142342334542525221442122264428122222445212442812222331313922242222331
3223323354333323234372444242373463821436122221823232432533533332344446513142323333541222341244217455
7455526631444542356445533352351453423842653536563363453344445222432533133425443346642463393231542655
8653953554777855947635356623955473553347535456542373216442635855766435335778333435863355534534696334
2123313323533233522234325253134223134342463263454131142213134333334342242414333242344253333223253576
4433351364335323163334323233734633344234343533524223331454334134343345333444333552324335333343135322
2676247333884956267277436553754385673228458733632722367132455754724742672592656787535922265428847452
5323342343344336454433333263423311328341322515255533364322646234565644344713216323855642632233565373
1133221326942423244343323212222522121122242234221225552555243122222312226242322423242232122444161112
5745757585647764645595455547777555574756775757484475665467555762654756556574765346685567548956663759
4571321513255225214645223224114322318122222133446333321233692233524333646292412121393432285264282222
3315332122322222252323332342321332263332143133412214123234344222242232422421243212314333132222424435
3712452322745236234223432424523225472154354252623312322322292124423152214233272422452233312342222123
2122122322222323222222212212222222332221213623222211262522221222212222212222121122224222222222111221
3878463445456594343447696625474456434384664578488543373834987437558867455385835783452453584558746285
8227231432234323326226222222223372233534224124232221133433311232252143422323253144252323242443131223
3132233422232215222221112223612232536153612126257222232312223242621262223332122326225212331248125352
8899389687567746688684992465866799836886577885757998968855448995658978853857785665776749875746666754
6475176885462947335537363373673946483735476343335337376275334622583395356234523457624566667937332358
5224457327442414324723564554424233627423444241443524344435827527429432834214343559324444555454761422
4345325324355364334338464343241431247363234433363424532466863333432433643343475452322533364254343431
5625893313532515654777281766549484453214439528733524862827285532721155253735432342894254445442515426
2122223322323322233323333223313252222332324223123133413222233233323314213333222523332334223636232232
3566454444795375834465668434645852632845467948764654464536444457635457666446253333457744448568467955
3332274361452133542353243425423322231353344222151231312224534225344533323512113225552346234224515122
3354332242433513337253337122133125323366332332223232244315522724231444323232633334123733113142742332
1623223222222531261632222222222122122132143453212312262623222212222522112122223723222232225514326145
5436354633654663574759344344656465454835454465474656557565544645346443956474444444954284444443734465
5429583223625147865243782836886657435836657243263351643255252433652481223336266125523653422527977354
3333221212323232323322224222224222232323233222233232212223322232232123122323222323323123233242273222
2312322223223323122223323243322233333123322224331223133421423222331223343245423333234322422321233322
5526855555441556453553354355557545724544436564664664877456643366453637585245747634666665454447345764
2231312322221222122222221343522122112222225222123221221221221232222222242231112122222221221121222311

View File

@@ -0,0 +1,200 @@
886223233233
999956576457
842223326322
644444444444
996666666663
664452222532
988332234312
987766666666
875446465444
988887654433
975433333342
998834436324
954444334341
654333332133
885555544633
855471322222
887777777471
665333622222
999999793343
877763446555
544443342531
999877362317
666666672514
999999996585
999988888887
999877766666
988843456583
996222332222
997644444442
765222224251
887443623232
987776666655
555555555555
444444433333
654334124244
877242323342
665544444444
866633333336
852212222312
844333333813
977777725333
887666913544
999224212222
965454212354
922222231312
764422344422
823222222551
872227621221
765542222223
985555344253
966444536364
999555874561
888777766993
977775442416
977655353625
888888745132
655544246234
557242232311
976665444433
999677322232
976533342453
888884483233
875544333346
867683332472
777552233424
964334345443
995444432564
877754443334
999988833548
998858233323
998888853745
886666363266
998883253454
874356525423
876446723521
555444332314
955555555642
765332252211
985433552133
776664333333
776556523222
922412222222
864443323232
877552314332
655555555553
866543232224
555544444444
888876666455
553512334323
988626432965
762222222222
997555655555
777763314632
766666555634
555554542352
999887777777
777423322211
665552221221
961333123233
998854543874
875462174444
997766433229
776655555415
999956448496
999999978454
888766222122
998865745421
977554243333
999998673765
888865652223
843332222232
988877656666
777655422368
654432352222
877654325536
988888888888
665332312231
999999959836
877747421336
888887776554
996745474443
866555455266
765442224322
966555444433
999989516866
444444456789
888935222631
999999999999
977777651349
999999987776
774444444445
877788217332
998833333333
544444444444
999887768433
888666655452
888954334455
766666666446
965544444433
977777776666
997555339474
663232552343
999886447242
777777777789
988777776664
555445332221
998888838333
888887653364
999888777766
995496461423
776633224262
987638332332
888888887729
999886644513
765522333232
998887778597
843332126322
777664345253
973223423233
775544731331
888556274681
888853534585
555555556789
933322522222
877784121493
644444433232
666666666789
922242222331
886554447455
903231542655
999888696334
665533353576
765555555532
999658847452
886633565373
964444461112
988956663759
999864282222
644444444445
975342222123
665422222222
999888888888
877555544433
766658125352
999999999999
999937332358
995555761422
887654343431
999955515426
554636232232
998868467955
766424515122
777742742332
735514326145
999844734465
988888977354
443342273222
544432233322
888777345764
554322222311

View File

@@ -0,0 +1,69 @@
package day03
import (
"strconv"
"strings"
)
func Part1(input string) int {
lines := strings.Split(input, "\n")
output := 0
for _, bank := range lines {
best := 0
length := len(bank)
for i := 0; i < length; i++ {
tens, _ := strconv.Atoi(string(bank[i]))
for j := i + 1; j < length; j++ {
ones, _ := strconv.Atoi(string(bank[j]))
value := tens*10 + ones
if value > best {
best = value
}
}
}
output += best
}
return output
}
func Part2(input string) int {
lines := strings.Split(strings.TrimSpace(input), "\n")
total := 0
k := 12
for _, bank := range lines {
bank = strings.TrimSpace(bank)
n := len(bank)
start := 0
chosen := make([]byte, 0, k)
for picked := 0; picked < k; picked++ {
// leave enough digits to complete the subsequence
last := n - (k - picked)
bestChar := bank[start]
bestIdx := start
for i := start + 1; i <= last; i++ {
if bank[i] > bestChar {
bestChar = bank[i]
bestIdx = i
if bestChar == '9' {
break
}
}
}
chosen = append(chosen, bestChar)
start = bestIdx + 1
}
val, _ := strconv.Atoi(string(chosen))
total += val
}
return total
}

View File

@@ -0,0 +1,23 @@
package day03
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`987654321111111
811111111111119
234234234234278
818181911112111`)
assert.Equal(t, 357, r)
}
func TestPart2(t *testing.T) {
r := Part2(`987654321111111
811111111111119
234234234234278
818181911112111`)
assert.Equal(t, 3121910778619, r)
}

View File

@@ -0,0 +1,200 @@
886223233233
999956576457
842223326322
644444444444
996666666663
664452222532
988332234312
987766666666
875446465444
988887654433
975433333342
998834436324
954444334341
654333332133
885555544633
855471322222
887777777471
665333622222
999999793343
877763446555
544443342531
999877362317
666666672514
999999996585
999988888887
999877766666
988843456583
996222332222
997644444442
765222224251
887443623232
987776666655
555555555555
444444433333
654334124244
877242323342
665544444444
866633333336
852212222312
844333333813
977777725333
887666913544
999224212222
965454212354
922222231312
764422344422
823222222551
872227621221
765542222223
985555344253
966444536364
999555874561
888777766993
977775442416
977655353625
888888745132
655544246234
557242232311
976665444433
999677322232
976533342453
888884483233
875544333346
867683332472
777552233424
964334345443
995444432564
877754443334
999988833548
998858233323
998888853745
886666363266
998883253454
874356525423
876446723521
555444332314
955555555642
765332252211
985433552133
776664333333
776556523222
922412222222
864443323232
877552314332
655555555553
866543232224
555544444444
888876666455
553512334323
988626432965
762222222222
997555655555
777763314632
766666555634
555554542352
999887777777
777423322211
665552221221
961333123233
998854543874
875462174444
997766433229
776655555415
999956448496
999999978454
888766222122
998865745421
977554243333
999998673765
888865652223
843332222232
988877656666
777655422368
654432352222
877654325536
988888888888
665332312231
999999959836
877747421336
888887776554
996745474443
866555455266
765442224322
966555444433
999989516866
444444456789
888935222631
999999999999
977777651349
999999987776
774444444445
877788217332
998833333333
544444444444
999887768433
888666655452
888954334455
766666666446
965544444433
977777776666
997555339474
663232552343
999886447242
777777777789
988777776664
555445332221
998888838333
888887653364
999888777766
995496461423
776633224262
987638332332
888888887729
999886644513
765522333232
998887778597
843332126322
777664345253
973223423233
775544731331
888556274681
888853534585
555555556789
933322522222
877784121493
644444433232
666666666789
922242222331
886554447455
893231542655
999888696334
665533353576
765555555532
999658847452
886633565373
964444461112
988956663759
999864282222
644444444445
975342222123
665422222222
999888888888
877555544433
766658125352
999999999999
999937332358
995555761422
887654343431
999955515426
554636232232
998868467955
766424515122
777742742332
735514326145
999844734465
988888977354
443342273222
544432233322
888777345764
554322222311

200
2025/gareth/day03/input.txt Normal file
View File

@@ -0,0 +1,200 @@
3133322312313332336153233333232281412234221222433272332313372222212233114622232233232321251122522243
3122243233322223222333513239233621333333523352333332361333233332142327423622333222313333242321112633
4453322423234323362634238645943333332463321659433346534324232461344544333233244323632243313334262243
6448895538826857235274976247543575444367645757464434697575874665478695238342662743886877975373645693
1134322241232322332224331133221412522322512233243421322616252222333223234632221323236212122235222232
4479242568986515346653123325247575265256582134963244533552224424124932962555334232534326255446632228
4426412316324254531114425464123214136311441166652543321621464654422165654455166414253156226642564789
5534943265545533146737249872452756665433166617813432253534268559555562632512417473647255444385366543
2221332232313335223223326323322224151322223433133252223132133333322233214222322312232523263323423153
1155555265656565945445445515455565444244558495552543595233253554355543555166554543534544555656645543
5375486865865543646375445844234147342565375934762358696736345227447645746233234765477442546863537543
6377523531453435443574315246554564646533255523533634533446327354552235123544256343543443365343544511
2422254262221214222343113222324222333329322249243446644483212142441542442142772223232574324424181222
3224333232343284522635562216535334233333536453225622315363634232432466373433543323243533423284256324
4432415264423343424524442424742353234444345363444422353244434443343332333546444335242244627424244243
7767456236539425625242747855734379453334633444259221833233727325141263383682327576726881586533226355
3343333333246334333333263333323433324132433343332433532132343325334212233133634336333234323332432315
2545646456545665546554557642556656266463445455556567566554626345676354456627654646455474646644665564
2433322122222373442324254224352332243332344233312212352211234232225222332233223224342225222274113431
1223422644542352452322244433123652524124232425213252533524232534322314254452515244242714442534236535
7436355442424144524648655572983555456553857475342849745533523555546973473555554944447583517666354456
3354332343233333452257333931333223233335144343942363333543125533424231253335233434333343625642342632
3647245432355223452345235453444454556385447243713344435475324247366313427577347544434475354531354524
4314134344421241423142421243322114312343414231231414312224131424313323421144233232133431142343256789
2222111212322211222112132213222212222222132221132222222123322131122222212222231122232232221311222324
2424173245432343439465475433352422232321126342412321321435225432122533311335433362254314243332232463
5432844335323357331133233332533333327333313334233352412333333233365332145242434323532233181231535233
1122222324224222222621224242213424221425222222232225523221252242222422222223273621423422222722122323
3743645335445453868636766323672563545876934124483636326664252554379555153588677644765253523733987369
5357445367737667464565657347567552566686446856726214455772537522723666354383457331466626922574666357
3333934435333143333423333233233333334223233373434323311312334242133323367353434543333332624432323323
4685698384447433555446379545435874726526559232776446567445196374345785664753345546553862439481975585
2212223222212332231232222132163221132622232212133122221222122222612322122222222223212222226312322421
5645463571423453464433469435453344796455674543332563556133146515444546844326644423846514542342333534
5233343336233633224232332226113236322312215233353333333233323225343322343233343332224333623344323535
2342227243452224224445323223453342338712363445723133323442333424337633477313342332344444423433231443
2322646222222622122328223598236932644822522322621822682225749223422722223295431517222264613228152266
3445337447457232452444444394435382372764533466433734666743653344444157847767544663564445646846443757
2345347254535445132343932232422424544332455215333234424312533544211549233443734343253222443234332442
3634423344236444353464244134443345441224432333244241544141436324533444442354254344342534242424432523
7231332334535312223652264335534314334339453253542133461336312553283783443222363334331323822343232336
4221531424224412332642233238323432423633612512612225323826323434223312553323464335223261346234222215
4852321327577233324223658814222972473235384575471636527421366343326547673464274328261632225124477363
4342434343136343441515223132333547653332527353453324142334635833314333521334343335833223275643443343
6232446431323244223342517443462442213564321235238323512333422223942532333314333533336445328333133313
4211222542621142332222526522264413212222222226235234262421412272422322222253315344224223111225352522
2331223232322433333332333355634234333331363332222242333322235232433333122323333333331275323333341322
2322522335333232118153272322334212233352323326222152533234523222322333853271235332224362522212223347
2321343321133234211232413223232232221222234222212222133232353333333233323332232341322322312222314232
4344543344434612415344744444334354334344433433443443334333434362442126412324434934444323343322533233
5643658557246447555486543355346775386523277657558583745333466455764754463595556546563568576565747415
4552242557446235454434454445323325544455552562564444654723532555754514513453455555524444555443355454
1322322227621133332121229623644292425743422847369633622414544923322264223222229451322343322282245422
3244443141414423334433521233353243444553236742616135424651457174227443324483447653434435493443352814
2332223456283243422565442411734626213212333322325345523122422222371255521233354282314243212222346811
2363353334438332753485332283432143844634134442235314333384332534411233538127123239559335324525173367
2233233235323213323132223232332232621212413332243333221332262343222325233233332322232321322733333533
2231262835222374325232237412434734246872142222265422343242152342423432436121422253232122126267228124
1617167414613376433741444343412452466424234322622744322463534122616275543323335313246433145323634344
5441422332252342442332233334339332433235422344223323424333371413343368215245423533624433223433224424
5534454447443434664553364454363373732666955334475424343455425356554543445373545445245366445534436457
2222222322332223313223222233343232342213323122225322132323323122322322212224312123334213224233112122
9444357435334337357253725853774787427781646153537837242484337664753556284673879345232837794643776362
3342224442222181242514542211552421273421221222222242542122262112533512423221252264622254256333422222
2453731182222236429123338923242731234422523223344333428262421262434223333123925274944122752262893652
7949675436668479445173944387468424444569538485763648466358543449982534369694559465844889937793478483
7525897989956253492876668653639333498484589824962736766226854174794787349995765998753465867748726349
3635215333523534323341652262264217242224324647362243332241232324325432233341454332324444452335255342
3235351532451225333552323425133565323333523333532342333333323353443234333235331332335133323353332334
2252462228323222133422254213212224722222422214221522225342225662285222152222325521552412223246252222
3343236352334472233435233253522333432334333322233323443343332143326443333333433334715332332334633313
3786957948699888786853995899657847776498789968998426859865395758275768954934688959957289759966967954
2733323322522332132223212333226332122722333142323321424266531312723323242333221432322122723233322322
2214362331522324431343484534342563442521534253435544744566456425653335355451545532333553345425858454
5439639959656979786597966563879777365396989655738678365562377327838388788969939837638653376636484953
2334734343343342344324343324334229342447239523333332334434372343343313134312134226222424132452333432
6724425365545232331435216575552744494554556545652355844652163542535345535243555443365513835532355415
3333332333333323354333233113313323333433332343333333443322523333533333333333623332433334232333233843
4437367564574537445498644432636847544474774435442876774346358678448734343669734643458454137848456656
2221222532213222123222232232212352211512223322322242232221233211422222222222222321225223222322222223
5523456333647612353377254433323232777323374323333343377352333433535387932733632343544313464633245324
2131222221222221222322221222221222221222242221222522121241211921122123222222223223822123222112251212
4431321233433243246213271132122221422323216234242222414223122222223163143332412253432423342223322323
3212262231352432332221321123222222323233252235424232392223223323234242532295245423442324143632522321
3274664282142364423211712233331324112364463223322125334345432332343352626324334284342452333372433324
9444554543554344534533543433444545554335335444442415365444444344134434228234563544423345343434435434
2322122323223132333222232332212533335221323432122323311262258223221432233223232343122323233333323233
4256445456356234755252516444543554233114323445333343454544444343532522224354232633355344321153422553
4656646715951462515563625654623643675644244445461467442462724776725663573121654549477361684255565445
2412221621223579553212322122235622225222125314222342212222222242222452141244422122522434921432212622
6566634554426546464435632522556466513452241424466565634522462654256455954636655157657446265256464314
2232611127632222111253221222226223223332222232222422271221133212321274222222312222223222251222212211
3353333333423336434373333353533425543333343333355343322543345355353333435353452335526343433355233333
2232223125232228222252533215233242422222222626123421221122112232343251742223233147222325232312231212
2323123223312262212146322212233522241222172232221321131322442222262321332123322912121222283242226242
4323622424322343523242324243522243246322262433212124323725541125142234322112351254231262312423244331
3361432233356332382222223333331233253363333343343365436131232232332312632331311332143322233863223338
3544383332295358255736425434222332233532256313234333363422833333337552233523332136233532234333325395
3323336324432223322333122223332332423133333223333333334543333333324333332253313332214333332223336311
5323563292737384237353387233322636363232453633553126738638735823373373435622713635232355136633323636
2114612138321225442242222224261222316622144442133312753354321214223121122536313226212222326142321362
6247453657645373434535444546656443327532476675344456355444643425446457447542633364545666645364735444
5422232383222221223233438833242733524342531233346374541123222534933328234212332332431321334443342242
1222221423223257321853321231223214422626112124124434322222621222252124221232622222513333323332412222
4279267668473452164259647337628548416726542527684472572412482564723752584633674525865775664775735584
5532212374612312333223242722231352223634282227622272521247225713222322222732316254422161228354446632
8867713564683676748783437544467384488468446476686464457578677965554479566376776534547672436488548648
4432412431321244322223521212342532232123325143323443733324332332243267132321221332223741233353422422
2322643323222232112212242735126521125222224241222522321161524333233313211222124153262226281422133221
7322221223222412714481222222222322224322258972232263272221262522232312242333722254313622233313232523
1424333334432242333333217332133722323433333232423345221345322223237253433333331432723266113334723123
1554363178113723478281266824262175158814163872852231451314645635246255668373368144125743153665532639
3334422364546744444571324532515243445314327453562167372456431242412524845442335226535535622772332552
2222223134232233234332332221433322872433224442342223423143333332434211223111222233232342713313323234
1222423212523452211222332121322232237262212222142252321222232521222212224511215122222222222322292222
6631222242632295822463483545724493546522256233322262222162622213226222318247222223673345232221374727
9979445565769447954725462535745746643554655956665664577574938675685834745555555843163646964452585854
1332233234222322212223122322333223242211232311232122231232532123313123342213124332212232222313123422
2122334242282422223229264223226722221432333379232322232115523232914966353333222313312228322232212924
8343226936424543433358424471743573555183245538845343644843333644476253356665232431732843754715276894
2423351416282141513226654215256452255321353212251421668125645232252535223245622625455325622543563323
2274222214222142221222225322232432231112221122221222232222222222642222222222222221121122212222222235
3422682214212444242412325341132151543223242222282126232216244427422332444242221215644222232122248244
5541555542521324121252535576224242537173484424612452232243421422531472346351322523551252252552233524
2231222325222222225132231123323242332231323312223224212252222113222352343422224342343214242242343222
2233212323232731132273372323333232531733212122422332112222152425432223333214222343346424232122223227
2346232422343424233244432617445135414564434834543737212455135533233433343225513434424221234423247424
1332232244222224222223228322332433323223321322224332321333212131122223213322332222222312342324234243
4242322312462124223242542232231252113152522223252233432222113252223125121321441321222333522221212252
1513432234151521123135555522234223143424445531424215355121251233522152155523543145553341213351316789
7366935544647586715762426265348565354476656763647423463446645164663574133177633738317724578374467853
2343324233233334322334244353253333242243444255312511613453423124334114221422444433334334244222442342
1422222222221221355224124621132331331321254223122332424122222334332222125622224222222234142215412211
3134321323343443255344344434453324443224354363343453334233333431462242242324335223534514355243435423
5222413432231237673211737244322222322232322333646125231325327543712232436222153223332222624331254671
4233343233221232323123221533436325132233334241332331332323332332722573235423212335122332222353334452
3342213523152244352423222422232216227222232224425152224254255344122222252521212221324721421312142113
5443532343322363325774162333323333443454235238635225234438152223433237532483232687334576237363223632
3525534323644464333434346333422313257324256662344813443535135522333325639142443433233412333334373232
3342353132322323643442342423333332442345213324232222311225243324342322322434434234312342223435327343
2215597625242266434372426244333213443522253842323164522435692342284562521223343552315229322242221227
1212122272221221121222222222221221221122322223222422222222222223222222121222112221232222222212121212
2232132433233232211321454322214533324412345133122142221132442333225444243225232122232334344255333248
4464243242222335423344333434433433242252554245241234345253321234433352433444252234434144322443342543
3234365123622223221245143121253333444522222425214322432242622324237212333324223225322622422212425244
2242532233123792312413232932121722127222132121234222425322245132122132463125241322212263322136264211
3231222332243335321223233443422232322442444223323231323324122323424323222232243322232333223423133432
2333323223221232331222232322231223433224211222322622232322212215314223223233233231432213223533322232
5685532356255584756433641634235331742524254473246125141476432485435332353546445547446314385122855534
3456344445212414323432544232434235223444344122345553442335433334642541253529243334245454422416453334
2242223333222224331222222224222213223442132215222224212242141434231422422321232324221242421122222221
4333383632323322333324334224213333343342331143313433373234444315333444234333426312232333333333333231
4422573134244263324522241316311233233345482124424135232342731328433124413172222363523414325222222235
8223222222223265116222241163153222221837124433322226411224124342242222211124224622232631311722222232
3534844444358244575564454474856336445454755444455343444474444444645445546533545644434545455796435534
5246624225353223243323273165442621323333333123334332382322253232425421234472524433335434243882427322
2622323243433253232235529421362332133154323347434333144623235223443386532663222714312453312332922243
6254635483964638693943763425358947433957247545953555563652853678776754953655625943564529736585973954
2322334323282133213433432312122334552333234331332323332133333453321231223443332322223322223232344233
7224322222942233222211513133321222415212123242343222221222321222232225222232232132121222322123221621
1225222222212232223123211521223222222125221222122321241121212122222212421225222222222212222214222214
3455555535554564555445635435535543554544554556355345355442544554654555355555555665355553254553555555
2222324212222222422524544232122575261333322725132222622222154521224131343233225251222424223223222725
3521324722222232242122232363222243232752125434212232222532322423433333343324223632223322554222322233
2121122222422243544422122274222333224613232245284121222154223452222423212923223212423721247422214443
3232123212232232332132133233235323221132333232142232322424423223223233322333533212335522213243333225
5177873528233661875332469534892728351386833272255574426731755914333233645873733629823353556313583595
6213333321253232322333523323332633233333333333342333321322331333333233233632223322333331323333322432
3373387333349854145353324345434853343433443383443464444348654344472386435784658634343747633383336233
3429393345344644363565375244243244543445333234583345434344333135232345425321562493523433442464453125
7434393434642448179344313244242244443334153444233223447721424341442646322442443243734342434424343132
1244334475341363372534443352243439515444744262343553842424433344935322537333743445483242533535575352
4373352144322333242451324432374254562431453553422453364243247143313112135443554413724423442244344343
4645563438835975552364244145474938135353452575749545556369475163573344256676416536453365734433955534
6232751632512233322312224324344212527243552223398222882323622722722224334225222624223622322122922221
4223353243524233432349343652523535235233224334132313433232525423554347244383334134332353332324634362
6532462659251523335544424644765725565347323437746464722418144255561673163326362423584544542752864364
5265355258244364654458553255366345454346535266544325444635233353471156843374465356142345463754544854
5333353133323333323343132235333233323143153333233433333222333223137423342522433322333332234335332535
3343433335343224443543432424333332343444333343333543244233435343243443233333344334124313343434343433
2132223322352221414222224422373422222222121184282212212222282122132224922234212512232471123423323362
1413222223123221226221725321142212231265522332127222422225222221322612223221235236219264422624221262
5215532874414323333352366199522245239342514438736631253368515152244356456573554592786424522845643456
4417433536414623449345363555313956437344537433233143853437256255344445324355363438433364353338273432
9786442645664536665425664482742494456631544436686579472166986232969232465525665274256524554446252662
7958556354745775266427683599272776745837655766567766478547674576675966775675453266655377755445127877
5464552767524334662646466373452456426544534386534264666332434446647473347556664167687664465556657669
3422237124533342313322332343432422323331233233222242113143423543443433332132333322332413314433235233
4587342221574643382424242413447556444383723349732441445448443257237364434145323768154243948226831343
2221133422982213342263223186422352211522242546232221229332462243222322233532222523222453423562225325
2232322525454232321533421132124421322231444522244114254333232332242422123322343441233333323224343323
3492347628432423334213264323334346561327733347235153431435542344443348225132245133133333227467376436
8675854562453553452445363245546664724456664357445334546665574645544825336454434173841475542574626397
4641325112314637326112652435765437554615742634552761743652475771227735261274664454467743363221532389
5441442463462432334372323724264223324451341845243644423243344443444443311445145221455434154476234134
4736271123322227262237354426264364322116234962553425433242763332336233344642676342164432232444346326
2332523223522224222223222325231233422142332232232243123152223122232122242222225223423133253314233332
3423367354345622372133357333724233735422453433236215132354452443633773454444335633445994526245447446
2272212144222112122221622522282525121222522511222341112226225222222132143225252222221212241122422222
5473262656595786245443644533532333343956663244245223445432655542666423485355334437736432226543565526

58
2025/gareth/day03/poc.py Normal file
View File

@@ -0,0 +1,58 @@
def part1(input_str):
lines = input_str.strip().split("\n")
output = 0
for bank in lines:
best = 0
length = len(bank)
for i in range(length):
tens = int(bank[i])
for j in range(i + 1, length):
ones = int(bank[j])
value = tens * 10 + ones
if value > best:
best = value
output += best
return output
def part2(input_str, k = 12):
lines = input_str.strip().split("\n")
total = 0
for bank in lines:
bank = bank.strip()
n = len(bank)
start = 0
chosen = []
for picked in range(k):
last = n - (k - picked)
best_char = bank[start]
best_idx = start
for i in range(start + 1, last + 1):
if bank[i] > best_char:
best_char = bank[i]
best_idx = i
if best_char == '9':
break
chosen.append(best_char)
start = best_idx + 1
total += int("".join(chosen))
return total
with open("input.txt") as f:
data = f.read()
print("Part1:", part1(data))
print("Part2:", part2(data, 12))

11
2025/gareth/go.mod Normal file
View File

@@ -0,0 +1,11 @@
module aoc/2025
go 1.23.2
require github.com/stretchr/testify v1.11.1
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
)

9
2025/gareth/go.sum Normal file
View File

@@ -0,0 +1,9 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

17
2025/gareth/main.go Normal file
View File

@@ -0,0 +1,17 @@
package main
import (
"aoc/2025/day02"
"fmt"
"os"
"time"
)
func main() {
start := time.Now()
data, _ := os.ReadFile("day02/input.txt")
fmt.Printf("part 1: %d\n", day02.Part1(string(data)))
fmt.Printf("part 2: %d\n", day02.Part2(string(data)))
elapsed := time.Since(start)
fmt.Printf("Execution time: %s\n", elapsed)
}

16
2025/go/.vscode/launch.json vendored Normal file
View 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": ["1"]
}
]
}

128
2025/go/day01/day01.go Normal file
View File

@@ -0,0 +1,128 @@
package day01
import (
"adventofcode2025/utils"
"fmt"
"strings"
)
type Dir int
const (
Left Dir = iota
Right
Safe
Unsafe
)
type Instruction struct {
Turn Dir
Steps int
}
func Part1(input string) int {
lines := strings.Split(input, "\n")
position := 50
code := 0
Instructions := make([]Instruction, 0)
for _, line := range lines {
var steps int
var dir Dir
switch line[0] {
case 'L':
steps = utils.MustAtoi(line[1:])
dir = Left
case 'R':
steps = utils.MustAtoi(line[1:])
dir = Right
default:
fmt.Println("Invalid direction")
continue
}
if steps > 100 {
steps = steps % 100
}
Instructions = append(Instructions, Instruction{Turn: dir, Steps: steps})
}
fmt.Print(Instructions)
for _, instr := range Instructions {
if instr.Turn == Left {
if position-instr.Steps < 0 {
position = 100 + (position - instr.Steps)
} else {
position -= instr.Steps
}
} else if instr.Turn == Right {
if position+instr.Steps >= 100 {
position = (position + instr.Steps) - 100
} else {
position += instr.Steps
}
}
fmt.Println("\n", instr.Turn, instr.Steps, "->", position)
if position == 0 {
code++
}
}
return code
}
func Part2(input string) int {
lines := strings.Split(input, "\n")
position := 50
code := 0
Instructions := make([]Instruction, 0)
for _, line := range lines {
var steps int
var dir Dir
switch line[0] {
case 'L':
steps = utils.MustAtoi(line[1:])
dir = Left
case 'R':
steps = utils.MustAtoi(line[1:])
dir = Right
default:
fmt.Println("Invalid direction")
continue
}
Instructions = append(Instructions, Instruction{Turn: dir, Steps: steps})
}
fmt.Print(Instructions)
for _, instr := range Instructions {
if instr.Steps > 100 {
code = code + (instr.Steps / 100)
instr.Steps = instr.Steps % 100
}
if instr.Turn == Left {
if position-instr.Steps < 0 {
if position != 0 {
code++
}
position = 100 + (position - instr.Steps)
} else {
position -= instr.Steps
if position == 0 {
code++
}
}
} else if instr.Turn == Right {
if position+instr.Steps > 99 {
if position != 0 {
code++
}
position = (position + instr.Steps) - 100
} else {
position += instr.Steps
if position == 0 {
code++
}
}
}
fmt.Println("\n", instr.Turn, instr.Steps, "->", position, "code:", code)
}
return code
}

Some files were not shown because too many files have changed in this diff Show More