Compare commits
33 Commits
60015d1134
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| bcd7daea9e | |||
| 9c2e2c68dd | |||
|
|
90083f28e5 | ||
|
|
7f6c31c003 | ||
|
|
015607cde3 | ||
| 358249e78a | |||
| d730d3c444 | |||
| 759b9c9544 | |||
|
|
a529516bab | ||
|
|
ba588cbc77 | ||
|
|
225d74acf9 | ||
| 3e69c5b463 | |||
| 6ab021face | |||
| 1ee00e8d45 | |||
| 952def48a0 | |||
| 08b38c2bd3 | |||
| 29387606b0 | |||
|
|
4619bc7775 | ||
|
|
305ce52a98 | ||
|
|
a5b1227979 | ||
|
|
53557adddb | ||
|
|
5b8676f6e0 | ||
|
|
ee128f3aa8 | ||
|
|
d93049c434 | ||
|
|
507cb1a907 | ||
|
|
a64c3ef3c4 | ||
|
|
2c9b7766e3 | ||
|
|
ae293fe5a2 | ||
|
|
c1c89faef8 | ||
| b1a4969f6d | |||
|
|
e2ab6dce9a | ||
| f8c29be7ef | |||
| 19c4afdc98 |
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
2024
|
||||||
|
2023/*
|
||||||
|
|
||||||
80
2024/gareth/day08/day08.go
Normal file
80
2024/gareth/day08/day08.go
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Coordinate struct {
|
||||||
|
Row int
|
||||||
|
Col int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid, antennaMap := parseInput(input)
|
||||||
|
result := findAntinodes(grid, antennaMap, true)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid, antennaMap := parseInput(input)
|
||||||
|
result := findAntinodes(grid, antennaMap, false)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([][]rune, map[rune][]Coordinate) {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
rowCount := len(lines)
|
||||||
|
colCount := len(lines[0])
|
||||||
|
grid := make([][]rune, rowCount)
|
||||||
|
antennaMap := make(map[rune][]Coordinate)
|
||||||
|
|
||||||
|
for row := 0; row < rowCount; row++ {
|
||||||
|
grid[row] = []rune(lines[row])
|
||||||
|
for col := 0; col < colCount; col++ {
|
||||||
|
frequency := grid[row][col]
|
||||||
|
if frequency != '.' {
|
||||||
|
antennaMap[frequency] = append(antennaMap[frequency], Coordinate{Row: row, Col: col})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid, antennaMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func findAntinodes(grid [][]rune, antennaMap map[rune][]Coordinate, onlySpecial bool) int {
|
||||||
|
rowCount := len(grid)
|
||||||
|
colCount := len(grid[0])
|
||||||
|
uniqueAntinodes := make(map[Coordinate]struct{})
|
||||||
|
|
||||||
|
for row := 0; row < rowCount; row++ {
|
||||||
|
for col := 0; col < colCount; col++ {
|
||||||
|
for _, antennaPositions := range antennaMap {
|
||||||
|
for i, firstAntenna := range antennaPositions {
|
||||||
|
for j, secondAntenna := range antennaPositions {
|
||||||
|
//I know I know thats too many for loops
|
||||||
|
if i != j {
|
||||||
|
distance1 := int(math.Abs(float64(row-firstAntenna.Row)) + math.Abs(float64(col-firstAntenna.Col)))
|
||||||
|
distance2 := int(math.Abs(float64(row-secondAntenna.Row)) + math.Abs(float64(col-secondAntenna.Col)))
|
||||||
|
|
||||||
|
rowDiff1 := row - firstAntenna.Row
|
||||||
|
rowDiff2 := row - secondAntenna.Row
|
||||||
|
colDiff1 := col - firstAntenna.Col
|
||||||
|
colDiff2 := col - secondAntenna.Col
|
||||||
|
|
||||||
|
if rowDiff1*colDiff2 == rowDiff2*colDiff1 {
|
||||||
|
if (distance1 == 2*distance2 || distance1*2 == distance2) && onlySpecial {
|
||||||
|
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||||
|
} else if !onlySpecial {
|
||||||
|
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(uniqueAntinodes)
|
||||||
|
}
|
||||||
39
2024/gareth/day08/day08_test.go
Normal file
39
2024/gareth/day08/day08_test.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............`)
|
||||||
|
assert.Equal(t, 14, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............`)
|
||||||
|
assert.Equal(t, 11387, r)
|
||||||
|
}
|
||||||
50
2024/gareth/day08/input.txt
Normal file
50
2024/gareth/day08/input.txt
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
........................E...j......W..........L...
|
||||||
|
............................O........E.........L..
|
||||||
|
..q......O...........l....................K.......
|
||||||
|
............q...................HM......W.........
|
||||||
|
................................1..H...........IW.
|
||||||
|
....................5.............................
|
||||||
|
..........k........M...wl............6............
|
||||||
|
.....O.......w...k.....5.8..l......K.........o.6..
|
||||||
|
.......k....w.........5.........R.....o........K..
|
||||||
|
.....q..X..............j........E...I.........K...
|
||||||
|
............O..........E........................H.
|
||||||
|
................Mn.h2.w.p....................H....
|
||||||
|
..................p.......a............j.....L....
|
||||||
|
.....X...l.p.....................m.........W..6...
|
||||||
|
..Xq................A..................R..m.......
|
||||||
|
.........................i..........a..........R..
|
||||||
|
...........u.....................a........I.....2.
|
||||||
|
k..............A..n.........R.................o...
|
||||||
|
................n.................Qo..............
|
||||||
|
..........u.A.........h........2..................
|
||||||
|
...5.......Y.....p...............iN...............
|
||||||
|
1...x.....................i.......................
|
||||||
|
........M..............2.....Qi...................
|
||||||
|
...............................I..e...............
|
||||||
|
......u......A...........m..........h.............
|
||||||
|
.......1...........U.............Qm.......j.......
|
||||||
|
.......X.......................................9..
|
||||||
|
.....u........U.......Y...........................
|
||||||
|
.............................h.e..................
|
||||||
|
..................4....e......Q.....L....N........
|
||||||
|
.1..................4.......................y8....
|
||||||
|
.........Y................................8.N.....
|
||||||
|
............P.0J...........3..........8y..........
|
||||||
|
....V3P..........J................................
|
||||||
|
............U..P...7x...........e.................
|
||||||
|
....................J...............r...9.........
|
||||||
|
.........0.V......Y...............................
|
||||||
|
...............V.4................................
|
||||||
|
..........V..........................n............
|
||||||
|
..............v........7..........................
|
||||||
|
...........U..........J.......7...................
|
||||||
|
.....v........7..........................a........
|
||||||
|
.......................................r..........
|
||||||
|
...........0.......x................y.............
|
||||||
|
............6..v.x.....................N..........
|
||||||
|
...........P......................................
|
||||||
|
........3.......................r......4..........
|
||||||
|
..............3......................y............
|
||||||
|
................................................9.
|
||||||
|
.................................................9
|
||||||
104
2024/gareth/day09/day09.go
Normal file
104
2024/gareth/day09/day09.go
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
files, gaps, lengthOfFinalFile := parseInput(input)
|
||||||
|
checksum := compactFiles(files, gaps, lengthOfFinalFile)
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
files, freeSpaces := parseInputPart2(input)
|
||||||
|
checksum := calculateChecksum(files, freeSpaces)
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([]int, []int, int) {
|
||||||
|
var files []int
|
||||||
|
var gaps []int
|
||||||
|
lengthOfFinalFile := 0
|
||||||
|
for i, char := range input {
|
||||||
|
if i%2 == 0 {
|
||||||
|
files = append(files, int(char-'0'))
|
||||||
|
lengthOfFinalFile += int(char - '0')
|
||||||
|
} else {
|
||||||
|
gaps = append(gaps, int(char-'0'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return files, gaps, lengthOfFinalFile
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInputPart2(input string) ([][]int, [][]int) {
|
||||||
|
files, freeSpaces, position := [][]int{}, [][]int{}, 0
|
||||||
|
for index, char := range input {
|
||||||
|
length := int(char - '0')
|
||||||
|
if index%2 == 0 {
|
||||||
|
files = append(files, generateRange(position, position+length))
|
||||||
|
} else {
|
||||||
|
freeSpaces = append(freeSpaces, generateRange(position, position+length))
|
||||||
|
}
|
||||||
|
position += length
|
||||||
|
}
|
||||||
|
return files, freeSpaces
|
||||||
|
}
|
||||||
|
|
||||||
|
func compactFiles(files []int, gaps []int, lengthOfFinalFile int) int {
|
||||||
|
fileIndex := len(files) - 1
|
||||||
|
gapIndex := 0
|
||||||
|
position := files[0]
|
||||||
|
checksum := 0
|
||||||
|
fileID := files[0]
|
||||||
|
|
||||||
|
for lengthOfFinalFile != position {
|
||||||
|
// If there's a gap and a file to move then move the file
|
||||||
|
if gaps[gapIndex] > 0 && files[fileIndex] > 0 {
|
||||||
|
files[fileIndex]--
|
||||||
|
gaps[gapIndex]--
|
||||||
|
checksum += fileIndex * position
|
||||||
|
position++
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this file is fully moved go to next file
|
||||||
|
if files[fileIndex] == 0 {
|
||||||
|
fileIndex--
|
||||||
|
fileID++
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update gapIndex if this gap is filled
|
||||||
|
if gaps[gapIndex] == 0 {
|
||||||
|
gapIndex++
|
||||||
|
for f := 0; f < files[gapIndex]; f++ {
|
||||||
|
checksum += gapIndex * position
|
||||||
|
position++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateRange(start, end int) []int {
|
||||||
|
rangeList := make([]int, end-start)
|
||||||
|
for i := range rangeList {
|
||||||
|
rangeList[i] = start + i
|
||||||
|
}
|
||||||
|
return rangeList
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculateChecksum(files, freeSpaces [][]int) int {
|
||||||
|
checksum := 0
|
||||||
|
for fileIndex := len(files) - 1; fileIndex >= 0; fileIndex-- {
|
||||||
|
for spaceIndex := 0; spaceIndex < len(freeSpaces); spaceIndex++ {
|
||||||
|
if len(freeSpaces[spaceIndex]) >= len(files[fileIndex]) && files[fileIndex][0] > freeSpaces[spaceIndex][0] {
|
||||||
|
files[fileIndex] = freeSpaces[spaceIndex][:len(files[fileIndex])]
|
||||||
|
freeSpaces[spaceIndex] = freeSpaces[spaceIndex][len(files[fileIndex]):]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for fileID, file := range files {
|
||||||
|
for _, block := range file {
|
||||||
|
checksum += fileID * block
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
22
2024/gareth/day09/day09_test.go
Normal file
22
2024/gareth/day09/day09_test.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`12345`)
|
||||||
|
assert.Equal(t, 60, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart1Long(t *testing.T) {
|
||||||
|
r := Part1(`2333133121414131402`)
|
||||||
|
assert.Equal(t, 1928, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`2333133121414131402`)
|
||||||
|
assert.Equal(t, 2858, r)
|
||||||
|
}
|
||||||
1
2024/gareth/day09/input.txt
Normal file
1
2024/gareth/day09/input.txt
Normal file
File diff suppressed because one or more lines are too long
191
2024/gareth/day20/day20.go
Normal file
191
2024/gareth/day20/day20.go
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
package day20
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/heap"
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var directions = [][]int{
|
||||||
|
{0, 1}, // Right
|
||||||
|
{1, 0}, // Down
|
||||||
|
{0, -1}, // Left
|
||||||
|
{-1, 0}, // Up
|
||||||
|
}
|
||||||
|
|
||||||
|
type State struct {
|
||||||
|
row, col, dir, score int
|
||||||
|
path []string
|
||||||
|
//Would rather use tuple as key but cant get to work
|
||||||
|
costMap map[[2]int]int
|
||||||
|
}
|
||||||
|
|
||||||
|
type PriorityQueue []State
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
maze := parseInput(input)
|
||||||
|
_, path, costMap := solveMaze(maze)
|
||||||
|
cheats := findCheats(path, costMap)
|
||||||
|
return cheats
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
maze := parseInput(input)
|
||||||
|
_, path, costMap := solveMaze(maze)
|
||||||
|
cheats := findCheatsPart2(path, costMap)
|
||||||
|
return cheats
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []string {
|
||||||
|
parts := strings.Split(input, "\n")
|
||||||
|
maze := []string{}
|
||||||
|
maze = append(maze, parts...)
|
||||||
|
|
||||||
|
return maze
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq PriorityQueue) Len() int { return len(pq) }
|
||||||
|
func (pq PriorityQueue) Less(i, j int) bool {
|
||||||
|
return pq[i].score < pq[j].score
|
||||||
|
}
|
||||||
|
func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Push(x interface{}) {
|
||||||
|
*pq = append(*pq, x.(State))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Pop() interface{} {
|
||||||
|
old := *pq
|
||||||
|
n := len(old)
|
||||||
|
item := old[n-1]
|
||||||
|
*pq = old[0 : n-1]
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
|
||||||
|
func solveMaze(maze []string) (int, []string, map[[2]int]int) {
|
||||||
|
rows := len(maze)
|
||||||
|
cols := len(maze[0])
|
||||||
|
|
||||||
|
// Locate start and end points
|
||||||
|
var startRow, startCol, endRow, endCol int
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if maze[i][j] == 'S' {
|
||||||
|
startRow, startCol = i, j
|
||||||
|
} else if maze[i][j] == 'E' {
|
||||||
|
endRow, endCol = i, j
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Priority queue and visited set
|
||||||
|
pq := &PriorityQueue{}
|
||||||
|
heap.Init(pq)
|
||||||
|
startPath := []string{fmt.Sprintf("(%d,%d)", startRow, startCol)}
|
||||||
|
startCostMap := map[[2]int]int{
|
||||||
|
{startRow, startCol}: 0,
|
||||||
|
}
|
||||||
|
heap.Push(pq, State{startRow, startCol, 0, 0, startPath, startCostMap})
|
||||||
|
visited := make(map[[3]int]bool)
|
||||||
|
|
||||||
|
for pq.Len() > 0 {
|
||||||
|
cur := heap.Pop(pq).(State)
|
||||||
|
|
||||||
|
// If reached the end point, return the score and path
|
||||||
|
if cur.row == endRow && cur.col == endCol {
|
||||||
|
return cur.score, cur.path, cur.costMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark as visited
|
||||||
|
key := [3]int{cur.row, cur.col, cur.dir}
|
||||||
|
if visited[key] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
visited[key] = true
|
||||||
|
|
||||||
|
// Explore moves
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
// Compute new direction
|
||||||
|
newDir := (cur.dir + i) % 4
|
||||||
|
|
||||||
|
// Compute new position
|
||||||
|
newRow := cur.row + directions[newDir][0]
|
||||||
|
newCol := cur.col + directions[newDir][1]
|
||||||
|
|
||||||
|
// Check bounds and wall
|
||||||
|
if newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols && maze[newRow][newCol] != '#' {
|
||||||
|
newCost := cur.score + 1
|
||||||
|
if oldCost, exists := cur.costMap[[2]int{newRow, newCol}]; !exists || newCost < oldCost {
|
||||||
|
// Update cost map
|
||||||
|
newCostMap := make(map[[2]int]int)
|
||||||
|
for k, v := range cur.costMap {
|
||||||
|
newCostMap[k] = v
|
||||||
|
}
|
||||||
|
newCostMap[[2]int{newRow, newCol}] = newCost
|
||||||
|
|
||||||
|
// Update path
|
||||||
|
newPath := append([]string{}, cur.path...)
|
||||||
|
newPath = append(newPath, fmt.Sprintf("(%d,%d)", newRow, newCol))
|
||||||
|
|
||||||
|
heap.Push(pq, State{
|
||||||
|
newRow,
|
||||||
|
newCol,
|
||||||
|
newDir,
|
||||||
|
newCost,
|
||||||
|
newPath,
|
||||||
|
newCostMap,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1, nil, nil // No path found
|
||||||
|
}
|
||||||
|
|
||||||
|
func findCheats(path []string, costLookup map[[2]int]int) int {
|
||||||
|
|
||||||
|
totalCheats := 0
|
||||||
|
for index, position := range path {
|
||||||
|
|
||||||
|
var row, col int
|
||||||
|
//Should be a better way to do this
|
||||||
|
fmt.Sscanf(position, "(%d,%d)", &row, &col)
|
||||||
|
|
||||||
|
for _, dir := range directions {
|
||||||
|
newRow := row + (dir[0] * 2)
|
||||||
|
newCol := col + (dir[1] * 2)
|
||||||
|
|
||||||
|
if cost, exists := costLookup[[2]int{newRow, newCol}]; exists {
|
||||||
|
if cost > index && (cost-index-2) >= 100 {
|
||||||
|
totalCheats++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalCheats
|
||||||
|
}
|
||||||
|
|
||||||
|
func findCheatsPart2(path []string, costLookup map[[2]int]int) int {
|
||||||
|
totalCheats := 0
|
||||||
|
|
||||||
|
for index, position := range path {
|
||||||
|
var row, col int
|
||||||
|
//Should be a better way to do this
|
||||||
|
fmt.Sscanf(position, "(%d,%d)", &row, &col)
|
||||||
|
|
||||||
|
for x1 := row - 20; x1 <= row+20; x1++ {
|
||||||
|
for y1 := col - 20 + int(math.Abs(float64(row-x1))); y1 <= col+20-int(math.Abs(float64(row-x1))); y1++ {
|
||||||
|
if cost, exists := costLookup[[2]int{x1, y1}]; exists && cost != -1 {
|
||||||
|
diff := cost - index - int(math.Abs(float64(row-x1))) - int(math.Abs(float64(col-y1)))
|
||||||
|
if cost > index && diff >= 100 {
|
||||||
|
totalCheats++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalCheats
|
||||||
|
}
|
||||||
45
2024/gareth/day20/day20_test.go
Normal file
45
2024/gareth/day20/day20_test.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package day20
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############`)
|
||||||
|
assert.Equal(t, 44, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############`)
|
||||||
|
assert.Equal(t, 285, r)
|
||||||
|
}
|
||||||
141
2024/gareth/day20/input.txt
Normal file
141
2024/gareth/day20/input.txt
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#...###...#.......###...........###...#...#####...#...#...###...#...#.........###...#.......#...#.....#.........#...........#...............#
|
||||||
|
#.#.###.#.#.#####.###.#########.###.#.#.#.#####.#.#.#.#.#.###.#.#.#.#.#######.###.#.#.#####.#.#.#.###.#.#######.#.#########.#.#############.#
|
||||||
|
#.#.#...#.#.#...#...#.#.........#...#.#.#...#...#.#.#...#.....#.#.#.#.....#...#...#.#...#...#.#.#.#...#.....#...#.#.........#.....#.........#
|
||||||
|
#.#.#.###.#.#.#.###.#.#.#########.###.#.###.#.###.#.###########.#.#.#####.#.###.###.###.#.###.#.#.#.#######.#.###.#.#############.#.#########
|
||||||
|
#.#.#.#...#...#...#...#.#...#.....#...#...#...#...#.#...........#.#.###...#.....#...#...#.....#...#.#...#...#.#...#.###...#...#...#.#...#...#
|
||||||
|
#.#.#.#.#########.#####.#.#.#.#####.#####.#####.###.#.###########.#.###.#########.###.#############.#.#.#.###.#.###.###.#.#.#.#.###.#.#.#.#.#
|
||||||
|
#.#...#...#...###.....#.#.#.#.#.....#...#.....#.#...#.#...#...#...#.#...#.........###.#.............#.#.#...#.#...#.....#...#.#.#...#.#.#.#.#
|
||||||
|
#.#######.#.#.#######.#.#.#.#.#.#####.#.#####.#.#.###.#.#.#.#.#.###.#.###.###########.#.#############.#.###.#.###.###########.#.#.###.#.#.#.#
|
||||||
|
#.#.....#...#.#.....#.#.#.#...#...#...#.....#.#.#.#...#.#...#.#...#...#...#...###...#.#.........#...#.#.#...#.#...#...#.......#.#.#...#...#.#
|
||||||
|
#.#.###.#####.#.###.#.#.#.#######.#.#######.#.#.#.#.###.#####.###.#####.###.#.###.#.#.#########.#.#.#.#.#.###.#.###.#.#.#######.#.#.#######.#
|
||||||
|
#.#.#...#.....#.#...#.#.#...#...#.#.......#.#.#.#.#.....#...#.###.....#.#...#.#...#...#.........#.#...#...#...#.#...#...###.....#.#.#.......#
|
||||||
|
#.#.#.###.#####.#.###.#.###.#.#.#.#######.#.#.#.#.#######.#.#.#######.#.#.###.#.#######.#########.#########.###.#.#########.#####.#.#.#######
|
||||||
|
#...#...#.....#.#.#...#.....#.#.#.#...#...#...#.#.#.....#.#...#...###.#...#...#.......#.....#...#.....#.....#...#.###.....#.....#...#.......#
|
||||||
|
#######.#####.#.#.#.#########.#.#.#.#.#.#######.#.#.###.#.#####.#.###.#####.#########.#####.#.#.#####.#.#####.###.###.###.#####.###########.#
|
||||||
|
###...#...#...#.#...#.......#.#...#.#.#...#...#...#...#.#.#.....#.....#.....#.....#...#.....#.#.#.....#.....#...#...#...#.###...#...........#
|
||||||
|
###.#.###.#.###.#####.#####.#.#####.#.###.#.#.#######.#.#.#.###########.#####.###.#.###.#####.#.#.#########.###.###.###.#.###.###.###########
|
||||||
|
#...#.....#...#.....#.#...#.#...#...#...#...#...#.....#...#...........#.###...#...#...#.#...#.#.#.#.......#.###...#...#.#.#...#...#.....#...#
|
||||||
|
#.###########.#####.#.#.#.#.###.#.#####.#######.#.###################.#.###.###.#####.#.#.#.#.#.#.#.#####.#.#####.###.#.#.#.###.###.###.#.#.#
|
||||||
|
#...........#.#...#...#.#.#.#...#.....#...#...#.#...#...#...#...#...#.#.#...#...#...#.#.#.#.#.#.#.#.#...#...#...#.#...#.#...#...###...#...#.#
|
||||||
|
###########.#.#.#.#####.#.#.#.#######.###.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.#####.#######.#####.#
|
||||||
|
#...###.....#...#.#...#.#...#.#.......#...#.#.#...#.#.#.#.#.#.#.#.#...#...#...###.#.#.#.#.#.#.#.#.#.#.#...###.#.#.#.#...#.....#.....#.#.....#
|
||||||
|
#.#.###.#########.#.#.#.#####.#.#######.###.#.###.#.#.#.#.#.#.#.#.#########.#####.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####
|
||||||
|
#.#.#...#.......#...#.#.#...#.#...#.....#...#.###.#.#.#.#.#.#.#.#.#.......#.#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.#.#...#.....#...#.#.#.....#
|
||||||
|
#.#.#.###.#####.#####.#.#.#.#.###.#.#####.###.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#####.#.#.#.#.#.#.###.###.#.#.#.#.###.#####.###.#.#.#####.#
|
||||||
|
#.#...#...#.....#...#.#...#.#.###.#.#...#...#...#.#...#.#.#.#.#.#.#.#...#...#.#.#.....#.#.#.#.#.#.#.#...#...#.#...#.....#.....#...#...#...#.#
|
||||||
|
#.#####.###.#####.#.#.#####.#.###.#.#.#.###.###.#.#####.#.#.#.#.#.#.#.#.#####.#.#####.#.#.#.#.#.#.#.#.###.###.###########.#####.#######.#.#.#
|
||||||
|
#.#...#...#...#...#.#.......#...#.#...#.....#...#.....#.#.#.#.#.#.#...#.....#.#...#...#.#.#.#.#.#.#.#.#...###.#.........#.......#.......#...#
|
||||||
|
#.#.#.###.###.#.###.###########.#.###########.#######.#.#.#.#.#.#.#########.#.###.#.###.#.#.#.#.#.#.#.#.#####.#.#######.#########.###########
|
||||||
|
#.#.#.#...#...#.###...........#.#...#.........#...#...#...#...#.#...#.....#.#.#...#...#.#.#.#.#.#.#.#.#.#...#.#.#...###.....#...#...........#
|
||||||
|
#.#.#.#.###.###.#############.#.###.#.#########.#.#.###########.###.#.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.###########.#
|
||||||
|
#.#.#.#.###.....#.............#.....#.#...#.....#.#.....#.......###.#...#...#.#.#...#.#.#.#.#.#.#.#...#.#.#...#...#...#...#...#.#.....#...#.#
|
||||||
|
#.#.#.#.#########.###################.#.#.#.#####.#####.#.#########.###.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###########.#.#.#####.#.###.#.#.#.#
|
||||||
|
#...#...#.........#...#.....#.......#.#.#.#...#...#...#.#.#...#...#.#...#...#.#.#.#.#.#.#.#.#.#.#...#...#.#...........#.#.....#...###...#.#.#
|
||||||
|
#########.#########.#.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.###########.#####.###########.#.#
|
||||||
|
###...###...#.......#.#...#...#.....#.#.#.#...#...#.#...#.#.#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#...#.#.#...#.......#...#.#.....#.........#.#.#
|
||||||
|
###.#.#####.#.#######.###.#####.#####.#.#.#.#####.#.#####.#.#####.#.#.#.###.#.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.#.#.#.#####.#######.#.#.#
|
||||||
|
#...#.#...#...###...#.#...#.....#...#...#...#...#.#.....#.#.....#.#.#.#.###...#.#.#...#...#.#...#.#.#.#.#.......#...#...#...###.#.......#...#
|
||||||
|
#.###.#.#.#######.#.#.#.###.#####.#.#########.#.#.#####.#.#####.#.#.#.#.#######.#.#########.###.#.#.#.#.#.#####.###########.###.#.###########
|
||||||
|
#...#...#.........#...#.###.......#.........#.#...#.....#.#...#.#...#.#.#.......#.......#...#...#...#.#.#.#...#.#...........#...#...........#
|
||||||
|
###.###################.###################.#.#####.#####.#.#.#.#####.#.#.#############.#.###.#######.#.#.#.#.#.#.###########.#############.#
|
||||||
|
###...................#.#.....#...#.........#.....#.....#...#.#.....#...#.#.....#.......#...#...#...#...#...#.#.#.....#.......#...#.........#
|
||||||
|
#####################.#.#.###.#.#.#.#############.#####.#####.#####.#####.#.###.#.#########.###.#.#.#########.#.#####.#.#######.#.#.#########
|
||||||
|
#...#.......#...#...#...#...#.#.#.#.........#.....#...#...#...#...#.#.....#.###.#.......###.....#.#.#...#...#.#.......#.#.......#...#...#...#
|
||||||
|
#.#.#.#####.#.#.#.#.#######.#.#.#.#########.#.#####.#.###.#.###.#.#.#.#####.###.#######.#########.#.#.#.#.#.#.#########.#.###########.#.#.#.#
|
||||||
|
#.#.#.....#...#...#.........#...#...........#.#...#.#...#.#...#.#...#...#...#...#...#...#.........#.#.#.#.#.#...........#.............#.#.#.#
|
||||||
|
#.#.#####.###################################.#.#.#.###.#.###.#.#######.#.###.###.#.#.###.#########.#.#.#.#.###########################.#.#.#
|
||||||
|
#.#.#...#...#...#...#.....#......S###########.#.#.#...#...###.#.......#.#...#...#.#...###...#.....#...#...#.#.........#...#...#.........#.#.#
|
||||||
|
#.#.#.#.###.#.#.#.#.#.###.#.#################.#.#.###.#######.#######.#.###.###.#.#########.#.###.#########.#.#######.#.#.#.#.#.#########.#.#
|
||||||
|
#.#...#.#...#.#...#...###...#################.#.#...#.......#.#.......#.....#...#.........#.#.###.........#...#.....#...#.#.#.#.....#.....#.#
|
||||||
|
#.#####.#.###.###############################.#.###.#######.#.#.#############.###########.#.#.###########.#####.###.#####.#.#.#####.#.#####.#
|
||||||
|
#...#...#.....#.....#...#####################...#...#...#...#.#...#...........#...#.....#.#...#...........#...#.#...#...#.#.#.#...#...#...#.#
|
||||||
|
###.#.#########.###.#.#.#########################.###.#.#.###.###.#.###########.#.#.###.#.#####.###########.#.#.#.###.#.#.#.#.#.#.#####.#.#.#
|
||||||
|
#...#.#...#...#...#.#.#...#####################...#...#...###...#.#.........#...#.#.###.#.#...#.......#...#.#.#.#.....#.#.#.#.#.#.#.....#...#
|
||||||
|
#.###.#.#.#.#.###.#.#.###.#####################.###.###########.#.#########.#.###.#.###.#.#.#.#######.#.#.#.#.#.#######.#.#.#.#.#.#.#########
|
||||||
|
#...#...#...#...#.#.#...#.#...#################...#.........#...#.#.........#.#...#...#...#.#.###...#...#...#...#.......#...#...#.#...#...###
|
||||||
|
###.###########.#.#.###.#.#.#.###################.#########.#.###.#.#########.#.#####.#####.#.###.#.#############.###############.###.#.#.###
|
||||||
|
###...#...#...#...#.....#.#.#.#...###############.#...#.....#.....#.......#...#.....#...#...#.....#.........#...#...........#...#...#...#...#
|
||||||
|
#####.#.#.#.#.###########.#.#.#.#.###############.#.#.#.#################.#.#######.###.#.#################.#.#.###########.#.#.###.#######.#
|
||||||
|
#####...#.#.#...........#.#.#.#.#.........#######...#.#.....#...#...#...#.#.###.....#...#.#.....#...#.....#...#.............#.#...#.........#
|
||||||
|
#########.#.###########.#.#.#.#.#########.###########.#####.#.#.#.#.#.#.#.#.###.#####.###.#.###.#.#.#.###.###################.###.###########
|
||||||
|
###.......#.###.........#...#.#.........#......E#...#.......#.#...#...#...#...#.#...#.#...#...#...#...###.....#...#...#...###.#...#.....#...#
|
||||||
|
###.#######.###.#############.#########.#########.#.#########.###############.#.#.#.#.#.#####.###############.#.#.#.#.#.#.###.#.###.###.#.#.#
|
||||||
|
#...#.....#.#...#...#...#...#.........#...###...#.#.#...#...#.......#.....#...#.#.#...#.#.....###...#.........#.#...#...#...#.#...#...#...#.#
|
||||||
|
#.###.###.#.#.###.#.#.#.#.#.#########.###.###.#.#.#.#.#.#.#.#######.#.###.#.###.#.#####.#.#######.#.#.#########.###########.#.###.###.#####.#
|
||||||
|
#...#.###...#.....#.#.#.#.#.#...#...#...#.....#...#...#...#.....#...#...#.#...#.#.#.....#.#.......#.#...........#.....#.....#...#.....#...#.#
|
||||||
|
###.#.#############.#.#.#.#.#.#.#.#.###.#######################.#.#####.#.###.#.#.#.#####.#.#######.#############.###.#.#######.#######.#.#.#
|
||||||
|
###.#...#.........#...#...#.#.#.#.#...#.#.......#.....#.........#...#...#...#.#.#.#.......#...#...#...........#...###...#.......#.......#...#
|
||||||
|
###.###.#.#######.#########.#.#.#.###.#.#.#####.#.###.#.###########.#.#####.#.#.#.###########.#.#.###########.#.#########.#######.###########
|
||||||
|
#...#...#...#...#...........#.#...#...#.#.....#...#...#.......#.....#...#...#.#...###...#...#...#.........###...#.........#.....#.......#...#
|
||||||
|
#.###.#####.#.#.#############.#####.###.#####.#####.#########.#.#######.#.###.#######.#.#.#.#############.#######.#########.###.#######.#.#.#
|
||||||
|
#.#...#.....#.#...#.....#...#.#...#...#.....#.....#...#.......#.........#.....###...#.#...#...#.....#...#.........#...#.....###...#...#...#.#
|
||||||
|
#.#.###.#####.###.#.###.#.#.#.#.#.###.#####.#####.###.#.#########################.#.#.#######.#.###.#.#.###########.#.#.#########.#.#.#####.#
|
||||||
|
#.#...#.#...#.###...###...#...#.#.....#...#.......#...#...#...#.....#...#...#.....#.#.......#.#...#...#.......#.....#.#.....#...#...#...#...#
|
||||||
|
#.###.#.#.#.#.#################.#######.#.#########.#####.#.#.#.###.#.#.#.#.#.#####.#######.#.###.###########.#.#####.#####.#.#.#######.#.###
|
||||||
|
#...#.#.#.#...#...............#.........#.........#...#...#.#.#.#...#.#...#.#.....#.#.......#...#...#.....#...#.....#.......#.#.......#.#...#
|
||||||
|
###.#.#.#.#####.#############.###################.###.#.###.#.#.#.###.#####.#####.#.#.#########.###.#.###.#.#######.#########.#######.#.###.#
|
||||||
|
#...#.#...#...#.............#...#...............#.#...#...#.#...#.....#...#.#.....#.#.........#.....#.###.#.........#...#...#.#.......#.....#
|
||||||
|
#.###.#####.#.#############.###.#.#############.#.#.#####.#.###########.#.#.#.#####.#########.#######.###.###########.#.#.#.#.#.#############
|
||||||
|
#.....#.....#.....#...#.....#...#.......#.....#...#.......#.........#...#...#.....#...........#.....#...#.#...#...###.#...#...#.#...#.......#
|
||||||
|
#######.#########.#.#.#.#####.#########.#.###.#####################.#.###########.#############.###.###.#.#.#.#.#.###.#########.#.#.#.#####.#
|
||||||
|
###...#.........#.#.#.#.....#.#...#...#...#...#...###...###...#.....#.#...#...#...#.........#...###.....#...#...#.....#.......#...#...#.....#
|
||||||
|
###.#.#########.#.#.#.#####.#.#.#.#.#.#####.###.#.###.#.###.#.#.#####.#.#.#.#.#.###.#######.#.#########################.#####.#########.#####
|
||||||
|
#...#...........#...#.#...#.#...#...#.......###.#.#...#...#.#.#.....#...#.#.#.#.....#...###...###...#...#...............#...#.....#...#.....#
|
||||||
|
#.###################.#.#.#.###################.#.#.#####.#.#.#####.#####.#.#.#######.#.#########.#.#.#.#.###############.#.#####.#.#.#####.#
|
||||||
|
#...#...#...#...#...#...#...#...............#...#.#...#...#.#.###...#.....#.#.###.....#...........#...#.#.................#...###...#.#.....#
|
||||||
|
###.#.#.#.#.#.#.#.#.#########.#############.#.###.###.#.###.#.###.###.#####.#.###.#####################.#####################.#######.#.#####
|
||||||
|
###...#...#...#...#.....#...#.#.............#.#...#...#...#.#...#...#.###...#...#.......#.....#...#...#...........#.........#.......#.#...###
|
||||||
|
#######################.#.#.#.#.#############.#.###.#####.#.###.###.#.###.#####.#######.#.###.#.#.#.#.###########.#.#######.#######.#.###.###
|
||||||
|
#.................###...#.#...#...........#...#.###...#...#...#.#...#...#.....#.....###...#...#.#...#...........#...###...#...#.....#...#...#
|
||||||
|
#.###############.###.###.###############.#.###.#####.#.#####.#.#.#####.#####.#####.#######.###.###############.#######.#.###.#.#######.###.#
|
||||||
|
#.............#...#...#...#...............#.#...#...#.#.#...#.#.#...#...#...#.#.....#.....#.....###...#.........###.....#...#...#...###.....#
|
||||||
|
#############.#.###.###.###.###############.#.###.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.###.#########.#.#.###########.#######.#####.#.#########
|
||||||
|
#.....#.......#.#...#...#...#...#...........#...#.#...#.#.#...#.....#.....#.#.#.#...#...#.....#.....#.#...........#.#.....#...#...#...#.....#
|
||||||
|
#.###.#.#######.#.###.###.###.#.#.#############.#.#####.#.#################.#.#.#.#.###.#####.#.#####.###########.#.#.###.###.#.#####.#.###.#
|
||||||
|
#...#.#.......#.#.....###.....#...#.............#.....#.#.............#...#...#...#.#...#...#.#.#...#...#...#.....#.#...#...#.#.#...#...#...#
|
||||||
|
###.#.#######.#.###################.#################.#.#############.#.#.#########.#.###.#.#.#.#.#.###.#.#.#.#####.###.###.#.#.#.#.#####.###
|
||||||
|
###.#.#...#...#...###...#...#.......#.......#...#...#.#...#...###...#...#.#.........#.#...#...#...#...#...#.#.......#...#...#...#.#.#...#...#
|
||||||
|
###.#.#.#.#.#####.###.#.#.#.#.#######.#####.#.#.#.#.#.###.#.#.###.#.#####.#.#########.#.#############.#####.#########.###.#######.#.#.#.###.#
|
||||||
|
#...#...#...#...#.....#...#.#.........#.....#.#.#.#.#...#.#.#.#...#...###.#.#.....###.#.###...###...#.....#.#...#.....#...#...#...#...#...#.#
|
||||||
|
#.###########.#.###########.###########.#####.#.#.#.###.#.#.#.#.#####.###.#.#.###.###.#.###.#.###.#.#####.#.#.#.#.#####.###.#.#.#########.#.#
|
||||||
|
#.#.......#...#...#...#...#.#...#.......#.....#.#.#.#...#.#.#.#.....#...#.#.#.#...#...#...#.#.#...#.....#.#...#...#...#.....#...#...#...#...#
|
||||||
|
#.#.#####.#.#####.#.#.#.#.#.#.#.#.#######.#####.#.#.#.###.#.#.#####.###.#.#.#.#.###.#####.#.#.#.#######.#.#########.#.###########.#.#.#.#####
|
||||||
|
#.#.#.....#...#...#.#...#.#.#.#.#...#...#.....#.#.#.#.#...#.#.#...#...#.#.#.#.#.###...#...#.#.#.......#.#...###.....#.............#...#.....#
|
||||||
|
#.#.#.#######.#.###.#####.#.#.#.###.#.#.#####.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.#####.#.###.#.#######.#.###.###.###########################.#
|
||||||
|
#...#.#...#...#.....###...#...#.....#.#.#...#.#.#.#.#.#...#.#.#.#...#.#.#.#.#.#...#...#.#...#.#...#...#...#.....#...#...#...#...#...#.......#
|
||||||
|
#####.#.#.#.###########.#############.#.#.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.###.#.###.#.###.#.#.#.#####.#######.#.#.#.#.#.#.#.#.#.#.#######
|
||||||
|
#.....#.#.#.#.....#...#.....#.........#.#.#.#.#.#.#.#...#...#.#.#...#.#.#.#.#...#...###.#.###...#.#...#...#.......#...#.#.#...#...#.#...#...#
|
||||||
|
#.#####.#.#.#.###.#.#.#####.#.#########.#.#.#.#.#.#.###.#####.#.#.###.#.#.#.###.#######.#.#######.###.#.###.###########.#.#########.###.#.#.#
|
||||||
|
#.#.....#...#...#...#.......#.###.......#.#...#.#.#...#.###...#.#.....#...#.#...#.......#.......#...#.#.#...###.......#.#.....#...#...#...#.#
|
||||||
|
#.#.###########.#############.###.#######.#####.#.###.#.###.###.###########.#.###.#############.###.#.#.#.#####.#####.#.#####.#.#.###.#####.#
|
||||||
|
#.#.#...........#...#...#...#...#...#...#...#...#.#...#...#...#.....#.......#.###.....#.....#...###.#.#.#.......#.....#.......#.#.###.......#
|
||||||
|
#.#.#.###########.#.#.#.#.#.###.###.#.#.###.#.###.#.#####.###.#####.#.#######.#######.#.###.#.#####.#.#.#########.#############.#.###########
|
||||||
|
#...#.............#...#.#.#...#...#...#.#...#.#...#.#...#.#...#.....#...#...#.#.....#.#.#...#.....#...#.#.......#.....###...###.#...........#
|
||||||
|
#######################.#.###.###.#####.#.###.#.###.#.#.#.#.###.#######.#.#.#.#.###.#.#.#.#######.#####.#.#####.#####.###.#.###.###########.#
|
||||||
|
#...............#.....#...#...#...###...#...#.#...#.#.#.#.#.#...#...###...#.#.#...#...#.#.....#...###...#...###.....#.....#.....#...#.......#
|
||||||
|
#.#############.#.###.#####.###.#####.#####.#.###.#.#.#.#.#.#.###.#.#######.#.###.#####.#####.#.#####.#####.#######.#############.#.#.#######
|
||||||
|
#.............#.#...#.....#...#.#.....#...#.#.#...#.#.#.#.#.#.....#.......#.#...#...#...#.....#.....#.#...#.....#...#...#.....#...#.#.......#
|
||||||
|
#############.#.###.#####.###.#.#.#####.#.#.#.#.###.#.#.#.#.#############.#.###.###.#.###.#########.#.#.#.#####.#.###.#.#.###.#.###.#######.#
|
||||||
|
#...#...###...#.....#...#.....#.#.....#.#...#.#.###.#.#.#.#...#...#.....#.#.#...###.#.###...#...#...#...#.#.....#.#...#.#...#.#...#.........#
|
||||||
|
#.#.#.#.###.#########.#.#######.#####.#.#####.#.###.#.#.#.###.#.#.#.###.#.#.#.#####.#.#####.#.#.#.#######.#.#####.#.###.###.#.###.###########
|
||||||
|
#.#...#...#...........#.....#...#.....#.#.....#...#...#.#.###.#.#.#.#...#.#.#.#.....#.#.....#.#.#.#.......#.....#.#.#...#...#.....#...#...###
|
||||||
|
#.#######.#################.#.###.#####.#.#######.#####.#.###.#.#.#.#.###.#.#.#.#####.#.#####.#.#.#.###########.#.#.#.###.#########.#.#.#.###
|
||||||
|
#.......#.#.................#.#...#...#.#...#...#.....#.#.#...#.#.#.#.#...#.#.#...#...#.#...#.#.#.#.......#.....#...#...#...........#...#...#
|
||||||
|
#######.#.#.#################.#.###.#.#.###.#.#.#####.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#.#.#.#######.#.###########.###################.#
|
||||||
|
#.......#.#...#.....#...#...#.#.#...#...###.#.#...#...#...#.#...#.#.#.#.#...#.#...#.###...#.#.#.#.#.......#.......#...#.#.....#...#...#...#.#
|
||||||
|
#.#######.###.#.###.#.#.#.#.#.#.#.#########.#.###.#.#######.#.###.#.#.#.#.###.#.###.#######.#.#.#.#.#############.#.#.#.#.###.#.#.#.#.#.#.#.#
|
||||||
|
#...#...#...#...#...#.#.#.#...#.#.#...#...#.#.###.#.###.....#...#...#.#.#.....#...#.......#.#.#.#.#.#...#...#...#.#.#.#...###.#.#.#.#...#.#.#
|
||||||
|
###.#.#.###.#####.###.#.#.#####.#.#.#.#.#.#.#.###.#.###.#######.#####.#.#########.#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.#.#####.#.#
|
||||||
|
###...#...#.......#...#.#.#...#...#.#...#...#...#.#...#...#.....#.....#.#.........#.......#...#.#.#...#.#.#...#.#...#.......#.#.#.#...###.#.#
|
||||||
|
#########.#########.###.#.#.#.#####.###########.#.###.###.#.#####.#####.#.#########.###########.#.#####.#.#####.###########.#.#.#.###.###.#.#
|
||||||
|
#.........#.....#...#...#...#.....#.........#...#.#...###.#.#...#...#...#.#...#...#...#.......#...###...#.....#...#...#.....#...#...#...#.#.#
|
||||||
|
#.#########.###.#.###.###########.#########.#.###.#.#####.#.#.#.###.#.###.#.#.#.#.###.#.#####.#######.#######.###.#.#.#.###########.###.#.#.#
|
||||||
|
#...#...#...###...#...#...#.......#.........#.###...#.....#...#.#...#.#...#.#.#.#...#...#...#.#.......#.......###...#.#.......#.....#...#...#
|
||||||
|
###.#.#.#.#########.###.#.#.#######.#########.#######.#########.#.###.#.###.#.#.###.#####.#.#.#.#######.#############.#######.#.#####.#######
|
||||||
|
#...#.#.#.#.........#...#.#.###...#...#.....#.......#.....#.....#...#.#...#.#.#...#...#...#...#.......#.#...#...#...#.#.......#.......###...#
|
||||||
|
#.###.#.#.#.#########.###.#.###.#.###.#.###.#######.#####.#.#######.#.###.#.#.###.###.#.#############.#.#.#.#.#.#.#.#.#.#################.#.#
|
||||||
|
#...#.#.#.#.#...#...#...#.#.#...#.....#.#...#.....#.....#.#...#.....#.#...#.#...#.#...#.....#.........#...#...#...#.#.#...................#.#
|
||||||
|
###.#.#.#.#.#.#.#.#.###.#.#.#.#########.#.###.###.#####.#.###.#.#####.#.###.###.#.#.#######.#.#####################.#.#####################.#
|
||||||
|
###...#...#...#...#.....#...#...........#.....###.......#.....#.......#.....###...#.........#.......................#.......................#
|
||||||
|
#############################################################################################################################################
|
||||||
125
2024/gareth/day21/day21.go
Normal file
125
2024/gareth/day21/day21.go
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
package day21
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type coordinate struct {
|
||||||
|
row, col int
|
||||||
|
}
|
||||||
|
|
||||||
|
var numberPad = map[string]coordinate{
|
||||||
|
"7": {0, 0}, "8": {0, 1}, "9": {0, 2},
|
||||||
|
"4": {1, 0}, "5": {1, 1}, "6": {1, 2},
|
||||||
|
"1": {2, 0}, "2": {2, 1}, "3": {2, 2},
|
||||||
|
"0": {3, 1}, "A": {3, 2},
|
||||||
|
}
|
||||||
|
|
||||||
|
var robotPad = map[string]coordinate{
|
||||||
|
"^": {0, 1}, "A": {0, 2},
|
||||||
|
"<": {1, 0}, "v": {1, 1}, ">": {1, 2},
|
||||||
|
}
|
||||||
|
|
||||||
|
type cacheKey struct {
|
||||||
|
sequence string
|
||||||
|
iterations int
|
||||||
|
}
|
||||||
|
|
||||||
|
var memo = make(map[cacheKey]int)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
codes := parseInput(input)
|
||||||
|
|
||||||
|
numpadGraph := createGraph(numberPad, coordinate{3, 0})
|
||||||
|
dirpadGraph := createGraph(robotPad, coordinate{0, 0})
|
||||||
|
|
||||||
|
total := 0
|
||||||
|
for _, code := range codes {
|
||||||
|
codeInt, _ := strconv.Atoi(code[:len(code)-1])
|
||||||
|
total += codeInt * getLength(code, 3, true, numpadGraph, dirpadGraph)
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
codes := parseInput(input)
|
||||||
|
|
||||||
|
numpadGraph := createGraph(numberPad, coordinate{3, 0})
|
||||||
|
dirpadGraph := createGraph(robotPad, coordinate{0, 0})
|
||||||
|
|
||||||
|
total := 0
|
||||||
|
for _, code := range codes {
|
||||||
|
codeInt, _ := strconv.Atoi(code[:len(code)-1])
|
||||||
|
total += codeInt * getLength(code, 26, true, numpadGraph, dirpadGraph)
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []string {
|
||||||
|
parts := strings.Split(input, "\n")
|
||||||
|
codes := []string{}
|
||||||
|
codes = append(codes, parts...)
|
||||||
|
return codes
|
||||||
|
}
|
||||||
|
|
||||||
|
func createGraph(keypad map[string]coordinate, invalidCoords coordinate) map[string]string {
|
||||||
|
graph := make(map[string]string)
|
||||||
|
|
||||||
|
for a, coordA := range keypad {
|
||||||
|
for b, coordB := range keypad {
|
||||||
|
x1, y1 := coordA.row, coordA.col
|
||||||
|
x2, y2 := coordB.row, coordB.col
|
||||||
|
|
||||||
|
path := strings.Repeat("<", max(0, y1-y2)) +
|
||||||
|
strings.Repeat("v", max(0, x2-x1)) +
|
||||||
|
strings.Repeat("^", max(0, x1-x2)) +
|
||||||
|
strings.Repeat(">", max(0, y2-y1))
|
||||||
|
|
||||||
|
if invalidCoords == (coordinate{x1, y2}) || invalidCoords == (coordinate{x2, y1}) {
|
||||||
|
path = reverseString(path)
|
||||||
|
}
|
||||||
|
graph[a+"->"+b] = path + "A"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return graph
|
||||||
|
}
|
||||||
|
|
||||||
|
func reverseString(s string) string {
|
||||||
|
runes := []rune(s)
|
||||||
|
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
runes[i], runes[j] = runes[j], runes[i]
|
||||||
|
}
|
||||||
|
return string(runes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLength(sequence string, iterations int, firstIter bool, numpadGraph map[string]string, dirpadGraph map[string]string) int {
|
||||||
|
|
||||||
|
if iterations == 0 {
|
||||||
|
return len(sequence)
|
||||||
|
}
|
||||||
|
|
||||||
|
key := cacheKey{sequence: sequence, iterations: iterations}
|
||||||
|
if cachedResult, exists := memo[key]; exists {
|
||||||
|
return cachedResult
|
||||||
|
}
|
||||||
|
|
||||||
|
graph := numpadGraph
|
||||||
|
if !firstIter {
|
||||||
|
graph = dirpadGraph
|
||||||
|
}
|
||||||
|
|
||||||
|
totalLength := 0
|
||||||
|
prev := "A"
|
||||||
|
for _, char := range sequence {
|
||||||
|
graphKey := prev + "->" + string(char)
|
||||||
|
if subSequence, exists := graph[graphKey]; exists {
|
||||||
|
totalLength += getLength(subSequence, iterations-1, false, numpadGraph, dirpadGraph)
|
||||||
|
}
|
||||||
|
prev = string(char)
|
||||||
|
}
|
||||||
|
|
||||||
|
memo[key] = totalLength
|
||||||
|
return totalLength
|
||||||
|
}
|
||||||
25
2024/gareth/day21/day21_test.go
Normal file
25
2024/gareth/day21/day21_test.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package day21
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`029A
|
||||||
|
980A
|
||||||
|
179A
|
||||||
|
456A
|
||||||
|
379A`)
|
||||||
|
assert.Equal(t, 126384, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`029A
|
||||||
|
980A
|
||||||
|
179A
|
||||||
|
456A
|
||||||
|
379A`)
|
||||||
|
assert.Equal(t, 126384, r)
|
||||||
|
}
|
||||||
5
2024/gareth/day21/input.txt
Normal file
5
2024/gareth/day21/input.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
985A
|
||||||
|
540A
|
||||||
|
463A
|
||||||
|
671A
|
||||||
|
382A
|
||||||
112
2024/gareth/day22/day22.go
Normal file
112
2024/gareth/day22/day22.go
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
package day22
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Queue struct {
|
||||||
|
data []int
|
||||||
|
size int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewQueue(size int) *Queue {
|
||||||
|
return &Queue{
|
||||||
|
data: make([]int, 0, size),
|
||||||
|
size: size,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (queue *Queue) Push(value int) {
|
||||||
|
if len(queue.data) == queue.size {
|
||||||
|
queue.data = queue.data[1:]
|
||||||
|
}
|
||||||
|
queue.data = append(queue.data, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (queue *Queue) Get() []int {
|
||||||
|
return queue.data
|
||||||
|
}
|
||||||
|
|
||||||
|
func (queue *Queue) String() string {
|
||||||
|
strs := make([]string, len(queue.data))
|
||||||
|
for i, val := range queue.data {
|
||||||
|
strs[i] = fmt.Sprintf("%d", val)
|
||||||
|
}
|
||||||
|
return strings.Join(strs, ", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
secretNumbers := parseInput(input)
|
||||||
|
|
||||||
|
total := 0
|
||||||
|
for _, number := range secretNumbers {
|
||||||
|
for i := 0; i < 2000; i++ {
|
||||||
|
number = getNextNumber(number)
|
||||||
|
}
|
||||||
|
total += number
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
secretNumbers := parseInput(input)
|
||||||
|
memo := make(map[string]int)
|
||||||
|
|
||||||
|
for _, number := range secretNumbers {
|
||||||
|
seen := make(map[string]bool)
|
||||||
|
queue := NewQueue(4)
|
||||||
|
prevNumber := secretNumbers[0] % 10
|
||||||
|
|
||||||
|
for i := 0; i < 2000; i++ {
|
||||||
|
singleNumber := number % 10
|
||||||
|
cost := singleNumber - prevNumber
|
||||||
|
queue.Push(cost)
|
||||||
|
if i > 3 {
|
||||||
|
if _, ok := seen[queue.String()]; !ok {
|
||||||
|
memo[queue.String()] += singleNumber
|
||||||
|
seen[queue.String()] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prevNumber = singleNumber
|
||||||
|
number = getNextNumber(number)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxMapValue(memo)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []int {
|
||||||
|
parts := strings.Split(input, "\n")
|
||||||
|
secretNumbers := []int{}
|
||||||
|
for _, part := range parts {
|
||||||
|
num, _ := strconv.Atoi(part)
|
||||||
|
secretNumbers = append(secretNumbers, num)
|
||||||
|
}
|
||||||
|
|
||||||
|
return secretNumbers
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNextNumber(number int) int {
|
||||||
|
step1 := (number * 64) ^ number
|
||||||
|
step1 = step1 % 16777216
|
||||||
|
|
||||||
|
step2 := (step1 / 32) ^ step1
|
||||||
|
step2 = step2 % 16777216
|
||||||
|
|
||||||
|
step3 := (step2 * 2048) ^ step2
|
||||||
|
step3 = step3 % 16777216
|
||||||
|
|
||||||
|
return step3
|
||||||
|
}
|
||||||
|
|
||||||
|
func maxMapValue(memo map[string]int) int {
|
||||||
|
maxValue := 0
|
||||||
|
|
||||||
|
for _, value := range memo {
|
||||||
|
if value > maxValue {
|
||||||
|
maxValue = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxValue
|
||||||
|
}
|
||||||
23
2024/gareth/day22/day22_test.go
Normal file
23
2024/gareth/day22/day22_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package day22
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`1
|
||||||
|
10
|
||||||
|
100
|
||||||
|
2024`)
|
||||||
|
assert.Equal(t, 37327623, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
2024`)
|
||||||
|
assert.Equal(t, 23, r)
|
||||||
|
}
|
||||||
1629
2024/gareth/day22/input.txt
Normal file
1629
2024/gareth/day22/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"aoc2024/day14"
|
"aoc2024/day22"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
@@ -9,9 +9,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
data, _ := os.ReadFile("day14/input.txt")
|
data, _ := os.ReadFile("day22/input.txt")
|
||||||
fmt.Printf("part 1: %d\n", day14.Part1(string(data)))
|
fmt.Printf("part 1: %d\n", day22.Part1(string(data)))
|
||||||
fmt.Printf("part 2: %d\n", day14.Part2(string(data)))
|
fmt.Printf("part 2: %d\n", day22.Part2(string(data)))
|
||||||
elapsed := time.Since(start)
|
elapsed := time.Since(start)
|
||||||
fmt.Printf("Execution time: %s\n", elapsed)
|
fmt.Printf("Execution time: %s\n", elapsed)
|
||||||
}
|
}
|
||||||
|
|||||||
291
2024/go/day06/day06.go
Normal file
291
2024/go/day06/day06.go
Normal 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
|
||||||
|
}
|
||||||
35
2024/go/day06/day06_test.go
Normal file
35
2024/go/day06/day06_test.go
Normal 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
130
2024/go/day06/input.txt
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
...#..................#...................#......................#..............................#.............................#...
|
||||||
|
....#.......................#........#.#..............##...........#.....#..........#..........................#..................
|
||||||
|
.............#........................................................................#.........#.#..#..#..........#..............
|
||||||
|
..........#.......#..........#..................#........##...................#..............#....................................
|
||||||
|
....................#..........................................................#..#.....................................#.........
|
||||||
|
....#............................#..............................................#.....................#..........##....#..........
|
||||||
|
.......#.............#......................................................................#.............#.........#.............
|
||||||
|
....###......................#....#...........#.....#................................#..........................#.................
|
||||||
|
..........#..#...........#..#........................................................#.....#...........#................#.........
|
||||||
|
..#....#......#....#....#...................................................................#.....................................
|
||||||
|
....................#............#............................................#......#....#...............................#.......
|
||||||
|
..........#.......#.........#.......#.............................................................................................
|
||||||
|
.......#...#.......................................#...................#..........................................................
|
||||||
|
.......#........#............................#.....#.......#..............................................#..................#...#
|
||||||
|
.....................#.................................#................#...#...............#.....#.#..........................#..
|
||||||
|
.....#..........................................#......................#.............##..............................#........#...
|
||||||
|
.....#......#.........................#..........................#..........................................................#..#..
|
||||||
|
.#......#.............#......#.................................................#.....#...................##......#................
|
||||||
|
.............................................................................##...................................................
|
||||||
|
........................................#.......................................#........#.............................#.#.......#
|
||||||
|
...........#.....................................#.............................#......#......#..#....................#..#.........
|
||||||
|
.............................................#.......................#..................##....#.....#.............................
|
||||||
|
........................#..............................................................#..........................................
|
||||||
|
#..............#.........................#........#...#...............#..............#..................#....................##...
|
||||||
|
...#...#.............................#.......#................................................#........................#....#.....
|
||||||
|
.....#.........................#..#.......................#..........#.....................#..................#.#.....#...........
|
||||||
|
..................#........#..#.......#...................................................................................#....#..
|
||||||
|
..#...#...............................................#.#..#........................................................#....#......#.
|
||||||
|
...............#...............#..........................#............................#..........#.............#.................
|
||||||
|
............#.....#........#.........................................................#........#........#.....#........#......#....
|
||||||
|
............................#.........#....#........#.....#...#.............#.................................#...................
|
||||||
|
........#..................#....#..........................................................#.#.#..................................
|
||||||
|
....................................................................................................................#.............
|
||||||
|
#............#.............#..................#......................................................................#............
|
||||||
|
...............................#....#..........#...........##........................................................#.........#.#
|
||||||
|
................#.........................................#.................................................#........#............
|
||||||
|
..............................................#............#................#........#........................#...................
|
||||||
|
..................#.........#..........................#.............#...............#............#....................#..........
|
||||||
|
........................#...#...............................................#..............#.....#.....................#..........
|
||||||
|
...........#.......................................#..............................#..................#....#...##..................
|
||||||
|
#...............#..................#...............................#...............................#.....................#........
|
||||||
|
.............#...............................................................##...................................................
|
||||||
|
.................#.............#.......................#...#............#.#....#................................#...........#.....
|
||||||
|
#......#......#..................................##.................#.#...............................#...........................
|
||||||
|
.#...............#..........#...............................................#...#..........#..........#...........................
|
||||||
|
.....................................#............................#....#.............................................#...#........
|
||||||
|
......#...#.............#.#....................#.........#..........##.................................#..........#..........#....
|
||||||
|
.............................#..................#....#..............##.......................#.#.....#........#...................
|
||||||
|
.................................................#.#......................................................#................#......
|
||||||
|
......................................#..........................................#......#.........................................
|
||||||
|
#....................#...........................................................#..................#.............................
|
||||||
|
.....#.........#...................................................#....#.#....#.#.........#......................................
|
||||||
|
........#..........#......#.............#................................#.....#................#.................................
|
||||||
|
...........#................................#...........#..........#......#.............#........................#................
|
||||||
|
.......#...............#....................#..#................................................#.................................
|
||||||
|
.....................#.........#..#............#..........#...........#...........#...............................#...............
|
||||||
|
................#...#........#...........#..........................................................#..#...................#......
|
||||||
|
.........................................................#.....................#...#......................#.#....................#
|
||||||
|
................#......#....#.#..............#............#.......................................................................
|
||||||
|
..........#.....................................#......................................................................#..........
|
||||||
|
#......................................#.......#.....##..#.....................#.........#.......#................................
|
||||||
|
........#...#..............#....................#................................#..............................................#.
|
||||||
|
.##............................................................................#......#................................#..........
|
||||||
|
.#........................#..............#..............................................#........#.....#.......#..................
|
||||||
|
#......................................#.....................#...................................................................#
|
||||||
|
............................#.....#.....#............#...............#...#.......#.........#......................................
|
||||||
|
.#.........................#.......................#.........#.......#.................#............................#..#..........
|
||||||
|
.............................................................................................................#........##..........
|
||||||
|
...........#...#...#.#................#.....................................#........#............................................
|
||||||
|
......#.......................#..........#.......#................................................................#...............
|
||||||
|
........#....#........#..................#....##.....#............#..............................#...........#...........#..#.....
|
||||||
|
..................................#...............................................................................#...............
|
||||||
|
.....................#.#.......................#....................................#.............................................
|
||||||
|
........................................................................................#.........#.................#.........#...
|
||||||
|
..........................#..........#....#..........................................#.......................#............#.#.....
|
||||||
|
...............................................#.#....#...............................#...................#......................#
|
||||||
|
.....#...........#........#.#.......#.............................#..................#............................................
|
||||||
|
...............#.........................................................#....................#.................#.............#...
|
||||||
|
#....................................##..........#................................................................#...............
|
||||||
|
...............#.................#...#..............#......................................................#..............#.......
|
||||||
|
...................#......#.............................................#......................................................#.#
|
||||||
|
..#.............#.......#......#....#..#..#.......................................................................................
|
||||||
|
.........#....................................................#.....................................#..............#..............
|
||||||
|
..............#..............#................................................................#.......................#...........
|
||||||
|
..........................#.................#.......................................................##...................#.#......
|
||||||
|
...............#..#...................................................................................................#.......###.
|
||||||
|
...#.....................#..#........#..........#..................................................................##.............
|
||||||
|
.................#.......................................###..............#.........................#.............................
|
||||||
|
...#.....................................................#.......#..........................#................#..#.................
|
||||||
|
...................................................#..................#.........................................................#.
|
||||||
|
.....#.............#...................#...................#.....................................#................................
|
||||||
|
.....................#.........................#......#...........................................................................
|
||||||
|
...........#...............#......#.....##...#...#.............................................#........#.#...............#...#...
|
||||||
|
..............#..............##...........#.......................#..#.^..........................................................
|
||||||
|
...................#..............................................................................................................
|
||||||
|
..................#.......#..........#.......#..................#..........#...................................#..................
|
||||||
|
..............................................................................................#..................................#
|
||||||
|
......................................................#................#......................#...................................
|
||||||
|
..............#.........#..............................#.....................#......................#.............................
|
||||||
|
#................#.........#................#.............................#......................#..#...#..............#..........
|
||||||
|
.#..#........#................#...............#..................#........#.....................#............#........#...........
|
||||||
|
.....................................................#.#.........#......................#.............................#........#..
|
||||||
|
......................#.....................#..#......#..........................#............................#......#............
|
||||||
|
......................#.........................#..#..................................#.......................#..............#....
|
||||||
|
..........................#..................#.............#......................................................#...............
|
||||||
|
..........................#....#........................................#..#...#....#.................#...........................
|
||||||
|
.......#...........#.......................#............##........#....................................................#..........
|
||||||
|
#..........................................................................#...........#..........................................
|
||||||
|
............................................................#.................#..#........................................##......
|
||||||
|
..#...............................................#....#.................................................##.....#...##.....#......
|
||||||
|
...#.....##..............................#.........................................................#............#.................
|
||||||
|
.....#....##............................#....##..........#...#....................................................................
|
||||||
|
..................................................#..........................#.........##.......#.......................#.........
|
||||||
|
.........#.....#..........#........#........................#.##..#............#.......................................#..........
|
||||||
|
.....#...............#.......#..........#.#..........#.....................#.....................................#.....#..........
|
||||||
|
....#......#............................................................................................##...#.#.#.........#......
|
||||||
|
...........#........................#.....#....................#..................#.#........#....................................
|
||||||
|
....................................................#................#.#................................................#.........
|
||||||
|
..........#..............#.......................#.................#...................................#.............#.#......##..
|
||||||
|
................##......................................................#.................#.......#.#....................#........
|
||||||
|
................#......................................................#.............##...............#.....#......#.......#......
|
||||||
|
..............................#............................#..........#...........#...............................................
|
||||||
|
.......#.............#....................................................................#..............................#.#......
|
||||||
|
...#.....................#.#...............................................................#...#..#....#..........................
|
||||||
|
....#.........##......#..............................................................................#..................#.........
|
||||||
|
....#..........................................#......#...................#........##............#................................
|
||||||
|
..#.......#......#............#........#...#.#...........................#.......#................................................
|
||||||
|
..........................#...#....................#...............#...#......#.#...#...#...............#.#.#.....................
|
||||||
|
....##.#....................................................................#...#.....##........................#.##..............
|
||||||
|
.............................................#....................................................................................
|
||||||
140
2024/go/day07/day07.go
Normal file
140
2024/go/day07/day07.go
Normal 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
|
||||||
|
}
|
||||||
47
2024/go/day07/day07_test.go
Normal file
47
2024/go/day07/day07_test.go
Normal 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
850
2024/go/day07/input.txt
Normal 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
168
2024/go/day08/day08.go
Normal 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
|
||||||
|
}
|
||||||
39
2024/go/day08/day08_test.go
Normal file
39
2024/go/day08/day08_test.go
Normal 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
50
2024/go/day08/input.txt
Normal 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
117
2024/go/day09/day09.go
Normal 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")
|
||||||
|
}
|
||||||
17
2024/go/day09/day09_test.go
Normal file
17
2024/go/day09/day09_test.go
Normal 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
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
103
2024/go/day10/day10.go
Normal 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
|
||||||
|
}
|
||||||
31
2024/go/day10/day10_test.go
Normal file
31
2024/go/day10/day10_test.go
Normal 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
56
2024/go/day10/input.txt
Normal 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
76
2024/go/day11/day11.go
Normal 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
|
||||||
|
}
|
||||||
17
2024/go/day11/day11_test.go
Normal file
17
2024/go/day11/day11_test.go
Normal 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
1
2024/go/day11/input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3 386358 86195 85 1267 3752457 0 741
|
||||||
146
2024/go/day12/day12.go
Normal file
146
2024/go/day12/day12.go
Normal 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, ®ion, 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, ®ion, 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
|
||||||
|
}
|
||||||
29
2024/go/day12/day12_test.go
Normal file
29
2024/go/day12/day12_test.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package day12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`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
140
2024/go/day12/input.txt
Normal 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
58
2024/go/day13/day13.go
Normal 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
|
||||||
|
}
|
||||||
45
2024/go/day13/day13_test.go
Normal file
45
2024/go/day13/day13_test.go
Normal 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
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
149
2024/go/day14/day14.go
Normal 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
527
2024/go/day14/day14_test.go
Normal 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
500
2024/go/day14/input.txt
Normal 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
119
2024/go/day15/day15.go
Normal 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)
|
||||||
|
}
|
||||||
57
2024/go/day15/day15_test.go
Normal file
57
2024/go/day15/day15_test.go
Normal 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
71
2024/go/day15/input.txt
Normal 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
225
2024/go/day16/day16.go
Normal 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
|
||||||
|
}
|
||||||
47
2024/go/day16/day16_test.go
Normal file
47
2024/go/day16/day16_test.go
Normal 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
141
2024/go/day16/input.txt
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#.....#.....#...#.................#...#.......#.........#...#.......#...#.......#.......#...#...#.....#...#.......................#...#....E#
|
||||||
|
#.###.#.#.#.###.#.###.###.#######.#.#.#.#.###.#.###.###.#.#.#.###.#.###.#.#.#####.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#######.#.#.#.###.#
|
||||||
|
#...#.#.#.#...#.....#...#.#.....#...#...#.#...#.#...#...#.#.#...#.#...#.#.#...#...#...#.....#.#.#.#.#...#...#.....#.#.#.....#.....#.#.#...#.#
|
||||||
|
#.#.###.#.###.#.#####.#.#.###.###########.#.#####.###.###.###.###.###.#.#.#.#.#.###.#######.#.#.#.#.#########.#####.#.#.#####.#####.#.###.#.#
|
||||||
|
#.#.....#.#.#.#...#...#.#...#.....#.....#.#.....#.#.#.#.........................#.#.......#.#.#...#.....#...#.#...#.....#...#.#...#.#.....#.#
|
||||||
|
#.#######.#.#.#.###.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.###.###.###.#.###.#.#.#.#.#######.###.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.#.#######.#
|
||||||
|
#...#...#.#...#.#...#.#...#.#.#.#...#.#.......#...#...#...#...#.#.....#...#.#...#.......#...#...#.....#...#.#.....#...#...#...#.#.........#.#
|
||||||
|
###.#.###.#.#####.###.###.#.###.#.#####.###.#.#####.###.#.###.#.###.###.###.#####.#########.#.#.###.#.###.#.#####.#.###.#######.###########.#
|
||||||
|
#...#...#.#.#.....#...#...#.#...#.#...#.#...#.#...#...#.#.....#...#...#.#...........#.........#.#...#.#...#.........#.#.#.......#...........#
|
||||||
|
#.#####.#.#.#.#######.#.###.#.###.#.#.#.#.###.#.#####.#########.#.#.###.#.#####.###.#.#####.#.#.#.###.###.###.#####.#.#.#.#######.#########.#
|
||||||
|
#.#.....#.#...#.......#...#.#.#.....#.#...#.#.#...............................#...#.#...#...#...#.#.#.....#.#.....#...#.#.#.....#.......#...#
|
||||||
|
#.#.###.#.#####.#.###.###.#.#.#.#.###.#.###.#.###############.#.#.#.#.#####.#.#####.###.#####.#.#.#.#####.#.#####.###.#.#.#.###.#######.###.#
|
||||||
|
#.#...#.#.....#.#.....#...#...#.#...#.#.....#.#.....#.................................#...#...#...#...#...................#...#...#...#...#.#
|
||||||
|
#.###.#.#####.###.#.#.#.#####.#.#.#.#.#######.#.###.#.#######.###.#.#.#.#.###.#.#########.#.#.#.#.#.###.#.#####.#.###.#.#.###.#.#.###.###.#.#
|
||||||
|
#.#...............#.#...#...#.#...#.........#.....#.#.#.......#...#.#.#.#.#...#.#.....#...#.#.....#.....#.....#.#.....#.#.#...#.#...#...#...#
|
||||||
|
#.#.#####.#.#####.#.#####.#.#.###.#########.#.#####.#.#.#######.###.#.###.#.###.#.###.#.#.#.#.#########.#.###.#########.#.#####.###.###.###.#
|
||||||
|
#.#.#.....#.....#.#.#.....#.....#.....#...#.#.#.....#.#.#.......#.#.#.....#.#...#.#...#.#.#.#.........#...#.#.........#.#.........#...#...#.#
|
||||||
|
#.#.#.#####.#####.#.###.#######.#####.###.#.###.#####.#.#####.###.#.#######.#.#.#.#.#.#.###.#.#######.#.###.###.#.###.#.#########.###.#.#.#.#
|
||||||
|
#.#.......#...#...#...#...#...#.....#...#.#.#...#.#.....#.....#.....#...#...#.#...#.#.#.....#.#.......#.#.......#...#.#.....#.......#.#.....#
|
||||||
|
#.#######.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.###.#######.#.#.#########.#.###.###.#.#######.#.#####.###.#.#####.#.###.###.#.#.#.#
|
||||||
|
#.....#...#...#...#.#.#.#...#.#.........#.#...#...#...#...#.#.#.......#...#.......#.#.#.......#.........#.........#.#...#.#.#...#.....#.#.#.#
|
||||||
|
#####.###.#.#.###.#.#.###.###.#.#########.#####.#####.#.#.#.#.#.#############.###.#.#.###########.#######.#######.#.#.#.#.#.###.#######.#.#.#
|
||||||
|
#...#...#.#.#.#...#.......#.#.#.#.......#.......#.....#.#.#...#.............#.#...#.#...#.......#.........#...#...#...#...#...#...#.....#.#.#
|
||||||
|
#.#.###.#.#.#.#.###########.#.#.###.###.#.#.#####.#####.#.#####.#.#########.#.#.###.###.#.###.#.###########.###.#####.###.#.#####.#.#####.#.#
|
||||||
|
#.#.#.#.#.#.#.#.....#.....#...#...#.#.....#.#.....#.#...#.....#.#.#.......#.#.#...#.#.....#...#.#.....#.....#...#.......#.#.................#
|
||||||
|
#.#.#.#.###.#.#####.#.###.#.#####.#.#######.#.#####.#.#####.#.#.#.#####.###.#.###.#.#########.#.#.###.#.###.#.###.#####.#.###.###.###.#.###.#
|
||||||
|
#.....#.#...#.....#...#...#...#...#.#.....#.#...#.#...#.....#...#.#.....#...#.#...#...#.......#...#...#...#.#.#...#.....#.#.#.........#...#.#
|
||||||
|
#.#####.#.#######.#####.#####.#.###.#.###.#####.#.#.#####.#.#####.#.#####.###.#.#####.#.###.#######.#######.#.###.#.#####.#.###############.#
|
||||||
|
#.#.....#...#...#...#...#.....#.#...#.#.#.......#.#.......#.....#.#.....#.#...#.......#.#...#.......#.....#.#.....#.....#.......#.........#.#
|
||||||
|
#.#.#######.#.#.###.#.#######.#.#.###.#.#########.#############.#.#.###.#.#.###.#########.#.#.#########.#.#.#####.#####.#####.###.#######.#.#
|
||||||
|
#...#.....#...#...#.#.......#...#...#...#.........#.......#...#...#...#.#.#...#.#...#...#.#.#.#.....#...#.#.....#.....#.....#.#...#.....#...#
|
||||||
|
#.###.#.#.#.#####.#########.###.###.###.###.###.#.#.###.#.#.#.#########.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#######.#####.#.#.###.#.#####.#
|
||||||
|
#.#.....#.#.#...#...#.......#.............#.#.#.#.#.#...#...#.#.........#.#.#.....#.#.#.#.#.....#.....#.#.#.#...........#...#.#...#.#.#...#.#
|
||||||
|
#.#.#.###.###.#.###.#.#########.#####.###.#.#.#.#.#.#.#########.#.#####.#.#########.#.#.#.#.#######.###.#.###########.###.###.###.#.###.#.#.#
|
||||||
|
#...#...#.....#.....#.#.........#.....#...#.....#.#.#.#.....#...#.#...#.#.#.......#...#.#...#.#...#...#...#.............#.#...#...#.....#.#.#
|
||||||
|
#####.#.#######.#####.#.#.#############.#####.#.###.#.#.###.#.###.#.#.###.#.#####.#####.#.###.#.#.#.#.#.###.###########.#.###.#.###.#####.#.#
|
||||||
|
#.#...#.......#.#.....#.#.#...#.............#.#.#...#.....#.....#...#...#.#...#.#...#...#.#...#.#.#.#.#...#.#...#.....#.#.#.....#...#...#...#
|
||||||
|
#.#.#.###.#####.#.#####.###.#.#.###########.###.#.#############.#######.#.###.#.###.#.###.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.###.#.#####
|
||||||
|
#...#...#...#...#.#.#.......#.#.#.......#.....#.....#.........#.........#...#.#.....#...#...#...#.#.#.#.....#.#.#.........#.#.#...#...#.#...#
|
||||||
|
#.###.#.###.#.###.#.#.#######.#.#.#####.#####.#.#####.#######.#.#####.#.###.#.#.#######.###.#.###.#.###.###.#.#.#.#########.#.#.#####.#.#.#.#
|
||||||
|
#.......#...#...#.#.........#...#...#.#.....#.#...#...#.#.....#.#.....#...#...#...#...#.....#...#.#.....#.....#.#.#.........#.#.......#.#.#.#
|
||||||
|
#.###.#.#.###.#.#.###.#########.###.#.#####.#.#####.###.#.#######.#######.#######.#.#.#.###.###.#.#.#####.#####.#.#.#########.#########.#.###
|
||||||
|
#.#.....#.....#.#...#.#.......#.#...#.....#.#.......#.....#.......#...#.....#...#...#.#.#...#...#.#.#.....#...#.#.#.#.........#.....#...#...#
|
||||||
|
#.#.#.#######.#.#.#.###.#.###.###.###.#####.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.#.#.###.#.#####.###.###.#.###.#.#
|
||||||
|
#.#.#.....#...#.#.#.#...#...#.#...#.....#...#.........#.........#.#.#.#.#.....#.....#.#...#...#.#...........#.#...#.#.#...#.......#.#...#.#.#
|
||||||
|
#.#.#.###.#.#.#.#.#.#.#####.#.#.#######.#.###.#########.#.###.#####.#.###.#####.#####.#.###.###.#######.#########.#.###.#.#####.#.#.###.###.#
|
||||||
|
#.#.#.....#.#.#.#.#.#.......#.#.#...#...#.#.#...#.#.....#.#...#.........#...#...#...#.#.#...#...#.....#.#.....#...#.....#.#.....#.#.........#
|
||||||
|
#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#####.#####.###.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#.#.#####.#.#.###.#.#########.#
|
||||||
|
#.#.......#.#.#...#.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#...#...#...#...#.#.....#.#.#.#.#...#.#.#...#...#.#.#.#.........#...#.#.....#...#.#
|
||||||
|
#.#######.#.#.###.#.#.#.#.###.#####.#.#.###.#.#####.#.#.#.#.#.###.###.###.#.#######.#.#.#.#.#####.#.###.###.#.#.#####.#.#####.#.#######.#.#.#
|
||||||
|
#.#.......#.#...#.#.#...#...#.#.......#.#...#.....#.#.#...#.#...#.....#.#.#.......#...#.....#.....#...#.#.....#.....#.#.#.....#.........#.#.#
|
||||||
|
#.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#####.#.#.###.#.###.#.###.#.#.#######.###########.#######.#.#.#########.###.#.###############.#.#
|
||||||
|
#.#...#...#.#...#.#...#.#...#...#.#.....#.#.#.....#.#.#...#...#.........#...................#.#.....#.#.#.........#...#...#.......#.......#.#
|
||||||
|
#.###.#.#.#.#####.###.###.#.#####.#.#####.#.#.#####.#.#.#####.#########.###################.#.#.#####.#.###.###.#.###.#####.#######.#######.#
|
||||||
|
#...#...#...#.....#.......#.....#.#.#.....#...#.........#...#...#.....#...#...........#.#.....#.......#...#.....#.......#...#.....#.#.....#.#
|
||||||
|
###.###.#.###.#####.###########.#.#.#.###########.#.#####.#.###.#.###.###.#.#########.#.#.#######.#####.#.###########.#.#.#.#.###.#.###.###.#
|
||||||
|
#...#...#...........#.#.....#.....#.#.#.......#...#.#.....#.....#.#.#.#...#.#.#.....#.#.....#...#.....#.#.................#.#.#.#.#...#.....#
|
||||||
|
#.#.#.#####.###.#####.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.#####.#.#.#.###.#.#####.#.#####.#####.#########.#####.#.#.#.#.#.###.###
|
||||||
|
#.#.#.#...#.#.......#.....#.....#.#.#.#...#.#.#.......#.....#...#.#.#...#.......#.....#...#...#.#...#.....#.........#...#...#.#...#.#...#...#
|
||||||
|
#.###.#.#.###.###.#.###########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#########.#######.###.###.#####.#########.###.#.###.#.#######.#####
|
||||||
|
#.#...#.#.....#...#.#.........#...#.#...#...#.#.....#...#...#...#.#.#...#.........#.........#.#.#...#...#...#.....#...#.#...#.#...#...#.....#
|
||||||
|
#.#.###.#.#####.#.#.#.#######.#.###.#####.###.#.###.#.###.#######.#.#.###.#######.###########.#.#.###.#.###.#.#####.###.#####.###.#.#.#.###.#
|
||||||
|
#...#...#.....#.#...#.#.....#.#.#...#.....#...#.....#...#.........#.#.#.........#.......#...#...#.....#...#.#...........#...#...#...#.......#
|
||||||
|
#####.###.#.###.#####.#.#.###.###.###.#####.#######.###.###.#######.#.#########.#.#.###.###.#.#########.###.#########.###.#.###.#######.###.#
|
||||||
|
#.....#...#.....#.....#.#.......................#...#...#.........#.#.......#...#.#...#...#.#.......#...#...#.........#...#...#.......#.....#
|
||||||
|
#.#####.#.#######.#################.#########.#.#.###.###.#####.#.#.#######.#####.###.###.#.#.#.###.#.#.#.###.###.#####.#####.#######.#.#####
|
||||||
|
#.#.#...#...#.................#.#...#.........#.......#.#.#.#...#...#...#...#...#.......#.#.#.#...#...#.#.....#...#...#...#.........#.......#
|
||||||
|
#.#.#.#.#.###.###.###########.#.#.###.#################.#.#.#.#####.#.#.#.###.#.#########.#.#.###.#####.#######.###.#.###.#########.###.###.#
|
||||||
|
#.#.#...#.........#.....#.....#.#.#.....#...#.............#.#.#.....#.#.......#.........#.#.#...#.........#.......#.#...#...#.....#.#.....#.#
|
||||||
|
#.#.###.#.#######.#####.#.#####.#.#.###.#.#.###.###.###.#.#.#.#######.#################.#.#.###.#.#.#####.#.#######.###.###.#.###.#.#.###.#.#
|
||||||
|
#.#...#.#.....#.........#.#.....#.#.#...#.#...#...#...#.#.....#.......#.........#.......#.#...#.#.#.....#.#.#...#...#...#...#...#.#...#.#.#.#
|
||||||
|
#.#.###.#.###.###########.#.###.#.###.###.###.#######.###.#.#.#.###############.#.#######.#.#.#.###.###.#.#.#.#.#.###.#.#.#####.#.#####.#.#.#
|
||||||
|
#.#.....#.#...............#.#...#...#...#...#.#.....#.......#...........#.....#.#.#.......#.#.#.....#.#.#.#...#.#.#.......#.....#.......#...#
|
||||||
|
#.#.###.#.#.#################.###.#.#.#.###.#.#.###.#######.###########.#.###.#.#.#.###.#.###.###.#.#.#.###.#####.#.###########.#.#####.###.#
|
||||||
|
#.#...#...#.#...#...#.........#...#.#.#...#.#...#.#.#.....#.#.....#...#.#...#...#...#.#...#...#...#...#.....#.....#.....#.......#.....#...#.#
|
||||||
|
#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.#.#####.#.#.###.###.###.#.#.#.###.#########.#####.#.#.#####.###.#.#.#######.###.#####.#####.###.#.#
|
||||||
|
#.#...#.......#.#.#...#...#.#...#...#.....#...#...#...#.#.....#.#...#.#...#.#.#.......#.......#.....#.......#.#.#.....#...#...#.#.....#...#.#
|
||||||
|
#.#.###.###.###.#.###.#.###.#.#######.#.#####.#.#.#####.#######.#####.###.#.#.#.###.#.#.#####.#####.#########.#.#.#####.###.#.#.###.###.#.#.#
|
||||||
|
#.#.#.....#.....#.#.....#.#.#.........#.......#.#.........#.............#.#.#.....#.#.#.#.....#.....#.......#.#...#...#.#...#.#...#...#.#.#.#
|
||||||
|
#.#.#.#.#.#.#####.#######.#.#####.#####.#.#########.###.#.#.#####.#####.#.#.#######.#.###.###.#.#.###.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.#.#
|
||||||
|
#.#...#.#...#...............#...#.#...#.#.#.......#...#.#.#...#.......#.#.#.#.......#.#...#.#.#.#.......#...#.......#.......#...#.#.#...#.#.#
|
||||||
|
#.#####.#.#.###.#######.#####.#.#.#.#.###.#.#####.#####.#.#.#.#.#.###.#.#.#.#.#######.#.###.#.#.#######.#.###.###########.#####.#.#.#######.#
|
||||||
|
#.....#...#...#.#...#...#.....#...#.#.#...#.#...........#.#...#.#...#.#.#.#.#...#...#...#.#...#.........#.#.....#...#.............#.#.......#
|
||||||
|
#.#.#.#.###.#.###.#.#.###.#.#######.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#.#.#.#.#####.#.#########.###.#.#####.#.#.#########.###.#.#######
|
||||||
|
#.#.#.......#.#...#.#.....#.......#.#...#...#.#.#.......#...#.#.#...#...#.#...#...#.#.........#.......#...#...#...#.#.#...#.....#...#...#...#
|
||||||
|
#.#.###.#####.#.###.#.#########.###.#######.#.###.#####.###.###.#.###.#######.#####.#.#######.###.#.###.#####.#.###.#.#.###.###.#.#.###.###.#
|
||||||
|
#...#...........#.#.#...........#...#.......#.........#.....#...#...#.#.....#.....#.......#...#...#.#...#.....#.#.....#...#...#.#.#...#.....#
|
||||||
|
#.###.#.###.#.#.#.#.###########.#.###.#.#################.###.#####.#.#.###.#####.#.#####.#.###.###.#.#####.###.#######.#.###.#.#.###.#####.#
|
||||||
|
#.....#.....#.....#.......#.....#...#.#...#.............#...#.....#.#.#...#.....#.#.....#.#.....#...#.#...#...#.....#...#.....#.#.#.#.....#.#
|
||||||
|
#.#######.###########.###.#.#######.#.###.#.###.#.#####.#########.#.#.###.###.#.#.###.###.#######.###.#.#.#.#######.#.#########.#.#.###.#.#.#
|
||||||
|
#.#.....#.......#...#...#.#...#.........#...#.#...#...#...........#.....#...#.....#...#...#.........#...#.#.#.......#.#.#.....#...#...#.#.#.#
|
||||||
|
#.#.###.#########.#.###.#.###.#.#######.#####.#.###.#########.#.#.#########.#######.###.###.#######.#####.###.#######.#.#.###.#.###.#.#.###.#
|
||||||
|
#.#.#.#...........#.#...#.#...#...#...#...........#.....#...#.#.#...#.....#.....#.....#.#.....#...#.#...#.....#.....#.#.....#.......#.#.#...#
|
||||||
|
#.#.#.#############.#####.#.#####.#.###.#.#########.###.#.#.#.#####.#.#.#####.#.#######.###.###.#.#.#.#.#######.###.#.#############.###.#.###
|
||||||
|
#.#.#...#...#.......#.....#.#.#...#.#...#.......#.....#.#.#.#.....#...#.....#...#.....#.....#...#.#...#...#.....#...#.............#...#...#.#
|
||||||
|
###.#.###.#.#.#######.#####.#.#.#.#.#.#####.###.#.###.#.#.#.#.#.#########.#.#.###.###.###.#.#.###.#.#####.###.###.###############.###.#####.#
|
||||||
|
#...#...#.#.#...#...#.........#.#.........#...#...#...#.#.#.#.#.............#.....#.#...#.#...#...#.#...#.....#...#.......#.....#...#.......#
|
||||||
|
#.###.#.#.#.#.#.#.#.###.#####.#.#########.#.#.#####.#.#.#.#.#######.###.#.#########.###.#.#####.#.###.#.#######.###.#####.#.#.#.###.#.#####.#
|
||||||
|
#.................#...#.....#.#.....#.#...#.#.....#.#.#.#.#.........#...#.....#.......#.#.#.....#.#...#.#.........#.....#.#...#.#.#...#...#.#
|
||||||
|
#.#.#.#.#####.#.#.###.#####.#######.#.#.###.#####.#.#.#.#.#########.#######.#.#.#####.#.#.#.#####.#.###.#.#.#####.#####.###.#.#.#.#####.###.#
|
||||||
|
#...........#...#.#.........#...#...#.#...#.....#...#.#.#...#.....#.#.....#.#...#.#...#.#.#.#.....#.#.#.#.#.#...............#.#.......#.....#
|
||||||
|
#.###.#.###.#.###.#########.#.#.#.###.###.#####.#####.#.###.#####.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###########.###.#########.#####
|
||||||
|
#.#.........#.....#.........#.#.#.#.#.....#...#...#.#.....#.....#...#.#...#.#.....#...#.#.#.#.#.....#.#...#.#.#...#.......#.#...#.......#...#
|
||||||
|
#.###.#.#.###.###.#.#####.###.#.#.#.#.#####.#.#.#.#.#####.#####.#.###.#.###.#.###.###.#.###.#.#.#####.###.#.#.#.###.#######.###.#.#########.#
|
||||||
|
#.......#...#.......#...#.#...#.#.#...#.....#.#.#.#.....#.#...#.#...#.#.#...#...#...#.#...#.#.#.#.......#.#.....#...#.....#...#...#.#.......#
|
||||||
|
#####.#.###.#.#####.#.###.#.###.#.###.###.###.###.#.###.#.#.#.#.###.#.#.###.###.#####.###.#.#.#.#.#.###.#.#######.#####.#.###.#####.#.###.#.#
|
||||||
|
#.......#.....#.....#...#.#.#...#...#.....#.#.#...#...#.#.#.#.#.#...#.#.......#.#.....#...#.#.#.#.#...#.#...#.....#.....#...#...#.......#...#
|
||||||
|
#.#####.#######.#####.#.#.#.#.#####.#######.#.#.#####.#.#.###.#.#####.#.#.###.#.#.#####.###.###.###.#.#.###.#.#####.#######.#.###.#########.#
|
||||||
|
#.#.....#.......#.....#.#.#.#.......#...........#...#.#.#.....#.....#...#.....#.#.....#.#.#...#.....#.....#.........#.....#.#.....#.....#...#
|
||||||
|
#.#.###.#.#######.#.###.#.#.#########.###########.#.#.#.#####.#####.###.#######.#.#####.#.#.#.#######.#####.###.#.###.#.###.#.#.###.###.#.#.#
|
||||||
|
#.#.#.....#.....#.#...#.#.#.....#...#...#...#.#...#.#.#.....#.#.......#.....#.....#...#.#.#.#.........#.....#.#.#...#.#.....#...#...#.#...#.#
|
||||||
|
#.#.#.#.###.#####.#.#.#.#.#####.#.#.#####.#.#.#.###.#.###.###.#.###.#.#####.#######.#.#.#.#.###.#####.#.###.#.#.#.#.#.###.#.###.#.###.#####.#
|
||||||
|
#.#.#.#.....#...#...#.#.#.....#...#.......#.#.#.#.#.#.#.#.....#.#.......#.#.#.....#.#.....#.#.......#.#.#...#.#.#...#...#.#...#...#.......#.#
|
||||||
|
#.#.#.#.#####.#.#.#.#.#.###.###.###########.#.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.###.#.#.#.#####.###.#.###.#####.#.#
|
||||||
|
#...#.#.......#.#...#.#.....#...#.........#.#.#...#.#.......#.#.#.#...#...#...#...#...#...#.#.....#...#.#.....#.#.#.....#...#...#.#.#.......#
|
||||||
|
#.###.#.#######.#####.###.#.#.#.#.#####.###.#.###.#.#######.#.#.###.#.###.#####.#.###.#.#.#.###.#.###.#.#####.#.#.#####.#.#.###.#.#.#.#.###.#
|
||||||
|
#.#...#.#...#...#...#...#.#...#.#.....#.....#.....#.......#...#.....#.#.#.#.....#...#.#.#...#...#.#.......#...#.#.....#.#.........#.#.#.....#
|
||||||
|
#.#.###.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#####.#.#####.#.#######.#.#.#.#########.#.#####.#.#.#.#####.#.#.#.#####.#.###.#.#.###.#.#####.#
|
||||||
|
#.#.#...#.#.#.#.#.#.....#...#...#...#.#.......#...#.#.#.....#...#...#.#...#.....#...#.#.......#.#.........#.#.#.......#...#.#...#...#.......#
|
||||||
|
#.#.#.###.#.#.#.#.#######.###.#.#####.#########.#.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.#########.#.#######.#.#.#####.#.#########.#
|
||||||
|
#...#.....#.#.#.#...#...#...#.#.....#.........#.#...#.#.#.....#.....#.#.........#.#...#.#.#.....#.#...#.....#.......#.#.#...#...#.#.....#...#
|
||||||
|
###########.#.#.###.#.#.###.#.###.###########.#.###.#.#.#.#######.###.#.#######.#.#####.#.#.###.#.#.###.###.#######.#.#.###.#.#.#.#.#.#.#.#.#
|
||||||
|
#.#.......#.#.#...#.#.#...#.#.....#.......#.#.#.......#.#.........#...#.........#.....#...#.#.....#.#.....#.......#.#.#...#.#.#...#.#.#.#.#.#
|
||||||
|
#.#.#####.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.#.#.###.#.###.###.#.#.#.#######.#####.#.#.###.###.###.#.#####.#####.#.#.###.#.#.#.#####.#.#.#.#
|
||||||
|
#.......#.#.#...#.#.#.#.#.#...#.....#...#...#.#.#.#...#...#...#...#.#.#.....#.#.........#.#...........#...#...#.#...#.#...#.#.......#.#...#.#
|
||||||
|
#########.#.###.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#######.#.#.#####.#.#.#.###.#.#####.###.#####.#######.#.###.#.#####.#.###.#######.#.#####.#
|
||||||
|
#.......#...#...#.#.#.#.#.#.#.........#...#...#.#.#...#...#.#.....#.#.#.#...#...#...#.#...#...#.......#.#.#.........#.#...#...#.#...........#
|
||||||
|
#.#####.#####.###.#.#.#.###.#########.###.#.#####.#.#.#.#########.#.#.#.###.#####.#.#.#.#.#.#.#.#####.#.#.###########.#######.#.#.###.#.#####
|
||||||
|
#...#.........#...#.#.#...#.#.......#...#...#.....#.#...#.........#.#.#...#.#.....#.#.#.#.#.#.......#.#.#.........#...#.....#.#.............#
|
||||||
|
#.#.###########.###.###.#.#.#######.#.#.#####.#####.#####.#######.#.#.#.#.#.#.###.#.#.#.#.#.#######.#.#.#########.#.###.###.#.#.#.#####.###.#
|
||||||
|
#.#.#.......#.............#.....#...#.....#.......#.#.....#...#...#.#.#...........#.#.#.#.#.#...#...#...#.#.......#.#...#.......#.........#.#
|
||||||
|
###.#.#####.###.#.###.###.###.#.#.###.#.###.#####.#.#.###.#.#.#.###.#.#.#######.###.#.###.#.###.#.#######.#.#######.#.#.#######.#######.#.#.#
|
||||||
|
#...#.....#...#.....#.#...#...#.#.....#...#...#...#.#.#...#.#.#...#.#.#...#.#...#...#...#.#.....#.....#.......................#...#.....#.#.#
|
||||||
|
#.#######.###.#.###.#.#.#.#.#.#.#.###.#.#.###.#.###.#.#.###.#.###.#.#.###.#.#.#########.#.###.#####.#.###.#.#.###.#.#########.#.#.#.###.#.#.#
|
||||||
|
#.......#.#.#...#...#...#...........................#.#.#...#.#...#.#...#...#.....#...#.#.....#.....#...#.#.#...................#.#.#...#...#
|
||||||
|
#.#.###.#.#.###.#.#.#########.#.###.#.#.###.#.#########.#.#.###.###.#######.#####.#.#.#.#.#####.#######.#.#.###.#.#########.#.#.###.#.#.###.#
|
||||||
|
#.#.#.#...#...#.#.#.......................#.#.#.........#.#.#...#.#.#.....#.#...#...#...#...#...#.......#.#.....#...#.......#.#.#...#.....#.#
|
||||||
|
#.#.#.#####.#.#.###.###########.#########.#.#.#####.#####.#.#.###.#.#.#.###.#.#.#############.###.#######.#########.#.#######.#.#.#####.#.#.#
|
||||||
|
#S..........#.#...........................#.........#.....#.......#...#.......#...............#...................#...........#.........#...#
|
||||||
|
#############################################################################################################################################
|
||||||
91
2024/go/day17/day17.go
Normal file
91
2024/go/day17/day17.go
Normal 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
|
||||||
|
}
|
||||||
25
2024/go/day17/day17_test.go
Normal file
25
2024/go/day17/day17_test.go
Normal 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
5
2024/go/day17/input.txt
Normal 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
126
2024/go/day18/day18.go
Normal 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
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
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
87
2024/go/day19/day19.go
Normal 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
|
||||||
|
}
|
||||||
42
2024/go/day19/day19_test.go
Normal file
42
2024/go/day19/day19_test.go
Normal 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
402
2024/go/day19/input.txt
Normal 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
220
2024/go/day20/day20.go
Normal 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
|
||||||
|
}
|
||||||
45
2024/go/day20/day20_test.go
Normal file
45
2024/go/day20/day20_test.go
Normal 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
141
2024/go/day20/input.txt
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#.........#...#...###...#...###...###...###...........#.....#...#.....#...###...#...#...#...#...###...#.....#.......#...###.............#...#
|
||||||
|
#.#######.#.#.#.#.###.#.#.#.###.#.###.#.###.#########.#.###.#.#.#.###.#.#.###.#.#.#.#.#.#.#.#.#.###.#.#.###.#.#####.#.#.###.###########.#.#.#
|
||||||
|
#.......#.#.#.#.#.#...#...#.#...#...#.#.....#...#...#.#...#.#.#.#...#.#.#.#...#...#.#.#.#.#.#.#...#.#.#.#...#...#...#.#.#...#...#.......#.#.#
|
||||||
|
#######.#.#.#.#.#.#.#######.#.#####.#.#######.#.#.#.#.###.#.#.#.###.#.#.#.#.#######.#.#.#.#.#.###.#.#.#.#.#####.#.###.#.#.###.#.#.#######.#.#
|
||||||
|
###...#.#.#.#.#.#.#.......#...#...#.#.#.......#...#...#...#.#.#.###.#.#.#.#.#.......#.#.#.#.#...#.#.#...#.#...#.#.#...#.#.#...#...###...#.#.#
|
||||||
|
###.#.#.#.#.#.#.#.#######.#####.#.#.#.#.###############.###.#.#.###.#.#.#.#.#.#######.#.#.#.###.#.#.#####.#.#.#.#.#.###.#.#.#########.#.#.#.#
|
||||||
|
#...#...#.#.#.#.#.###...#.....#.#...#.#.#...#...#...###...#.#.#.....#.#.#...#.......#.#.#.#.#...#.#.....#.#.#.#.#...#...#.#.#...#...#.#.#.#.#
|
||||||
|
#.#######.#.#.#.#.###.#.#####.#.#####.#.#.#.#.#.#.#.#####.#.#.#######.#.###########.#.#.#.#.#.###.#####.#.#.#.#.#####.###.#.#.#.#.#.#.#.#.#.#
|
||||||
|
#...#.....#.#...#.....#.#.....#...#...#.#.#.#.#...#.#.....#.#.......#.#.#...........#.#.#.#.#...#.......#...#.#.....#...#.#.#.#.#.#.#.#...#.#
|
||||||
|
###.#.#####.###########.#.#######.#.###.#.#.#.#####.#.#####.#######.#.#.#.###########.#.#.#.###.#############.#####.###.#.#.#.#.#.#.#.#####.#
|
||||||
|
#...#.#...#...........#.#.....#...#...#.#.#...#.....#.#...#...###...#.#.#.###...#...#.#.#.#...#.#...#.......#.###...#...#.#...#...#...#.....#
|
||||||
|
#.###.#.#.###########.#.#####.#.#####.#.#.#####.#####.#.#.###.###.###.#.#.###.#.#.#.#.#.#.###.#.#.#.#.#####.#.###.###.###.#############.#####
|
||||||
|
#...#.#.#.###.....#...#.......#.....#.#.#...#...#...#...#...#...#...#.#.#...#.#.#.#...#.#.#...#...#...#...#.#.#...#...#...#...#.........#...#
|
||||||
|
###.#.#.#.###.###.#.###############.#.#.###.#.###.#.#######.###.###.#.#.###.#.#.#.#####.#.#.###########.#.#.#.#.###.###.###.#.#.#########.#.#
|
||||||
|
#...#...#.....#...#...#...........#.#.#.....#...#.#.###...#.#...###.#.#.#...#.#...#.....#.#.#...#####...#.#.#.#.#...#...#...#.#...........#.#
|
||||||
|
#.#############.#####.#.#########.#.#.#########.#.#.###.#.#.#.#####.#.#.#.###.#####.#####.#.#.#.#####.###.#.#.#.#.###.###.###.#############.#
|
||||||
|
#.......#.....#...###...#...#.....#.#.....#.....#.#...#.#.#.#.......#...#...#.....#.#...#.#.#.#...#...#...#.#.#.#.....#...###.......#.......#
|
||||||
|
#######.#.###.###.#######.#.#.#####.#####.#.#####.###.#.#.#.###############.#####.#.#.#.#.#.#.###.#.###.###.#.#.#######.###########.#.#######
|
||||||
|
#.....#...###...#...###...#.#.#...#.#.....#...###.#...#.#.#.......#.......#...#...#.#.#.#.#.#...#.#...#.#...#...#.....#.........###.#.......#
|
||||||
|
#.###.#########.###.###.###.#.#.#.#.#.#######.###.#.###.#.#######.#.#####.###.#.###.#.#.#.#.###.#.###.#.#.#######.###.#########.###.#######.#
|
||||||
|
#...#...###...#...#...#...#...#.#...#.......#.....#.###.#.....###...#.....#...#.#...#.#...#.#...#.#...#.#.#.......###.#.......#.#...#...#...#
|
||||||
|
###.###.###.#.###.###.###.#####.###########.#######.###.#####.#######.#####.###.#.###.#####.#.###.#.###.#.#.#########.#.#####.#.#.###.#.#.###
|
||||||
|
#...#...#...#...#...#...#.....#...#.....#...#.......#...#.....#.....#.....#.#...#.#...#.....#...#.#...#.#.#.........#.#.....#...#.....#...###
|
||||||
|
#.###.###.#####.###.###.#####.###.#.###.#.###.#######.###.#####.###.#####.#.#.###.#.###.#######.#.###.#.#.#########.#.#####.#################
|
||||||
|
#...#...#.....#.###...#.#...#...#.#.#...#...#.###...#...#.....#...#...#...#...#...#...#.....#...#.#...#...#.....#...#.......#...#.....#.....#
|
||||||
|
###.###.#####.#.#####.#.#.#.###.#.#.#.#####.#.###.#.###.#####.###.###.#.#######.#####.#####.#.###.#.#######.###.#.###########.#.#.###.#.###.#
|
||||||
|
#...#...###...#.#.....#...#.....#.#.#.#.....#...#.#.#...#.....#...#...#...#.....#####.....#...#...#...#.....###...#...###...#.#...#...#.#...#
|
||||||
|
#.###.#####.###.#.###############.#.#.#.#######.#.#.#.###.#####.###.#####.#.#############.#####.#####.#.###########.#.###.#.#.#####.###.#.###
|
||||||
|
#.#...#...#...#.#.......#...#...#...#.#.#.......#.#...#...#...#...#.#####.#.#...###...###...#...#...#.#...#.....###.#.....#.#.#.....###.#...#
|
||||||
|
#.#.###.#.###.#.#######.#.#.#.#.#####.#.#.#######.#####.###.#.###.#.#####.#.#.#.###.#.#####.#.###.#.#.###.#.###.###.#######.#.#.#######.###.#
|
||||||
|
#.#...#.#...#.#.#.......#.#...#.#...#.#.#.#.....#.....#.....#.#...#...#...#.#.#...#.#.#.....#...#.#.#.#...#.#...#...#.......#.#.........#...#
|
||||||
|
#.###.#.###.#.#.#.#######.#####.#.#.#.#.#.#.###.#####.#######.#.#####.#.###.#.###.#.#.#.#######.#.#.#.#.###.#.###.###.#######.###########.###
|
||||||
|
#.#...#.#...#.#...#.......#...#.#.#.#.#.#.#.#...#...#.......#.#...#...#...#.#.#...#.#.#.....#...#.#.#.#.###.#.....#...#...###.#.........#...#
|
||||||
|
#.#.###.#.###.#####.#######.#.#.#.#.#.#.#.#.#.###.#.#######.#.###.#.#####.#.#.#.###.#.#####.#.###.#.#.#.###.#######.###.#.###.#.#######.###.#
|
||||||
|
#.#.#...#...#.......#...###.#.#...#.#...#.#.#.#...#...#...#.#...#.#.#...#.#.#.#...#.#.#...#.#.#...#.#.#.....#.....#.....#.....#.......#...#.#
|
||||||
|
#.#.#.#####.#########.#.###.#.#####.#####.#.#.#.#####.#.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#######.###.###################.###.#.#
|
||||||
|
#.#.#.....#.#...#.....#...#.#.....#.....#.#.#.#...#...#.#.#...#.#.#...#.#.#...###...#...#.#.#...###.#...#.....###...#.......#...#...#.#...#.#
|
||||||
|
#.#.#####.#.#.#.#.#######.#.#####.#####.#.#.#.###.#.###.#.###.#.#.#####.#.###############.#.#######.###.#.#########.#.#####.#.#.#.#.#.#.###.#
|
||||||
|
#.#.......#.#.#.#.......#.#.....#.......#...#...#.#.#...#...#.#...#.....#...........#.....#...#...#.....#.........#.#.....#.#.#...#.#.#...#.#
|
||||||
|
#.#########.#.#.#######.#.#####.###############.#.#.#.#####.#.#####.###############.#.#######.#.#.###############.#.#####.#.#.#####.#.###.#.#
|
||||||
|
#.........#.#.#.#...#...#...###.............#...#.#.#...#...#.#.....#.....#.....#...#.....#...#.#.................#.......#...#...#...#...#.#
|
||||||
|
#########.#.#.#.#.#.#.#####.###############.#.###.#.###.#.###.#.#####.###.#.###.#.#######.#.###.###############################.#.#####.###.#
|
||||||
|
#.........#...#...#...#...#...#.........#...#...#.#.#...#...#.#...#...#E..#...#.#...#.....#...#.....#...........................#.....#...#.#
|
||||||
|
#.#####################.#.###.#.#######.#.#####.#.#.#.#####.#.###.#.#########.#.###.#.#######.#####.#.###############################.###.#.#
|
||||||
|
#.........#...#.........#.#...#.......#.#.....#...#.#.#...#...###...#########.#.#...#.#...#...#.....#.#.........#.............#...#...#...#.#
|
||||||
|
#########.#.#.#.#########.#.#########.#.#####.#####.#.#.#.###################.#.#.###.#.#.#.###.#####.#.#######.#.###########.#.#.#.###.###.#
|
||||||
|
#.........#.#.#.#.........#.....###...#.#.....#.....#...#.....###############.#.#.#...#.#.#...#.......#.......#...#.........#...#.#...#.....#
|
||||||
|
#.#########.#.#.#.#############.###.###.#.#####.#############.###############.#.#.#.###.#.###.###############.#####.#######.#####.###.#######
|
||||||
|
#.........#.#.#.#.......#.....#.....###...#...#.....#...#.....###############.#...#.#...#...#.#...............#...#.#.....#.....#...#.#.....#
|
||||||
|
#########.#.#.#.#######.#.###.#############.#.#####.#.#.#.###################.#####.#.#####.#.#.###############.#.#.#.###.#####.###.#.#.###.#
|
||||||
|
#.........#.#.#.#.....#...###.......#...#...#.....#.#.#.#.....###############.....#...#...#...#...#.............#...#...#.......#...#...#...#
|
||||||
|
#.#########.#.#.#.###.#############.#.#.#.#######.#.#.#.#####.###################.#####.#.#######.#.###################.#########.#######.###
|
||||||
|
#...#...#...#...#...#.............#...#...#.......#...#.#.....###################.....#.#.........#.#...........#.......#.....###.......#...#
|
||||||
|
###.#.#.#.#########.#############.#########.###########.#.###########################.#.###########.#.#########.#.#######.###.#########.###.#
|
||||||
|
###...#...#.........#...#.......#.....#...#.....#...#...#.....###################...#.#...#.........#.........#...#...#...#...#...#...#.....#
|
||||||
|
###########.#########.#.#.#####.#####.#.#.#####.#.#.#.#######.###################.#.#.###.#.#################.#####.#.#.###.###.#.#.#.#######
|
||||||
|
#...###...#...........#...#.....#...#...#.......#.#.#.........###################.#...###...#...............#.......#.#.#...###.#...#.......#
|
||||||
|
#.#.###.#.#################.#####.#.#############.#.#############################.###########.#############.#########.#.#.#####.###########.#
|
||||||
|
#.#...#.#.#...#...#.........#.....#...............#.......#...###################...#...#...#.....#.......#.....#...#...#.#...#.#...........#
|
||||||
|
#.###.#.#.#.#.#.#.#.#########.###########################.#.#.#####################.#.#.#.#.#####.#.#####.#####.#.#.#####.#.#.#.#.###########
|
||||||
|
#...#...#...#.#.#.#...#.......#...#...#...#...#...#...#...#.#...#############...#...#.#...#.......#.#.....#...#...#.....#...#...#.....#.....#
|
||||||
|
###.#########.#.#.###.#.#######.#.#.#.#.#.#.#.#.#.#.#.#.###.###.#############.#.#.###.#############.#.#####.#.#########.#############.#.###.#
|
||||||
|
###.....#...#...#.###...#...#...#...#...#.#.#...#.#.#...#...#...#############.#.#.#...#...#.........#.......#...#.....#...............#.#...#
|
||||||
|
#######.#.#.#####.#######.#.#.###########.#.#####.#.#####.###.###############.#.#.#.###.#.#.###################.#.###.#################.#.###
|
||||||
|
###...#...#.....#.....#...#...#.....#...#...#...#...#...#...#.###############.#...#.....#.#.#.........###.......#.#...#.......#...###...#...#
|
||||||
|
###.#.#########.#####.#.#######.###.#.#.#####.#.#####.#.###.#.###############.###########.#.#.#######.###.#######.#.###.#####.#.#.###.#####.#
|
||||||
|
#...#...........#...#...#...#...###...#...#...#.......#.....#...#...###...#S..###...#...#...#...#...#.....#...#...#...#.#.....#.#...#.#...#.#
|
||||||
|
#.###############.#.#####.#.#.###########.#.###################.#.#.###.#.#######.#.#.#.#######.#.#.#######.#.#.#####.#.#.#####.###.#.#.#.#.#
|
||||||
|
#...#.....#...#...#...#...#...#.......#...#...#...........#...#...#.....#...#.....#.#.#.###...#...#.........#...#...#...#...###.#...#.#.#...#
|
||||||
|
###.#.###.#.#.#.#####.#.#######.#####.#.#####.#.#########.#.#.#############.#.#####.#.#.###.#.###################.#.#######.###.#.###.#.#####
|
||||||
|
###...#...#.#.#.#...#...#...###.....#.#...#...#.....#...#.#.#.#...#.....#...#...#...#.#.....#.......#...........#.#.#.....#.....#.....#.....#
|
||||||
|
#######.###.#.#.#.#.#####.#.#######.#.###.#.#######.#.#.#.#.#.#.#.#.###.#.#####.#.###.#############.#.#########.#.#.#.###.#################.#
|
||||||
|
###...#.....#...#.#.......#.......#.#.....#.#.......#.#.#...#...#.#...#.#.#.....#...#.............#.#.........#...#...###.....#.....#.......#
|
||||||
|
###.#.###########.###############.#.#######.#.#######.#.#########.###.#.#.#.#######.#############.#.#########.###############.#.###.#.#######
|
||||||
|
#...#.#...#...###...............#.#.....#...#.#...#...#.....#.....#...#...#.......#...#...#.......#.....#...#.........#...###...###.#.......#
|
||||||
|
#.###.#.#.#.#.#################.#.#####.#.###.#.#.#.#######.#.#####.#############.###.#.#.#.###########.#.#.#########.#.#.#########.#######.#
|
||||||
|
#...#.#.#...#...................#.....#.#...#...#...#.......#.......###.....#...#...#.#.#.#...........#...#.#.......#...#.........#.#.......#
|
||||||
|
###.#.#.#############################.#.###.#########.#################.###.#.#.###.#.#.#.###########.#####.#.#####.#############.#.#.#######
|
||||||
|
#...#...#.....#.....................#.#.....#.......#.......#.....#...#...#...#.....#...#.....#.....#.....#.#.....#...#...#...#...#.#.#...###
|
||||||
|
#.#######.###.#.###################.#.#######.#####.#######.#.###.#.#.###.###################.#.###.#####.#.#####.###.#.#.#.#.#.###.#.#.#.###
|
||||||
|
#...#.....###.#.#.................#.#.#.....#.#...#.......#...#...#.#.###.........#...#.....#.#...#.###...#.....#...#.#.#.#.#...#...#...#...#
|
||||||
|
###.#.#######.#.#.###############.#.#.#.###.#.#.#.#######.#####.###.#.###########.#.#.#.###.#.###.#.###.#######.###.#.#.#.#.#####.#########.#
|
||||||
|
###.#.#.....#...#...............#...#.#.#...#...#.......#.......#...#.#...#...#...#.#.#.#...#.###.#...#.......#.....#...#...#...#.....#...#.#
|
||||||
|
###.#.#.###.###################.#####.#.#.#############.#########.###.#.#.#.#.#.###.#.#.#.###.###.###.#######.###############.#.#####.#.#.#.#
|
||||||
|
#...#.#...#.#...###.............#...#...#...#.....#...#...#...###...#...#.#.#.#...#.#.#.#...#.....#...#.......#.......#...###.#...###...#...#
|
||||||
|
#.###.###.#.#.#.###.#############.#.#######.#.###.#.#.###.#.#.#####.#####.#.#.###.#.#.#.###.#######.###.#######.#####.#.#.###.###.###########
|
||||||
|
#.....###.#.#.#.#...#.....#.......#.......#.#...#...#.....#.#.....#...#...#.#...#...#...###...#...#...#.......#.#.....#.#...#...#.#.........#
|
||||||
|
#########.#.#.#.#.###.###.#.#############.#.###.###########.#####.###.#.###.###.#############.#.#.###.#######.#.#.#####.###.###.#.#.#######.#
|
||||||
|
#...#.....#.#.#.#.....#...#.#.............#.#...#.......###.#.....#...#...#...#...#...#...###...#...#.......#.#.#...###...#.....#.#.#.......#
|
||||||
|
#.#.#.#####.#.#.#######.###.#.#############.#.###.#####.###.#.#####.#####.###.###.#.#.#.#.#########.#######.#.#.###.#####.#######.#.#.#######
|
||||||
|
#.#.#.....#.#.#.#...###.....#...#...#...###.#...#.....#.#...#...#...#.....#...#...#.#.#.#.#...#.....#.....#...#.#...#...#.#.....#...#.......#
|
||||||
|
#.#.#####.#.#.#.#.#.###########.#.#.#.#.###.###.#####.#.#.#####.#.###.#####.###.###.#.#.#.#.#.#.#####.###.#####.#.###.#.#.#.###.###########.#
|
||||||
|
#.#.#.....#...#...#.#...#.....#...#...#...#.#...#.....#.#.....#.#.#...#...#.#...###.#.#.#.#.#.#.......###.......#.....#...#...#.#...#...#...#
|
||||||
|
#.#.#.#############.#.#.#.###.###########.#.#.###.#####.#####.#.#.#.###.#.#.#.#####.#.#.#.#.#.###############################.#.#.#.#.#.#.###
|
||||||
|
#.#.#.....#.......#.#.#.#...#.#...........#...###.....#...###.#.#.#...#.#...#.....#.#...#.#.#...#...........#.....#...#...#...#...#.#.#...###
|
||||||
|
#.#.#####.#.#####.#.#.#.###.#.#.#####################.###.###.#.#.###.#.#########.#.#####.#.###.#.#########.#.###.#.#.#.#.#.#######.#.#######
|
||||||
|
#.#.......#.#.....#...#...#.#.#.................#.....#...#...#.#.#...#.........#.#...#...#...#.#.........#.#...#...#...#.#.......#.#...#...#
|
||||||
|
#.#########.#.###########.#.#.#################.#.#####.###.###.#.#.###########.#.###.#.#####.#.#########.#.###.#########.#######.#.###.#.#.#
|
||||||
|
#.#.........#...........#...#.....#.............#.....#.#...#...#.#.###...#.....#.#...#.#.....#.#...#.....#.....###...###.........#.....#.#.#
|
||||||
|
#.#.###################.#########.#.#################.#.#.###.###.#.###.#.#.#####.#.###.#.#####.#.#.#.#############.#.###################.#.#
|
||||||
|
#...#.......###...#.....#...#...#...#.....#.....#.....#.#...#.#...#...#.#.#.#...#.#.#...#...#...#.#.#...........#...#.....###...###.......#.#
|
||||||
|
#####.#####.###.#.#.#####.#.#.#.#####.###.#.###.#.#####.###.#.#.#####.#.#.#.#.#.#.#.#.#####.#.###.#.###########.#.#######.###.#.###.#######.#
|
||||||
|
###...#...#.....#...#...#.#...#.....#.#...#...#.#.....#.###.#.#...#...#.#.#...#.#.#.#.#...#.#.###.#.#...#.....#...#.......#...#.....#.......#
|
||||||
|
###.###.#.###########.#.#.#########.#.#.#####.#.#####.#.###.#.###.#.###.#.#####.#.#.#.#.#.#.#.###.#.#.#.#.###.#####.#######.#########.#######
|
||||||
|
#...#...#.......#...#.#...###.......#.#...#...#...#...#.#...#.#...#.#...#...#...#.#.#.#.#.#.#.#...#...#.#...#.#...#.#...#...#.....#...#.....#
|
||||||
|
#.###.#########.#.#.#.#######.#######.###.#.#####.#.###.#.###.#.###.#.#####.#.###.#.#.#.#.#.#.#.#######.###.#.#.#.#.#.#.#.###.###.#.###.###.#
|
||||||
|
#...#.#.........#.#.#.#.......#.....#.#...#...###...###.#...#.#.#...#.#.....#.###.#.#.#.#.#.#.#.....###...#.#.#.#.#...#.#...#.###.#.###.#...#
|
||||||
|
###.#.#.#########.#.#.#.#######.###.#.#.#####.#########.###.#.#.#.###.#.#####.###.#.#.#.#.#.#.#####.#####.#.#.#.#.#####.###.#.###.#.###.#.###
|
||||||
|
###...#.......#...#.#.#.#.......#...#.#...#...#.........#...#.#.#.....#.#...#...#.#.#.#.#.#.#.#.....#.....#.#.#.#.....#.....#...#.#.....#...#
|
||||||
|
#############.#.###.#.#.#.#######.###.###.#.###.#########.###.#.#######.#.#.###.#.#.#.#.#.#.#.#.#####.#####.#.#.#####.#########.#.#########.#
|
||||||
|
#...#.........#.###...#...#.......#...###.#.###...#.....#.#...#.......#...#.#...#.#.#.#.#.#.#.#.#.....#...#.#.#.....#...#...#...#.....#...#.#
|
||||||
|
#.#.#.#########.###########.#######.#####.#.#####.#.###.#.#.#########.#####.#.###.#.#.#.#.#.#.#.#.#####.#.#.#.#####.###.#.#.#.#######.#.#.#.#
|
||||||
|
#.#.#.....#...#.......#.....#...#...#...#.#.#.....#...#...#...#.....#.#.....#...#...#.#.#...#...#...#...#.#.#...#...###.#.#.#.......#.#.#.#.#
|
||||||
|
#.#.#####.#.#.#######.#.#####.#.#.###.#.#.#.#.#######.#######.#.###.#.#.#######.#####.#.###########.#.###.#.###.#.#####.#.#.#######.#.#.#.#.#
|
||||||
|
#.#.......#.#.#.......#.....#.#.#.#...#...#.#.#...#...###.....#.###...#.....#...#...#...#...........#.###.#...#.#.#.....#.#.........#.#.#.#.#
|
||||||
|
#.#########.#.#.###########.#.#.#.#.#######.#.#.#.#.#####.#####.###########.#.###.#.#####.###########.###.###.#.#.#.#####.###########.#.#.#.#
|
||||||
|
#...........#.#.###...###...#.#.#.#...#.....#...#.#.#.....#...#.......#.....#.....#.....#...........#...#...#.#...#.#...#...###.....#.#.#.#.#
|
||||||
|
#############.#.###.#.###.###.#.#.###.#.#########.#.#.#####.#.#######.#.###############.###########.###.###.#.#####.#.#.###.###.###.#.#.#.#.#
|
||||||
|
#...#.......#.#.....#...#.#...#.#.###...###.......#.#.......#...#.....#...#...#...#...#...#.........#...###.#...#...#.#...#...#...#.#...#...#
|
||||||
|
#.#.#.#####.#.#########.#.#.###.#.#########.#######.###########.#.#######.#.#.#.#.#.#.###.#.#########.#####.###.#.###.###.###.###.#.#########
|
||||||
|
#.#.#.....#...#.....#...#.#...#.#.#.........#...#...#.........#...#...#...#.#.#.#...#...#.#.#.......#.....#.#...#.#...#...#...###.#.........#
|
||||||
|
#.#.#####.#####.###.#.###.###.#.#.#.#########.#.#.###.#######.#####.#.#.###.#.#.#######.#.#.#.#####.#####.#.#.###.#.###.###.#####.#########.#
|
||||||
|
#.#.......#...#...#.#.#...#...#.#.#.#.....#...#.#...#...#...#...###.#...#...#.#.......#.#.#...#.....#.....#.#...#.#...#...#.......#...#...#.#
|
||||||
|
#.#########.#.###.#.#.#.###.###.#.#.#.###.#.###.###.###.#.#.###.###.#####.###.#######.#.#.#####.#####.#####.###.#.###.###.#########.#.#.#.#.#
|
||||||
|
#.#.......#.#.#...#.#.#...#...#...#...#...#.#...#...#...#.#...#.....#.....###.#.......#...#.....#...#.....#.....#.....###.......#...#...#.#.#
|
||||||
|
#.#.#####.#.#.#.###.#.###.###.#########.###.#.###.###.###.###.#######.#######.#.###########.#####.#.#####.#####################.#.#######.#.#
|
||||||
|
#.#.#.....#.#.#.###...###...#...###...#.....#...#...#...#.###...#...#.......#.#...#.......#.#.....#.#...#...............#.......#.....###...#
|
||||||
|
#.#.#.#####.#.#.###########.###.###.#.#########.###.###.#.#####.#.#.#######.#.###.#.#####.#.#.#####.#.#.###############.#.###########.#######
|
||||||
|
#.#.#...#...#.#.....#...#...#...#...#.#...#.....#...###.#.#.....#.#.#...#...#...#...#...#.#.#...#...#.#.#.......#.....#.#...#...#...#...#...#
|
||||||
|
#.#.###.#.###.#####.#.#.#.###.###.###.#.#.#.#####.#####.#.#.#####.#.#.#.#.#####.#####.#.#.#.###.#.###.#.#.#####.#.###.#.###.#.#.#.#.###.#.#.#
|
||||||
|
#...#...#...#.#...#.#.#...#...###...#...#...#...#...#...#.#.#...#.#.#.#.#.....#...#...#...#...#.#...#.#.#.....#.#...#...#...#.#.#.#.#...#.#.#
|
||||||
|
#####.#####.#.#.#.#.#.#####.#######.#########.#.###.#.###.#.#.#.#.#.#.#.#####.###.#.#########.#.###.#.#.#####.#.###.#####.###.#.#.#.#.###.#.#
|
||||||
|
#...#...#...#.#.#...#.#...#.###.....#...#.....#.#...#...#.#...#...#...#.#...#.###.#.....#####...###.#.#.......#.#...#.....#...#.#.#.#.....#.#
|
||||||
|
#.#.###.#.###.#.#####.#.#.#.###.#####.#.#.#####.#.#####.#.#############.#.#.#.###.#####.###########.#.#########.#.###.#####.###.#.#.#######.#
|
||||||
|
#.#.....#...#.#.#.....#.#.#...#...#...#...#.....#...###.#.###...........#.#...#...#...#...#...#.....#.........#.#.###.....#.###.#.#.#...#...#
|
||||||
|
#.#########.#.#.#.#####.#.###.###.#.#######.#######.###.#.###.###########.#####.###.#.###.#.#.#.#############.#.#.#######.#.###.#.#.#.#.#.###
|
||||||
|
#.#...#...#.#.#.#...#...#...#...#.#.#.......#...#...#...#.#...#...#...#...#.....#...#...#...#.#...#...#...#...#.#.#.......#...#.#.#.#.#.#...#
|
||||||
|
#.#.#.#.#.#.#.#.###.#.#####.###.#.#.#.#######.#.#.###.###.#.###.#.#.#.#.###.#####.#####.#####.###.#.#.#.#.#.###.#.#.#########.#.#.#.#.#.###.#
|
||||||
|
#...#...#...#...###...#####.....#...#.........#...###.....#.....#...#...###.......#####.......###...#...#...###...#...........#...#...#.....#
|
||||||
|
#############################################################################################################################################
|
||||||
181
2024/go/day21/day21.go
Normal file
181
2024/go/day21/day21.go
Normal 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)}]
|
||||||
|
}
|
||||||
|
}
|
||||||
25
2024/go/day21/day21_test.go
Normal file
25
2024/go/day21/day21_test.go
Normal 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
5
2024/go/day21/input.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
480A
|
||||||
|
965A
|
||||||
|
140A
|
||||||
|
341A
|
||||||
|
285A
|
||||||
9
2024/go/day21/tt
Normal file
9
2024/go/day21/tt
Normal 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
2024/go/day22/__debug_bin1539271134
Executable file
BIN
2024/go/day22/__debug_bin1539271134
Executable file
Binary file not shown.
91
2024/go/day22/day22.go
Normal file
91
2024/go/day22/day22.go
Normal 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
|
||||||
|
}
|
||||||
20
2024/go/day22/day22_test.go
Normal file
20
2024/go/day22/day22_test.go
Normal 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
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
242
2024/go/day23/day23.go
Normal 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
|
||||||
|
}
|
||||||
79
2024/go/day23/day23_test.go
Normal file
79
2024/go/day23/day23_test.go
Normal 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
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
297
2024/go/day24/day24.go
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
17
2024/go/day24/day24_test.go
Normal file
17
2024/go/day24/day24_test.go
Normal 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
313
2024/go/day24/input.txt
Normal 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
76
2024/go/day25/day25.go
Normal 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
|
||||||
|
}
|
||||||
24
2024/go/day25/day25_test.go
Normal file
24
2024/go/day25/day25_test.go
Normal 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
3999
2024/go/day25/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,17 @@
|
|||||||
module adventofcode2024
|
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 (
|
require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // 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
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
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/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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
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 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
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-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
|
||||||
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
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/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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
@@ -2,23 +2,44 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
// "math/rand"
|
// "math/rand"
|
||||||
"os"
|
"os"
|
||||||
// "strings"
|
// "strings"
|
||||||
// "time"
|
// "time"
|
||||||
"adventofcode2024/utils"
|
|
||||||
"adventofcode2024/day01"
|
"adventofcode2024/day01"
|
||||||
"adventofcode2024/day02"
|
"adventofcode2024/day02"
|
||||||
"adventofcode2024/day03"
|
"adventofcode2024/day03"
|
||||||
"adventofcode2024/day04"
|
"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>
|
// Usage: go run main.go <NN>
|
||||||
// assumes input is in day<NN>/input.txt
|
// assumes input is in day<NN>/input.txt
|
||||||
func main() {
|
func main() {
|
||||||
d := day()
|
d := day()
|
||||||
fmt.Printf("Running day %02d\n", d)
|
fmt.Printf("Running day %02d\n", d)
|
||||||
|
start := time.Now()
|
||||||
switch d {
|
switch d {
|
||||||
case 1:
|
case 1:
|
||||||
fmt.Printf("part 1: %d\n", day01.Part1(utils.Readfile(d)))
|
fmt.Printf("part 1: %d\n", day01.Part1(utils.Readfile(d)))
|
||||||
@@ -32,14 +53,73 @@ func main() {
|
|||||||
case 4:
|
case 4:
|
||||||
fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d)))
|
fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d)))
|
||||||
fmt.Printf("part 2: %d\n", day04.Part2(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:
|
default:
|
||||||
panic(fmt.Errorf("no such day: %d", d))
|
panic(fmt.Errorf("no such day: %d", d))
|
||||||
}
|
}
|
||||||
|
elapsed := time.Since(start)
|
||||||
|
fmt.Printf("Execution time: %s\n", elapsed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reads day from os.Args.
|
// Reads day from os.Args.
|
||||||
func day() int {
|
func day() int {
|
||||||
latest := 3
|
latest := 24
|
||||||
if len(os.Args) == 1 {
|
if len(os.Args) == 1 {
|
||||||
return latest
|
return latest
|
||||||
}
|
}
|
||||||
@@ -52,7 +132,6 @@ func day() int {
|
|||||||
return day
|
return day
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func genNext(n int) {
|
func genNext(n int) {
|
||||||
os.Mkdir(fmt.Sprintf("day%02d", n), 0755)
|
os.Mkdir(fmt.Sprintf("day%02d", n), 0755)
|
||||||
f, err := os.Create(fmt.Sprintf("day%02d/day%02d.go", n, n))
|
f, err := os.Create(fmt.Sprintf("day%02d/day%02d.go", n, n))
|
||||||
|
|||||||
241
2024/go/utils/dijkstra/graph.go
Normal file
241
2024/go/utils/dijkstra/graph.go
Normal 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
|
||||||
|
}
|
||||||
35
2024/go/utils/dijkstra/object.go
Normal file
35
2024/go/utils/dijkstra/object.go
Normal 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
|
||||||
|
}
|
||||||
65
2024/go/utils/dijkstra/queue.go
Normal file
65
2024/go/utils/dijkstra/queue.go
Normal 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)
|
||||||
|
}
|
||||||
47
2024/go/utils/memo/memo.go
Normal file
47
2024/go/utils/memo/memo.go
Normal 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
|
||||||
|
}
|
||||||
56
2024/go/utils/ringbuffer/ringbuffer.go
Normal file
56
2024/go/utils/ringbuffer/ringbuffer.go
Normal 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
|
||||||
|
}
|
||||||
64
2025/gareth/day01/day01.go
Normal file
64
2025/gareth/day01/day01.go
Normal 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
|
||||||
|
}
|
||||||
35
2025/gareth/day01/day01_test.go
Normal file
35
2025/gareth/day01/day01_test.go
Normal 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
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
49
2025/gareth/day01/poc.py
Normal 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
119
2025/gareth/day02/day02.go
Normal 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
|
||||||
|
}
|
||||||
17
2025/gareth/day02/day02_test.go
Normal file
17
2025/gareth/day02/day02_test.go
Normal 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)
|
||||||
|
}
|
||||||
1
2025/gareth/day02/input.txt
Normal file
1
2025/gareth/day02/input.txt
Normal 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
|
||||||
200
2025/gareth/day03/dad_in.txt
Normal file
200
2025/gareth/day03/dad_in.txt
Normal 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
|
||||||
200
2025/gareth/day03/dad_out.txt
Normal file
200
2025/gareth/day03/dad_out.txt
Normal 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
|
||||||
69
2025/gareth/day03/day03.go
Normal file
69
2025/gareth/day03/day03.go
Normal 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
|
||||||
|
}
|
||||||
23
2025/gareth/day03/day03_test.go
Normal file
23
2025/gareth/day03/day03_test.go
Normal 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)
|
||||||
|
}
|
||||||
200
2025/gareth/day03/greatest_and_most_modest_coder_ever_out.txt
Normal file
200
2025/gareth/day03/greatest_and_most_modest_coder_ever_out.txt
Normal 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
200
2025/gareth/day03/input.txt
Normal 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
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user