refactor: 2023 Day 5
This commit is contained in:
parent
422a378ec0
commit
70b145286b
1 changed files with 24 additions and 22 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue