aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHunky Jimpjorps <thechairman@thechairman.info>2023-12-05 14:44:52 -0500
committerHunky Jimpjorps <thechairman@thechairman.info>2023-12-05 14:44:52 -0500
commit2c5ef0de53a74b0805a111313279c008ac60a64e (patch)
treecefc68a9a938bbe6bdd05d51137c85acd1c38853
parente18df290edcd9c863bf2008a70b6ccbf1e49b36a (diff)
downloadgleam_aoc-2c5ef0de53a74b0805a111313279c008ac60a64e.tar.gz
gleam_aoc-2c5ef0de53a74b0805a111313279c008ac60a64e.zip
day 5 complete
-rw-r--r--aoc2023-other/day-05/day-05.rkt12
1 files changed, 12 insertions, 0 deletions
diff --git a/aoc2023-other/day-05/day-05.rkt b/aoc2023-other/day-05/day-05.rkt
index 78f44da..0373619 100644
--- a/aoc2023-other/day-05/day-05.rkt
+++ b/aoc2023-other/day-05/day-05.rkt
@@ -40,21 +40,33 @@
(define (remap-range r mapper [acc '()])
(match-define (seed-range r-start r-end) r)
(match mapper
+ ; mapper exhausted
['() (cons r acc)]
+ ; range to the left - not covered by this mapping, so keep as-is
[(list* (map-range m-start _ _) _)
#:when (< r-end m-start)
(cons r acc)]
+ ; range to the right - move to next map-range
[(list* (map-range _ m-end _) ms)
#:when (< m-end r-start)
(remap-range r ms acc)]
+ ; range is inside map-range - transform whole range
[(list* (map-range m-start m-end offset) _)
#:when (and (<= m-start r-start) (<= r-end m-end))
(cons (seed-range (+ r-start offset) (+ r-end offset)) acc)]
+ ; range overlaps start only - keep left side, transform right side
+ [(list* (map-range m-start m-end offset) ms)
+ #:when (and (< r-start m-start) (<= r-end m-end))
+ (remap-range (seed-range (add1 m-end) r-end)
+ ms
+ (cons (seed-range (+ m-start offset) (+ r-end offset)) acc))]
+ ; range overlaps end - transform left side, pass right side
[(list* (map-range m-start m-end offset) ms)
#:when (and (< m-start r-start) (<= m-end r-end))
(remap-range (seed-range (add1 m-end) r-end)
ms
(cons (seed-range (+ r-start offset) (+ m-end offset)) acc))]
+ ; range overlaps whole map-range - keep left side, transform middle, pass right side
[(list* (map-range m-start m-end offset) ms)
(remap-range (seed-range (add1 m-end) r-end)
ms