Watch
1
0
Fork
You've already forked advent-of-code
0

refactor: 2023 Day 5

This commit is contained in:
Jeremy Kaplan 2023-12-04 23:32:51 -08:00
commit 70b145286b

View file

@ -95,52 +95,54 @@ func newRange(start: int, length: int): Range =
func empty(r: Range): bool = func empty(r: Range): bool =
r.lo > r.hi r.lo > r.hi
func intersect(a: Range, b: Range): Range = type Split = tuple
(max(a.lo, b.lo), min(a.hi, b.hi)) prefix: Range
inside: Range
suffix: Range
proc lookup(r: Remap, src: Range): Range = func split(a: Range, b: Range): Split =
let lo = max(a.lo, b.lo)
let hi = min(a.hi, b.hi)
result.prefix = (a.lo, lo - 1)
result.inside = (lo, hi)
result.suffix = (hi + 1, a.hi)
func lookup(r: Remap, src: Range): Range =
let delta = r.dst_start - r.src_start let delta = r.dst_start - r.src_start
(src.lo + delta, src.hi + delta) (src.lo + delta, src.hi + delta)
proc lookup(m: Map, src: Range): seq[Range] = func lookup(m: Map, src: Range): seq[Range] =
var unmapped = @[src] var unmapped = @[src]
for remap in m.remaps: for remap in m.remaps:
var still_unmapped: seq[Range] var still_unmapped: seq[Range]
for src in unmapped: for src in unmapped:
let rr = newRange(remap.src_start, remap.length) let rr = newRange(remap.src_start, remap.length)
if src.intersect(rr).empty: let split = src.split(rr)
if split.inside.empty:
still_unmapped.add src still_unmapped.add src
continue continue
let dn = src.lo result.add remap.lookup(split.inside)
let lo = max(src.lo, rr.lo)
let hi = min(src.hi, rr.hi)
let up = src.hi
let prefix = (dn, lo - 1) if not split.prefix.empty:
let inside = (lo, hi) still_unmapped.add split.prefix
let suffix = (hi + 1, up)
if not prefix.empty: if not split.suffix.empty:
still_unmapped.add prefix still_unmapped.add split.suffix
if not suffix.empty:
still_unmapped.add suffix
if not inside.empty:
result.add remap.lookup(inside)
unmapped = still_unmapped unmapped = still_unmapped
for src in unmapped: for src in unmapped:
result.add src result.add src
proc lookup(m: Map, srcs: seq[Range]): seq[Range] = func lookup(m: Map, srcs: seq[Range]): seq[Range] =
for src in srcs: for src in srcs:
result.add m.lookup(src) result.add m.lookup(src)
proc lookup(a: Almanac, dst: string, seeds: seq[Range]): seq[Range] = func lookup(a: Almanac, dst: string, seeds: seq[Range]): seq[Range] =
var map = a.mapsBySrc["seed"] var map = a.mapsBySrc["seed"]
var src = seeds var src = seeds