2023 Day 16 Part 2
This commit is contained in:
parent
140fcbc376
commit
6f07fd5c27
1 changed files with 31 additions and 5 deletions
|
|
@ -68,7 +68,7 @@ type Beam = tuple
|
||||||
pos: Point
|
pos: Point
|
||||||
dir: Direction
|
dir: Direction
|
||||||
|
|
||||||
func simulate(c: Contraption, beam: Beam): seq[Beam] =
|
func tick(c: Contraption, beam: Beam): seq[Beam] =
|
||||||
let (pos, dir) = beam
|
let (pos, dir) = beam
|
||||||
let tile = c.grid[beam.pos]
|
let tile = c.grid[beam.pos]
|
||||||
case tile:
|
case tile:
|
||||||
|
|
@ -106,11 +106,11 @@ func inBounds(c: Contraption, p: Point): bool =
|
||||||
func inBounds(c: Contraption, b: Beam): bool =
|
func inBounds(c: Contraption, b: Beam): bool =
|
||||||
c.inBounds(b.pos)
|
c.inBounds(b.pos)
|
||||||
|
|
||||||
func simulate(c: Contraption): HashSet[Point] =
|
func run(c: Contraption, start: Beam): HashSet[Point] =
|
||||||
var beams: Deque[Beam]
|
var beams: Deque[Beam]
|
||||||
var seen: HashSet[Beam]
|
var seen: HashSet[Beam]
|
||||||
|
|
||||||
beams.addFirst ((0, 0), E)
|
beams.addFirst start
|
||||||
while beams.len > 0:
|
while beams.len > 0:
|
||||||
let beam = beams.popFirst
|
let beam = beams.popFirst
|
||||||
if not c.inBounds(beam):
|
if not c.inBounds(beam):
|
||||||
|
|
@ -119,7 +119,7 @@ func simulate(c: Contraption): HashSet[Point] =
|
||||||
continue
|
continue
|
||||||
seen.incl beam
|
seen.incl beam
|
||||||
|
|
||||||
for next in c.simulate(beam):
|
for next in c.tick(beam):
|
||||||
beams.addLast next
|
beams.addLast next
|
||||||
|
|
||||||
seen.map(func (b: Beam): Point = b.pos)
|
seen.map(func (b: Beam): Point = b.pos)
|
||||||
|
|
@ -127,7 +127,33 @@ func simulate(c: Contraption): HashSet[Point] =
|
||||||
proc part1(input: string): int =
|
proc part1(input: string): int =
|
||||||
let text = readFile(input)
|
let text = readFile(input)
|
||||||
let contraption = parseContraption(text)
|
let contraption = parseContraption(text)
|
||||||
contraption.simulate.len
|
contraption.run(((0, 0), E)).len
|
||||||
|
|
||||||
|
proc part2(input: string): int =
|
||||||
|
let text = readFile(input)
|
||||||
|
let contraption = parseContraption(text)
|
||||||
|
|
||||||
|
# North edge
|
||||||
|
for c in 0 ..< contraption.width:
|
||||||
|
let tiles = contraption.run ((0, c), S)
|
||||||
|
result = result.max(tiles.len)
|
||||||
|
|
||||||
|
# South edge
|
||||||
|
for c in 0 ..< contraption.width:
|
||||||
|
let tiles = contraption.run ((contraption.height - 1, c), N)
|
||||||
|
result = result.max(tiles.len)
|
||||||
|
|
||||||
|
# West edge
|
||||||
|
for r in 0 ..< contraption.height:
|
||||||
|
let tiles = contraption.run ((r, 0), E)
|
||||||
|
result = result.max(tiles.len)
|
||||||
|
|
||||||
|
# East edge
|
||||||
|
for r in 0 ..< contraption.height:
|
||||||
|
let tiles = contraption.run ((r, contraption.width - 1), W)
|
||||||
|
result = result.max(tiles.len)
|
||||||
|
|
||||||
echo part1("input/test.txt")
|
echo part1("input/test.txt")
|
||||||
echo part1("input/day16.txt")
|
echo part1("input/day16.txt")
|
||||||
|
echo part2("input/test.txt")
|
||||||
|
echo part2("input/day16.txt")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue