feat: add day 6 2024 #24
							
								
								
									
										10
									
								
								aoc2024/day06/example.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								aoc2024/day06/example.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
....#.....
 | 
			
		||||
.........#
 | 
			
		||||
..........
 | 
			
		||||
..#.......
 | 
			
		||||
.......#..
 | 
			
		||||
..........
 | 
			
		||||
.#..^.....
 | 
			
		||||
........#.
 | 
			
		||||
#.........
 | 
			
		||||
......#...
 | 
			
		||||
							
								
								
									
										130
									
								
								aoc2024/day06/input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								aoc2024/day06/input.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,130 @@
 | 
			
		||||
........#........................................#......#........#................................................................
 | 
			
		||||
....................................#......#.....#............#.............#..........#..........................................
 | 
			
		||||
......................#.......................................................#...................................................
 | 
			
		||||
.......#..#..#....#...#...#....#..............#......#.......#...#................#.......#.......................................
 | 
			
		||||
......................#....##...#.......#....#.......................................#....................#.......................
 | 
			
		||||
...#............................#........................................#..........................#.....................#.......
 | 
			
		||||
....................#............#...............#......#.........#...........#...................................................
 | 
			
		||||
............................#......#...#................#.............#...........................................................
 | 
			
		||||
.....#..#.........#....................#......................................................#........................#.........#
 | 
			
		||||
.........#..##.#.........#.............................................#...........#........#....................##...............
 | 
			
		||||
...............#....#.........................##......#.....................#..............................................#......
 | 
			
		||||
..................##...................................#...........#........#....#.............#..................#........#.#....
 | 
			
		||||
....................................#...................#..............................#............#.............................
 | 
			
		||||
.........#.....#................#..........................................#...................................#..............#...
 | 
			
		||||
...#....................#...................................#..##...................#.......#......................###.........#..
 | 
			
		||||
....................#............#....#.##....#.........#......#...#........................#.......................#..........#..
 | 
			
		||||
..............#...................................................................................#....................#..........
 | 
			
		||||
.........#................#..............................#............................#...#.................#...............#.....
 | 
			
		||||
............................................................................................#...#............................#....
 | 
			
		||||
............#....................#................................#....#...............................#....#.....................
 | 
			
		||||
........................................#.........#..................................................#..#..................#......
 | 
			
		||||
.............#.#............................#..#.....#............................................#....#..........................
 | 
			
		||||
................................................................................................#.........#..#..............#..#..
 | 
			
		||||
...........#..........#.#..#................#.#..#...#.........#..........................................#..........#..#.........
 | 
			
		||||
.............................#....................#.......#....#.....#....#......#....................#..#...............##.......
 | 
			
		||||
..........#..............................................................................#....#.........#..#................#.....
 | 
			
		||||
..#..#...............................................................#.......#........#...........................#...............
 | 
			
		||||
...........................................................................#...##....................#.#....##....................
 | 
			
		||||
.......................................#...............................................#.....................#.........#..........
 | 
			
		||||
.......................................................#.......#....#................#.....................................#......
 | 
			
		||||
.............#................#...................#.................#....................#..................#.#.........#.........
 | 
			
		||||
.....................................................................#.....................................#......................
 | 
			
		||||
........................#..........................................#....#..#.#..........................................#.........
 | 
			
		||||
............#.......#..................#.................................................#..............#.......................#.
 | 
			
		||||
.........................................................#...............#...#....#...........#.................................#.
 | 
			
		||||
.........................#..........................#..#........................................................#.................
 | 
			
		||||
...............#....................................#.......#......................................#............#.................
 | 
			
		||||
.#......................................................................................................#.........................
 | 
			
		||||
#...#........................................................#.................#....#....................#...........#............
 | 
			
		||||
..#.........#................................................................#................................#.............#.....
 | 
			
		||||
..................................#.........................................................................#................#....
 | 
			
		||||
..............#..............................................#........#..................................#........................
 | 
			
		||||
......#............................................#.................................#............................#...............
 | 
			
		||||
.......##..#.......................##............#...#...................#.#..........................................##..........
 | 
			
		||||
.#......#.....................................................................#..#..........................#......#.............#
 | 
			
		||||
.................#.....................#........##..#.........#........#................#.........................................
 | 
			
		||||
...........#.....#..........#........#............................................................................................
 | 
			
		||||
.........................#......#.......................................#..............................#..........................
 | 
			
		||||
............#............................................................#..............#..............................#..........
 | 
			
		||||
..................#.........#...........................................................................................#.........
 | 
			
		||||
#.#..................................#....................#......................#.............#.................................#
 | 
			
		||||
....#................#.................#...................#...........#......................................#...................
 | 
			
		||||
................#........................................................................................#....#.#.......#.....##..
 | 
			
		||||
..........#...#.......................................#........#.......................................#...#......................
 | 
			
		||||
.......#..##........................#......##.........................#.........#.......#.............................#.....#.....
 | 
			
		||||
................#...............................................#....#..........#.....#.........#.........#.........#.............
 | 
			
		||||
...............................#............#....................................#......#......................................#..
 | 
			
		||||
.#..#..................#............................................#....#............#...............##...#..........#...........
 | 
			
		||||
....#.............................................................................................................................
 | 
			
		||||
.............................................................#...........................#..........#.............................
 | 
			
		||||
.#........#..................#.....#.............#.....................................................#...#........#...........#.
 | 
			
		||||
.......................#........................................#.....#............................#.#..................#.........
 | 
			
		||||
................#....#................#.......#............................#.......#.................#............................
 | 
			
		||||
....#.........#....#........#.....................#........................#............#.........................................
 | 
			
		||||
.......#.......#.....................................................................##...........#...............................
 | 
			
		||||
...........#.........................................................#..........#............#....................................
 | 
			
		||||
..................#.............................#.......................................................................#.........
 | 
			
		||||
................#.....#........#.....#...#..........#.....................................#.....#........................#........
 | 
			
		||||
..........................................#.........#...........#.................................................................
 | 
			
		||||
...#.......................................................................................................#......................
 | 
			
		||||
....#..............#...........#..................................................#.................#.................#...........
 | 
			
		||||
.#................#.....#.#.................................................................#.........................#...........
 | 
			
		||||
............#.........................##....................................#..............#......................................
 | 
			
		||||
...##...........#...#............#..........................................................................#.....................
 | 
			
		||||
............................................#......................#......#.......................................................
 | 
			
		||||
............#............................................................................................................#........
 | 
			
		||||
...................##..............#.#....#.##...................................................#..................#.............
 | 
			
		||||
..#...................................................................................#.........#.........................#.....#.
 | 
			
		||||
........................#..............................................#......#................................................#..
 | 
			
		||||
................#............#............................#.#...................#.....................#...........................
 | 
			
		||||
..................#......#................#.#......................#...................#...#......................................
 | 
			
		||||
..#................................................##...................................................................#.........
 | 
			
		||||
...........................#......................................................................#......#...#......#.............
 | 
			
		||||
........................#...#........#......#.......#..........#.............................#........#.....#.....................
 | 
			
		||||
.................................................#..............................................#......#.....#....................
 | 
			
		||||
.....#....#.................#......#........#.#..............^...........................#...................#..#.................
 | 
			
		||||
.............................................................................#................................#...................
 | 
			
		||||
#..........................#..#..............#.......#..........................#.................................................
 | 
			
		||||
............#.............................................................................#...................#...................
 | 
			
		||||
..................#.............................#.........................................#................#.........#......#.....
 | 
			
		||||
...#...............................#.....#......#............###.#.#.....................................#....#.............#.....
 | 
			
		||||
...........#...........#...........................#..............................................................................
 | 
			
		||||
............#..........................................#.....#.............#..........................#....................#.....#
 | 
			
		||||
........................#......#..#............................#.......................................................#..........
 | 
			
		||||
..#...#...#.......#.#..........................................#.............#.........#....#..................#...........#......
 | 
			
		||||
..................#.......#.....................................................................................#........#........
 | 
			
		||||
......##................#...........................................#..............##.................................#...........
 | 
			
		||||
.................#................................................................................#.#....................#........
 | 
			
		||||
....................#.........#..........#...............#...#...#.#.#............................................................
 | 
			
		||||
#..................#.#..........#..#...................................................................................#..........
 | 
			
		||||
..........#........................................................#..........##..........................#..##...................
 | 
			
		||||
...........#...................................................................#..................................................
 | 
			
		||||
..................#........#............................................#..................#....#.......................#..#......
 | 
			
		||||
............#...................#......#..........................................................................................
 | 
			
		||||
...........................#.....##..........#.#..............#......................#.............#.......#...........#..........
 | 
			
		||||
............#..................................................#.......#.........#.#..................#..............##...........
 | 
			
		||||
#..................................................#...#......#..#......................#.............#........#............#.....
 | 
			
		||||
....#..................#..........#.........#.........................................#..................#................#.......
 | 
			
		||||
...#.................#.............................................................................#....................#.........
 | 
			
		||||
..........#.................................................................#............#....................#.#.#.....#.........
 | 
			
		||||
.....................#......................#...........#........#................................................................
 | 
			
		||||
.....#.......................................................................#......................#...#......#..................
 | 
			
		||||
.............##........#.....................#...........##........#............#.....#.....................#...............#.....
 | 
			
		||||
.....#.........#....#.................#....#...........#.......##..........#.........#.#......................................#...
 | 
			
		||||
.......#..................##.......#...#.#...#...................................#.......................................#.....#..
 | 
			
		||||
...............#.......#.................#........................................................................................
 | 
			
		||||
......#.......#.....#...............................#...........#.......#......................##...#....#........................
 | 
			
		||||
.##..........................##..................##................#..#....#...##.................................................
 | 
			
		||||
........#..............................#.#......#........#...............#....#........#.#........................................
 | 
			
		||||
...............................#..#.....................#.#...................#...................................................
 | 
			
		||||
.....................#.................................................##...#.......#.................##...............#.......#..
 | 
			
		||||
.............#..........................#.................................#..............#.......#..........#........#............
 | 
			
		||||
.........................................#...................#.........................................................#..........
 | 
			
		||||
...............................#..........#..............................#............#.....#.....................................
 | 
			
		||||
.............#..........................#....................#................................#...#............#..................
 | 
			
		||||
....#......#........#.......#......#................................................#...#......................................##.
 | 
			
		||||
..#...................................#........#.....................................#...#......#.........#..#..........#.........
 | 
			
		||||
.......#.........#................................................................................................................
 | 
			
		||||
...........#...............................##.........................................#..#....................#.....#.#.......##..
 | 
			
		||||
.........................#..#...............#............................#.............#..........................#..............#
 | 
			
		||||
							
								
								
									
										147
									
								
								aoc2024/day06/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								aoc2024/day06/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,147 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	_ "embed"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	aoc "go.sour.is/advent-of-code"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// var log = aoc.Log
 | 
			
		||||
 | 
			
		||||
func main() { aoc.MustResult(aoc.Runner(run)) }
 | 
			
		||||
 | 
			
		||||
type result struct {
 | 
			
		||||
	valuePT1 int
 | 
			
		||||
	valuePT2 int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r result) String() string { return fmt.Sprintf("%#v", r) }
 | 
			
		||||
 | 
			
		||||
func run(scan *bufio.Scanner) (*result, error) {
 | 
			
		||||
 | 
			
		||||
	var start aoc.Point[int]
 | 
			
		||||
	var m [][]rune
 | 
			
		||||
 | 
			
		||||
	for scan.Scan() {
 | 
			
		||||
		txt := scan.Text()
 | 
			
		||||
 | 
			
		||||
		if txt == "" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m = append(m, []rune(txt))
 | 
			
		||||
 | 
			
		||||
		for i, c := range txt {
 | 
			
		||||
			if c == '^' {
 | 
			
		||||
				start = aoc.Point[int]{len(m) - 1, i}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sum, positions, _ := runPT1(m, start)
 | 
			
		||||
 | 
			
		||||
	loops := runPT2(m, start, positions)
 | 
			
		||||
 | 
			
		||||
	return &result{sum, loops}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isOutOfBounds(p, topRight, bottomLeft aoc.Point[int]) bool {
 | 
			
		||||
	return p[0] < topRight[0] ||
 | 
			
		||||
		p[0] > bottomLeft[0] ||
 | 
			
		||||
		p[1] < topRight[1] ||
 | 
			
		||||
		p[1] > bottomLeft[1]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func printMap(m [][]rune, o aoc.Point[int]) {
 | 
			
		||||
	for i, row := range m {
 | 
			
		||||
		if i == o[0] {
 | 
			
		||||
			row[o[1]] = 'O'
 | 
			
		||||
		} 
 | 
			
		||||
		println(string(row))
 | 
			
		||||
	}
 | 
			
		||||
	println()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runPT1(m [][]rune, start aoc.Point[int]) (int, []aoc.Point[int], bool) {
 | 
			
		||||
	m = copyMap(m)
 | 
			
		||||
 | 
			
		||||
	topRight := aoc.Point[int]{0, 0}
 | 
			
		||||
	bottomLeft := aoc.Point[int]{len(m) - 1, len(m[0]) - 1}
 | 
			
		||||
 | 
			
		||||
	directions := []aoc.Point[int]{
 | 
			
		||||
		{-1, 0}, // up
 | 
			
		||||
		{0, 1},  // right
 | 
			
		||||
		{1, 0},  // down
 | 
			
		||||
		{0, -1}, // left
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	d := 0
 | 
			
		||||
	current := start
 | 
			
		||||
	var loopStart [3]int
 | 
			
		||||
	var paths = aoc.NewSet[[3]int]()
 | 
			
		||||
	for !isOutOfBounds(current, topRight, bottomLeft) {
 | 
			
		||||
		m[current[0]][current[1]] = 'X'
 | 
			
		||||
		next := current.Add(directions[d])
 | 
			
		||||
		if isOutOfBounds(next, topRight, bottomLeft) {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if m[next[0]][next[1]] == '#' {
 | 
			
		||||
			d = (d + 1) % 4
 | 
			
		||||
			pt := [3]int{current[0], current[1], d}
 | 
			
		||||
			if paths.Has(pt) {
 | 
			
		||||
				if loopStart == pt {
 | 
			
		||||
					return 0, nil, true
 | 
			
		||||
				}
 | 
			
		||||
				if loopStart == [3]int{} {
 | 
			
		||||
					loopStart = pt					
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			paths.Add(pt)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		current = next
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var sum int
 | 
			
		||||
	var points []aoc.Point[int]
 | 
			
		||||
	for y, row := range m {
 | 
			
		||||
		for x, v := range row {
 | 
			
		||||
			if v == 'X' {
 | 
			
		||||
				points = append(points, aoc.Point[int]{x, y})
 | 
			
		||||
				sum++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sum, points, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runPT2(m [][]rune, start aoc.Point[int], points []aoc.Point[int]) int {
 | 
			
		||||
	sum := 0
 | 
			
		||||
	for _, p := range points {
 | 
			
		||||
		cm := copyMap(m)
 | 
			
		||||
		cm[p[0]][p[1]] = '#'
 | 
			
		||||
 | 
			
		||||
		_, _, isOOB :=runPT1(cm, start)
 | 
			
		||||
 | 
			
		||||
		if !isOOB {
 | 
			
		||||
			printMap(cm, start)
 | 
			
		||||
			sum++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sum
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func copyMap(m [][]rune) [][]rune {
 | 
			
		||||
	newM := make([][]rune, len(m))
 | 
			
		||||
	for i, row := range m {
 | 
			
		||||
		newM[i] = make([]rune, len(row))
 | 
			
		||||
		copy(newM[i], row)
 | 
			
		||||
	}
 | 
			
		||||
	return newM
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								aoc2024/day06/main_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								aoc2024/day06/main_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	_ "embed"
 | 
			
		||||
 | 
			
		||||
	"github.com/matryer/is"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:embed example.txt
 | 
			
		||||
var example []byte
 | 
			
		||||
 | 
			
		||||
//go:embed input.txt
 | 
			
		||||
var input []byte
 | 
			
		||||
 | 
			
		||||
func TestExample(t *testing.T) {
 | 
			
		||||
	is := is.New(t)
 | 
			
		||||
	scan := bufio.NewScanner(bytes.NewReader(example))
 | 
			
		||||
 | 
			
		||||
	result, err := run(scan)
 | 
			
		||||
	is.NoErr(err)
 | 
			
		||||
 | 
			
		||||
	t.Log(result)
 | 
			
		||||
	is.Equal(result.valuePT1, 41)
 | 
			
		||||
	is.Equal(result.valuePT2, 6)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSolution(t *testing.T) {
 | 
			
		||||
	is := is.New(t)
 | 
			
		||||
	scan := bufio.NewScanner(bytes.NewReader(input))
 | 
			
		||||
 | 
			
		||||
	result, err := run(scan)
 | 
			
		||||
	is.NoErr(err)
 | 
			
		||||
 | 
			
		||||
	t.Log(result)
 | 
			
		||||
	is.Equal(result.valuePT1, 5329)
 | 
			
		||||
	is.True(result.valuePT2 > 897)
 | 
			
		||||
	is.Equal(result.valuePT2, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -73,3 +73,17 @@ func toList[T any](seq iter.Seq[T]) []T {
 | 
			
		||||
	}
 | 
			
		||||
	return list
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGraphBFS2(t *testing.T) {
 | 
			
		||||
	is := is.New(t)
 | 
			
		||||
 | 
			
		||||
	var adjacencyList = map[int][]int{
 | 
			
		||||
		1: {2, 3},
 | 
			
		||||
		2: {4},
 | 
			
		||||
		3: {5, 6},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	g := aoc.Graph(aoc.WithAdjacencyList[int](adjacencyList))
 | 
			
		||||
	is.Equal(toList(g.BFS(1)), []int{1, 2, 3, 4, 5, 6})
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user