2023 day 10
This commit is contained in:
parent
bfcad28fff
commit
a9fc4c9e60
9 changed files with 570 additions and 0 deletions
18
2023/10/part2/cmd/main.go
Normal file
18
2023/10/part2/cmd/main.go
Normal file
|
@ -0,0 +1,18 @@
|
|||
|
||||
package main
|
||||
|
||||
import (
|
||||
"git.tristans.cloud/tristan/aoc/2023/10/part1/lib"
|
||||
"git.tristans.cloud/tristan/aoc/2023/10/part2/lib"
|
||||
"bufio"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main () {
|
||||
scanner := bufio.NewScanner(os.Stdin);
|
||||
|
||||
pipeMap := part1.ReadMap(scanner)
|
||||
inside := part2.GetVolume(pipeMap)
|
||||
println(inside)
|
||||
}
|
||||
|
84
2023/10/part2/lib/lib.go
Normal file
84
2023/10/part2/lib/lib.go
Normal file
|
@ -0,0 +1,84 @@
|
|||
|
||||
package part2
|
||||
|
||||
import (
|
||||
"git.tristans.cloud/tristan/aoc/2023/10/part1/lib"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Loop map[[2]int]bool
|
||||
|
||||
func GetLoop(pipeMap []string) ( loop Loop ) {
|
||||
x,y := part1.FindStart(pipeMap)
|
||||
loop = Loop{{x,y}: true}
|
||||
side,x,y := part1.FindFirst(pipeMap, x,y)
|
||||
for pipeMap[y][x] != 'S' {
|
||||
loop[[2]int{x,y}] = true
|
||||
side,x,y = part1.FindNext(pipeMap, side, x,y)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func GetShapeOfS(pipeMap []string) () {
|
||||
return
|
||||
}
|
||||
|
||||
const CLEAR = "\u001b[0;0m";
|
||||
const OUT_OF_LOOP = CLEAR;
|
||||
const ON_LOOP = "\u001b[0;31m";
|
||||
const IN_LOOP = "\u001b[0;33m";
|
||||
|
||||
func GetVolume(pipeMap []string) int {
|
||||
loop := GetLoop(pipeMap)
|
||||
count := 0
|
||||
for y,line := range pipeMap {
|
||||
inLoop := false
|
||||
onDownEdge := false
|
||||
onUpEdge := false
|
||||
for x,c := range line {
|
||||
_,onLoop := loop[[2]int{x,y}]
|
||||
|
||||
if onLoop {
|
||||
switch c {
|
||||
case '|':
|
||||
inLoop = !inLoop
|
||||
case 'L':
|
||||
onDownEdge = true
|
||||
case 'F':
|
||||
onUpEdge = true
|
||||
case '7':
|
||||
if onDownEdge {
|
||||
onDownEdge = false
|
||||
inLoop = !inLoop
|
||||
} else if onUpEdge {
|
||||
onUpEdge = false
|
||||
}
|
||||
case 'J':
|
||||
if onUpEdge {
|
||||
onUpEdge = false
|
||||
inLoop = !inLoop
|
||||
} else if onDownEdge {
|
||||
onDownEdge = false
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
color := OUT_OF_LOOP
|
||||
if onLoop {
|
||||
color = ON_LOOP
|
||||
}
|
||||
if inLoop && !onLoop {
|
||||
count++
|
||||
color = IN_LOOP
|
||||
}
|
||||
if c == 'S' {
|
||||
color = "\u001b[41;30m"
|
||||
}
|
||||
fmt.Printf("%v%c", color, c)
|
||||
}
|
||||
println(CLEAR)
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
88
2023/10/part2/lib/lib_test.go
Normal file
88
2023/10/part2/lib/lib_test.go
Normal file
|
@ -0,0 +1,88 @@
|
|||
|
||||
package part2
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
var inputMap = []string{
|
||||
"...........",
|
||||
".S-------7.",
|
||||
".|F-----7|.",
|
||||
".||.....||.",
|
||||
".||.....||.",
|
||||
".|L-7.F-J|.",
|
||||
".|..|.|..|.",
|
||||
".L--J.L--J.",
|
||||
"...........",
|
||||
}
|
||||
|
||||
var complexMap = []string{
|
||||
"FF7FSF7F7F7F7F7F---7",
|
||||
"L|LJ||||||||||||F--J",
|
||||
"FL-7LJLJ||||||LJL-77",
|
||||
"F--JF--7||LJLJ7F7FJ-",
|
||||
"L---JF-JLJ.||-FJLJJ7",
|
||||
"|F|F-JF---7F7-L7L|7|",
|
||||
"|FFJF7L7F-JF7|JL---7",
|
||||
"7-L-JL7||F7|L7F-7F7|",
|
||||
"L.L7LFJ|||||FJL7||LJ",
|
||||
"L7JLJL-JLJLJL--JLJ.L",
|
||||
}
|
||||
|
||||
var anotherMap = []string{
|
||||
".F----7F7F7F7F-7....",
|
||||
".|F--7||||||||FJ....",
|
||||
".||.FJ||||||||L7....",
|
||||
"FJL7L7LJLJ||LJ.L-7..",
|
||||
"L--J.L7...LJS7F-7L7.",
|
||||
"....F-J..F7FJ|L7L7L7",
|
||||
"....L7.F7||L7|.L7L7|",
|
||||
".....|FJLJ|FJ|F7|.LJ",
|
||||
"....FJL-7.||.||||...",
|
||||
"....L---J.LJ.LJLJ...",
|
||||
}
|
||||
|
||||
var basicMap = []string{
|
||||
".....",
|
||||
".S-7.",
|
||||
".|.|.",
|
||||
".L-J.",
|
||||
".....",
|
||||
}
|
||||
|
||||
func TestGetLoop(t *testing.T) {
|
||||
loop := GetLoop(basicMap)
|
||||
equal(t, loop, Loop{
|
||||
{1,1}:true,
|
||||
{2,1}:true,
|
||||
{3,1}:true,
|
||||
{3,2}:true,
|
||||
{3,3}:true,
|
||||
{2,3}:true,
|
||||
{1,3}:true,
|
||||
{1,2}:true,
|
||||
})
|
||||
}
|
||||
|
||||
func TestGetVolume(t *testing.T) {
|
||||
v := GetVolume(inputMap)
|
||||
equal(t, v, 4)
|
||||
}
|
||||
|
||||
func TestGetVolumeComplex(t *testing.T) {
|
||||
v := GetVolume(complexMap)
|
||||
equal(t, v, 10)
|
||||
}
|
||||
|
||||
func TestGetVolumeAgain(t *testing.T) {
|
||||
v := GetVolume(anotherMap)
|
||||
equal(t, v, 8)
|
||||
}
|
||||
|
||||
func equal(t *testing.T, actual any, target any) {
|
||||
if !reflect.DeepEqual(actual, target) {
|
||||
t.Errorf("expected %v, got %v", target, actual)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue